Skip to content

Commit 1eea5fd

Browse files
HolyMolyCowManmahesh-attarde
authored andcommitted
[AArch64][GlobalISel] Add support for ldexp (llvm#160517)
1 parent 03e82e3 commit 1eea5fd

File tree

3 files changed

+120
-3
lines changed

3 files changed

+120
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
444444
// Regardless of FP16 support, widen 16-bit elements to 32-bits.
445445
.minScalar(0, s32)
446446
.libcallFor({s32, s64, s128});
447-
getActionDefinitionsBuilder(G_FPOWI)
447+
getActionDefinitionsBuilder({G_FPOWI, G_FLDEXP})
448448
.scalarize(0)
449449
.minScalar(0, s32)
450450
.libcallFor({{s32, s32}, {s64, s32}, {s128, s32}});

llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,9 @@
540540
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
541541
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
542542
# DEBUG-NEXT: G_FLDEXP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
543-
# DEBUG-NEXT:.. type index coverage check SKIPPED: no rules defined
544-
# DEBUG-NEXT:.. imm index coverage check SKIPPED: no rules defined
543+
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
544+
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
545+
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
545546
# DEBUG-NEXT: G_FFREXP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
546547
# DEBUG-NEXT:.. type index coverage check SKIPPED: no rules defined
547548
# DEBUG-NEXT:.. imm index coverage check SKIPPED: no rules defined

llvm/test/CodeGen/AArch64/ldexp.ll

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
22
; RUN: llc -mtriple=aarch64 -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVELINUX %s
3+
; RUN: llc -mtriple=aarch64 -global-isel < %s -o - | FileCheck -check-prefixes=GISEL %s
34
; RUN: llc -mtriple=aarch64-windows-msvc -mattr=+sve < %s -o - | FileCheck -check-prefixes=SVE,SVEWINDOWS %s
45
; RUN: llc -mtriple=aarch64-windows-msvc < %s -o - | FileCheck -check-prefixes=WINDOWS %s
56

@@ -15,6 +16,10 @@ define double @testExp(double %val, i32 %a) {
1516
; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
1617
; SVE-NEXT: ret
1718
;
19+
; GISEL-LABEL: testExp:
20+
; GISEL: // %bb.0: // %entry
21+
; GISEL-NEXT: b ldexp
22+
;
1823
; WINDOWS-LABEL: testExp:
1924
; WINDOWS: // %bb.0: // %entry
2025
; WINDOWS-NEXT: b ldexp
@@ -37,6 +42,10 @@ define double @testExpIntrinsic(double %val, i32 %a) {
3742
; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
3843
; SVE-NEXT: ret
3944
;
45+
; GISEL-LABEL: testExpIntrinsic:
46+
; GISEL: // %bb.0: // %entry
47+
; GISEL-NEXT: b ldexp
48+
;
4049
; WINDOWS-LABEL: testExpIntrinsic:
4150
; WINDOWS: // %bb.0: // %entry
4251
; WINDOWS-NEXT: b ldexp
@@ -55,6 +64,10 @@ define float @testExpf(float %val, i32 %a) {
5564
; SVELINUX-NEXT: // kill: def $s0 killed $s0 killed $z0
5665
; SVELINUX-NEXT: ret
5766
;
67+
; GISEL-LABEL: testExpf:
68+
; GISEL: // %bb.0: // %entry
69+
; GISEL-NEXT: b ldexpf
70+
;
5871
; SVEWINDOWS-LABEL: testExpf:
5972
; SVEWINDOWS: // %bb.0: // %entry
6073
; SVEWINDOWS-NEXT: b ldexpf
@@ -77,6 +90,10 @@ define float @testExpfIntrinsic(float %val, i32 %a) {
7790
; SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
7891
; SVE-NEXT: ret
7992
;
93+
; GISEL-LABEL: testExpfIntrinsic:
94+
; GISEL: // %bb.0: // %entry
95+
; GISEL-NEXT: b ldexpf
96+
;
8097
; WINDOWS-LABEL: testExpfIntrinsic:
8198
; WINDOWS: .seh_proc testExpfIntrinsic
8299
; WINDOWS-NEXT: // %bb.0: // %entry
@@ -98,6 +115,90 @@ entry:
98115
ret float %call
99116
}
100117

118+
define <2 x float> @test_ldexp_v2f32_v2i32(<2 x float> %Val, <2 x i32> %Exp) {
119+
; SVE-LABEL: test_ldexp_v2f32_v2i32:
120+
; SVE: // %bb.0:
121+
; SVE-NEXT: // kill: def $d1 killed $d1 def $z1
122+
; SVE-NEXT: mov w8, v1.s[1]
123+
; SVE-NEXT: // kill: def $d0 killed $d0 def $z0
124+
; SVE-NEXT: mov s2, v0.s[1]
125+
; SVE-NEXT: ptrue p0.s
126+
; SVE-NEXT: fscale z0.s, p0/m, z0.s, z1.s
127+
; SVE-NEXT: fmov s3, w8
128+
; SVE-NEXT: fscale z2.s, p0/m, z2.s, z3.s
129+
; SVE-NEXT: mov v0.s[1], v2.s[0]
130+
; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
131+
; SVE-NEXT: ret
132+
;
133+
; GISEL-LABEL: test_ldexp_v2f32_v2i32:
134+
; GISEL: // %bb.0:
135+
; GISEL-NEXT: sub sp, sp, #48
136+
; GISEL-NEXT: stp d9, d8, [sp, #16] // 16-byte Folded Spill
137+
; GISEL-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
138+
; GISEL-NEXT: .cfi_def_cfa_offset 48
139+
; GISEL-NEXT: .cfi_offset w30, -16
140+
; GISEL-NEXT: .cfi_offset b8, -24
141+
; GISEL-NEXT: .cfi_offset b9, -32
142+
; GISEL-NEXT: // kill: def $d1 killed $d1 def $q1
143+
; GISEL-NEXT: fmov w0, s1
144+
; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
145+
; GISEL-NEXT: mov s8, v0.s[1]
146+
; GISEL-NEXT: mov s9, v1.s[1]
147+
; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0
148+
; GISEL-NEXT: bl ldexpf
149+
; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0
150+
; GISEL-NEXT: str q0, [sp] // 16-byte Folded Spill
151+
; GISEL-NEXT: fmov w0, s9
152+
; GISEL-NEXT: fmov s0, s8
153+
; GISEL-NEXT: bl ldexpf
154+
; GISEL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
155+
; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0
156+
; GISEL-NEXT: ldp d9, d8, [sp, #16] // 16-byte Folded Reload
157+
; GISEL-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
158+
; GISEL-NEXT: mov v1.s[1], v0.s[0]
159+
; GISEL-NEXT: fmov d0, d1
160+
; GISEL-NEXT: add sp, sp, #48
161+
; GISEL-NEXT: ret
162+
;
163+
; WINDOWS-LABEL: test_ldexp_v2f32_v2i32:
164+
; WINDOWS: .seh_proc test_ldexp_v2f32_v2i32
165+
; WINDOWS-NEXT: // %bb.0:
166+
; WINDOWS-NEXT: sub sp, sp, #48
167+
; WINDOWS-NEXT: .seh_stackalloc 48
168+
; WINDOWS-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
169+
; WINDOWS-NEXT: .seh_save_reg x30, 32
170+
; WINDOWS-NEXT: .seh_endprologue
171+
; WINDOWS-NEXT: // kill: def $d0 killed $d0 def $q0
172+
; WINDOWS-NEXT: mov s2, v0.s[1]
173+
; WINDOWS-NEXT: // kill: def $d1 killed $d1 def $q1
174+
; WINDOWS-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill
175+
; WINDOWS-NEXT: mov w0, v1.s[1]
176+
; WINDOWS-NEXT: fcvt d0, s2
177+
; WINDOWS-NEXT: bl ldexp
178+
; WINDOWS-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
179+
; WINDOWS-NEXT: fcvt s0, d0
180+
; WINDOWS-NEXT: fcvt d1, s1
181+
; WINDOWS-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
182+
; WINDOWS-NEXT: ldr q0, [sp] // 16-byte Folded Reload
183+
; WINDOWS-NEXT: fmov w0, s0
184+
; WINDOWS-NEXT: fmov d0, d1
185+
; WINDOWS-NEXT: bl ldexp
186+
; WINDOWS-NEXT: fcvt s0, d0
187+
; WINDOWS-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
188+
; WINDOWS-NEXT: mov v0.s[1], v1.s[0]
189+
; WINDOWS-NEXT: // kill: def $d0 killed $d0 killed $q0
190+
; WINDOWS-NEXT: .seh_startepilogue
191+
; WINDOWS-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
192+
; WINDOWS-NEXT: .seh_save_reg x30, 32
193+
; WINDOWS-NEXT: add sp, sp, #48
194+
; WINDOWS-NEXT: .seh_stackalloc 48
195+
; WINDOWS-NEXT: .seh_endepilogue
196+
; WINDOWS-NEXT: ret
197+
; WINDOWS-NEXT: .seh_endfunclet
198+
; WINDOWS-NEXT: .seh_endproc
199+
%result = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %Val, <2 x i32> %Exp)
200+
ret <2 x float> %result
201+
}
101202

102203
declare float @ldexpf(float, i32) memory(none)
103204

@@ -106,6 +207,10 @@ define fp128 @testExpl(fp128 %val, i32 %a) {
106207
; SVE: // %bb.0: // %entry
107208
; SVE-NEXT: b ldexpl
108209
;
210+
; GISEL-LABEL: testExpl:
211+
; GISEL: // %bb.0: // %entry
212+
; GISEL-NEXT: b ldexpl
213+
;
109214
; WINDOWS-LABEL: testExpl:
110215
; WINDOWS: // %bb.0: // %entry
111216
; WINDOWS-NEXT: b ldexpl
@@ -126,6 +231,17 @@ define half @testExpf16(half %val, i32 %a) {
126231
; SVE-NEXT: fcvt h0, s0
127232
; SVE-NEXT: ret
128233
;
234+
; GISEL-LABEL: testExpf16:
235+
; GISEL: // %bb.0: // %entry
236+
; GISEL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
237+
; GISEL-NEXT: .cfi_def_cfa_offset 16
238+
; GISEL-NEXT: .cfi_offset w30, -16
239+
; GISEL-NEXT: fcvt s0, h0
240+
; GISEL-NEXT: bl ldexpf
241+
; GISEL-NEXT: fcvt h0, s0
242+
; GISEL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
243+
; GISEL-NEXT: ret
244+
;
129245
; WINDOWS-LABEL: testExpf16:
130246
; WINDOWS: .seh_proc testExpf16
131247
; WINDOWS-NEXT: // %bb.0: // %entry

0 commit comments

Comments
 (0)