Skip to content

Commit dff6871

Browse files
committed
[RISCV][GISel] Support G_FCONSTANT for Zfh.
1 parent 0280f97 commit dff6871

File tree

3 files changed

+104
-5
lines changed

3 files changed

+104
-5
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,12 +577,14 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
577577
const APFloat &FPimm = MI.getOperand(1).getFPImm()->getValueAPF();
578578
APInt Imm = FPimm.bitcastToAPInt();
579579
unsigned Size = MRI.getType(DstReg).getSizeInBits();
580-
if (Size == 32 || (Size == 64 && Subtarget->is64Bit())) {
580+
if (Size == 16 || Size == 32 || (Size == 64 && Subtarget->is64Bit())) {
581581
Register GPRReg = MRI.createVirtualRegister(&RISCV::GPRRegClass);
582582
if (!materializeImm(GPRReg, Imm.getSExtValue(), MIB))
583583
return false;
584584

585-
unsigned Opcode = Size == 64 ? RISCV::FMV_D_X : RISCV::FMV_W_X;
585+
unsigned Opcode = Size == 64 ? RISCV::FMV_D_X
586+
: Size == 32 ? RISCV::FMV_W_X
587+
: RISCV::FMV_H_X;
586588
auto FMV = MIB.buildInstr(Opcode, {DstReg}, {GPRReg});
587589
if (!FMV.constrainAllUses(TII, TRI, RBI))
588590
return false;

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,11 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
410410
getActionDefinitionsBuilder(G_IS_FPCLASS)
411411
.customIf(all(typeIs(0, s1), typeIsScalarFPArith(1, ST)));
412412

413-
getActionDefinitionsBuilder(G_FCONSTANT)
414-
.legalIf(typeIsScalarFPArith(0, ST))
415-
.lowerFor({s32, s64});
413+
auto &FConstantActions = getActionDefinitionsBuilder(G_FCONSTANT)
414+
.legalIf(typeIsScalarFPArith(0, ST));
415+
if (ST.hasStdExtZfh())
416+
FConstantActions.legalFor({s16});
417+
FConstantActions.lowerFor({s32, s64});
416418

417419
getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
418420
.legalIf(all(typeInSet(0, {s32, sXLen}), typeIsScalarFPArith(1, ST)))
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2+
# RUN: llc -mtriple=riscv32 -mattr=+zfh -run-pass=instruction-select \
3+
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,RV32
4+
# RUN: llc -mtriple=riscv64 -mattr=+zfh -run-pass=instruction-select \
5+
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,RV64
6+
7+
---
8+
name: half_imm
9+
legalized: true
10+
regBankSelected: true
11+
body: |
12+
bb.1:
13+
; RV32-LABEL: name: half_imm
14+
; RV32: [[LUI:%[0-9]+]]:gpr = LUI 4
15+
; RV32-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI [[LUI]], 584
16+
; RV32-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X [[ADDI]]
17+
; RV32-NEXT: $f10_h = COPY [[FMV_H_X]]
18+
; RV32-NEXT: PseudoRET implicit $f10_h
19+
;
20+
; RV64-LABEL: name: half_imm
21+
; RV64: [[LUI:%[0-9]+]]:gpr = LUI 4
22+
; RV64-NEXT: [[ADDIW:%[0-9]+]]:gpr = ADDIW [[LUI]], 584
23+
; RV64-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X [[ADDIW]]
24+
; RV64-NEXT: $f10_h = COPY [[FMV_H_X]]
25+
; RV64-NEXT: PseudoRET implicit $f10_h
26+
%0:fprb(s16) = G_FCONSTANT half 0xH4248
27+
$f10_h = COPY %0(s16)
28+
PseudoRET implicit $f10_h
29+
30+
...
31+
---
32+
name: half_imm_op
33+
legalized: true
34+
regBankSelected: true
35+
body: |
36+
bb.1:
37+
liveins: $f10_h
38+
39+
; CHECK-LABEL: name: half_imm_op
40+
; CHECK: liveins: $f10_h
41+
; CHECK-NEXT: {{ $}}
42+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr16 = COPY $f10_h
43+
; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 15
44+
; CHECK-NEXT: [[SLLI:%[0-9]+]]:gpr = SLLI [[ADDI]], 10
45+
; CHECK-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X [[SLLI]]
46+
; CHECK-NEXT: [[FADD_H:%[0-9]+]]:fpr16 = nofpexcept FADD_H [[COPY]], [[FMV_H_X]], 7
47+
; CHECK-NEXT: $f10_h = COPY [[FADD_H]]
48+
; CHECK-NEXT: PseudoRET implicit $f10_h
49+
%0:fprb(s16) = COPY $f10_h
50+
%1:fprb(s16) = G_FCONSTANT half 1.000000e+00
51+
%2:fprb(s16) = G_FADD %0, %1
52+
$f10_h = COPY %2(s16)
53+
PseudoRET implicit $f10_h
54+
55+
...
56+
---
57+
name: half_positive_zero
58+
legalized: true
59+
regBankSelected: true
60+
body: |
61+
bb.1:
62+
liveins: $x10
63+
64+
; CHECK-LABEL: name: half_positive_zero
65+
; CHECK: liveins: $x10
66+
; CHECK-NEXT: {{ $}}
67+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0
68+
; CHECK-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X [[COPY]]
69+
; CHECK-NEXT: $f10_h = COPY [[FMV_H_X]]
70+
; CHECK-NEXT: PseudoRET implicit $f10_h
71+
%1:fprb(s16) = G_FCONSTANT half 0.000000e+00
72+
$f10_h = COPY %1(s16)
73+
PseudoRET implicit $f10_h
74+
75+
...
76+
---
77+
name: half_negative_zero
78+
legalized: true
79+
regBankSelected: true
80+
body: |
81+
bb.1:
82+
liveins: $x10
83+
84+
; CHECK-LABEL: name: half_negative_zero
85+
; CHECK: liveins: $x10
86+
; CHECK-NEXT: {{ $}}
87+
; CHECK-NEXT: [[LUI:%[0-9]+]]:gpr = LUI 1048568
88+
; CHECK-NEXT: [[FMV_H_X:%[0-9]+]]:fpr16 = FMV_H_X [[LUI]]
89+
; CHECK-NEXT: $f10_h = COPY [[FMV_H_X]]
90+
; CHECK-NEXT: PseudoRET implicit $f10_h
91+
%1:fprb(s16) = G_FCONSTANT half -0.000000e+00
92+
$f10_h = COPY %1(s16)
93+
PseudoRET implicit $f10_h
94+
95+
...

0 commit comments

Comments
 (0)