Skip to content

Commit efca401

Browse files
committed
Add test for F16 select feeding into arithmetic op
1 parent 802d55b commit efca401

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed

llvm/test/CodeGen/RISCV/zicond-fp-select-zfinx.ll

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)