Skip to content

Commit c8591e4

Browse files
committed
[RISCV] Support scalar llvm.fmodf intrinsic.
1 parent ab2c4a0 commit c8591e4

File tree

10 files changed

+659
-4
lines changed

10 files changed

+659
-4
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
629629
getActionDefinitionsBuilder({G_FCOS, G_FSIN, G_FTAN, G_FPOW, G_FLOG, G_FLOG2,
630630
G_FLOG10, G_FEXP, G_FEXP2, G_FEXP10, G_FACOS,
631631
G_FASIN, G_FATAN, G_FATAN2, G_FCOSH, G_FSINH,
632-
G_FTANH})
632+
G_FTANH, G_FMODF})
633633
.libcallFor({s32, s64})
634634
.libcallFor(ST.is64Bit(), {s128});
635635
getActionDefinitionsBuilder({G_FPOWI, G_FLDEXP})

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
533533
setOperationAction({ISD::FREM, ISD::FPOW, ISD::FPOWI,
534534
ISD::FCOS, ISD::FSIN, ISD::FSINCOS, ISD::FEXP,
535535
ISD::FEXP2, ISD::FEXP10, ISD::FLOG, ISD::FLOG2,
536-
ISD::FLOG10, ISD::FLDEXP, ISD::FFREXP},
536+
ISD::FLOG10, ISD::FLDEXP, ISD::FFREXP, ISD::FMODF},
537537
MVT::f16, Promote);
538538

539539
// FIXME: Need to promote f16 STRICT_* to f32 libcalls, but we don't have

llvm/test/CodeGen/RISCV/GlobalISel/double-intrinsics.ll

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,3 +1420,79 @@ define double @tanh_f64(double %a) nounwind {
14201420
%1 = call double @llvm.tanh.f64(double %a)
14211421
ret double %1
14221422
}
1423+
1424+
define { double, double } @test_modf_f64(double %a) {
1425+
; RV32IFD-LABEL: test_modf_f64:
1426+
; RV32IFD: # %bb.0:
1427+
; RV32IFD-NEXT: addi sp, sp, -16
1428+
; RV32IFD-NEXT: .cfi_def_cfa_offset 16
1429+
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1430+
; RV32IFD-NEXT: .cfi_offset ra, -4
1431+
; RV32IFD-NEXT: mv a0, sp
1432+
; RV32IFD-NEXT: call modf
1433+
; RV32IFD-NEXT: fld fa1, 0(sp)
1434+
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1435+
; RV32IFD-NEXT: .cfi_restore ra
1436+
; RV32IFD-NEXT: addi sp, sp, 16
1437+
; RV32IFD-NEXT: .cfi_def_cfa_offset 0
1438+
; RV32IFD-NEXT: ret
1439+
;
1440+
; RV64IFD-LABEL: test_modf_f64:
1441+
; RV64IFD: # %bb.0:
1442+
; RV64IFD-NEXT: addi sp, sp, -16
1443+
; RV64IFD-NEXT: .cfi_def_cfa_offset 16
1444+
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1445+
; RV64IFD-NEXT: .cfi_offset ra, -8
1446+
; RV64IFD-NEXT: mv a0, sp
1447+
; RV64IFD-NEXT: call modf
1448+
; RV64IFD-NEXT: fld fa1, 0(sp)
1449+
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1450+
; RV64IFD-NEXT: .cfi_restore ra
1451+
; RV64IFD-NEXT: addi sp, sp, 16
1452+
; RV64IFD-NEXT: .cfi_def_cfa_offset 0
1453+
; RV64IFD-NEXT: ret
1454+
;
1455+
; RV32I-LABEL: test_modf_f64:
1456+
; RV32I: # %bb.0:
1457+
; RV32I-NEXT: addi sp, sp, -16
1458+
; RV32I-NEXT: .cfi_def_cfa_offset 16
1459+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1460+
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
1461+
; RV32I-NEXT: .cfi_offset ra, -4
1462+
; RV32I-NEXT: .cfi_offset s0, -8
1463+
; RV32I-NEXT: mv s0, a0
1464+
; RV32I-NEXT: mv a0, a1
1465+
; RV32I-NEXT: mv a1, a2
1466+
; RV32I-NEXT: mv a2, sp
1467+
; RV32I-NEXT: call modf
1468+
; RV32I-NEXT: lw a2, 0(sp)
1469+
; RV32I-NEXT: lw a3, 4(sp)
1470+
; RV32I-NEXT: sw a0, 0(s0)
1471+
; RV32I-NEXT: sw a1, 4(s0)
1472+
; RV32I-NEXT: sw a2, 8(s0)
1473+
; RV32I-NEXT: sw a3, 12(s0)
1474+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1475+
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
1476+
; RV32I-NEXT: .cfi_restore ra
1477+
; RV32I-NEXT: .cfi_restore s0
1478+
; RV32I-NEXT: addi sp, sp, 16
1479+
; RV32I-NEXT: .cfi_def_cfa_offset 0
1480+
; RV32I-NEXT: ret
1481+
;
1482+
; RV64I-LABEL: test_modf_f64:
1483+
; RV64I: # %bb.0:
1484+
; RV64I-NEXT: addi sp, sp, -16
1485+
; RV64I-NEXT: .cfi_def_cfa_offset 16
1486+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1487+
; RV64I-NEXT: .cfi_offset ra, -8
1488+
; RV64I-NEXT: mv a1, sp
1489+
; RV64I-NEXT: call modf
1490+
; RV64I-NEXT: ld a1, 0(sp)
1491+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1492+
; RV64I-NEXT: .cfi_restore ra
1493+
; RV64I-NEXT: addi sp, sp, 16
1494+
; RV64I-NEXT: .cfi_def_cfa_offset 0
1495+
; RV64I-NEXT: ret
1496+
%result = call { double, double } @llvm.modf.f64(double %a)
1497+
ret { double, double } %result
1498+
}

llvm/test/CodeGen/RISCV/GlobalISel/float-intrinsics.ll

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2118,3 +2118,82 @@ define float @tanh_f32(float %a) nounwind {
21182118
%1 = call float @llvm.tanh.f32(float %a)
21192119
ret float %1
21202120
}
2121+
2122+
define { float, float } @test_modf_f32(float %a) {
2123+
; RV32IF-LABEL: test_modf_f32:
2124+
; RV32IF: # %bb.0:
2125+
; RV32IF-NEXT: addi sp, sp, -16
2126+
; RV32IF-NEXT: .cfi_def_cfa_offset 16
2127+
; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2128+
; RV32IF-NEXT: .cfi_offset ra, -4
2129+
; RV32IF-NEXT: addi a0, sp, 8
2130+
; RV32IF-NEXT: call modff
2131+
; RV32IF-NEXT: flw fa1, 8(sp)
2132+
; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2133+
; RV32IF-NEXT: .cfi_restore ra
2134+
; RV32IF-NEXT: addi sp, sp, 16
2135+
; RV32IF-NEXT: .cfi_def_cfa_offset 0
2136+
; RV32IF-NEXT: ret
2137+
;
2138+
; RV64IF-LABEL: test_modf_f32:
2139+
; RV64IF: # %bb.0:
2140+
; RV64IF-NEXT: addi sp, sp, -16
2141+
; RV64IF-NEXT: .cfi_def_cfa_offset 16
2142+
; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2143+
; RV64IF-NEXT: .cfi_offset ra, -8
2144+
; RV64IF-NEXT: addi a0, sp, 4
2145+
; RV64IF-NEXT: call modff
2146+
; RV64IF-NEXT: flw fa1, 4(sp)
2147+
; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2148+
; RV64IF-NEXT: .cfi_restore ra
2149+
; RV64IF-NEXT: addi sp, sp, 16
2150+
; RV64IF-NEXT: .cfi_def_cfa_offset 0
2151+
; RV64IF-NEXT: ret
2152+
;
2153+
; RV64IFD-LABEL: test_modf_f32:
2154+
; RV64IFD: # %bb.0:
2155+
; RV64IFD-NEXT: addi sp, sp, -16
2156+
; RV64IFD-NEXT: .cfi_def_cfa_offset 16
2157+
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2158+
; RV64IFD-NEXT: .cfi_offset ra, -8
2159+
; RV64IFD-NEXT: addi a0, sp, 4
2160+
; RV64IFD-NEXT: call modff
2161+
; RV64IFD-NEXT: flw fa1, 4(sp)
2162+
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2163+
; RV64IFD-NEXT: .cfi_restore ra
2164+
; RV64IFD-NEXT: addi sp, sp, 16
2165+
; RV64IFD-NEXT: .cfi_def_cfa_offset 0
2166+
; RV64IFD-NEXT: ret
2167+
;
2168+
; RV32I-LABEL: test_modf_f32:
2169+
; RV32I: # %bb.0:
2170+
; RV32I-NEXT: addi sp, sp, -16
2171+
; RV32I-NEXT: .cfi_def_cfa_offset 16
2172+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2173+
; RV32I-NEXT: .cfi_offset ra, -4
2174+
; RV32I-NEXT: addi a1, sp, 8
2175+
; RV32I-NEXT: call modff
2176+
; RV32I-NEXT: lw a1, 8(sp)
2177+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2178+
; RV32I-NEXT: .cfi_restore ra
2179+
; RV32I-NEXT: addi sp, sp, 16
2180+
; RV32I-NEXT: .cfi_def_cfa_offset 0
2181+
; RV32I-NEXT: ret
2182+
;
2183+
; RV64I-LABEL: test_modf_f32:
2184+
; RV64I: # %bb.0:
2185+
; RV64I-NEXT: addi sp, sp, -16
2186+
; RV64I-NEXT: .cfi_def_cfa_offset 16
2187+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2188+
; RV64I-NEXT: .cfi_offset ra, -8
2189+
; RV64I-NEXT: addi a1, sp, 4
2190+
; RV64I-NEXT: call modff
2191+
; RV64I-NEXT: lw a1, 4(sp)
2192+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2193+
; RV64I-NEXT: .cfi_restore ra
2194+
; RV64I-NEXT: addi sp, sp, 16
2195+
; RV64I-NEXT: .cfi_def_cfa_offset 0
2196+
; RV64I-NEXT: ret
2197+
%result = call { float, float } @llvm.modf.f32(float %a)
2198+
ret { float, float } %result
2199+
}

llvm/test/CodeGen/RISCV/GlobalISel/fp128.ll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,3 +911,34 @@ define fp128 @tanh(fp128 %a) nounwind {
911911
%1 = call fp128 @llvm.tanh.f128(fp128 %a)
912912
ret fp128 %1
913913
}
914+
915+
define { fp128, fp128 } @modf(fp128 %a) {
916+
; CHECK-LABEL: modf:
917+
; CHECK: # %bb.0:
918+
; CHECK-NEXT: addi sp, sp, -32
919+
; CHECK-NEXT: .cfi_def_cfa_offset 32
920+
; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
921+
; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
922+
; CHECK-NEXT: .cfi_offset ra, -8
923+
; CHECK-NEXT: .cfi_offset s0, -16
924+
; CHECK-NEXT: mv s0, a0
925+
; CHECK-NEXT: mv a0, a1
926+
; CHECK-NEXT: mv a1, a2
927+
; CHECK-NEXT: mv a2, sp
928+
; CHECK-NEXT: call modfl
929+
; CHECK-NEXT: ld a2, 0(sp)
930+
; CHECK-NEXT: ld a3, 8(sp)
931+
; CHECK-NEXT: sd a0, 0(s0)
932+
; CHECK-NEXT: sd a1, 8(s0)
933+
; CHECK-NEXT: sd a2, 16(s0)
934+
; CHECK-NEXT: sd a3, 24(s0)
935+
; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
936+
; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
937+
; CHECK-NEXT: .cfi_restore ra
938+
; CHECK-NEXT: .cfi_restore s0
939+
; CHECK-NEXT: addi sp, sp, 32
940+
; CHECK-NEXT: .cfi_def_cfa_offset 0
941+
; CHECK-NEXT: ret
942+
%result = call { fp128, fp128 } @llvm.modf.f128(fp128 %a)
943+
ret { fp128, fp128 } %result
944+
}

llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,9 @@
506506
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
507507
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
508508
# DEBUG-NEXT: G_FMODF (opcode {{[0-9]+}}): 1 type index, 0 imm indices
509-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
510-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
509+
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
510+
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
511+
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
511512
# DEBUG-NEXT: G_FPOW (opcode {{[0-9]+}}): 1 type index, 0 imm indices
512513
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
513514
# DEBUG-NEXT: .. the first uncovered type index: 1, OK

llvm/test/CodeGen/RISCV/double-intrinsics.ll

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,3 +2109,111 @@ define double @tanh_f64(double %a) nounwind {
21092109
%1 = call double @llvm.tanh.f64(double %a)
21102110
ret double %1
21112111
}
2112+
2113+
define { double, double } @test_modf_f64(double %a) {
2114+
; RV32IFD-LABEL: test_modf_f64:
2115+
; RV32IFD: # %bb.0:
2116+
; RV32IFD-NEXT: addi sp, sp, -16
2117+
; RV32IFD-NEXT: .cfi_def_cfa_offset 16
2118+
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2119+
; RV32IFD-NEXT: .cfi_offset ra, -4
2120+
; RV32IFD-NEXT: mv a0, sp
2121+
; RV32IFD-NEXT: call modf
2122+
; RV32IFD-NEXT: fld fa1, 0(sp)
2123+
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2124+
; RV32IFD-NEXT: .cfi_restore ra
2125+
; RV32IFD-NEXT: addi sp, sp, 16
2126+
; RV32IFD-NEXT: .cfi_def_cfa_offset 0
2127+
; RV32IFD-NEXT: ret
2128+
;
2129+
; RV64IFD-LABEL: test_modf_f64:
2130+
; RV64IFD: # %bb.0:
2131+
; RV64IFD-NEXT: addi sp, sp, -16
2132+
; RV64IFD-NEXT: .cfi_def_cfa_offset 16
2133+
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2134+
; RV64IFD-NEXT: .cfi_offset ra, -8
2135+
; RV64IFD-NEXT: mv a0, sp
2136+
; RV64IFD-NEXT: call modf
2137+
; RV64IFD-NEXT: fld fa1, 0(sp)
2138+
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2139+
; RV64IFD-NEXT: .cfi_restore ra
2140+
; RV64IFD-NEXT: addi sp, sp, 16
2141+
; RV64IFD-NEXT: .cfi_def_cfa_offset 0
2142+
; RV64IFD-NEXT: ret
2143+
;
2144+
; RV32IZFINXZDINX-LABEL: test_modf_f64:
2145+
; RV32IZFINXZDINX: # %bb.0:
2146+
; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
2147+
; RV32IZFINXZDINX-NEXT: .cfi_def_cfa_offset 16
2148+
; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2149+
; RV32IZFINXZDINX-NEXT: .cfi_offset ra, -4
2150+
; RV32IZFINXZDINX-NEXT: mv a2, sp
2151+
; RV32IZFINXZDINX-NEXT: call modf
2152+
; RV32IZFINXZDINX-NEXT: lw a2, 0(sp)
2153+
; RV32IZFINXZDINX-NEXT: lw a3, 4(sp)
2154+
; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2155+
; RV32IZFINXZDINX-NEXT: .cfi_restore ra
2156+
; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
2157+
; RV32IZFINXZDINX-NEXT: .cfi_def_cfa_offset 0
2158+
; RV32IZFINXZDINX-NEXT: ret
2159+
;
2160+
; RV64IZFINXZDINX-LABEL: test_modf_f64:
2161+
; RV64IZFINXZDINX: # %bb.0:
2162+
; RV64IZFINXZDINX-NEXT: addi sp, sp, -16
2163+
; RV64IZFINXZDINX-NEXT: .cfi_def_cfa_offset 16
2164+
; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2165+
; RV64IZFINXZDINX-NEXT: .cfi_offset ra, -8
2166+
; RV64IZFINXZDINX-NEXT: mv a1, sp
2167+
; RV64IZFINXZDINX-NEXT: call modf
2168+
; RV64IZFINXZDINX-NEXT: ld a1, 0(sp)
2169+
; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2170+
; RV64IZFINXZDINX-NEXT: .cfi_restore ra
2171+
; RV64IZFINXZDINX-NEXT: addi sp, sp, 16
2172+
; RV64IZFINXZDINX-NEXT: .cfi_def_cfa_offset 0
2173+
; RV64IZFINXZDINX-NEXT: ret
2174+
;
2175+
; RV32I-LABEL: test_modf_f64:
2176+
; RV32I: # %bb.0:
2177+
; RV32I-NEXT: addi sp, sp, -16
2178+
; RV32I-NEXT: .cfi_def_cfa_offset 16
2179+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2180+
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
2181+
; RV32I-NEXT: .cfi_offset ra, -4
2182+
; RV32I-NEXT: .cfi_offset s0, -8
2183+
; RV32I-NEXT: mv a3, a2
2184+
; RV32I-NEXT: mv s0, a0
2185+
; RV32I-NEXT: mv a2, sp
2186+
; RV32I-NEXT: mv a0, a1
2187+
; RV32I-NEXT: mv a1, a3
2188+
; RV32I-NEXT: call modf
2189+
; RV32I-NEXT: lw a2, 0(sp)
2190+
; RV32I-NEXT: lw a3, 4(sp)
2191+
; RV32I-NEXT: sw a0, 0(s0)
2192+
; RV32I-NEXT: sw a1, 4(s0)
2193+
; RV32I-NEXT: sw a2, 8(s0)
2194+
; RV32I-NEXT: sw a3, 12(s0)
2195+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2196+
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
2197+
; RV32I-NEXT: .cfi_restore ra
2198+
; RV32I-NEXT: .cfi_restore s0
2199+
; RV32I-NEXT: addi sp, sp, 16
2200+
; RV32I-NEXT: .cfi_def_cfa_offset 0
2201+
; RV32I-NEXT: ret
2202+
;
2203+
; RV64I-LABEL: test_modf_f64:
2204+
; RV64I: # %bb.0:
2205+
; RV64I-NEXT: addi sp, sp, -16
2206+
; RV64I-NEXT: .cfi_def_cfa_offset 16
2207+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2208+
; RV64I-NEXT: .cfi_offset ra, -8
2209+
; RV64I-NEXT: mv a1, sp
2210+
; RV64I-NEXT: call modf
2211+
; RV64I-NEXT: ld a1, 0(sp)
2212+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2213+
; RV64I-NEXT: .cfi_restore ra
2214+
; RV64I-NEXT: addi sp, sp, 16
2215+
; RV64I-NEXT: .cfi_def_cfa_offset 0
2216+
; RV64I-NEXT: ret
2217+
%result = call { double, double } @llvm.modf.f64(double %a)
2218+
ret { double, double } %result
2219+
}

0 commit comments

Comments
 (0)