@@ -182,8 +182,7 @@ define double @select_f64_i1(i1 %cond, double %t, double %f) nounwind {
182182; RV32ZDINX_ZICOND-NEXT: # %bb.1: # %entry
183183; RV32ZDINX_ZICOND-NEXT: mv a7, a4
184184; RV32ZDINX_ZICOND-NEXT: mv a6, a3
185- ; RV32ZDINX_ZICOND-NEXT: mv a4, a6
186- ; RV32ZDINX_ZICOND-NEXT: mv a5, a7
185+ ; RV32ZDINX_ZICOND-NEXT: fmv.d a4, a6
187186; RV32ZDINX_ZICOND-NEXT: j .LBB1_3
188187; RV32ZDINX_ZICOND-NEXT: .LBB1_2:
189188; RV32ZDINX_ZICOND-NEXT: mv a5, a2
@@ -200,8 +199,7 @@ define double @select_f64_i1(i1 %cond, double %t, double %f) nounwind {
200199; RV32ZDINX_NOZICOND-NEXT: # %bb.1: # %entry
201200; RV32ZDINX_NOZICOND-NEXT: mv a7, a4
202201; RV32ZDINX_NOZICOND-NEXT: mv a6, a3
203- ; RV32ZDINX_NOZICOND-NEXT: mv a4, a6
204- ; RV32ZDINX_NOZICOND-NEXT: mv a5, a7
202+ ; RV32ZDINX_NOZICOND-NEXT: fmv.d a4, a6
205203; RV32ZDINX_NOZICOND-NEXT: j .LBB1_3
206204; RV32ZDINX_NOZICOND-NEXT: .LBB1_2:
207205; RV32ZDINX_NOZICOND-NEXT: mv a5, a2
@@ -328,8 +326,7 @@ define double @select_f64_fcmp(double %a, double %b, double %c, double %d) nounw
328326; RV32ZDINX_ZICOND-NEXT: flt.d a0, a2, a0
329327; RV32ZDINX_ZICOND-NEXT: bnez a0, .LBB2_2
330328; RV32ZDINX_ZICOND-NEXT: # %bb.1: # %entry
331- ; RV32ZDINX_ZICOND-NEXT: mv a4, a6
332- ; RV32ZDINX_ZICOND-NEXT: mv a5, a7
329+ ; RV32ZDINX_ZICOND-NEXT: fmv.d a4, a6
333330; RV32ZDINX_ZICOND-NEXT: .LBB2_2: # %entry
334331; RV32ZDINX_ZICOND-NEXT: mv a0, a4
335332; RV32ZDINX_ZICOND-NEXT: mv a1, a5
@@ -340,8 +337,7 @@ define double @select_f64_fcmp(double %a, double %b, double %c, double %d) nounw
340337; RV32ZDINX_NOZICOND-NEXT: flt.d a0, a2, a0
341338; RV32ZDINX_NOZICOND-NEXT: bnez a0, .LBB2_2
342339; RV32ZDINX_NOZICOND-NEXT: # %bb.1: # %entry
343- ; RV32ZDINX_NOZICOND-NEXT: mv a4, a6
344- ; RV32ZDINX_NOZICOND-NEXT: mv a5, a7
340+ ; RV32ZDINX_NOZICOND-NEXT: fmv.d a4, a6
345341; RV32ZDINX_NOZICOND-NEXT: .LBB2_2: # %entry
346342; RV32ZDINX_NOZICOND-NEXT: mv a0, a4
347343; RV32ZDINX_NOZICOND-NEXT: mv a1, a5
@@ -636,3 +632,167 @@ entry:
636632 %sel = select i1 %cond , half %val , half 0xH0000
637633 ret half %sel
638634}
635+
636+ ; -----------------------------------------------------------------------------
637+ ; Test select with i1 condition and zero value for half fp, feeding into fadd ((cond ? a : 0) + 1.0)
638+ ; -----------------------------------------------------------------------------
639+ define half @select_i1_half_0_add (i1 %cond , half %val ) nounwind {
640+ ; RV64ZDINX_ZICOND-LABEL: select_i1_half_0_add:
641+ ; RV64ZDINX_ZICOND: # %bb.0: # %entry
642+ ; RV64ZDINX_ZICOND-NEXT: addi sp, sp, -16
643+ ; RV64ZDINX_ZICOND-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
644+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
645+ ; RV64ZDINX_ZICOND-NEXT: andi a0, a0, 1
646+ ; RV64ZDINX_ZICOND-NEXT: czero.eqz a0, a1, a0
647+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
648+ ; RV64ZDINX_ZICOND-NEXT: call __extendhfsf2
649+ ; RV64ZDINX_ZICOND-NEXT: lui a1, 260096
650+ ; RV64ZDINX_ZICOND-NEXT: fadd.s a0, a0, a1
651+ ; RV64ZDINX_ZICOND-NEXT: call __truncsfhf2
652+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
653+ ; RV64ZDINX_ZICOND-NEXT: lui a1, 1048560
654+ ; RV64ZDINX_ZICOND-NEXT: or a0, a0, a1
655+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
656+ ; RV64ZDINX_ZICOND-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
657+ ; RV64ZDINX_ZICOND-NEXT: addi sp, sp, 16
658+ ; RV64ZDINX_ZICOND-NEXT: ret
659+ ;
660+ ; RV64ZDINX_NOZICOND-LABEL: select_i1_half_0_add:
661+ ; RV64ZDINX_NOZICOND: # %bb.0: # %entry
662+ ; RV64ZDINX_NOZICOND-NEXT: addi sp, sp, -16
663+ ; RV64ZDINX_NOZICOND-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
664+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
665+ ; RV64ZDINX_NOZICOND-NEXT: slli a0, a0, 63
666+ ; RV64ZDINX_NOZICOND-NEXT: srai a0, a0, 63
667+ ; RV64ZDINX_NOZICOND-NEXT: and a0, a0, a1
668+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
669+ ; RV64ZDINX_NOZICOND-NEXT: call __extendhfsf2
670+ ; RV64ZDINX_NOZICOND-NEXT: lui a1, 260096
671+ ; RV64ZDINX_NOZICOND-NEXT: fadd.s a0, a0, a1
672+ ; RV64ZDINX_NOZICOND-NEXT: call __truncsfhf2
673+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
674+ ; RV64ZDINX_NOZICOND-NEXT: lui a1, 1048560
675+ ; RV64ZDINX_NOZICOND-NEXT: or a0, a0, a1
676+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
677+ ; RV64ZDINX_NOZICOND-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
678+ ; RV64ZDINX_NOZICOND-NEXT: addi sp, sp, 16
679+ ; RV64ZDINX_NOZICOND-NEXT: ret
680+ ;
681+ ; RV64ZHINX_ZICOND-LABEL: select_i1_half_0_add:
682+ ; RV64ZHINX_ZICOND: # %bb.0: # %entry
683+ ; RV64ZHINX_ZICOND-NEXT: # kill: def $x11_h killed $x11_h def $x11
684+ ; RV64ZHINX_ZICOND-NEXT: andi a0, a0, 1
685+ ; RV64ZHINX_ZICOND-NEXT: czero.eqz a0, a1, a0
686+ ; RV64ZHINX_ZICOND-NEXT: li a1, 15
687+ ; RV64ZHINX_ZICOND-NEXT: slli a1, a1, 10
688+ ; RV64ZHINX_ZICOND-NEXT: fadd.h a0, a0, a1
689+ ; RV64ZHINX_ZICOND-NEXT: ret
690+ ;
691+ ; RV64FD-LABEL: select_i1_half_0_add:
692+ ; RV64FD: # %bb.0: # %entry
693+ ; RV64FD-NEXT: addi sp, sp, -16
694+ ; RV64FD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
695+ ; RV64FD-NEXT: fmv.x.w a1, fa0
696+ ; RV64FD-NEXT: slli a0, a0, 63
697+ ; RV64FD-NEXT: srai a0, a0, 63
698+ ; RV64FD-NEXT: and a0, a0, a1
699+ ; RV64FD-NEXT: fmv.w.x fa0, a0
700+ ; RV64FD-NEXT: call __extendhfsf2
701+ ; RV64FD-NEXT: lui a0, 260096
702+ ; RV64FD-NEXT: fmv.w.x fa5, a0
703+ ; RV64FD-NEXT: fadd.s fa0, fa0, fa5
704+ ; RV64FD-NEXT: call __truncsfhf2
705+ ; RV64FD-NEXT: fmv.x.w a0, fa0
706+ ; RV64FD-NEXT: lui a1, 1048560
707+ ; RV64FD-NEXT: or a0, a0, a1
708+ ; RV64FD-NEXT: fmv.w.x fa0, a0
709+ ; RV64FD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
710+ ; RV64FD-NEXT: addi sp, sp, 16
711+ ; RV64FD-NEXT: ret
712+ ;
713+ ; RV32ZFINX_ZICOND-LABEL: select_i1_half_0_add:
714+ ; RV32ZFINX_ZICOND: # %bb.0: # %entry
715+ ; RV32ZFINX_ZICOND-NEXT: addi sp, sp, -16
716+ ; RV32ZFINX_ZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
717+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
718+ ; RV32ZFINX_ZICOND-NEXT: andi a0, a0, 1
719+ ; RV32ZFINX_ZICOND-NEXT: czero.eqz a0, a1, a0
720+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
721+ ; RV32ZFINX_ZICOND-NEXT: call __extendhfsf2
722+ ; RV32ZFINX_ZICOND-NEXT: lui a1, 260096
723+ ; RV32ZFINX_ZICOND-NEXT: fadd.s a0, a0, a1
724+ ; RV32ZFINX_ZICOND-NEXT: call __truncsfhf2
725+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
726+ ; RV32ZFINX_ZICOND-NEXT: lui a1, 1048560
727+ ; RV32ZFINX_ZICOND-NEXT: or a0, a0, a1
728+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
729+ ; RV32ZFINX_ZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
730+ ; RV32ZFINX_ZICOND-NEXT: addi sp, sp, 16
731+ ; RV32ZFINX_ZICOND-NEXT: ret
732+ ;
733+ ; RV32ZFINX_NOZICOND-LABEL: select_i1_half_0_add:
734+ ; RV32ZFINX_NOZICOND: # %bb.0: # %entry
735+ ; RV32ZFINX_NOZICOND-NEXT: addi sp, sp, -16
736+ ; RV32ZFINX_NOZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
737+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
738+ ; RV32ZFINX_NOZICOND-NEXT: slli a0, a0, 31
739+ ; RV32ZFINX_NOZICOND-NEXT: srai a0, a0, 31
740+ ; RV32ZFINX_NOZICOND-NEXT: and a0, a0, a1
741+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
742+ ; RV32ZFINX_NOZICOND-NEXT: call __extendhfsf2
743+ ; RV32ZFINX_NOZICOND-NEXT: lui a1, 260096
744+ ; RV32ZFINX_NOZICOND-NEXT: fadd.s a0, a0, a1
745+ ; RV32ZFINX_NOZICOND-NEXT: call __truncsfhf2
746+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
747+ ; RV32ZFINX_NOZICOND-NEXT: lui a1, 1048560
748+ ; RV32ZFINX_NOZICOND-NEXT: or a0, a0, a1
749+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
750+ ; RV32ZFINX_NOZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
751+ ; RV32ZFINX_NOZICOND-NEXT: addi sp, sp, 16
752+ ; RV32ZFINX_NOZICOND-NEXT: ret
753+ ;
754+ ; RV32ZDINX_ZICOND-LABEL: select_i1_half_0_add:
755+ ; RV32ZDINX_ZICOND: # %bb.0: # %entry
756+ ; RV32ZDINX_ZICOND-NEXT: addi sp, sp, -16
757+ ; RV32ZDINX_ZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
758+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
759+ ; RV32ZDINX_ZICOND-NEXT: andi a0, a0, 1
760+ ; RV32ZDINX_ZICOND-NEXT: czero.eqz a0, a1, a0
761+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
762+ ; RV32ZDINX_ZICOND-NEXT: call __extendhfsf2
763+ ; RV32ZDINX_ZICOND-NEXT: lui a1, 260096
764+ ; RV32ZDINX_ZICOND-NEXT: fadd.s a0, a0, a1
765+ ; RV32ZDINX_ZICOND-NEXT: call __truncsfhf2
766+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
767+ ; RV32ZDINX_ZICOND-NEXT: lui a1, 1048560
768+ ; RV32ZDINX_ZICOND-NEXT: or a0, a0, a1
769+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
770+ ; RV32ZDINX_ZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
771+ ; RV32ZDINX_ZICOND-NEXT: addi sp, sp, 16
772+ ; RV32ZDINX_ZICOND-NEXT: ret
773+ ;
774+ ; RV32ZDINX_NOZICOND-LABEL: select_i1_half_0_add:
775+ ; RV32ZDINX_NOZICOND: # %bb.0: # %entry
776+ ; RV32ZDINX_NOZICOND-NEXT: addi sp, sp, -16
777+ ; RV32ZDINX_NOZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
778+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
779+ ; RV32ZDINX_NOZICOND-NEXT: slli a0, a0, 31
780+ ; RV32ZDINX_NOZICOND-NEXT: srai a0, a0, 31
781+ ; RV32ZDINX_NOZICOND-NEXT: and a0, a0, a1
782+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
783+ ; RV32ZDINX_NOZICOND-NEXT: call __extendhfsf2
784+ ; RV32ZDINX_NOZICOND-NEXT: lui a1, 260096
785+ ; RV32ZDINX_NOZICOND-NEXT: fadd.s a0, a0, a1
786+ ; RV32ZDINX_NOZICOND-NEXT: call __truncsfhf2
787+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
788+ ; RV32ZDINX_NOZICOND-NEXT: lui a1, 1048560
789+ ; RV32ZDINX_NOZICOND-NEXT: or a0, a0, a1
790+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
791+ ; RV32ZDINX_NOZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
792+ ; RV32ZDINX_NOZICOND-NEXT: addi sp, sp, 16
793+ ; RV32ZDINX_NOZICOND-NEXT: ret
794+ entry:
795+ %sel = select i1 %cond , half %val , half 0xH0000
796+ %add = fadd half %sel , 1 .0
797+ ret half %add
798+ }
0 commit comments