Skip to content

Commit c4efcd6

Browse files
committed
[RISCV] Generalise shouldExtendTypeInLibcall logic to apply to all <XLEN floats on soft ABIs
This results in improved codegen for half/bf16 libcalls on soft ABIs Adds a RISCVSubtarget helper method for determining if a soft FP ABI is being targeted (future bf16 related patches make use of this). Differential Revision: https://reviews.llvm.org/D151434
1 parent c551c9c commit c4efcd6

File tree

4 files changed

+9
-19
lines changed

4 files changed

+9
-19
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15988,9 +15988,9 @@ Register RISCVTargetLowering::getExceptionSelectorRegister(
1598815988

1598915989
bool RISCVTargetLowering::shouldExtendTypeInLibCall(EVT Type) const {
1599015990
// Return false to suppress the unnecessary extensions if the LibCall
15991-
// arguments or return value is f32 type for LP64 ABI.
15992-
RISCVABI::ABI ABI = Subtarget.getTargetABI();
15993-
if (ABI == RISCVABI::ABI_LP64 && (Type == MVT::f32))
15991+
// arguments or return value is a float narrower than XLEN on a soft FP ABI.
15992+
if (Subtarget.isSoftFPABI() && (Type.isFloatingPoint() && !Type.isVector() &&
15993+
Type.getSizeInBits() < Subtarget.getXLen()))
1599415994
return false;
1599515995

1599615996
return true;

llvm/lib/Target/RISCV/RISCVSubtarget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo {
152152
return VLen == 0 ? 65536 : VLen;
153153
}
154154
RISCVABI::ABI getTargetABI() const { return TargetABI; }
155+
bool isSoftFPABI() const {
156+
return TargetABI == RISCVABI::ABI_LP64 ||
157+
TargetABI == RISCVABI::ABI_ILP32 ||
158+
TargetABI == RISCVABI::ABI_ILP32E;
159+
}
155160
bool isRegisterReservedByUser(Register i) const {
156161
assert(i < RISCV::NUM_TARGET_REGS && "Register out of range");
157162
return UserReservedRegister[i];

llvm/test/CodeGen/RISCV/bfloat.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ define double @bfloat_to_double(bfloat %a) nounwind {
7777
; RV64I-LP64: # %bb.0:
7878
; RV64I-LP64-NEXT: addi sp, sp, -16
7979
; RV64I-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
80-
; RV64I-LP64-NEXT: slli a0, a0, 48
81-
; RV64I-LP64-NEXT: srli a0, a0, 32
80+
; RV64I-LP64-NEXT: slliw a0, a0, 16
8281
; RV64I-LP64-NEXT: call __extendsfdf2@plt
8382
; RV64I-LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
8483
; RV64I-LP64-NEXT: addi sp, sp, 16

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

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,8 +1828,6 @@ define i64 @fcvt_l_h_sat(half %a) nounwind {
18281828
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
18291829
; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill
18301830
; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill
1831-
; RV32I-NEXT: slli a0, a0, 16
1832-
; RV32I-NEXT: srli a0, a0, 16
18331831
; RV32I-NEXT: call __extendhfsf2@plt
18341832
; RV32I-NEXT: mv s1, a0
18351833
; RV32I-NEXT: lui a1, 913408
@@ -2393,8 +2391,6 @@ define i64 @fcvt_lu_h_sat(half %a) nounwind {
23932391
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
23942392
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
23952393
; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
2396-
; RV32I-NEXT: slli a0, a0, 16
2397-
; RV32I-NEXT: srli a0, a0, 16
23982394
; RV32I-NEXT: call __extendhfsf2@plt
23992395
; RV32I-NEXT: mv s0, a0
24002396
; RV32I-NEXT: lui a1, 391168
@@ -3748,8 +3744,6 @@ define float @fcvt_s_h(half %a) nounwind {
37483744
; RV32I: # %bb.0:
37493745
; RV32I-NEXT: addi sp, sp, -16
37503746
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3751-
; RV32I-NEXT: slli a0, a0, 16
3752-
; RV32I-NEXT: srli a0, a0, 16
37533747
; RV32I-NEXT: call __extendhfsf2@plt
37543748
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
37553749
; RV32I-NEXT: addi sp, sp, 16
@@ -3759,8 +3753,6 @@ define float @fcvt_s_h(half %a) nounwind {
37593753
; RV64I: # %bb.0:
37603754
; RV64I-NEXT: addi sp, sp, -16
37613755
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3762-
; RV64I-NEXT: slli a0, a0, 48
3763-
; RV64I-NEXT: srli a0, a0, 48
37643756
; RV64I-NEXT: call __extendhfsf2@plt
37653757
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
37663758
; RV64I-NEXT: addi sp, sp, 16
@@ -4016,8 +4008,6 @@ define double @fcvt_d_h(half %a) nounwind {
40164008
; RV32I: # %bb.0:
40174009
; RV32I-NEXT: addi sp, sp, -16
40184010
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
4019-
; RV32I-NEXT: slli a0, a0, 16
4020-
; RV32I-NEXT: srli a0, a0, 16
40214011
; RV32I-NEXT: call __extendhfsf2@plt
40224012
; RV32I-NEXT: call __extendsfdf2@plt
40234013
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
@@ -4028,11 +4018,7 @@ define double @fcvt_d_h(half %a) nounwind {
40284018
; RV64I: # %bb.0:
40294019
; RV64I-NEXT: addi sp, sp, -16
40304020
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
4031-
; RV64I-NEXT: slli a0, a0, 48
4032-
; RV64I-NEXT: srli a0, a0, 48
40334021
; RV64I-NEXT: call __extendhfsf2@plt
4034-
; RV64I-NEXT: slli a0, a0, 32
4035-
; RV64I-NEXT: srli a0, a0, 32
40364022
; RV64I-NEXT: call __extendsfdf2@plt
40374023
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
40384024
; RV64I-NEXT: addi sp, sp, 16

0 commit comments

Comments
 (0)