Skip to content

Commit ef97fca

Browse files
committed
Add test for F16 select feeding into arithmetic op
1 parent 3b721ca commit ef97fca

File tree

1 file changed

+168
-8
lines changed

1 file changed

+168
-8
lines changed

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

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

Comments
 (0)