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
102203declare 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