Skip to content

Commit ed6749a

Browse files
committed
[RISCV] Promote frexp with Zfh.
The default expansion tries to create an illegal integer type after legalization.
1 parent a5dd646 commit ed6749a

File tree

4 files changed

+288
-1
lines changed

4 files changed

+288
-1
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
498498
setOperationAction({ISD::FREM, ISD::FPOW, ISD::FPOWI,
499499
ISD::FCOS, ISD::FSIN, ISD::FSINCOS, ISD::FEXP,
500500
ISD::FEXP2, ISD::FEXP10, ISD::FLOG, ISD::FLOG2,
501-
ISD::FLOG10, ISD::FLDEXP},
501+
ISD::FLOG10, ISD::FLDEXP, ISD::FFREXP},
502502
MVT::f16, Promote);
503503

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

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

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,3 +1690,82 @@ define double @ldexp_double(double %x, i32 signext %y) nounwind {
16901690
%z = call double @llvm.ldexp.f64.i32(double %x, i32 %y)
16911691
ret double %z
16921692
}
1693+
1694+
define {double, i32} @frexp_double(double %x) nounwind {
1695+
; RV32IFD-LABEL: frexp_double:
1696+
; RV32IFD: # %bb.0:
1697+
; RV32IFD-NEXT: addi sp, sp, -16
1698+
; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1699+
; RV32IFD-NEXT: addi a0, sp, 8
1700+
; RV32IFD-NEXT: call frexp
1701+
; RV32IFD-NEXT: lw a0, 8(sp)
1702+
; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1703+
; RV32IFD-NEXT: addi sp, sp, 16
1704+
; RV32IFD-NEXT: ret
1705+
;
1706+
; RV64IFD-LABEL: frexp_double:
1707+
; RV64IFD: # %bb.0:
1708+
; RV64IFD-NEXT: addi sp, sp, -16
1709+
; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1710+
; RV64IFD-NEXT: mv a0, sp
1711+
; RV64IFD-NEXT: call frexp
1712+
; RV64IFD-NEXT: ld a0, 0(sp)
1713+
; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1714+
; RV64IFD-NEXT: addi sp, sp, 16
1715+
; RV64IFD-NEXT: ret
1716+
;
1717+
; RV32IZFINXZDINX-LABEL: frexp_double:
1718+
; RV32IZFINXZDINX: # %bb.0:
1719+
; RV32IZFINXZDINX-NEXT: addi sp, sp, -16
1720+
; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1721+
; RV32IZFINXZDINX-NEXT: addi a2, sp, 8
1722+
; RV32IZFINXZDINX-NEXT: call frexp
1723+
; RV32IZFINXZDINX-NEXT: lw a2, 8(sp)
1724+
; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1725+
; RV32IZFINXZDINX-NEXT: addi sp, sp, 16
1726+
; RV32IZFINXZDINX-NEXT: ret
1727+
;
1728+
; RV64IZFINXZDINX-LABEL: frexp_double:
1729+
; RV64IZFINXZDINX: # %bb.0:
1730+
; RV64IZFINXZDINX-NEXT: addi sp, sp, -16
1731+
; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1732+
; RV64IZFINXZDINX-NEXT: mv a1, sp
1733+
; RV64IZFINXZDINX-NEXT: call frexp
1734+
; RV64IZFINXZDINX-NEXT: ld a1, 0(sp)
1735+
; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1736+
; RV64IZFINXZDINX-NEXT: addi sp, sp, 16
1737+
; RV64IZFINXZDINX-NEXT: ret
1738+
;
1739+
; RV32I-LABEL: frexp_double:
1740+
; RV32I: # %bb.0:
1741+
; RV32I-NEXT: addi sp, sp, -16
1742+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1743+
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
1744+
; RV32I-NEXT: mv a3, a2
1745+
; RV32I-NEXT: mv s0, a0
1746+
; RV32I-NEXT: addi a2, sp, 4
1747+
; RV32I-NEXT: mv a0, a1
1748+
; RV32I-NEXT: mv a1, a3
1749+
; RV32I-NEXT: call frexp
1750+
; RV32I-NEXT: lw a2, 4(sp)
1751+
; RV32I-NEXT: sw a0, 0(s0)
1752+
; RV32I-NEXT: sw a1, 4(s0)
1753+
; RV32I-NEXT: sw a2, 8(s0)
1754+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1755+
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
1756+
; RV32I-NEXT: addi sp, sp, 16
1757+
; RV32I-NEXT: ret
1758+
;
1759+
; RV64I-LABEL: frexp_double:
1760+
; RV64I: # %bb.0:
1761+
; RV64I-NEXT: addi sp, sp, -16
1762+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1763+
; RV64I-NEXT: addi a1, sp, 4
1764+
; RV64I-NEXT: call frexp
1765+
; RV64I-NEXT: lw a1, 4(sp)
1766+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1767+
; RV64I-NEXT: addi sp, sp, 16
1768+
; RV64I-NEXT: ret
1769+
%a = call {double, i32} @llvm.frexp.f64.i32(double %x)
1770+
ret {double, i32} %a
1771+
}

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,3 +2290,73 @@ define float @ldexp_float(float %x, i32 signext %y) nounwind {
22902290
%z = call float @llvm.ldexp.f32.i32(float %x, i32 %y)
22912291
ret float %z
22922292
}
2293+
2294+
define {float, i32} @frexp_float(float %x) nounwind {
2295+
; RV32IF-LABEL: frexp_float:
2296+
; RV32IF: # %bb.0:
2297+
; RV32IF-NEXT: addi sp, sp, -16
2298+
; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2299+
; RV32IF-NEXT: addi a0, sp, 8
2300+
; RV32IF-NEXT: call frexpf
2301+
; RV32IF-NEXT: lw a0, 8(sp)
2302+
; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2303+
; RV32IF-NEXT: addi sp, sp, 16
2304+
; RV32IF-NEXT: ret
2305+
;
2306+
; RV32IZFINX-LABEL: frexp_float:
2307+
; RV32IZFINX: # %bb.0:
2308+
; RV32IZFINX-NEXT: addi sp, sp, -16
2309+
; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2310+
; RV32IZFINX-NEXT: addi a1, sp, 8
2311+
; RV32IZFINX-NEXT: call frexpf
2312+
; RV32IZFINX-NEXT: lw a1, 8(sp)
2313+
; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2314+
; RV32IZFINX-NEXT: addi sp, sp, 16
2315+
; RV32IZFINX-NEXT: ret
2316+
;
2317+
; RV64IF-LABEL: frexp_float:
2318+
; RV64IF: # %bb.0:
2319+
; RV64IF-NEXT: addi sp, sp, -16
2320+
; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2321+
; RV64IF-NEXT: mv a0, sp
2322+
; RV64IF-NEXT: call frexpf
2323+
; RV64IF-NEXT: ld a0, 0(sp)
2324+
; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2325+
; RV64IF-NEXT: addi sp, sp, 16
2326+
; RV64IF-NEXT: ret
2327+
;
2328+
; RV64IZFINX-LABEL: frexp_float:
2329+
; RV64IZFINX: # %bb.0:
2330+
; RV64IZFINX-NEXT: addi sp, sp, -16
2331+
; RV64IZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2332+
; RV64IZFINX-NEXT: mv a1, sp
2333+
; RV64IZFINX-NEXT: call frexpf
2334+
; RV64IZFINX-NEXT: ld a1, 0(sp)
2335+
; RV64IZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2336+
; RV64IZFINX-NEXT: addi sp, sp, 16
2337+
; RV64IZFINX-NEXT: ret
2338+
;
2339+
; RV32I-LABEL: frexp_float:
2340+
; RV32I: # %bb.0:
2341+
; RV32I-NEXT: addi sp, sp, -16
2342+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2343+
; RV32I-NEXT: addi a1, sp, 8
2344+
; RV32I-NEXT: call frexpf
2345+
; RV32I-NEXT: lw a1, 8(sp)
2346+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2347+
; RV32I-NEXT: addi sp, sp, 16
2348+
; RV32I-NEXT: ret
2349+
;
2350+
; RV64I-LABEL: frexp_float:
2351+
; RV64I: # %bb.0:
2352+
; RV64I-NEXT: addi sp, sp, -16
2353+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2354+
; RV64I-NEXT: addi a1, sp, 4
2355+
; RV64I-NEXT: call frexpf
2356+
; RV64I-NEXT: lw a1, 4(sp)
2357+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2358+
; RV64I-NEXT: addi sp, sp, 16
2359+
; RV64I-NEXT: ret
2360+
%a = call {float, i32} @llvm.frexp.f32.i32(float %x)
2361+
ret {float, i32} %a
2362+
}

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

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3312,3 +3312,141 @@ define half @ldexp_half(half %x, i32 signext %y) nounwind {
33123312
%z = call half @llvm.ldexp.f16.i32(half %x, i32 %y)
33133313
ret half %z
33143314
}
3315+
3316+
define {half, i32} @frexp_half(half %x) nounwind {
3317+
; RV32IZFH-LABEL: frexp_half:
3318+
; RV32IZFH: # %bb.0:
3319+
; RV32IZFH-NEXT: addi sp, sp, -16
3320+
; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3321+
; RV32IZFH-NEXT: fcvt.s.h fa0, fa0
3322+
; RV32IZFH-NEXT: addi a0, sp, 8
3323+
; RV32IZFH-NEXT: call frexpf
3324+
; RV32IZFH-NEXT: lw a0, 8(sp)
3325+
; RV32IZFH-NEXT: fcvt.h.s fa0, fa0
3326+
; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3327+
; RV32IZFH-NEXT: addi sp, sp, 16
3328+
; RV32IZFH-NEXT: ret
3329+
;
3330+
; RV64IZFH-LABEL: frexp_half:
3331+
; RV64IZFH: # %bb.0:
3332+
; RV64IZFH-NEXT: addi sp, sp, -16
3333+
; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3334+
; RV64IZFH-NEXT: fcvt.s.h fa0, fa0
3335+
; RV64IZFH-NEXT: mv a0, sp
3336+
; RV64IZFH-NEXT: call frexpf
3337+
; RV64IZFH-NEXT: ld a0, 0(sp)
3338+
; RV64IZFH-NEXT: fcvt.h.s fa0, fa0
3339+
; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3340+
; RV64IZFH-NEXT: addi sp, sp, 16
3341+
; RV64IZFH-NEXT: ret
3342+
;
3343+
; RV32IZHINX-LABEL: frexp_half:
3344+
; RV32IZHINX: # %bb.0:
3345+
; RV32IZHINX-NEXT: addi sp, sp, -16
3346+
; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3347+
; RV32IZHINX-NEXT: fcvt.s.h a0, a0
3348+
; RV32IZHINX-NEXT: addi a1, sp, 8
3349+
; RV32IZHINX-NEXT: call frexpf
3350+
; RV32IZHINX-NEXT: lw a1, 8(sp)
3351+
; RV32IZHINX-NEXT: fcvt.h.s a0, a0
3352+
; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3353+
; RV32IZHINX-NEXT: addi sp, sp, 16
3354+
; RV32IZHINX-NEXT: ret
3355+
;
3356+
; RV64IZHINX-LABEL: frexp_half:
3357+
; RV64IZHINX: # %bb.0:
3358+
; RV64IZHINX-NEXT: addi sp, sp, -16
3359+
; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3360+
; RV64IZHINX-NEXT: fcvt.s.h a0, a0
3361+
; RV64IZHINX-NEXT: mv a1, sp
3362+
; RV64IZHINX-NEXT: call frexpf
3363+
; RV64IZHINX-NEXT: ld a1, 0(sp)
3364+
; RV64IZHINX-NEXT: fcvt.h.s a0, a0
3365+
; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3366+
; RV64IZHINX-NEXT: addi sp, sp, 16
3367+
; RV64IZHINX-NEXT: ret
3368+
;
3369+
; RV32I-LABEL: frexp_half:
3370+
; RV32I: # %bb.0:
3371+
; RV32I-NEXT: addi sp, sp, -16
3372+
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3373+
; RV32I-NEXT: slli a0, a0, 16
3374+
; RV32I-NEXT: srli a0, a0, 16
3375+
; RV32I-NEXT: call __extendhfsf2
3376+
; RV32I-NEXT: addi a1, sp, 8
3377+
; RV32I-NEXT: call frexpf
3378+
; RV32I-NEXT: call __truncsfhf2
3379+
; RV32I-NEXT: lw a1, 8(sp)
3380+
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3381+
; RV32I-NEXT: addi sp, sp, 16
3382+
; RV32I-NEXT: ret
3383+
;
3384+
; RV64I-LABEL: frexp_half:
3385+
; RV64I: # %bb.0:
3386+
; RV64I-NEXT: addi sp, sp, -16
3387+
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3388+
; RV64I-NEXT: slli a0, a0, 48
3389+
; RV64I-NEXT: srli a0, a0, 48
3390+
; RV64I-NEXT: call __extendhfsf2
3391+
; RV64I-NEXT: addi a1, sp, 4
3392+
; RV64I-NEXT: call frexpf
3393+
; RV64I-NEXT: call __truncsfhf2
3394+
; RV64I-NEXT: lw a1, 4(sp)
3395+
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3396+
; RV64I-NEXT: addi sp, sp, 16
3397+
; RV64I-NEXT: ret
3398+
;
3399+
; RV32IZFHMIN-LABEL: frexp_half:
3400+
; RV32IZFHMIN: # %bb.0:
3401+
; RV32IZFHMIN-NEXT: addi sp, sp, -16
3402+
; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3403+
; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3404+
; RV32IZFHMIN-NEXT: addi a0, sp, 8
3405+
; RV32IZFHMIN-NEXT: call frexpf
3406+
; RV32IZFHMIN-NEXT: lw a0, 8(sp)
3407+
; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3408+
; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3409+
; RV32IZFHMIN-NEXT: addi sp, sp, 16
3410+
; RV32IZFHMIN-NEXT: ret
3411+
;
3412+
; RV64IZFHMIN-LABEL: frexp_half:
3413+
; RV64IZFHMIN: # %bb.0:
3414+
; RV64IZFHMIN-NEXT: addi sp, sp, -16
3415+
; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3416+
; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3417+
; RV64IZFHMIN-NEXT: mv a0, sp
3418+
; RV64IZFHMIN-NEXT: call frexpf
3419+
; RV64IZFHMIN-NEXT: ld a0, 0(sp)
3420+
; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3421+
; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3422+
; RV64IZFHMIN-NEXT: addi sp, sp, 16
3423+
; RV64IZFHMIN-NEXT: ret
3424+
;
3425+
; RV32IZHINXMIN-LABEL: frexp_half:
3426+
; RV32IZHINXMIN: # %bb.0:
3427+
; RV32IZHINXMIN-NEXT: addi sp, sp, -16
3428+
; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3429+
; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0
3430+
; RV32IZHINXMIN-NEXT: addi a1, sp, 8
3431+
; RV32IZHINXMIN-NEXT: call frexpf
3432+
; RV32IZHINXMIN-NEXT: lw a1, 8(sp)
3433+
; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0
3434+
; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3435+
; RV32IZHINXMIN-NEXT: addi sp, sp, 16
3436+
; RV32IZHINXMIN-NEXT: ret
3437+
;
3438+
; RV64IZHINXMIN-LABEL: frexp_half:
3439+
; RV64IZHINXMIN: # %bb.0:
3440+
; RV64IZHINXMIN-NEXT: addi sp, sp, -16
3441+
; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3442+
; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0
3443+
; RV64IZHINXMIN-NEXT: mv a1, sp
3444+
; RV64IZHINXMIN-NEXT: call frexpf
3445+
; RV64IZHINXMIN-NEXT: ld a1, 0(sp)
3446+
; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0
3447+
; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3448+
; RV64IZHINXMIN-NEXT: addi sp, sp, 16
3449+
; RV64IZHINXMIN-NEXT: ret
3450+
%a = call {half, i32} @llvm.frexp.f16.i32(half %x)
3451+
ret {half, i32} %a
3452+
}

0 commit comments

Comments
 (0)