xref: /llvm-project/llvm/test/CodeGen/RISCV/frm-dependency.ll (revision f69078b77f6354e51715499f71d8923938399fad)
13f1c403aSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
23f1c403aSCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+f,+d -stop-after=finalize-isel < %s \
3*f69078b7SCraig Topper; RUN:   -target-abi=ilp32d | FileCheck -check-prefixes=RV32IF %s
43f1c403aSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+f,+d -stop-after=finalize-isel < %s \
5*f69078b7SCraig Topper; RUN:   -target-abi=lp64d | FileCheck -check-prefixes=RV64IF %s
63f1c403aSCraig Topper
73f1c403aSCraig Topper; Make sure an implicit FRM dependency is added to instructions with dynamic
83f1c403aSCraig Topper; rounding.
93f1c403aSCraig Topper
103f1c403aSCraig Topperdefine float @fadd_s(float %a, float %b) nounwind {
113f1c403aSCraig Topper  ; RV32IF-LABEL: name: fadd_s
123f1c403aSCraig Topper  ; RV32IF: bb.0 (%ir-block.0):
13*f69078b7SCraig Topper  ; RV32IF-NEXT:   liveins: $f10_f, $f11_f
143f1c403aSCraig Topper  ; RV32IF-NEXT: {{  $}}
15*f69078b7SCraig Topper  ; RV32IF-NEXT:   [[COPY:%[0-9]+]]:fpr32 = COPY $f11_f
16*f69078b7SCraig Topper  ; RV32IF-NEXT:   [[COPY1:%[0-9]+]]:fpr32 = COPY $f10_f
17*f69078b7SCraig Topper  ; RV32IF-NEXT:   %2:fpr32 = nofpexcept FADD_S [[COPY1]], [[COPY]], 7, implicit $frm
18*f69078b7SCraig Topper  ; RV32IF-NEXT:   $f10_f = COPY %2
19*f69078b7SCraig Topper  ; RV32IF-NEXT:   PseudoRET implicit $f10_f
203f1c403aSCraig Topper  ; RV64IF-LABEL: name: fadd_s
213f1c403aSCraig Topper  ; RV64IF: bb.0 (%ir-block.0):
22*f69078b7SCraig Topper  ; RV64IF-NEXT:   liveins: $f10_f, $f11_f
233f1c403aSCraig Topper  ; RV64IF-NEXT: {{  $}}
24*f69078b7SCraig Topper  ; RV64IF-NEXT:   [[COPY:%[0-9]+]]:fpr32 = COPY $f11_f
25*f69078b7SCraig Topper  ; RV64IF-NEXT:   [[COPY1:%[0-9]+]]:fpr32 = COPY $f10_f
26*f69078b7SCraig Topper  ; RV64IF-NEXT:   %2:fpr32 = nofpexcept FADD_S [[COPY1]], [[COPY]], 7, implicit $frm
27*f69078b7SCraig Topper  ; RV64IF-NEXT:   $f10_f = COPY %2
28*f69078b7SCraig Topper  ; RV64IF-NEXT:   PseudoRET implicit $f10_f
293f1c403aSCraig Topper  %1 = fadd float %a, %b
303f1c403aSCraig Topper  ret float %1
313f1c403aSCraig Topper}
323f1c403aSCraig Topper
333f1c403aSCraig Topperdeclare float @llvm.fma.f32(float, float, float)
343f1c403aSCraig Topper
353f1c403aSCraig Topperdefine float @fmadd_s(float %a, float %b, float %c) nounwind {
363f1c403aSCraig Topper  ; RV32IF-LABEL: name: fmadd_s
373f1c403aSCraig Topper  ; RV32IF: bb.0 (%ir-block.0):
38*f69078b7SCraig Topper  ; RV32IF-NEXT:   liveins: $f10_f, $f11_f, $f12_f
393f1c403aSCraig Topper  ; RV32IF-NEXT: {{  $}}
40*f69078b7SCraig Topper  ; RV32IF-NEXT:   [[COPY:%[0-9]+]]:fpr32 = COPY $f12_f
41*f69078b7SCraig Topper  ; RV32IF-NEXT:   [[COPY1:%[0-9]+]]:fpr32 = COPY $f11_f
42*f69078b7SCraig Topper  ; RV32IF-NEXT:   [[COPY2:%[0-9]+]]:fpr32 = COPY $f10_f
43*f69078b7SCraig Topper  ; RV32IF-NEXT:   %3:fpr32 = nofpexcept FMADD_S [[COPY2]], [[COPY1]], [[COPY]], 7, implicit $frm
44*f69078b7SCraig Topper  ; RV32IF-NEXT:   $f10_f = COPY %3
45*f69078b7SCraig Topper  ; RV32IF-NEXT:   PseudoRET implicit $f10_f
463f1c403aSCraig Topper  ; RV64IF-LABEL: name: fmadd_s
473f1c403aSCraig Topper  ; RV64IF: bb.0 (%ir-block.0):
48*f69078b7SCraig Topper  ; RV64IF-NEXT:   liveins: $f10_f, $f11_f, $f12_f
493f1c403aSCraig Topper  ; RV64IF-NEXT: {{  $}}
50*f69078b7SCraig Topper  ; RV64IF-NEXT:   [[COPY:%[0-9]+]]:fpr32 = COPY $f12_f
51*f69078b7SCraig Topper  ; RV64IF-NEXT:   [[COPY1:%[0-9]+]]:fpr32 = COPY $f11_f
52*f69078b7SCraig Topper  ; RV64IF-NEXT:   [[COPY2:%[0-9]+]]:fpr32 = COPY $f10_f
53*f69078b7SCraig Topper  ; RV64IF-NEXT:   %3:fpr32 = nofpexcept FMADD_S [[COPY2]], [[COPY1]], [[COPY]], 7, implicit $frm
54*f69078b7SCraig Topper  ; RV64IF-NEXT:   $f10_f = COPY %3
55*f69078b7SCraig Topper  ; RV64IF-NEXT:   PseudoRET implicit $f10_f
563f1c403aSCraig Topper  %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
573f1c403aSCraig Topper  ret float %1
583f1c403aSCraig Topper}
593f1c403aSCraig Topper
603f1c403aSCraig Topper; This uses rtz instead of dyn rounding mode so shouldn't have an FRM dependncy.
613f1c403aSCraig Topperdefine i32 @fcvt_w_s(float %a) nounwind {
623f1c403aSCraig Topper  ; RV32IF-LABEL: name: fcvt_w_s
633f1c403aSCraig Topper  ; RV32IF: bb.0 (%ir-block.0):
64*f69078b7SCraig Topper  ; RV32IF-NEXT:   liveins: $f10_f
653f1c403aSCraig Topper  ; RV32IF-NEXT: {{  $}}
66*f69078b7SCraig Topper  ; RV32IF-NEXT:   [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
67*f69078b7SCraig Topper  ; RV32IF-NEXT:   %1:gpr = nofpexcept FCVT_W_S [[COPY]], 1
68*f69078b7SCraig Topper  ; RV32IF-NEXT:   $x10 = COPY %1
693f1c403aSCraig Topper  ; RV32IF-NEXT:   PseudoRET implicit $x10
703f1c403aSCraig Topper  ; RV64IF-LABEL: name: fcvt_w_s
713f1c403aSCraig Topper  ; RV64IF: bb.0 (%ir-block.0):
72*f69078b7SCraig Topper  ; RV64IF-NEXT:   liveins: $f10_f
733f1c403aSCraig Topper  ; RV64IF-NEXT: {{  $}}
74*f69078b7SCraig Topper  ; RV64IF-NEXT:   [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
75*f69078b7SCraig Topper  ; RV64IF-NEXT:   %1:gpr = nofpexcept FCVT_W_S [[COPY]], 1
76*f69078b7SCraig Topper  ; RV64IF-NEXT:   $x10 = COPY %1
773f1c403aSCraig Topper  ; RV64IF-NEXT:   PseudoRET implicit $x10
783f1c403aSCraig Topper  %1 = fptosi float %a to i32
793f1c403aSCraig Topper  ret i32 %1
803f1c403aSCraig Topper}
813f1c403aSCraig Topper
823f1c403aSCraig Topper; This doesn't use a rounding mode since i32 can be represented exactly as a
833f1c403aSCraig Topper; double.
843f1c403aSCraig Topperdefine double @fcvt_d_w(i32 %a) nounwind {
853f1c403aSCraig Topper  ; RV32IF-LABEL: name: fcvt_d_w
863f1c403aSCraig Topper  ; RV32IF: bb.0 (%ir-block.0):
873f1c403aSCraig Topper  ; RV32IF-NEXT:   liveins: $x10
883f1c403aSCraig Topper  ; RV32IF-NEXT: {{  $}}
893f1c403aSCraig Topper  ; RV32IF-NEXT:   [[COPY:%[0-9]+]]:gpr = COPY $x10
903f1c403aSCraig Topper  ; RV32IF-NEXT:   %1:fpr64 = nofpexcept FCVT_D_W [[COPY]]
91*f69078b7SCraig Topper  ; RV32IF-NEXT:   $f10_d = COPY %1
92*f69078b7SCraig Topper  ; RV32IF-NEXT:   PseudoRET implicit $f10_d
933f1c403aSCraig Topper  ; RV64IF-LABEL: name: fcvt_d_w
943f1c403aSCraig Topper  ; RV64IF: bb.0 (%ir-block.0):
953f1c403aSCraig Topper  ; RV64IF-NEXT:   liveins: $x10
963f1c403aSCraig Topper  ; RV64IF-NEXT: {{  $}}
973f1c403aSCraig Topper  ; RV64IF-NEXT:   [[COPY:%[0-9]+]]:gpr = COPY $x10
983f1c403aSCraig Topper  ; RV64IF-NEXT:   %1:fpr64 = nofpexcept FCVT_D_W [[COPY]]
99*f69078b7SCraig Topper  ; RV64IF-NEXT:   $f10_d = COPY %1
100*f69078b7SCraig Topper  ; RV64IF-NEXT:   PseudoRET implicit $f10_d
1013f1c403aSCraig Topper  %1 = sitofp i32 %a to double
1023f1c403aSCraig Topper  ret double %1
1033f1c403aSCraig Topper}
104