Skip to content

Commit 868fae1

Browse files
committed
[RISCV][GISel] Support G_FPEXT/FPTRUNC with ZFh.
1 parent 8ab6677 commit 868fae1

File tree

4 files changed

+278
-1
lines changed

4 files changed

+278
-1
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,15 +384,24 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
384384
getActionDefinitionsBuilder(G_FCOPYSIGN)
385385
.legalIf(all(typeIsScalarFPArith(0, ST), typeIsScalarFPArith(1, ST)));
386386

387+
// FIXME: Use Zfhmin.
387388
getActionDefinitionsBuilder(G_FPTRUNC).legalIf(
388389
[=, &ST](const LegalityQuery &Query) -> bool {
389390
return (ST.hasStdExtD() && typeIs(0, s32)(Query) &&
391+
typeIs(1, s64)(Query)) ||
392+
(ST.hasStdExtZfh() && typeIs(0, s16)(Query) &&
393+
typeIs(1, s32)(Query)) ||
394+
(ST.hasStdExtZfh() && ST.hasStdExtD() && typeIs(0, s16)(Query) &&
390395
typeIs(1, s64)(Query));
391396
});
392397
getActionDefinitionsBuilder(G_FPEXT).legalIf(
393398
[=, &ST](const LegalityQuery &Query) -> bool {
394399
return (ST.hasStdExtD() && typeIs(0, s64)(Query) &&
395-
typeIs(1, s32)(Query));
400+
typeIs(1, s32)(Query)) ||
401+
(ST.hasStdExtZfh() && typeIs(0, s32)(Query) &&
402+
typeIs(1, s16)(Query)) ||
403+
(ST.hasStdExtZfh() && ST.hasStdExtD() && typeIs(0, s64)(Query) &&
404+
typeIs(1, s16)(Query));
396405
});
397406

398407
getActionDefinitionsBuilder(G_FCMP)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -mattr=+d,+zfh -run-pass=instruction-select \
3+
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
4+
# RUN: llc -mtriple=riscv64 -mattr=+d,+zfh -run-pass=instruction-select \
5+
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
6+
7+
---
8+
name: fpext_f32
9+
legalized: true
10+
regBankSelected: true
11+
tracksRegLiveness: true
12+
body: |
13+
bb.1:
14+
liveins: $f10_h
15+
16+
; CHECK-LABEL: name: fpext_f32
17+
; CHECK: liveins: $f10_h
18+
; CHECK-NEXT: {{ $}}
19+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr16 = COPY $f10_h
20+
; CHECK-NEXT: [[FCVT_S_H:%[0-9]+]]:fpr32 = nofpexcept FCVT_S_H [[COPY]], 0
21+
; CHECK-NEXT: $f10_f = COPY [[FCVT_S_H]]
22+
; CHECK-NEXT: PseudoRET implicit $f10_f
23+
%0:fprb(s16) = COPY $f10_h
24+
%1:fprb(s32) = G_FPEXT %0(s16)
25+
$f10_f = COPY %1(s32)
26+
PseudoRET implicit $f10_f
27+
28+
...
29+
---
30+
name: fptrunc_f32
31+
legalized: true
32+
regBankSelected: true
33+
tracksRegLiveness: true
34+
body: |
35+
bb.1:
36+
liveins: $f10_f
37+
38+
; CHECK-LABEL: name: fptrunc_f32
39+
; CHECK: liveins: $f10_f
40+
; CHECK-NEXT: {{ $}}
41+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
42+
; CHECK-NEXT: [[FCVT_H_S:%[0-9]+]]:fpr16 = nofpexcept FCVT_H_S [[COPY]], 7
43+
; CHECK-NEXT: $f10_h = COPY [[FCVT_H_S]]
44+
; CHECK-NEXT: PseudoRET implicit $f10_h
45+
%0:fprb(s32) = COPY $f10_f
46+
%1:fprb(s16) = G_FPTRUNC %0(s32)
47+
$f10_h = COPY %1(s16)
48+
PseudoRET implicit $f10_h
49+
50+
...
51+
---
52+
name: fpext_f64
53+
legalized: true
54+
regBankSelected: true
55+
tracksRegLiveness: true
56+
body: |
57+
bb.1:
58+
liveins: $f10_h
59+
60+
; CHECK-LABEL: name: fpext_f64
61+
; CHECK: liveins: $f10_h
62+
; CHECK-NEXT: {{ $}}
63+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr16 = COPY $f10_h
64+
; CHECK-NEXT: [[FCVT_D_H:%[0-9]+]]:fpr64 = nofpexcept FCVT_D_H [[COPY]], 0
65+
; CHECK-NEXT: $f10_d = COPY [[FCVT_D_H]]
66+
; CHECK-NEXT: PseudoRET implicit $f10_d
67+
%0:fprb(s16) = COPY $f10_h
68+
%1:fprb(s64) = G_FPEXT %0(s16)
69+
$f10_d = COPY %1(s64)
70+
PseudoRET implicit $f10_d
71+
72+
...
73+
---
74+
name: fptrunc_f64
75+
legalized: true
76+
regBankSelected: true
77+
tracksRegLiveness: true
78+
body: |
79+
bb.1:
80+
liveins: $f10_d
81+
82+
; CHECK-LABEL: name: fptrunc_f64
83+
; CHECK: liveins: $f10_d
84+
; CHECK-NEXT: {{ $}}
85+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f10_d
86+
; CHECK-NEXT: [[FCVT_H_D:%[0-9]+]]:fpr16 = nofpexcept FCVT_H_D [[COPY]], 7
87+
; CHECK-NEXT: $f10_h = COPY [[FCVT_H_D]]
88+
; CHECK-NEXT: PseudoRET implicit $f10_h
89+
%0:fprb(s64) = COPY $f10_d
90+
%1:fprb(s16) = G_FPTRUNC %0(s64)
91+
$f10_h = COPY %1(s16)
92+
PseudoRET implicit $f10_h
93+
94+
...
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2+
# RUN: llc -mtriple=riscv32 -mattr=+d,+zfh -run-pass=legalizer %s -o - \
3+
# RUN: | FileCheck %s
4+
# RUN: llc -mtriple=riscv64 -mattr=+d,+zfh -run-pass=legalizer %s -o - \
5+
# RUN: | FileCheck %s
6+
7+
---
8+
name: fpext_f32
9+
body: |
10+
bb.1:
11+
liveins: $f10_h
12+
13+
; CHECK-LABEL: name: fpext_f32
14+
; CHECK: liveins: $f10_h
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $f10_h
17+
; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(s32) = G_FPEXT [[COPY]](s16)
18+
; CHECK-NEXT: $f10_f = COPY [[FPEXT]](s32)
19+
; CHECK-NEXT: PseudoRET implicit $f10_f
20+
%0:_(s16) = COPY $f10_h
21+
%1:_(s32) = G_FPEXT %0(s16)
22+
$f10_f = COPY %1(s32)
23+
PseudoRET implicit $f10_f
24+
25+
...
26+
---
27+
name: fptrunc_f32
28+
body: |
29+
bb.1:
30+
liveins: $f10_f
31+
32+
; CHECK-LABEL: name: fptrunc_f32
33+
; CHECK: liveins: $f10_f
34+
; CHECK-NEXT: {{ $}}
35+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
36+
; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(s16) = G_FPTRUNC [[COPY]](s32)
37+
; CHECK-NEXT: $f10_h = COPY [[FPTRUNC]](s16)
38+
; CHECK-NEXT: PseudoRET implicit $f10_h
39+
%0:_(s32) = COPY $f10_f
40+
%1:_(s16) = G_FPTRUNC %0(s32)
41+
$f10_h = COPY %1(s16)
42+
PseudoRET implicit $f10_h
43+
44+
...
45+
---
46+
name: fpext_f64
47+
body: |
48+
bb.1:
49+
liveins: $f10_h
50+
51+
; CHECK-LABEL: name: fpext_f64
52+
; CHECK: liveins: $f10_h
53+
; CHECK-NEXT: {{ $}}
54+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $f10_h
55+
; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(s64) = G_FPEXT [[COPY]](s16)
56+
; CHECK-NEXT: $f10_d = COPY [[FPEXT]](s64)
57+
; CHECK-NEXT: PseudoRET implicit $f10_d
58+
%0:_(s16) = COPY $f10_h
59+
%1:_(s64) = G_FPEXT %0(s16)
60+
$f10_d = COPY %1(s64)
61+
PseudoRET implicit $f10_d
62+
63+
...
64+
---
65+
name: fptrunc_f64
66+
body: |
67+
bb.1:
68+
liveins: $f10_d
69+
70+
; CHECK-LABEL: name: fptrunc_f64
71+
; CHECK: liveins: $f10_d
72+
; CHECK-NEXT: {{ $}}
73+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
74+
; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(s16) = G_FPTRUNC [[COPY]](s64)
75+
; CHECK-NEXT: $f10_h = COPY [[FPTRUNC]](s16)
76+
; CHECK-NEXT: PseudoRET implicit $f10_h
77+
%0:_(s64) = COPY $f10_d
78+
%1:_(s16) = G_FPTRUNC %0(s64)
79+
$f10_h = COPY %1(s16)
80+
PseudoRET implicit $f10_h
81+
82+
...
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2+
# RUN: llc -mtriple=riscv32 -mattr=+d,zfh -run-pass=regbankselect \
3+
# RUN: -simplify-mir -verify-machineinstrs %s \
4+
# RUN: -o - | FileCheck %s
5+
# RUN: llc -mtriple=riscv64 -mattr=+d,zfh -run-pass=regbankselect \
6+
# RUN: -simplify-mir -verify-machineinstrs %s \
7+
# RUN: -o - | FileCheck %s
8+
9+
---
10+
name: fpext_f32
11+
legalized: true
12+
tracksRegLiveness: true
13+
body: |
14+
bb.1:
15+
liveins: $f10_h
16+
17+
; CHECK-LABEL: name: fpext_f32
18+
; CHECK: liveins: $f10_h
19+
; CHECK-NEXT: {{ $}}
20+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s16) = COPY $f10_h
21+
; CHECK-NEXT: [[FPEXT:%[0-9]+]]:fprb(s32) = G_FPEXT [[COPY]](s16)
22+
; CHECK-NEXT: $f10_f = COPY [[FPEXT]](s32)
23+
; CHECK-NEXT: PseudoRET implicit $f10_f
24+
%0:_(s16) = COPY $f10_h
25+
%1:_(s32) = G_FPEXT %0(s16)
26+
$f10_f = COPY %1(s32)
27+
PseudoRET implicit $f10_f
28+
29+
...
30+
---
31+
name: fptrunc_f32
32+
legalized: true
33+
tracksRegLiveness: true
34+
body: |
35+
bb.1:
36+
liveins: $f10_f
37+
38+
; CHECK-LABEL: name: fptrunc_f32
39+
; CHECK: liveins: $f10_f
40+
; CHECK-NEXT: {{ $}}
41+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s32) = COPY $f10_f
42+
; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:fprb(s16) = G_FPTRUNC [[COPY]](s32)
43+
; CHECK-NEXT: $f10_h = COPY [[FPTRUNC]](s16)
44+
; CHECK-NEXT: PseudoRET implicit $f10_h
45+
%0:_(s32) = COPY $f10_f
46+
%1:_(s16) = G_FPTRUNC %0(s32)
47+
$f10_h = COPY %1(s16)
48+
PseudoRET implicit $f10_h
49+
50+
...
51+
---
52+
name: fpext_f64
53+
legalized: true
54+
tracksRegLiveness: true
55+
body: |
56+
bb.1:
57+
liveins: $f10_h
58+
59+
; CHECK-LABEL: name: fpext_f64
60+
; CHECK: liveins: $f10_h
61+
; CHECK-NEXT: {{ $}}
62+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s16) = COPY $f10_h
63+
; CHECK-NEXT: [[FPEXT:%[0-9]+]]:fprb(s64) = G_FPEXT [[COPY]](s16)
64+
; CHECK-NEXT: $f10_d = COPY [[FPEXT]](s64)
65+
; CHECK-NEXT: PseudoRET implicit $f10_d
66+
%0:_(s16) = COPY $f10_h
67+
%1:_(s64) = G_FPEXT %0(s16)
68+
$f10_d = COPY %1(s64)
69+
PseudoRET implicit $f10_d
70+
71+
...
72+
---
73+
name: fptrunc_f64
74+
legalized: true
75+
tracksRegLiveness: true
76+
body: |
77+
bb.1:
78+
liveins: $f10_d
79+
80+
; CHECK-LABEL: name: fptrunc_f64
81+
; CHECK: liveins: $f10_d
82+
; CHECK-NEXT: {{ $}}
83+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fprb(s64) = COPY $f10_d
84+
; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:fprb(s16) = G_FPTRUNC [[COPY]](s64)
85+
; CHECK-NEXT: $f10_h = COPY [[FPTRUNC]](s16)
86+
; CHECK-NEXT: PseudoRET implicit $f10_h
87+
%0:_(s64) = COPY $f10_d
88+
%1:_(s16) = G_FPTRUNC %0(s64)
89+
$f10_h = COPY %1(s16)
90+
PseudoRET implicit $f10_h
91+
92+
...

0 commit comments

Comments
 (0)