Skip to content

Commit 3106e97

Browse files
authored
[AArch64][GlobalISel] Generate libcall for s128 G_FPTRUNC (llvm#96602)
This patch would generate libcall if the source type is s128. This is the root cause for many fallbacks in RajaPerf benchmark.
1 parent 87c60bf commit 3106e97

File tree

2 files changed

+203
-0
lines changed

2 files changed

+203
-0
lines changed

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
648648
getActionDefinitionsBuilder(G_FPTRUNC)
649649
.legalFor(
650650
{{s16, s32}, {s16, s64}, {s32, s64}, {v4s16, v4s32}, {v2s32, v2s64}})
651+
.libcallFor({{s16, s128}, {s32, s128}, {s64, s128}})
651652
.clampNumElements(0, v4s16, v4s16)
652653
.clampNumElements(0, v2s32, v2s32)
653654
.scalarize(0);

llvm/test/CodeGen/AArch64/fptrunc.ll

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,208 @@ entry:
3232
ret half %c
3333
}
3434

35+
36+
define half @fptrunc_f128_f16(fp128 %a) {
37+
; CHECK-SD-LABEL: fptrunc_f128_f16:
38+
; CHECK-SD: // %bb.0: // %entry
39+
; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
40+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
41+
; CHECK-SD-NEXT: .cfi_offset w30, -16
42+
; CHECK-SD-NEXT: bl __trunctfhf2
43+
; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
44+
; CHECK-SD-NEXT: ret
45+
;
46+
; CHECK-GI-LABEL: fptrunc_f128_f16:
47+
; CHECK-GI: // %bb.0: // %entry
48+
; CHECK-GI-NEXT: b __trunctfhf2
49+
entry:
50+
%c = fptrunc fp128 %a to half
51+
ret half %c
52+
}
53+
54+
define float @fptrunc_f128_f32(fp128 %a) {
55+
; CHECK-SD-LABEL: fptrunc_f128_f32:
56+
; CHECK-SD: // %bb.0: // %entry
57+
; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
58+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
59+
; CHECK-SD-NEXT: .cfi_offset w30, -16
60+
; CHECK-SD-NEXT: bl __trunctfsf2
61+
; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
62+
; CHECK-SD-NEXT: ret
63+
;
64+
; CHECK-GI-LABEL: fptrunc_f128_f32:
65+
; CHECK-GI: // %bb.0: // %entry
66+
; CHECK-GI-NEXT: b __trunctfsf2
67+
entry:
68+
%c = fptrunc fp128 %a to float
69+
ret float %c
70+
}
71+
72+
define double @fptrunc_f128_f64(fp128 %a) {
73+
; CHECK-SD-LABEL: fptrunc_f128_f64:
74+
; CHECK-SD: // %bb.0: // %entry
75+
; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
76+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
77+
; CHECK-SD-NEXT: .cfi_offset w30, -16
78+
; CHECK-SD-NEXT: bl __trunctfdf2
79+
; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
80+
; CHECK-SD-NEXT: ret
81+
;
82+
; CHECK-GI-LABEL: fptrunc_f128_f64:
83+
; CHECK-GI: // %bb.0: // %entry
84+
; CHECK-GI-NEXT: b __trunctfdf2
85+
entry:
86+
%c = fptrunc fp128 %a to double
87+
ret double %c
88+
}
89+
90+
define <2 x half> @fptrunc_v2f128_v2f16(<2 x fp128> %a) {
91+
; CHECK-SD-LABEL: fptrunc_v2f128_v2f16:
92+
; CHECK-SD: // %bb.0: // %entry
93+
; CHECK-SD-NEXT: sub sp, sp, #48
94+
; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
95+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
96+
; CHECK-SD-NEXT: .cfi_offset w30, -16
97+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
98+
; CHECK-SD-NEXT: mov v0.16b, v1.16b
99+
; CHECK-SD-NEXT: bl __trunctfhf2
100+
; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $q0
101+
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
102+
; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
103+
; CHECK-SD-NEXT: bl __trunctfhf2
104+
; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
105+
; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $q0
106+
; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
107+
; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]
108+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
109+
; CHECK-SD-NEXT: add sp, sp, #48
110+
; CHECK-SD-NEXT: ret
111+
;
112+
; CHECK-GI-LABEL: fptrunc_v2f128_v2f16:
113+
; CHECK-GI: // %bb.0: // %entry
114+
; CHECK-GI-NEXT: sub sp, sp, #64
115+
; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill
116+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 64
117+
; CHECK-GI-NEXT: .cfi_offset w30, -16
118+
; CHECK-GI-NEXT: mov v2.d[0], x8
119+
; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
120+
; CHECK-GI-NEXT: mov v2.d[1], x8
121+
; CHECK-GI-NEXT: str q2, [sp, #32] // 16-byte Folded Spill
122+
; CHECK-GI-NEXT: bl __trunctfhf2
123+
; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q0
124+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
125+
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
126+
; CHECK-GI-NEXT: bl __trunctfhf2
127+
; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q0
128+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
129+
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
130+
; CHECK-GI-NEXT: bl __trunctfhf2
131+
; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
132+
; CHECK-GI-NEXT: bl __trunctfhf2
133+
; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload
134+
; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload
135+
; CHECK-GI-NEXT: mov v0.h[1], v1.h[0]
136+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
137+
; CHECK-GI-NEXT: add sp, sp, #64
138+
; CHECK-GI-NEXT: ret
139+
entry:
140+
%c = fptrunc <2 x fp128> %a to <2 x half>
141+
ret <2 x half> %c
142+
}
143+
144+
145+
define <2 x float> @fptrunc_v2f128_v2f32(<2 x fp128> %a) {
146+
; CHECK-SD-LABEL: fptrunc_v2f128_v2f32:
147+
; CHECK-SD: // %bb.0: // %entry
148+
; CHECK-SD-NEXT: sub sp, sp, #48
149+
; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
150+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
151+
; CHECK-SD-NEXT: .cfi_offset w30, -16
152+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
153+
; CHECK-SD-NEXT: mov v0.16b, v1.16b
154+
; CHECK-SD-NEXT: bl __trunctfsf2
155+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
156+
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
157+
; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
158+
; CHECK-SD-NEXT: bl __trunctfsf2
159+
; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
160+
; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
161+
; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
162+
; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]
163+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
164+
; CHECK-SD-NEXT: add sp, sp, #48
165+
; CHECK-SD-NEXT: ret
166+
;
167+
; CHECK-GI-LABEL: fptrunc_v2f128_v2f32:
168+
; CHECK-GI: // %bb.0: // %entry
169+
; CHECK-GI-NEXT: sub sp, sp, #48
170+
; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
171+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 48
172+
; CHECK-GI-NEXT: .cfi_offset w30, -16
173+
; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
174+
; CHECK-GI-NEXT: bl __trunctfsf2
175+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
176+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
177+
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
178+
; CHECK-GI-NEXT: bl __trunctfsf2
179+
; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
180+
; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
181+
; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
182+
; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]
183+
; CHECK-GI-NEXT: fmov d0, d1
184+
; CHECK-GI-NEXT: add sp, sp, #48
185+
; CHECK-GI-NEXT: ret
186+
entry:
187+
%c = fptrunc <2 x fp128> %a to <2 x float>
188+
ret <2 x float> %c
189+
}
190+
191+
192+
define <2 x double> @fptrunc_v2f128_v2f64(<2 x fp128> %a) {
193+
; CHECK-SD-LABEL: fptrunc_v2f128_v2f64:
194+
; CHECK-SD: // %bb.0: // %entry
195+
; CHECK-SD-NEXT: sub sp, sp, #48
196+
; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
197+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
198+
; CHECK-SD-NEXT: .cfi_offset w30, -16
199+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
200+
; CHECK-SD-NEXT: mov v0.16b, v1.16b
201+
; CHECK-SD-NEXT: bl __trunctfdf2
202+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
203+
; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
204+
; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
205+
; CHECK-SD-NEXT: bl __trunctfdf2
206+
; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
207+
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
208+
; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
209+
; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
210+
; CHECK-SD-NEXT: add sp, sp, #48
211+
; CHECK-SD-NEXT: ret
212+
;
213+
; CHECK-GI-LABEL: fptrunc_v2f128_v2f64:
214+
; CHECK-GI: // %bb.0: // %entry
215+
; CHECK-GI-NEXT: sub sp, sp, #48
216+
; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
217+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 48
218+
; CHECK-GI-NEXT: .cfi_offset w30, -16
219+
; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
220+
; CHECK-GI-NEXT: bl __trunctfdf2
221+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
222+
; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
223+
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
224+
; CHECK-GI-NEXT: bl __trunctfdf2
225+
; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
226+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
227+
; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
228+
; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]
229+
; CHECK-GI-NEXT: mov v0.16b, v1.16b
230+
; CHECK-GI-NEXT: add sp, sp, #48
231+
; CHECK-GI-NEXT: ret
232+
entry:
233+
%c = fptrunc <2 x fp128> %a to <2 x double>
234+
ret <2 x double> %c
235+
}
236+
35237
define <2 x float> @fptrunc_v2f64_v2f32(<2 x double> %a) {
36238
; CHECK-LABEL: fptrunc_v2f64_v2f32:
37239
; CHECK: // %bb.0: // %entry

0 commit comments

Comments
 (0)