@@ -636,3 +636,167 @@ entry:
636636 %sel = select i1 %cond , half %val , half 0xH0000
637637 ret half %sel
638638}
639+
640+ ; -----------------------------------------------------------------------------
641+ ; Test select with i1 condition and zero value for half fp, feeding into fadd ((cond ? a : 0) + 1.0)
642+ ; -----------------------------------------------------------------------------
643+ define half @select_i1_half_0_add (i1 %cond , half %val ) nounwind {
644+ ; RV64ZDINX_ZICOND-LABEL: select_i1_half_0_add:
645+ ; RV64ZDINX_ZICOND: # %bb.0: # %entry
646+ ; RV64ZDINX_ZICOND-NEXT: addi sp, sp, -16
647+ ; RV64ZDINX_ZICOND-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
648+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
649+ ; RV64ZDINX_ZICOND-NEXT: andi a0, a0, 1
650+ ; RV64ZDINX_ZICOND-NEXT: czero.eqz a0, a1, a0
651+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
652+ ; RV64ZDINX_ZICOND-NEXT: call __extendhfsf2
653+ ; RV64ZDINX_ZICOND-NEXT: lui a1, 260096
654+ ; RV64ZDINX_ZICOND-NEXT: fadd.s a0, a0, a1
655+ ; RV64ZDINX_ZICOND-NEXT: call __truncsfhf2
656+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
657+ ; RV64ZDINX_ZICOND-NEXT: lui a1, 1048560
658+ ; RV64ZDINX_ZICOND-NEXT: or a0, a0, a1
659+ ; RV64ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
660+ ; RV64ZDINX_ZICOND-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
661+ ; RV64ZDINX_ZICOND-NEXT: addi sp, sp, 16
662+ ; RV64ZDINX_ZICOND-NEXT: ret
663+ ;
664+ ; RV64ZDINX_NOZICOND-LABEL: select_i1_half_0_add:
665+ ; RV64ZDINX_NOZICOND: # %bb.0: # %entry
666+ ; RV64ZDINX_NOZICOND-NEXT: addi sp, sp, -16
667+ ; RV64ZDINX_NOZICOND-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
668+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
669+ ; RV64ZDINX_NOZICOND-NEXT: slli a0, a0, 63
670+ ; RV64ZDINX_NOZICOND-NEXT: srai a0, a0, 63
671+ ; RV64ZDINX_NOZICOND-NEXT: and a0, a0, a1
672+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
673+ ; RV64ZDINX_NOZICOND-NEXT: call __extendhfsf2
674+ ; RV64ZDINX_NOZICOND-NEXT: lui a1, 260096
675+ ; RV64ZDINX_NOZICOND-NEXT: fadd.s a0, a0, a1
676+ ; RV64ZDINX_NOZICOND-NEXT: call __truncsfhf2
677+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
678+ ; RV64ZDINX_NOZICOND-NEXT: lui a1, 1048560
679+ ; RV64ZDINX_NOZICOND-NEXT: or a0, a0, a1
680+ ; RV64ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
681+ ; RV64ZDINX_NOZICOND-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
682+ ; RV64ZDINX_NOZICOND-NEXT: addi sp, sp, 16
683+ ; RV64ZDINX_NOZICOND-NEXT: ret
684+ ;
685+ ; RV64ZHINX_ZICOND-LABEL: select_i1_half_0_add:
686+ ; RV64ZHINX_ZICOND: # %bb.0: # %entry
687+ ; RV64ZHINX_ZICOND-NEXT: # kill: def $x11_h killed $x11_h def $x11
688+ ; RV64ZHINX_ZICOND-NEXT: andi a0, a0, 1
689+ ; RV64ZHINX_ZICOND-NEXT: czero.eqz a0, a1, a0
690+ ; RV64ZHINX_ZICOND-NEXT: li a1, 15
691+ ; RV64ZHINX_ZICOND-NEXT: slli a1, a1, 10
692+ ; RV64ZHINX_ZICOND-NEXT: fadd.h a0, a0, a1
693+ ; RV64ZHINX_ZICOND-NEXT: ret
694+ ;
695+ ; RV64FD-LABEL: select_i1_half_0_add:
696+ ; RV64FD: # %bb.0: # %entry
697+ ; RV64FD-NEXT: addi sp, sp, -16
698+ ; RV64FD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
699+ ; RV64FD-NEXT: fmv.x.w a1, fa0
700+ ; RV64FD-NEXT: slli a0, a0, 63
701+ ; RV64FD-NEXT: srai a0, a0, 63
702+ ; RV64FD-NEXT: and a0, a0, a1
703+ ; RV64FD-NEXT: fmv.w.x fa0, a0
704+ ; RV64FD-NEXT: call __extendhfsf2
705+ ; RV64FD-NEXT: lui a0, 260096
706+ ; RV64FD-NEXT: fmv.w.x fa5, a0
707+ ; RV64FD-NEXT: fadd.s fa0, fa0, fa5
708+ ; RV64FD-NEXT: call __truncsfhf2
709+ ; RV64FD-NEXT: fmv.x.w a0, fa0
710+ ; RV64FD-NEXT: lui a1, 1048560
711+ ; RV64FD-NEXT: or a0, a0, a1
712+ ; RV64FD-NEXT: fmv.w.x fa0, a0
713+ ; RV64FD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
714+ ; RV64FD-NEXT: addi sp, sp, 16
715+ ; RV64FD-NEXT: ret
716+ ;
717+ ; RV32ZFINX_ZICOND-LABEL: select_i1_half_0_add:
718+ ; RV32ZFINX_ZICOND: # %bb.0: # %entry
719+ ; RV32ZFINX_ZICOND-NEXT: addi sp, sp, -16
720+ ; RV32ZFINX_ZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
721+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
722+ ; RV32ZFINX_ZICOND-NEXT: andi a0, a0, 1
723+ ; RV32ZFINX_ZICOND-NEXT: czero.eqz a0, a1, a0
724+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
725+ ; RV32ZFINX_ZICOND-NEXT: call __extendhfsf2
726+ ; RV32ZFINX_ZICOND-NEXT: lui a1, 260096
727+ ; RV32ZFINX_ZICOND-NEXT: fadd.s a0, a0, a1
728+ ; RV32ZFINX_ZICOND-NEXT: call __truncsfhf2
729+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
730+ ; RV32ZFINX_ZICOND-NEXT: lui a1, 1048560
731+ ; RV32ZFINX_ZICOND-NEXT: or a0, a0, a1
732+ ; RV32ZFINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
733+ ; RV32ZFINX_ZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
734+ ; RV32ZFINX_ZICOND-NEXT: addi sp, sp, 16
735+ ; RV32ZFINX_ZICOND-NEXT: ret
736+ ;
737+ ; RV32ZFINX_NOZICOND-LABEL: select_i1_half_0_add:
738+ ; RV32ZFINX_NOZICOND: # %bb.0: # %entry
739+ ; RV32ZFINX_NOZICOND-NEXT: addi sp, sp, -16
740+ ; RV32ZFINX_NOZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
741+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
742+ ; RV32ZFINX_NOZICOND-NEXT: slli a0, a0, 31
743+ ; RV32ZFINX_NOZICOND-NEXT: srai a0, a0, 31
744+ ; RV32ZFINX_NOZICOND-NEXT: and a0, a0, a1
745+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
746+ ; RV32ZFINX_NOZICOND-NEXT: call __extendhfsf2
747+ ; RV32ZFINX_NOZICOND-NEXT: lui a1, 260096
748+ ; RV32ZFINX_NOZICOND-NEXT: fadd.s a0, a0, a1
749+ ; RV32ZFINX_NOZICOND-NEXT: call __truncsfhf2
750+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
751+ ; RV32ZFINX_NOZICOND-NEXT: lui a1, 1048560
752+ ; RV32ZFINX_NOZICOND-NEXT: or a0, a0, a1
753+ ; RV32ZFINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
754+ ; RV32ZFINX_NOZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
755+ ; RV32ZFINX_NOZICOND-NEXT: addi sp, sp, 16
756+ ; RV32ZFINX_NOZICOND-NEXT: ret
757+ ;
758+ ; RV32ZDINX_ZICOND-LABEL: select_i1_half_0_add:
759+ ; RV32ZDINX_ZICOND: # %bb.0: # %entry
760+ ; RV32ZDINX_ZICOND-NEXT: addi sp, sp, -16
761+ ; RV32ZDINX_ZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
762+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
763+ ; RV32ZDINX_ZICOND-NEXT: andi a0, a0, 1
764+ ; RV32ZDINX_ZICOND-NEXT: czero.eqz a0, a1, a0
765+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
766+ ; RV32ZDINX_ZICOND-NEXT: call __extendhfsf2
767+ ; RV32ZDINX_ZICOND-NEXT: lui a1, 260096
768+ ; RV32ZDINX_ZICOND-NEXT: fadd.s a0, a0, a1
769+ ; RV32ZDINX_ZICOND-NEXT: call __truncsfhf2
770+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
771+ ; RV32ZDINX_ZICOND-NEXT: lui a1, 1048560
772+ ; RV32ZDINX_ZICOND-NEXT: or a0, a0, a1
773+ ; RV32ZDINX_ZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
774+ ; RV32ZDINX_ZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
775+ ; RV32ZDINX_ZICOND-NEXT: addi sp, sp, 16
776+ ; RV32ZDINX_ZICOND-NEXT: ret
777+ ;
778+ ; RV32ZDINX_NOZICOND-LABEL: select_i1_half_0_add:
779+ ; RV32ZDINX_NOZICOND: # %bb.0: # %entry
780+ ; RV32ZDINX_NOZICOND-NEXT: addi sp, sp, -16
781+ ; RV32ZDINX_NOZICOND-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
782+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x11_w killed $x11_w def $x11
783+ ; RV32ZDINX_NOZICOND-NEXT: slli a0, a0, 31
784+ ; RV32ZDINX_NOZICOND-NEXT: srai a0, a0, 31
785+ ; RV32ZDINX_NOZICOND-NEXT: and a0, a0, a1
786+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
787+ ; RV32ZDINX_NOZICOND-NEXT: call __extendhfsf2
788+ ; RV32ZDINX_NOZICOND-NEXT: lui a1, 260096
789+ ; RV32ZDINX_NOZICOND-NEXT: fadd.s a0, a0, a1
790+ ; RV32ZDINX_NOZICOND-NEXT: call __truncsfhf2
791+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w def $x10
792+ ; RV32ZDINX_NOZICOND-NEXT: lui a1, 1048560
793+ ; RV32ZDINX_NOZICOND-NEXT: or a0, a0, a1
794+ ; RV32ZDINX_NOZICOND-NEXT: # kill: def $x10_w killed $x10_w killed $x10
795+ ; RV32ZDINX_NOZICOND-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
796+ ; RV32ZDINX_NOZICOND-NEXT: addi sp, sp, 16
797+ ; RV32ZDINX_NOZICOND-NEXT: ret
798+ entry:
799+ %sel = select i1 %cond , half %val , half 0xH0000
800+ %add = fadd half %sel , 1 .0
801+ ret half %add
802+ }
0 commit comments