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