[LoopVectorizer] Propagate underlying instruction to the cloned instances of VPPartia...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / fpowi.ll
blob8948556d1b380a90d6b617b586185841412dc87d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3 ; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5 define double @powi_f64(double %a, i32 %b) {
6 ; CHECK-LABEL: powi_f64:
7 ; CHECK:       // %bb.0: // %entry
8 ; CHECK-NEXT:    b __powidf2
9 entry:
10   %c = call double @llvm.powi.f64.i32(double %a, i32 %b)
11   ret double %c
14 define float @powi_f32(float %a, i32 %b) {
15 ; CHECK-LABEL: powi_f32:
16 ; CHECK:       // %bb.0: // %entry
17 ; CHECK-NEXT:    b __powisf2
18 entry:
19   %c = call float @llvm.powi.f32.i32(float %a, i32 %b)
20   ret float %c
23 define half @powi_f16(half %a, i32 %b) {
24 ; CHECK-LABEL: powi_f16:
25 ; CHECK:       // %bb.0: // %entry
26 ; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
27 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
28 ; CHECK-NEXT:    .cfi_offset w30, -16
29 ; CHECK-NEXT:    fcvt s0, h0
30 ; CHECK-NEXT:    bl __powisf2
31 ; CHECK-NEXT:    fcvt h0, s0
32 ; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
33 ; CHECK-NEXT:    ret
34 entry:
35   %c = call half @llvm.powi.f16.i32(half %a, i32 %b)
36   ret half %c
39 define fp128 @powi_fp128(fp128 %a, i32 %b) {
40 ; CHECK-LABEL: powi_fp128:
41 ; CHECK:       // %bb.0: // %entry
42 ; CHECK-NEXT:    b __powitf2
43 entry:
44   %c = call fp128 @llvm.powi.fp128.i32(fp128 %a, i32 %b)
45   ret fp128 %c
48 define <1 x double> @powi_v1f64(<1 x double> %a, i32 %b) {
49 ; CHECK-LABEL: powi_v1f64:
50 ; CHECK:       // %bb.0: // %entry
51 ; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
52 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
53 ; CHECK-NEXT:    .cfi_offset w30, -16
54 ; CHECK-NEXT:    bl __powidf2
55 ; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
56 ; CHECK-NEXT:    ret
57 entry:
58   %c = call <1 x double> @llvm.powi.v1f64.i32(<1 x double> %a, i32 %b)
59   ret <1 x double> %c
62 define <2 x double> @powi_v2f64(<2 x double> %a, i32 %b) {
63 ; CHECK-SD-LABEL: powi_v2f64:
64 ; CHECK-SD:       // %bb.0: // %entry
65 ; CHECK-SD-NEXT:    sub sp, sp, #48
66 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
67 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
68 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
69 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
70 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
71 ; CHECK-SD-NEXT:    mov d0, v0.d[1]
72 ; CHECK-SD-NEXT:    mov w19, w0
73 ; CHECK-SD-NEXT:    bl __powidf2
74 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
75 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
76 ; CHECK-SD-NEXT:    mov w0, w19
77 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
78 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
79 ; CHECK-SD-NEXT:    bl __powidf2
80 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
81 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
82 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
83 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
84 ; CHECK-SD-NEXT:    add sp, sp, #48
85 ; CHECK-SD-NEXT:    ret
87 ; CHECK-GI-LABEL: powi_v2f64:
88 ; CHECK-GI:       // %bb.0: // %entry
89 ; CHECK-GI-NEXT:    sub sp, sp, #48
90 ; CHECK-GI-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
91 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
92 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
93 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
94 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
95 ; CHECK-GI-NEXT:    .cfi_offset b8, -32
96 ; CHECK-GI-NEXT:    mov d8, v0.d[1]
97 ; CHECK-GI-NEXT:    mov w19, w0
98 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
99 ; CHECK-GI-NEXT:    bl __powidf2
100 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
101 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
102 ; CHECK-GI-NEXT:    mov w0, w19
103 ; CHECK-GI-NEXT:    fmov d0, d8
104 ; CHECK-GI-NEXT:    bl __powidf2
105 ; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
106 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
107 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
108 ; CHECK-GI-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
109 ; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]
110 ; CHECK-GI-NEXT:    mov v0.16b, v1.16b
111 ; CHECK-GI-NEXT:    add sp, sp, #48
112 ; CHECK-GI-NEXT:    ret
113 entry:
114   %c = call <2 x double> @llvm.powi.v2f64.i32(<2 x double> %a, i32 %b)
115   ret <2 x double> %c
118 define <3 x double> @powi_v3f64(<3 x double> %a, i32 %b) {
119 ; CHECK-SD-LABEL: powi_v3f64:
120 ; CHECK-SD:       // %bb.0: // %entry
121 ; CHECK-SD-NEXT:    str d10, [sp, #-48]! // 8-byte Folded Spill
122 ; CHECK-SD-NEXT:    stp d9, d8, [sp, #16] // 16-byte Folded Spill
123 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
124 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
125 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
126 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
127 ; CHECK-SD-NEXT:    .cfi_offset b8, -24
128 ; CHECK-SD-NEXT:    .cfi_offset b9, -32
129 ; CHECK-SD-NEXT:    .cfi_offset b10, -48
130 ; CHECK-SD-NEXT:    mov w19, w0
131 ; CHECK-SD-NEXT:    fmov d8, d2
132 ; CHECK-SD-NEXT:    fmov d9, d1
133 ; CHECK-SD-NEXT:    bl __powidf2
134 ; CHECK-SD-NEXT:    fmov d10, d0
135 ; CHECK-SD-NEXT:    fmov d0, d9
136 ; CHECK-SD-NEXT:    mov w0, w19
137 ; CHECK-SD-NEXT:    bl __powidf2
138 ; CHECK-SD-NEXT:    fmov d9, d0
139 ; CHECK-SD-NEXT:    fmov d0, d8
140 ; CHECK-SD-NEXT:    mov w0, w19
141 ; CHECK-SD-NEXT:    bl __powidf2
142 ; CHECK-SD-NEXT:    fmov d1, d9
143 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
144 ; CHECK-SD-NEXT:    ldp d9, d8, [sp, #16] // 16-byte Folded Reload
145 ; CHECK-SD-NEXT:    fmov d2, d0
146 ; CHECK-SD-NEXT:    fmov d0, d10
147 ; CHECK-SD-NEXT:    ldr d10, [sp], #48 // 8-byte Folded Reload
148 ; CHECK-SD-NEXT:    ret
150 ; CHECK-GI-LABEL: powi_v3f64:
151 ; CHECK-GI:       // %bb.0: // %entry
152 ; CHECK-GI-NEXT:    str d10, [sp, #-48]! // 8-byte Folded Spill
153 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #16] // 16-byte Folded Spill
154 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
155 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
156 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
157 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
158 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
159 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
160 ; CHECK-GI-NEXT:    .cfi_offset b10, -48
161 ; CHECK-GI-NEXT:    fmov d8, d1
162 ; CHECK-GI-NEXT:    fmov d9, d2
163 ; CHECK-GI-NEXT:    mov w19, w0
164 ; CHECK-GI-NEXT:    bl __powidf2
165 ; CHECK-GI-NEXT:    fmov d10, d0
166 ; CHECK-GI-NEXT:    fmov d0, d8
167 ; CHECK-GI-NEXT:    mov w0, w19
168 ; CHECK-GI-NEXT:    bl __powidf2
169 ; CHECK-GI-NEXT:    fmov d8, d0
170 ; CHECK-GI-NEXT:    fmov d0, d9
171 ; CHECK-GI-NEXT:    mov w0, w19
172 ; CHECK-GI-NEXT:    bl __powidf2
173 ; CHECK-GI-NEXT:    fmov d1, d8
174 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
175 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #16] // 16-byte Folded Reload
176 ; CHECK-GI-NEXT:    fmov d2, d0
177 ; CHECK-GI-NEXT:    fmov d0, d10
178 ; CHECK-GI-NEXT:    ldr d10, [sp], #48 // 8-byte Folded Reload
179 ; CHECK-GI-NEXT:    ret
180 entry:
181   %c = call <3 x double> @llvm.powi.v3f64.i32(<3 x double> %a, i32 %b)
182   ret <3 x double> %c
185 define <4 x double> @powi_v4f64(<4 x double> %a, i32 %b) {
186 ; CHECK-SD-LABEL: powi_v4f64:
187 ; CHECK-SD:       // %bb.0: // %entry
188 ; CHECK-SD-NEXT:    sub sp, sp, #64
189 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
190 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
191 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
192 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
193 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
194 ; CHECK-SD-NEXT:    mov d0, v0.d[1]
195 ; CHECK-SD-NEXT:    mov w19, w0
196 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
197 ; CHECK-SD-NEXT:    bl __powidf2
198 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
199 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
200 ; CHECK-SD-NEXT:    mov w0, w19
201 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
202 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
203 ; CHECK-SD-NEXT:    bl __powidf2
204 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
205 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
206 ; CHECK-SD-NEXT:    mov w0, w19
207 ; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
208 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
209 ; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
210 ; CHECK-SD-NEXT:    mov d0, v0.d[1]
211 ; CHECK-SD-NEXT:    bl __powidf2
212 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
213 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
214 ; CHECK-SD-NEXT:    mov w0, w19
215 ; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
216 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
217 ; CHECK-SD-NEXT:    bl __powidf2
218 ; CHECK-SD-NEXT:    fmov d1, d0
219 ; CHECK-SD-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
220 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
221 ; CHECK-SD-NEXT:    mov v1.d[1], v2.d[0]
222 ; CHECK-SD-NEXT:    add sp, sp, #64
223 ; CHECK-SD-NEXT:    ret
225 ; CHECK-GI-LABEL: powi_v4f64:
226 ; CHECK-GI:       // %bb.0: // %entry
227 ; CHECK-GI-NEXT:    sub sp, sp, #80
228 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
229 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #64] // 16-byte Folded Spill
230 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
231 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
232 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
233 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
234 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
235 ; CHECK-GI-NEXT:    str q1, [sp] // 16-byte Folded Spill
236 ; CHECK-GI-NEXT:    mov d8, v0.d[1]
237 ; CHECK-GI-NEXT:    mov d9, v1.d[1]
238 ; CHECK-GI-NEXT:    mov w19, w0
239 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
240 ; CHECK-GI-NEXT:    bl __powidf2
241 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
242 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
243 ; CHECK-GI-NEXT:    mov w0, w19
244 ; CHECK-GI-NEXT:    fmov d0, d8
245 ; CHECK-GI-NEXT:    bl __powidf2
246 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
247 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
248 ; CHECK-GI-NEXT:    mov w0, w19
249 ; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
250 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
251 ; CHECK-GI-NEXT:    bl __powidf2
252 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
253 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
254 ; CHECK-GI-NEXT:    mov w0, w19
255 ; CHECK-GI-NEXT:    fmov d0, d9
256 ; CHECK-GI-NEXT:    bl __powidf2
257 ; CHECK-GI-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
258 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
259 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #64] // 16-byte Folded Reload
260 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
261 ; CHECK-GI-NEXT:    mov v2.d[1], v1.d[0]
262 ; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
263 ; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]
264 ; CHECK-GI-NEXT:    mov v0.16b, v2.16b
265 ; CHECK-GI-NEXT:    add sp, sp, #80
266 ; CHECK-GI-NEXT:    ret
267 entry:
268   %c = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %a, i32 %b)
269   ret <4 x double> %c
272 define <2 x float> @powi_v2f32(<2 x float> %a, i32 %b) {
273 ; CHECK-SD-LABEL: powi_v2f32:
274 ; CHECK-SD:       // %bb.0: // %entry
275 ; CHECK-SD-NEXT:    sub sp, sp, #48
276 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
277 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
278 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
279 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
280 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
281 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
282 ; CHECK-SD-NEXT:    mov w19, w0
283 ; CHECK-SD-NEXT:    mov s0, v0.s[1]
284 ; CHECK-SD-NEXT:    bl __powisf2
285 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
286 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
287 ; CHECK-SD-NEXT:    mov w0, w19
288 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
289 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
290 ; CHECK-SD-NEXT:    bl __powisf2
291 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
292 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
293 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
294 ; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
295 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
296 ; CHECK-SD-NEXT:    add sp, sp, #48
297 ; CHECK-SD-NEXT:    ret
299 ; CHECK-GI-LABEL: powi_v2f32:
300 ; CHECK-GI:       // %bb.0: // %entry
301 ; CHECK-GI-NEXT:    sub sp, sp, #48
302 ; CHECK-GI-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
303 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
304 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
305 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
306 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
307 ; CHECK-GI-NEXT:    .cfi_offset b8, -32
308 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
309 ; CHECK-GI-NEXT:    mov s8, v0.s[1]
310 ; CHECK-GI-NEXT:    mov w19, w0
311 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
312 ; CHECK-GI-NEXT:    bl __powisf2
313 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
314 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
315 ; CHECK-GI-NEXT:    mov w0, w19
316 ; CHECK-GI-NEXT:    fmov s0, s8
317 ; CHECK-GI-NEXT:    bl __powisf2
318 ; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
319 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
320 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
321 ; CHECK-GI-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
322 ; CHECK-GI-NEXT:    mov v1.s[1], v0.s[0]
323 ; CHECK-GI-NEXT:    fmov d0, d1
324 ; CHECK-GI-NEXT:    add sp, sp, #48
325 ; CHECK-GI-NEXT:    ret
326 entry:
327   %c = call <2 x float> @llvm.powi.v2f32.i32(<2 x float> %a, i32 %b)
328   ret <2 x float> %c
331 define <3 x float> @powi_v3f32(<3 x float> %a, i32 %b) {
332 ; CHECK-SD-LABEL: powi_v3f32:
333 ; CHECK-SD:       // %bb.0: // %entry
334 ; CHECK-SD-NEXT:    sub sp, sp, #48
335 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
336 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
337 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
338 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
339 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
340 ; CHECK-SD-NEXT:    mov s0, v0.s[1]
341 ; CHECK-SD-NEXT:    mov w19, w0
342 ; CHECK-SD-NEXT:    bl __powisf2
343 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
344 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
345 ; CHECK-SD-NEXT:    mov w0, w19
346 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
347 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
348 ; CHECK-SD-NEXT:    bl __powisf2
349 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
350 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
351 ; CHECK-SD-NEXT:    mov w0, w19
352 ; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
353 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
354 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
355 ; CHECK-SD-NEXT:    mov s0, v0.s[2]
356 ; CHECK-SD-NEXT:    bl __powisf2
357 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
358 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
359 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
360 ; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
361 ; CHECK-SD-NEXT:    mov v0.16b, v1.16b
362 ; CHECK-SD-NEXT:    add sp, sp, #48
363 ; CHECK-SD-NEXT:    ret
365 ; CHECK-GI-LABEL: powi_v3f32:
366 ; CHECK-GI:       // %bb.0: // %entry
367 ; CHECK-GI-NEXT:    sub sp, sp, #64
368 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
369 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
370 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
371 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
372 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
373 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
374 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
375 ; CHECK-GI-NEXT:    mov s8, v0.s[1]
376 ; CHECK-GI-NEXT:    mov s9, v0.s[2]
377 ; CHECK-GI-NEXT:    mov w19, w0
378 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
379 ; CHECK-GI-NEXT:    bl __powisf2
380 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
381 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
382 ; CHECK-GI-NEXT:    mov w0, w19
383 ; CHECK-GI-NEXT:    fmov s0, s8
384 ; CHECK-GI-NEXT:    bl __powisf2
385 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
386 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
387 ; CHECK-GI-NEXT:    mov w0, w19
388 ; CHECK-GI-NEXT:    fmov s0, s9
389 ; CHECK-GI-NEXT:    bl __powisf2
390 ; CHECK-GI-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
391 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
392 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
393 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
394 ; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
395 ; CHECK-GI-NEXT:    mov v1.s[2], v0.s[0]
396 ; CHECK-GI-NEXT:    mov v0.16b, v1.16b
397 ; CHECK-GI-NEXT:    add sp, sp, #64
398 ; CHECK-GI-NEXT:    ret
399 entry:
400   %c = call <3 x float> @llvm.powi.v3f32.i32(<3 x float> %a, i32 %b)
401   ret <3 x float> %c
404 define <4 x float> @powi_v4f32(<4 x float> %a, i32 %b) {
405 ; CHECK-SD-LABEL: powi_v4f32:
406 ; CHECK-SD:       // %bb.0: // %entry
407 ; CHECK-SD-NEXT:    sub sp, sp, #48
408 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
409 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
410 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
411 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
412 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
413 ; CHECK-SD-NEXT:    mov s0, v0.s[1]
414 ; CHECK-SD-NEXT:    mov w19, w0
415 ; CHECK-SD-NEXT:    bl __powisf2
416 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
417 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
418 ; CHECK-SD-NEXT:    mov w0, w19
419 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
420 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
421 ; CHECK-SD-NEXT:    bl __powisf2
422 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
423 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
424 ; CHECK-SD-NEXT:    mov w0, w19
425 ; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
426 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
427 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
428 ; CHECK-SD-NEXT:    mov s0, v0.s[2]
429 ; CHECK-SD-NEXT:    bl __powisf2
430 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
431 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
432 ; CHECK-SD-NEXT:    mov w0, w19
433 ; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
434 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
435 ; CHECK-SD-NEXT:    mov s0, v0.s[3]
436 ; CHECK-SD-NEXT:    str q1, [sp] // 16-byte Folded Spill
437 ; CHECK-SD-NEXT:    bl __powisf2
438 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
439 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
440 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
441 ; CHECK-SD-NEXT:    mov v1.s[3], v0.s[0]
442 ; CHECK-SD-NEXT:    mov v0.16b, v1.16b
443 ; CHECK-SD-NEXT:    add sp, sp, #48
444 ; CHECK-SD-NEXT:    ret
446 ; CHECK-GI-LABEL: powi_v4f32:
447 ; CHECK-GI:       // %bb.0: // %entry
448 ; CHECK-GI-NEXT:    sub sp, sp, #96
449 ; CHECK-GI-NEXT:    str d10, [sp, #48] // 8-byte Folded Spill
450 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #64] // 16-byte Folded Spill
451 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #80] // 16-byte Folded Spill
452 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 96
453 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
454 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
455 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
456 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
457 ; CHECK-GI-NEXT:    .cfi_offset b10, -48
458 ; CHECK-GI-NEXT:    mov s8, v0.s[1]
459 ; CHECK-GI-NEXT:    mov s9, v0.s[2]
460 ; CHECK-GI-NEXT:    mov w19, w0
461 ; CHECK-GI-NEXT:    mov s10, v0.s[3]
462 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
463 ; CHECK-GI-NEXT:    bl __powisf2
464 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
465 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
466 ; CHECK-GI-NEXT:    mov w0, w19
467 ; CHECK-GI-NEXT:    fmov s0, s8
468 ; CHECK-GI-NEXT:    bl __powisf2
469 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
470 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
471 ; CHECK-GI-NEXT:    mov w0, w19
472 ; CHECK-GI-NEXT:    fmov s0, s9
473 ; CHECK-GI-NEXT:    bl __powisf2
474 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
475 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
476 ; CHECK-GI-NEXT:    mov w0, w19
477 ; CHECK-GI-NEXT:    fmov s0, s10
478 ; CHECK-GI-NEXT:    bl __powisf2
479 ; CHECK-GI-NEXT:    ldp q2, q1, [sp, #16] // 32-byte Folded Reload
480 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
481 ; CHECK-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Folded Reload
482 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #80] // 16-byte Folded Reload
483 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #64] // 16-byte Folded Reload
484 ; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
485 ; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
486 ; CHECK-GI-NEXT:    mov v1.s[2], v2.s[0]
487 ; CHECK-GI-NEXT:    mov v1.s[3], v0.s[0]
488 ; CHECK-GI-NEXT:    mov v0.16b, v1.16b
489 ; CHECK-GI-NEXT:    add sp, sp, #96
490 ; CHECK-GI-NEXT:    ret
491 entry:
492   %c = call <4 x float> @llvm.powi.v4f32.i32(<4 x float> %a, i32 %b)
493   ret <4 x float> %c
496 define <8 x float> @powi_v8f32(<8 x float> %a, i32 %b) {
497 ; CHECK-SD-LABEL: powi_v8f32:
498 ; CHECK-SD:       // %bb.0: // %entry
499 ; CHECK-SD-NEXT:    sub sp, sp, #64
500 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
501 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
502 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
503 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
504 ; CHECK-SD-NEXT:    stp q0, q1, [sp] // 32-byte Folded Spill
505 ; CHECK-SD-NEXT:    mov s0, v0.s[1]
506 ; CHECK-SD-NEXT:    mov w19, w0
507 ; CHECK-SD-NEXT:    bl __powisf2
508 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
509 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
510 ; CHECK-SD-NEXT:    mov w0, w19
511 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
512 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
513 ; CHECK-SD-NEXT:    bl __powisf2
514 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
515 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
516 ; CHECK-SD-NEXT:    mov w0, w19
517 ; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
518 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
519 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
520 ; CHECK-SD-NEXT:    mov s0, v0.s[2]
521 ; CHECK-SD-NEXT:    bl __powisf2
522 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
523 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
524 ; CHECK-SD-NEXT:    mov w0, w19
525 ; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
526 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
527 ; CHECK-SD-NEXT:    mov s0, v0.s[3]
528 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
529 ; CHECK-SD-NEXT:    bl __powisf2
530 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
531 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
532 ; CHECK-SD-NEXT:    mov w0, w19
533 ; CHECK-SD-NEXT:    mov v1.s[3], v0.s[0]
534 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
535 ; CHECK-SD-NEXT:    mov s0, v0.s[1]
536 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
537 ; CHECK-SD-NEXT:    bl __powisf2
538 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
539 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
540 ; CHECK-SD-NEXT:    mov w0, w19
541 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
542 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
543 ; CHECK-SD-NEXT:    bl __powisf2
544 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
545 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
546 ; CHECK-SD-NEXT:    mov w0, w19
547 ; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
548 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
549 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
550 ; CHECK-SD-NEXT:    mov s0, v0.s[2]
551 ; CHECK-SD-NEXT:    bl __powisf2
552 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
553 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
554 ; CHECK-SD-NEXT:    mov w0, w19
555 ; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
556 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
557 ; CHECK-SD-NEXT:    mov s0, v0.s[3]
558 ; CHECK-SD-NEXT:    str q1, [sp] // 16-byte Folded Spill
559 ; CHECK-SD-NEXT:    bl __powisf2
560 ; CHECK-SD-NEXT:    fmov s2, s0
561 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
562 ; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
563 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
564 ; CHECK-SD-NEXT:    mov v1.s[3], v2.s[0]
565 ; CHECK-SD-NEXT:    add sp, sp, #64
566 ; CHECK-SD-NEXT:    ret
568 ; CHECK-GI-LABEL: powi_v8f32:
569 ; CHECK-GI:       // %bb.0: // %entry
570 ; CHECK-GI-NEXT:    sub sp, sp, #176
571 ; CHECK-GI-NEXT:    stp d13, d12, [sp, #112] // 16-byte Folded Spill
572 ; CHECK-GI-NEXT:    stp d11, d10, [sp, #128] // 16-byte Folded Spill
573 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #144] // 16-byte Folded Spill
574 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #160] // 16-byte Folded Spill
575 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 176
576 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
577 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
578 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
579 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
580 ; CHECK-GI-NEXT:    .cfi_offset b10, -40
581 ; CHECK-GI-NEXT:    .cfi_offset b11, -48
582 ; CHECK-GI-NEXT:    .cfi_offset b12, -56
583 ; CHECK-GI-NEXT:    .cfi_offset b13, -64
584 ; CHECK-GI-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
585 ; CHECK-GI-NEXT:    mov s8, v0.s[1]
586 ; CHECK-GI-NEXT:    mov s9, v0.s[2]
587 ; CHECK-GI-NEXT:    mov s10, v0.s[3]
588 ; CHECK-GI-NEXT:    mov s11, v1.s[1]
589 ; CHECK-GI-NEXT:    mov w19, w0
590 ; CHECK-GI-NEXT:    mov s12, v1.s[2]
591 ; CHECK-GI-NEXT:    mov s13, v1.s[3]
592 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
593 ; CHECK-GI-NEXT:    bl __powisf2
594 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
595 ; CHECK-GI-NEXT:    str q0, [sp, #96] // 16-byte Folded Spill
596 ; CHECK-GI-NEXT:    mov w0, w19
597 ; CHECK-GI-NEXT:    fmov s0, s8
598 ; CHECK-GI-NEXT:    bl __powisf2
599 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
600 ; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
601 ; CHECK-GI-NEXT:    mov w0, w19
602 ; CHECK-GI-NEXT:    fmov s0, s9
603 ; CHECK-GI-NEXT:    bl __powisf2
604 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
605 ; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
606 ; CHECK-GI-NEXT:    mov w0, w19
607 ; CHECK-GI-NEXT:    fmov s0, s10
608 ; CHECK-GI-NEXT:    bl __powisf2
609 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
610 ; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
611 ; CHECK-GI-NEXT:    mov w0, w19
612 ; CHECK-GI-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
613 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
614 ; CHECK-GI-NEXT:    bl __powisf2
615 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
616 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
617 ; CHECK-GI-NEXT:    mov w0, w19
618 ; CHECK-GI-NEXT:    fmov s0, s11
619 ; CHECK-GI-NEXT:    bl __powisf2
620 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
621 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
622 ; CHECK-GI-NEXT:    mov w0, w19
623 ; CHECK-GI-NEXT:    fmov s0, s12
624 ; CHECK-GI-NEXT:    bl __powisf2
625 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
626 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
627 ; CHECK-GI-NEXT:    mov w0, w19
628 ; CHECK-GI-NEXT:    fmov s0, s13
629 ; CHECK-GI-NEXT:    bl __powisf2
630 ; CHECK-GI-NEXT:    ldp q3, q2, [sp, #32] // 32-byte Folded Reload
631 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
632 ; CHECK-GI-NEXT:    ldr q1, [sp, #96] // 16-byte Folded Reload
633 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #160] // 16-byte Folded Reload
634 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #144] // 16-byte Folded Reload
635 ; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
636 ; CHECK-GI-NEXT:    ldr q2, [sp, #16] // 16-byte Folded Reload
637 ; CHECK-GI-NEXT:    ldp d11, d10, [sp, #128] // 16-byte Folded Reload
638 ; CHECK-GI-NEXT:    mov v3.s[1], v2.s[0]
639 ; CHECK-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Folded Reload
640 ; CHECK-GI-NEXT:    ldp d13, d12, [sp, #112] // 16-byte Folded Reload
641 ; CHECK-GI-NEXT:    mov v1.s[2], v2.s[0]
642 ; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
643 ; CHECK-GI-NEXT:    mov v3.s[2], v2.s[0]
644 ; CHECK-GI-NEXT:    ldr q2, [sp, #64] // 16-byte Folded Reload
645 ; CHECK-GI-NEXT:    mov v1.s[3], v2.s[0]
646 ; CHECK-GI-NEXT:    mov v3.s[3], v0.s[0]
647 ; CHECK-GI-NEXT:    mov v2.16b, v1.16b
648 ; CHECK-GI-NEXT:    mov v1.16b, v3.16b
649 ; CHECK-GI-NEXT:    mov v0.16b, v2.16b
650 ; CHECK-GI-NEXT:    add sp, sp, #176
651 ; CHECK-GI-NEXT:    ret
652 entry:
653   %c = call <8 x float> @llvm.powi.v8f32.i32(<8 x float> %a, i32 %b)
654   ret <8 x float> %c
657 define <7 x half> @powi_v7f16(<7 x half> %a, i32 %b) {
658 ; CHECK-SD-LABEL: powi_v7f16:
659 ; CHECK-SD:       // %bb.0: // %entry
660 ; CHECK-SD-NEXT:    sub sp, sp, #48
661 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
662 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
663 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
664 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
665 ; CHECK-SD-NEXT:    mov h1, v0.h[1]
666 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
667 ; CHECK-SD-NEXT:    mov w19, w0
668 ; CHECK-SD-NEXT:    fcvt s0, h1
669 ; CHECK-SD-NEXT:    bl __powisf2
670 ; CHECK-SD-NEXT:    fcvt h0, s0
671 ; CHECK-SD-NEXT:    mov w0, w19
672 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
673 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
674 ; CHECK-SD-NEXT:    fcvt s0, h0
675 ; CHECK-SD-NEXT:    bl __powisf2
676 ; CHECK-SD-NEXT:    fcvt h0, s0
677 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
678 ; CHECK-SD-NEXT:    mov w0, w19
679 ; CHECK-SD-NEXT:    mov v0.h[1], v1.h[0]
680 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
681 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
682 ; CHECK-SD-NEXT:    mov h0, v0.h[2]
683 ; CHECK-SD-NEXT:    fcvt s0, h0
684 ; CHECK-SD-NEXT:    bl __powisf2
685 ; CHECK-SD-NEXT:    fcvt h0, s0
686 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
687 ; CHECK-SD-NEXT:    mov w0, w19
688 ; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
689 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
690 ; CHECK-SD-NEXT:    mov h0, v0.h[3]
691 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
692 ; CHECK-SD-NEXT:    fcvt s0, h0
693 ; CHECK-SD-NEXT:    bl __powisf2
694 ; CHECK-SD-NEXT:    fcvt h0, s0
695 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
696 ; CHECK-SD-NEXT:    mov w0, w19
697 ; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
698 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
699 ; CHECK-SD-NEXT:    mov h0, v0.h[4]
700 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
701 ; CHECK-SD-NEXT:    fcvt s0, h0
702 ; CHECK-SD-NEXT:    bl __powisf2
703 ; CHECK-SD-NEXT:    fcvt h0, s0
704 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
705 ; CHECK-SD-NEXT:    mov w0, w19
706 ; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
707 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
708 ; CHECK-SD-NEXT:    mov h0, v0.h[5]
709 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
710 ; CHECK-SD-NEXT:    fcvt s0, h0
711 ; CHECK-SD-NEXT:    bl __powisf2
712 ; CHECK-SD-NEXT:    fcvt h0, s0
713 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
714 ; CHECK-SD-NEXT:    mov w0, w19
715 ; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
716 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
717 ; CHECK-SD-NEXT:    mov h0, v0.h[6]
718 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
719 ; CHECK-SD-NEXT:    fcvt s0, h0
720 ; CHECK-SD-NEXT:    bl __powisf2
721 ; CHECK-SD-NEXT:    fcvt h0, s0
722 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
723 ; CHECK-SD-NEXT:    mov w0, w19
724 ; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
725 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
726 ; CHECK-SD-NEXT:    mov h0, v0.h[7]
727 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
728 ; CHECK-SD-NEXT:    fcvt s0, h0
729 ; CHECK-SD-NEXT:    bl __powisf2
730 ; CHECK-SD-NEXT:    fcvt h1, s0
731 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
732 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
733 ; CHECK-SD-NEXT:    mov v0.h[7], v1.h[0]
734 ; CHECK-SD-NEXT:    add sp, sp, #48
735 ; CHECK-SD-NEXT:    ret
737 ; CHECK-GI-LABEL: powi_v7f16:
738 ; CHECK-GI:       // %bb.0: // %entry
739 ; CHECK-GI-NEXT:    sub sp, sp, #160
740 ; CHECK-GI-NEXT:    stp d13, d12, [sp, #96] // 16-byte Folded Spill
741 ; CHECK-GI-NEXT:    stp d11, d10, [sp, #112] // 16-byte Folded Spill
742 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #128] // 16-byte Folded Spill
743 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #144] // 16-byte Folded Spill
744 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 160
745 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
746 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
747 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
748 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
749 ; CHECK-GI-NEXT:    .cfi_offset b10, -40
750 ; CHECK-GI-NEXT:    .cfi_offset b11, -48
751 ; CHECK-GI-NEXT:    .cfi_offset b12, -56
752 ; CHECK-GI-NEXT:    .cfi_offset b13, -64
753 ; CHECK-GI-NEXT:    mov h8, v0.h[1]
754 ; CHECK-GI-NEXT:    mov h9, v0.h[2]
755 ; CHECK-GI-NEXT:    mov w19, w0
756 ; CHECK-GI-NEXT:    mov h10, v0.h[3]
757 ; CHECK-GI-NEXT:    mov h11, v0.h[4]
758 ; CHECK-GI-NEXT:    mov h12, v0.h[5]
759 ; CHECK-GI-NEXT:    mov h13, v0.h[6]
760 ; CHECK-GI-NEXT:    fcvt s0, h0
761 ; CHECK-GI-NEXT:    bl __powisf2
762 ; CHECK-GI-NEXT:    fcvt s1, h8
763 ; CHECK-GI-NEXT:    fcvt h0, s0
764 ; CHECK-GI-NEXT:    mov w0, w19
765 ; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
766 ; CHECK-GI-NEXT:    fmov s0, s1
767 ; CHECK-GI-NEXT:    bl __powisf2
768 ; CHECK-GI-NEXT:    fcvt s1, h9
769 ; CHECK-GI-NEXT:    fcvt h0, s0
770 ; CHECK-GI-NEXT:    mov w0, w19
771 ; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
772 ; CHECK-GI-NEXT:    fmov s0, s1
773 ; CHECK-GI-NEXT:    bl __powisf2
774 ; CHECK-GI-NEXT:    fcvt s1, h10
775 ; CHECK-GI-NEXT:    fcvt h0, s0
776 ; CHECK-GI-NEXT:    mov w0, w19
777 ; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
778 ; CHECK-GI-NEXT:    fmov s0, s1
779 ; CHECK-GI-NEXT:    bl __powisf2
780 ; CHECK-GI-NEXT:    fcvt s1, h11
781 ; CHECK-GI-NEXT:    fcvt h0, s0
782 ; CHECK-GI-NEXT:    mov w0, w19
783 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
784 ; CHECK-GI-NEXT:    fmov s0, s1
785 ; CHECK-GI-NEXT:    bl __powisf2
786 ; CHECK-GI-NEXT:    fcvt s1, h12
787 ; CHECK-GI-NEXT:    fcvt h0, s0
788 ; CHECK-GI-NEXT:    mov w0, w19
789 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
790 ; CHECK-GI-NEXT:    fmov s0, s1
791 ; CHECK-GI-NEXT:    bl __powisf2
792 ; CHECK-GI-NEXT:    fcvt s1, h13
793 ; CHECK-GI-NEXT:    fcvt h0, s0
794 ; CHECK-GI-NEXT:    mov w0, w19
795 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
796 ; CHECK-GI-NEXT:    fmov s0, s1
797 ; CHECK-GI-NEXT:    bl __powisf2
798 ; CHECK-GI-NEXT:    ldp q2, q1, [sp, #64] // 32-byte Folded Reload
799 ; CHECK-GI-NEXT:    fcvt h0, s0
800 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #144] // 16-byte Folded Reload
801 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #128] // 16-byte Folded Reload
802 ; CHECK-GI-NEXT:    mov v1.h[1], v2.h[0]
803 ; CHECK-GI-NEXT:    ldp q2, q3, [sp, #32] // 32-byte Folded Reload
804 ; CHECK-GI-NEXT:    ldp d11, d10, [sp, #112] // 16-byte Folded Reload
805 ; CHECK-GI-NEXT:    ldp d13, d12, [sp, #96] // 16-byte Folded Reload
806 ; CHECK-GI-NEXT:    mov v1.h[2], v3.h[0]
807 ; CHECK-GI-NEXT:    mov v1.h[3], v2.h[0]
808 ; CHECK-GI-NEXT:    ldp q2, q3, [sp] // 32-byte Folded Reload
809 ; CHECK-GI-NEXT:    mov v1.h[4], v3.h[0]
810 ; CHECK-GI-NEXT:    mov v1.h[5], v2.h[0]
811 ; CHECK-GI-NEXT:    mov v1.h[6], v0.h[0]
812 ; CHECK-GI-NEXT:    mov v0.16b, v1.16b
813 ; CHECK-GI-NEXT:    add sp, sp, #160
814 ; CHECK-GI-NEXT:    ret
815 entry:
816   %c = call <7 x half> @llvm.powi.v7f16.i32(<7 x half> %a, i32 %b)
817   ret <7 x half> %c
820 define <4 x half> @powi_v4f16(<4 x half> %a, i32 %b) {
821 ; CHECK-SD-LABEL: powi_v4f16:
822 ; CHECK-SD:       // %bb.0: // %entry
823 ; CHECK-SD-NEXT:    sub sp, sp, #48
824 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
825 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
826 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
827 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
828 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
829 ; CHECK-SD-NEXT:    mov h1, v0.h[1]
830 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
831 ; CHECK-SD-NEXT:    mov w19, w0
832 ; CHECK-SD-NEXT:    fcvt s0, h1
833 ; CHECK-SD-NEXT:    bl __powisf2
834 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
835 ; CHECK-SD-NEXT:    fcvt h0, s0
836 ; CHECK-SD-NEXT:    mov w0, w19
837 ; CHECK-SD-NEXT:    fcvt s1, h1
838 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
839 ; CHECK-SD-NEXT:    fmov s0, s1
840 ; CHECK-SD-NEXT:    bl __powisf2
841 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
842 ; CHECK-SD-NEXT:    fcvt h2, s0
843 ; CHECK-SD-NEXT:    mov w0, w19
844 ; CHECK-SD-NEXT:    mov h1, v1.h[2]
845 ; CHECK-SD-NEXT:    fcvt s0, h1
846 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
847 ; CHECK-SD-NEXT:    mov v2.h[1], v1.h[0]
848 ; CHECK-SD-NEXT:    str q2, [sp] // 16-byte Folded Spill
849 ; CHECK-SD-NEXT:    bl __powisf2
850 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
851 ; CHECK-SD-NEXT:    fcvt h2, s0
852 ; CHECK-SD-NEXT:    mov w0, w19
853 ; CHECK-SD-NEXT:    mov h1, v1.h[3]
854 ; CHECK-SD-NEXT:    fcvt s0, h1
855 ; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
856 ; CHECK-SD-NEXT:    mov v1.h[2], v2.h[0]
857 ; CHECK-SD-NEXT:    str q1, [sp] // 16-byte Folded Spill
858 ; CHECK-SD-NEXT:    bl __powisf2
859 ; CHECK-SD-NEXT:    fcvt h1, s0
860 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
861 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
862 ; CHECK-SD-NEXT:    mov v0.h[3], v1.h[0]
863 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
864 ; CHECK-SD-NEXT:    add sp, sp, #48
865 ; CHECK-SD-NEXT:    ret
867 ; CHECK-GI-LABEL: powi_v4f16:
868 ; CHECK-GI:       // %bb.0: // %entry
869 ; CHECK-GI-NEXT:    sub sp, sp, #96
870 ; CHECK-GI-NEXT:    str d10, [sp, #48] // 8-byte Folded Spill
871 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #64] // 16-byte Folded Spill
872 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #80] // 16-byte Folded Spill
873 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 96
874 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
875 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
876 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
877 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
878 ; CHECK-GI-NEXT:    .cfi_offset b10, -48
879 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
880 ; CHECK-GI-NEXT:    mov h8, v0.h[1]
881 ; CHECK-GI-NEXT:    mov h9, v0.h[2]
882 ; CHECK-GI-NEXT:    mov w19, w0
883 ; CHECK-GI-NEXT:    mov h10, v0.h[3]
884 ; CHECK-GI-NEXT:    fcvt s0, h0
885 ; CHECK-GI-NEXT:    bl __powisf2
886 ; CHECK-GI-NEXT:    fcvt s1, h8
887 ; CHECK-GI-NEXT:    fcvt h0, s0
888 ; CHECK-GI-NEXT:    mov w0, w19
889 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
890 ; CHECK-GI-NEXT:    fmov s0, s1
891 ; CHECK-GI-NEXT:    bl __powisf2
892 ; CHECK-GI-NEXT:    fcvt s1, h9
893 ; CHECK-GI-NEXT:    fcvt h0, s0
894 ; CHECK-GI-NEXT:    mov w0, w19
895 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
896 ; CHECK-GI-NEXT:    fmov s0, s1
897 ; CHECK-GI-NEXT:    bl __powisf2
898 ; CHECK-GI-NEXT:    fcvt s1, h10
899 ; CHECK-GI-NEXT:    fcvt h0, s0
900 ; CHECK-GI-NEXT:    mov w0, w19
901 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
902 ; CHECK-GI-NEXT:    fmov s0, s1
903 ; CHECK-GI-NEXT:    bl __powisf2
904 ; CHECK-GI-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
905 ; CHECK-GI-NEXT:    fcvt h0, s0
906 ; CHECK-GI-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
907 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #80] // 16-byte Folded Reload
908 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #64] // 16-byte Folded Reload
909 ; CHECK-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Folded Reload
910 ; CHECK-GI-NEXT:    mov v1.h[1], v3.h[0]
911 ; CHECK-GI-NEXT:    mov v1.h[2], v2.h[0]
912 ; CHECK-GI-NEXT:    mov v1.h[3], v0.h[0]
913 ; CHECK-GI-NEXT:    mov v0.16b, v1.16b
914 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
915 ; CHECK-GI-NEXT:    add sp, sp, #96
916 ; CHECK-GI-NEXT:    ret
917 entry:
918   %c = call <4 x half> @llvm.powi.v4f16.i32(<4 x half> %a, i32 %b)
919   ret <4 x half> %c
922 define <8 x half> @powi_v8f16(<8 x half> %a, i32 %b) {
923 ; CHECK-SD-LABEL: powi_v8f16:
924 ; CHECK-SD:       // %bb.0: // %entry
925 ; CHECK-SD-NEXT:    sub sp, sp, #48
926 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
927 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
928 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
929 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
930 ; CHECK-SD-NEXT:    mov h1, v0.h[1]
931 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
932 ; CHECK-SD-NEXT:    mov w19, w0
933 ; CHECK-SD-NEXT:    fcvt s0, h1
934 ; CHECK-SD-NEXT:    bl __powisf2
935 ; CHECK-SD-NEXT:    fcvt h0, s0
936 ; CHECK-SD-NEXT:    mov w0, w19
937 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
938 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
939 ; CHECK-SD-NEXT:    fcvt s0, h0
940 ; CHECK-SD-NEXT:    bl __powisf2
941 ; CHECK-SD-NEXT:    fcvt h0, s0
942 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
943 ; CHECK-SD-NEXT:    mov w0, w19
944 ; CHECK-SD-NEXT:    mov v0.h[1], v1.h[0]
945 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
946 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
947 ; CHECK-SD-NEXT:    mov h0, v0.h[2]
948 ; CHECK-SD-NEXT:    fcvt s0, h0
949 ; CHECK-SD-NEXT:    bl __powisf2
950 ; CHECK-SD-NEXT:    fcvt h0, s0
951 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
952 ; CHECK-SD-NEXT:    mov w0, w19
953 ; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
954 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
955 ; CHECK-SD-NEXT:    mov h0, v0.h[3]
956 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
957 ; CHECK-SD-NEXT:    fcvt s0, h0
958 ; CHECK-SD-NEXT:    bl __powisf2
959 ; CHECK-SD-NEXT:    fcvt h0, s0
960 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
961 ; CHECK-SD-NEXT:    mov w0, w19
962 ; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
963 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
964 ; CHECK-SD-NEXT:    mov h0, v0.h[4]
965 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
966 ; CHECK-SD-NEXT:    fcvt s0, h0
967 ; CHECK-SD-NEXT:    bl __powisf2
968 ; CHECK-SD-NEXT:    fcvt h0, s0
969 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
970 ; CHECK-SD-NEXT:    mov w0, w19
971 ; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
972 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
973 ; CHECK-SD-NEXT:    mov h0, v0.h[5]
974 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
975 ; CHECK-SD-NEXT:    fcvt s0, h0
976 ; CHECK-SD-NEXT:    bl __powisf2
977 ; CHECK-SD-NEXT:    fcvt h0, s0
978 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
979 ; CHECK-SD-NEXT:    mov w0, w19
980 ; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
981 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
982 ; CHECK-SD-NEXT:    mov h0, v0.h[6]
983 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
984 ; CHECK-SD-NEXT:    fcvt s0, h0
985 ; CHECK-SD-NEXT:    bl __powisf2
986 ; CHECK-SD-NEXT:    fcvt h0, s0
987 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
988 ; CHECK-SD-NEXT:    mov w0, w19
989 ; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
990 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
991 ; CHECK-SD-NEXT:    mov h0, v0.h[7]
992 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
993 ; CHECK-SD-NEXT:    fcvt s0, h0
994 ; CHECK-SD-NEXT:    bl __powisf2
995 ; CHECK-SD-NEXT:    fcvt h1, s0
996 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
997 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
998 ; CHECK-SD-NEXT:    mov v0.h[7], v1.h[0]
999 ; CHECK-SD-NEXT:    add sp, sp, #48
1000 ; CHECK-SD-NEXT:    ret
1002 ; CHECK-GI-LABEL: powi_v8f16:
1003 ; CHECK-GI:       // %bb.0: // %entry
1004 ; CHECK-GI-NEXT:    sub sp, sp, #192
1005 ; CHECK-GI-NEXT:    str d14, [sp, #112] // 8-byte Folded Spill
1006 ; CHECK-GI-NEXT:    stp d13, d12, [sp, #128] // 16-byte Folded Spill
1007 ; CHECK-GI-NEXT:    stp d11, d10, [sp, #144] // 16-byte Folded Spill
1008 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #160] // 16-byte Folded Spill
1009 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #176] // 16-byte Folded Spill
1010 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 192
1011 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
1012 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
1013 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
1014 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
1015 ; CHECK-GI-NEXT:    .cfi_offset b10, -40
1016 ; CHECK-GI-NEXT:    .cfi_offset b11, -48
1017 ; CHECK-GI-NEXT:    .cfi_offset b12, -56
1018 ; CHECK-GI-NEXT:    .cfi_offset b13, -64
1019 ; CHECK-GI-NEXT:    .cfi_offset b14, -80
1020 ; CHECK-GI-NEXT:    mov h8, v0.h[1]
1021 ; CHECK-GI-NEXT:    mov h9, v0.h[2]
1022 ; CHECK-GI-NEXT:    mov w19, w0
1023 ; CHECK-GI-NEXT:    mov h10, v0.h[3]
1024 ; CHECK-GI-NEXT:    mov h11, v0.h[4]
1025 ; CHECK-GI-NEXT:    mov h12, v0.h[5]
1026 ; CHECK-GI-NEXT:    mov h13, v0.h[6]
1027 ; CHECK-GI-NEXT:    mov h14, v0.h[7]
1028 ; CHECK-GI-NEXT:    fcvt s0, h0
1029 ; CHECK-GI-NEXT:    bl __powisf2
1030 ; CHECK-GI-NEXT:    fcvt s1, h8
1031 ; CHECK-GI-NEXT:    fcvt h0, s0
1032 ; CHECK-GI-NEXT:    mov w0, w19
1033 ; CHECK-GI-NEXT:    str q0, [sp, #96] // 16-byte Folded Spill
1034 ; CHECK-GI-NEXT:    fmov s0, s1
1035 ; CHECK-GI-NEXT:    bl __powisf2
1036 ; CHECK-GI-NEXT:    fcvt s1, h9
1037 ; CHECK-GI-NEXT:    fcvt h0, s0
1038 ; CHECK-GI-NEXT:    mov w0, w19
1039 ; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
1040 ; CHECK-GI-NEXT:    fmov s0, s1
1041 ; CHECK-GI-NEXT:    bl __powisf2
1042 ; CHECK-GI-NEXT:    fcvt s1, h10
1043 ; CHECK-GI-NEXT:    fcvt h0, s0
1044 ; CHECK-GI-NEXT:    mov w0, w19
1045 ; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
1046 ; CHECK-GI-NEXT:    fmov s0, s1
1047 ; CHECK-GI-NEXT:    bl __powisf2
1048 ; CHECK-GI-NEXT:    fcvt s1, h11
1049 ; CHECK-GI-NEXT:    fcvt h0, s0
1050 ; CHECK-GI-NEXT:    mov w0, w19
1051 ; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
1052 ; CHECK-GI-NEXT:    fmov s0, s1
1053 ; CHECK-GI-NEXT:    bl __powisf2
1054 ; CHECK-GI-NEXT:    fcvt s1, h12
1055 ; CHECK-GI-NEXT:    fcvt h0, s0
1056 ; CHECK-GI-NEXT:    mov w0, w19
1057 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1058 ; CHECK-GI-NEXT:    fmov s0, s1
1059 ; CHECK-GI-NEXT:    bl __powisf2
1060 ; CHECK-GI-NEXT:    fcvt s1, h13
1061 ; CHECK-GI-NEXT:    fcvt h0, s0
1062 ; CHECK-GI-NEXT:    mov w0, w19
1063 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1064 ; CHECK-GI-NEXT:    fmov s0, s1
1065 ; CHECK-GI-NEXT:    bl __powisf2
1066 ; CHECK-GI-NEXT:    fcvt s1, h14
1067 ; CHECK-GI-NEXT:    fcvt h0, s0
1068 ; CHECK-GI-NEXT:    mov w0, w19
1069 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1070 ; CHECK-GI-NEXT:    fmov s0, s1
1071 ; CHECK-GI-NEXT:    bl __powisf2
1072 ; CHECK-GI-NEXT:    ldp q2, q1, [sp, #80] // 32-byte Folded Reload
1073 ; CHECK-GI-NEXT:    fcvt h0, s0
1074 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #176] // 16-byte Folded Reload
1075 ; CHECK-GI-NEXT:    ldr d14, [sp, #112] // 8-byte Folded Reload
1076 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #160] // 16-byte Folded Reload
1077 ; CHECK-GI-NEXT:    mov v1.h[1], v2.h[0]
1078 ; CHECK-GI-NEXT:    ldp q2, q3, [sp, #48] // 32-byte Folded Reload
1079 ; CHECK-GI-NEXT:    ldp d11, d10, [sp, #144] // 16-byte Folded Reload
1080 ; CHECK-GI-NEXT:    ldp d13, d12, [sp, #128] // 16-byte Folded Reload
1081 ; CHECK-GI-NEXT:    mov v1.h[2], v3.h[0]
1082 ; CHECK-GI-NEXT:    mov v1.h[3], v2.h[0]
1083 ; CHECK-GI-NEXT:    ldp q2, q3, [sp, #16] // 32-byte Folded Reload
1084 ; CHECK-GI-NEXT:    mov v1.h[4], v3.h[0]
1085 ; CHECK-GI-NEXT:    mov v1.h[5], v2.h[0]
1086 ; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
1087 ; CHECK-GI-NEXT:    mov v1.h[6], v2.h[0]
1088 ; CHECK-GI-NEXT:    mov v1.h[7], v0.h[0]
1089 ; CHECK-GI-NEXT:    mov v0.16b, v1.16b
1090 ; CHECK-GI-NEXT:    add sp, sp, #192
1091 ; CHECK-GI-NEXT:    ret
1092 entry:
1093   %c = call <8 x half> @llvm.powi.v8f16.i32(<8 x half> %a, i32 %b)
1094   ret <8 x half> %c
1097 define <16 x half> @powi_v16f16(<16 x half> %a, i32 %b) {
1098 ; CHECK-SD-LABEL: powi_v16f16:
1099 ; CHECK-SD:       // %bb.0: // %entry
1100 ; CHECK-SD-NEXT:    sub sp, sp, #64
1101 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #48] // 16-byte Folded Spill
1102 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1103 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
1104 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
1105 ; CHECK-SD-NEXT:    stp q1, q0, [sp] // 32-byte Folded Spill
1106 ; CHECK-SD-NEXT:    mov h1, v0.h[1]
1107 ; CHECK-SD-NEXT:    mov w19, w0
1108 ; CHECK-SD-NEXT:    fcvt s0, h1
1109 ; CHECK-SD-NEXT:    bl __powisf2
1110 ; CHECK-SD-NEXT:    fcvt h0, s0
1111 ; CHECK-SD-NEXT:    mov w0, w19
1112 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1113 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1114 ; CHECK-SD-NEXT:    fcvt s0, h0
1115 ; CHECK-SD-NEXT:    bl __powisf2
1116 ; CHECK-SD-NEXT:    fcvt h0, s0
1117 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1118 ; CHECK-SD-NEXT:    mov w0, w19
1119 ; CHECK-SD-NEXT:    mov v0.h[1], v1.h[0]
1120 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1121 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1122 ; CHECK-SD-NEXT:    mov h0, v0.h[2]
1123 ; CHECK-SD-NEXT:    fcvt s0, h0
1124 ; CHECK-SD-NEXT:    bl __powisf2
1125 ; CHECK-SD-NEXT:    fcvt h0, s0
1126 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1127 ; CHECK-SD-NEXT:    mov w0, w19
1128 ; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
1129 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1130 ; CHECK-SD-NEXT:    mov h0, v0.h[3]
1131 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1132 ; CHECK-SD-NEXT:    fcvt s0, h0
1133 ; CHECK-SD-NEXT:    bl __powisf2
1134 ; CHECK-SD-NEXT:    fcvt h0, s0
1135 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1136 ; CHECK-SD-NEXT:    mov w0, w19
1137 ; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
1138 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1139 ; CHECK-SD-NEXT:    mov h0, v0.h[4]
1140 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1141 ; CHECK-SD-NEXT:    fcvt s0, h0
1142 ; CHECK-SD-NEXT:    bl __powisf2
1143 ; CHECK-SD-NEXT:    fcvt h0, s0
1144 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1145 ; CHECK-SD-NEXT:    mov w0, w19
1146 ; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
1147 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1148 ; CHECK-SD-NEXT:    mov h0, v0.h[5]
1149 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1150 ; CHECK-SD-NEXT:    fcvt s0, h0
1151 ; CHECK-SD-NEXT:    bl __powisf2
1152 ; CHECK-SD-NEXT:    fcvt h0, s0
1153 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1154 ; CHECK-SD-NEXT:    mov w0, w19
1155 ; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
1156 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1157 ; CHECK-SD-NEXT:    mov h0, v0.h[6]
1158 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1159 ; CHECK-SD-NEXT:    fcvt s0, h0
1160 ; CHECK-SD-NEXT:    bl __powisf2
1161 ; CHECK-SD-NEXT:    fcvt h0, s0
1162 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1163 ; CHECK-SD-NEXT:    mov w0, w19
1164 ; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
1165 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1166 ; CHECK-SD-NEXT:    mov h0, v0.h[7]
1167 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1168 ; CHECK-SD-NEXT:    fcvt s0, h0
1169 ; CHECK-SD-NEXT:    bl __powisf2
1170 ; CHECK-SD-NEXT:    fcvt h0, s0
1171 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
1172 ; CHECK-SD-NEXT:    mov w0, w19
1173 ; CHECK-SD-NEXT:    mov v1.h[7], v0.h[0]
1174 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1175 ; CHECK-SD-NEXT:    mov h0, v0.h[1]
1176 ; CHECK-SD-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
1177 ; CHECK-SD-NEXT:    fcvt s0, h0
1178 ; CHECK-SD-NEXT:    bl __powisf2
1179 ; CHECK-SD-NEXT:    fcvt h0, s0
1180 ; CHECK-SD-NEXT:    mov w0, w19
1181 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1182 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1183 ; CHECK-SD-NEXT:    fcvt s0, h0
1184 ; CHECK-SD-NEXT:    bl __powisf2
1185 ; CHECK-SD-NEXT:    fcvt h0, s0
1186 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
1187 ; CHECK-SD-NEXT:    mov w0, w19
1188 ; CHECK-SD-NEXT:    mov v0.h[1], v1.h[0]
1189 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1190 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1191 ; CHECK-SD-NEXT:    mov h0, v0.h[2]
1192 ; CHECK-SD-NEXT:    fcvt s0, h0
1193 ; CHECK-SD-NEXT:    bl __powisf2
1194 ; CHECK-SD-NEXT:    fcvt h0, s0
1195 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
1196 ; CHECK-SD-NEXT:    mov w0, w19
1197 ; CHECK-SD-NEXT:    mov v1.h[2], v0.h[0]
1198 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1199 ; CHECK-SD-NEXT:    mov h0, v0.h[3]
1200 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1201 ; CHECK-SD-NEXT:    fcvt s0, h0
1202 ; CHECK-SD-NEXT:    bl __powisf2
1203 ; CHECK-SD-NEXT:    fcvt h0, s0
1204 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
1205 ; CHECK-SD-NEXT:    mov w0, w19
1206 ; CHECK-SD-NEXT:    mov v1.h[3], v0.h[0]
1207 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1208 ; CHECK-SD-NEXT:    mov h0, v0.h[4]
1209 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1210 ; CHECK-SD-NEXT:    fcvt s0, h0
1211 ; CHECK-SD-NEXT:    bl __powisf2
1212 ; CHECK-SD-NEXT:    fcvt h0, s0
1213 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
1214 ; CHECK-SD-NEXT:    mov w0, w19
1215 ; CHECK-SD-NEXT:    mov v1.h[4], v0.h[0]
1216 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1217 ; CHECK-SD-NEXT:    mov h0, v0.h[5]
1218 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1219 ; CHECK-SD-NEXT:    fcvt s0, h0
1220 ; CHECK-SD-NEXT:    bl __powisf2
1221 ; CHECK-SD-NEXT:    fcvt h0, s0
1222 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
1223 ; CHECK-SD-NEXT:    mov w0, w19
1224 ; CHECK-SD-NEXT:    mov v1.h[5], v0.h[0]
1225 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1226 ; CHECK-SD-NEXT:    mov h0, v0.h[6]
1227 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1228 ; CHECK-SD-NEXT:    fcvt s0, h0
1229 ; CHECK-SD-NEXT:    bl __powisf2
1230 ; CHECK-SD-NEXT:    fcvt h0, s0
1231 ; CHECK-SD-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
1232 ; CHECK-SD-NEXT:    mov w0, w19
1233 ; CHECK-SD-NEXT:    mov v1.h[6], v0.h[0]
1234 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1235 ; CHECK-SD-NEXT:    mov h0, v0.h[7]
1236 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1237 ; CHECK-SD-NEXT:    fcvt s0, h0
1238 ; CHECK-SD-NEXT:    bl __powisf2
1239 ; CHECK-SD-NEXT:    fmov s1, s0
1240 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #48] // 16-byte Folded Reload
1241 ; CHECK-SD-NEXT:    fcvt h2, s1
1242 ; CHECK-SD-NEXT:    ldp q1, q0, [sp, #16] // 32-byte Folded Reload
1243 ; CHECK-SD-NEXT:    mov v1.h[7], v2.h[0]
1244 ; CHECK-SD-NEXT:    add sp, sp, #64
1245 ; CHECK-SD-NEXT:    ret
1247 ; CHECK-GI-LABEL: powi_v16f16:
1248 ; CHECK-GI:       // %bb.0: // %entry
1249 ; CHECK-GI-NEXT:    sub sp, sp, #336
1250 ; CHECK-GI-NEXT:    stp d15, d14, [sp, #240] // 16-byte Folded Spill
1251 ; CHECK-GI-NEXT:    stp d13, d12, [sp, #256] // 16-byte Folded Spill
1252 ; CHECK-GI-NEXT:    stp d11, d10, [sp, #272] // 16-byte Folded Spill
1253 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #288] // 16-byte Folded Spill
1254 ; CHECK-GI-NEXT:    str x29, [sp, #304] // 8-byte Folded Spill
1255 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #320] // 16-byte Folded Spill
1256 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 336
1257 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
1258 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
1259 ; CHECK-GI-NEXT:    .cfi_offset w29, -32
1260 ; CHECK-GI-NEXT:    .cfi_offset b8, -40
1261 ; CHECK-GI-NEXT:    .cfi_offset b9, -48
1262 ; CHECK-GI-NEXT:    .cfi_offset b10, -56
1263 ; CHECK-GI-NEXT:    .cfi_offset b11, -64
1264 ; CHECK-GI-NEXT:    .cfi_offset b12, -72
1265 ; CHECK-GI-NEXT:    .cfi_offset b13, -80
1266 ; CHECK-GI-NEXT:    .cfi_offset b14, -88
1267 ; CHECK-GI-NEXT:    .cfi_offset b15, -96
1268 ; CHECK-GI-NEXT:    mov v2.16b, v1.16b
1269 ; CHECK-GI-NEXT:    str q1, [sp, #64] // 16-byte Folded Spill
1270 ; CHECK-GI-NEXT:    mov h14, v1.h[1]
1271 ; CHECK-GI-NEXT:    mov h1, v1.h[2]
1272 ; CHECK-GI-NEXT:    mov h8, v0.h[1]
1273 ; CHECK-GI-NEXT:    mov w19, w0
1274 ; CHECK-GI-NEXT:    mov h9, v0.h[2]
1275 ; CHECK-GI-NEXT:    mov h10, v0.h[3]
1276 ; CHECK-GI-NEXT:    mov h11, v0.h[4]
1277 ; CHECK-GI-NEXT:    mov h12, v0.h[5]
1278 ; CHECK-GI-NEXT:    mov h13, v0.h[6]
1279 ; CHECK-GI-NEXT:    mov h15, v0.h[7]
1280 ; CHECK-GI-NEXT:    fcvt s0, h0
1281 ; CHECK-GI-NEXT:    str h1, [sp, #16] // 2-byte Folded Spill
1282 ; CHECK-GI-NEXT:    mov h1, v2.h[3]
1283 ; CHECK-GI-NEXT:    str h1, [sp, #32] // 2-byte Folded Spill
1284 ; CHECK-GI-NEXT:    mov h1, v2.h[4]
1285 ; CHECK-GI-NEXT:    str h1, [sp, #48] // 2-byte Folded Spill
1286 ; CHECK-GI-NEXT:    mov h1, v2.h[5]
1287 ; CHECK-GI-NEXT:    str h1, [sp, #80] // 2-byte Folded Spill
1288 ; CHECK-GI-NEXT:    mov h1, v2.h[6]
1289 ; CHECK-GI-NEXT:    str h1, [sp, #112] // 2-byte Folded Spill
1290 ; CHECK-GI-NEXT:    mov h1, v2.h[7]
1291 ; CHECK-GI-NEXT:    str h1, [sp, #176] // 2-byte Folded Spill
1292 ; CHECK-GI-NEXT:    bl __powisf2
1293 ; CHECK-GI-NEXT:    fcvt s1, h8
1294 ; CHECK-GI-NEXT:    fcvt h0, s0
1295 ; CHECK-GI-NEXT:    mov w0, w19
1296 ; CHECK-GI-NEXT:    str q0, [sp, #192] // 16-byte Folded Spill
1297 ; CHECK-GI-NEXT:    fmov s0, s1
1298 ; CHECK-GI-NEXT:    bl __powisf2
1299 ; CHECK-GI-NEXT:    fcvt s1, h9
1300 ; CHECK-GI-NEXT:    fcvt h0, s0
1301 ; CHECK-GI-NEXT:    mov w0, w19
1302 ; CHECK-GI-NEXT:    str q0, [sp, #144] // 16-byte Folded Spill
1303 ; CHECK-GI-NEXT:    fmov s0, s1
1304 ; CHECK-GI-NEXT:    bl __powisf2
1305 ; CHECK-GI-NEXT:    fcvt s1, h10
1306 ; CHECK-GI-NEXT:    fcvt h0, s0
1307 ; CHECK-GI-NEXT:    mov w0, w19
1308 ; CHECK-GI-NEXT:    str q0, [sp, #224] // 16-byte Folded Spill
1309 ; CHECK-GI-NEXT:    fmov s0, s1
1310 ; CHECK-GI-NEXT:    bl __powisf2
1311 ; CHECK-GI-NEXT:    fcvt s1, h11
1312 ; CHECK-GI-NEXT:    fcvt h0, s0
1313 ; CHECK-GI-NEXT:    mov w0, w19
1314 ; CHECK-GI-NEXT:    str q0, [sp, #208] // 16-byte Folded Spill
1315 ; CHECK-GI-NEXT:    fmov s0, s1
1316 ; CHECK-GI-NEXT:    bl __powisf2
1317 ; CHECK-GI-NEXT:    fcvt s1, h12
1318 ; CHECK-GI-NEXT:    fcvt h0, s0
1319 ; CHECK-GI-NEXT:    mov w0, w19
1320 ; CHECK-GI-NEXT:    str q0, [sp, #160] // 16-byte Folded Spill
1321 ; CHECK-GI-NEXT:    fmov s0, s1
1322 ; CHECK-GI-NEXT:    bl __powisf2
1323 ; CHECK-GI-NEXT:    fcvt s1, h13
1324 ; CHECK-GI-NEXT:    fcvt h0, s0
1325 ; CHECK-GI-NEXT:    mov w0, w19
1326 ; CHECK-GI-NEXT:    str q0, [sp, #128] // 16-byte Folded Spill
1327 ; CHECK-GI-NEXT:    fmov s0, s1
1328 ; CHECK-GI-NEXT:    bl __powisf2
1329 ; CHECK-GI-NEXT:    fcvt s1, h15
1330 ; CHECK-GI-NEXT:    fcvt h0, s0
1331 ; CHECK-GI-NEXT:    mov w0, w19
1332 ; CHECK-GI-NEXT:    str q0, [sp, #96] // 16-byte Folded Spill
1333 ; CHECK-GI-NEXT:    fmov s0, s1
1334 ; CHECK-GI-NEXT:    bl __powisf2
1335 ; CHECK-GI-NEXT:    ldr q1, [sp, #64] // 16-byte Folded Reload
1336 ; CHECK-GI-NEXT:    fcvt h0, s0
1337 ; CHECK-GI-NEXT:    mov w0, w19
1338 ; CHECK-GI-NEXT:    fcvt s1, h1
1339 ; CHECK-GI-NEXT:    str q0, [sp, #64] // 16-byte Folded Spill
1340 ; CHECK-GI-NEXT:    fmov s0, s1
1341 ; CHECK-GI-NEXT:    bl __powisf2
1342 ; CHECK-GI-NEXT:    fcvt s1, h14
1343 ; CHECK-GI-NEXT:    fcvt h0, s0
1344 ; CHECK-GI-NEXT:    mov w0, w19
1345 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1346 ; CHECK-GI-NEXT:    fmov s0, s1
1347 ; CHECK-GI-NEXT:    bl __powisf2
1348 ; CHECK-GI-NEXT:    ldr h1, [sp, #16] // 2-byte Folded Reload
1349 ; CHECK-GI-NEXT:    fcvt h0, s0
1350 ; CHECK-GI-NEXT:    mov w0, w19
1351 ; CHECK-GI-NEXT:    fcvt s1, h1
1352 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1353 ; CHECK-GI-NEXT:    fmov s0, s1
1354 ; CHECK-GI-NEXT:    bl __powisf2
1355 ; CHECK-GI-NEXT:    ldr h1, [sp, #32] // 2-byte Folded Reload
1356 ; CHECK-GI-NEXT:    fcvt h0, s0
1357 ; CHECK-GI-NEXT:    mov w0, w19
1358 ; CHECK-GI-NEXT:    fcvt s1, h1
1359 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1360 ; CHECK-GI-NEXT:    fmov s0, s1
1361 ; CHECK-GI-NEXT:    bl __powisf2
1362 ; CHECK-GI-NEXT:    ldr h1, [sp, #48] // 2-byte Folded Reload
1363 ; CHECK-GI-NEXT:    fcvt h0, s0
1364 ; CHECK-GI-NEXT:    mov w0, w19
1365 ; CHECK-GI-NEXT:    fcvt s1, h1
1366 ; CHECK-GI-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
1367 ; CHECK-GI-NEXT:    fmov s0, s1
1368 ; CHECK-GI-NEXT:    bl __powisf2
1369 ; CHECK-GI-NEXT:    ldr h1, [sp, #80] // 2-byte Folded Reload
1370 ; CHECK-GI-NEXT:    fcvt h0, s0
1371 ; CHECK-GI-NEXT:    mov w0, w19
1372 ; CHECK-GI-NEXT:    fcvt s1, h1
1373 ; CHECK-GI-NEXT:    str q0, [sp, #80] // 16-byte Folded Spill
1374 ; CHECK-GI-NEXT:    fmov s0, s1
1375 ; CHECK-GI-NEXT:    bl __powisf2
1376 ; CHECK-GI-NEXT:    ldr h1, [sp, #112] // 2-byte Folded Reload
1377 ; CHECK-GI-NEXT:    fcvt h0, s0
1378 ; CHECK-GI-NEXT:    mov w0, w19
1379 ; CHECK-GI-NEXT:    fcvt s1, h1
1380 ; CHECK-GI-NEXT:    str q0, [sp, #112] // 16-byte Folded Spill
1381 ; CHECK-GI-NEXT:    fmov s0, s1
1382 ; CHECK-GI-NEXT:    bl __powisf2
1383 ; CHECK-GI-NEXT:    ldr h1, [sp, #176] // 2-byte Folded Reload
1384 ; CHECK-GI-NEXT:    fcvt h0, s0
1385 ; CHECK-GI-NEXT:    mov w0, w19
1386 ; CHECK-GI-NEXT:    fcvt s1, h1
1387 ; CHECK-GI-NEXT:    str q0, [sp, #176] // 16-byte Folded Spill
1388 ; CHECK-GI-NEXT:    fmov s0, s1
1389 ; CHECK-GI-NEXT:    bl __powisf2
1390 ; CHECK-GI-NEXT:    ldr q3, [sp, #192] // 16-byte Folded Reload
1391 ; CHECK-GI-NEXT:    ldr q2, [sp, #144] // 16-byte Folded Reload
1392 ; CHECK-GI-NEXT:    ldr x29, [sp, #304] // 8-byte Folded Reload
1393 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #320] // 16-byte Folded Reload
1394 ; CHECK-GI-NEXT:    mov v3.h[1], v2.h[0]
1395 ; CHECK-GI-NEXT:    ldp q1, q2, [sp] // 32-byte Folded Reload
1396 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #288] // 16-byte Folded Reload
1397 ; CHECK-GI-NEXT:    ldp d11, d10, [sp, #272] // 16-byte Folded Reload
1398 ; CHECK-GI-NEXT:    mov v1.h[1], v2.h[0]
1399 ; CHECK-GI-NEXT:    ldr q2, [sp, #224] // 16-byte Folded Reload
1400 ; CHECK-GI-NEXT:    ldp d13, d12, [sp, #256] // 16-byte Folded Reload
1401 ; CHECK-GI-NEXT:    mov v3.h[2], v2.h[0]
1402 ; CHECK-GI-NEXT:    ldr q2, [sp, #32] // 16-byte Folded Reload
1403 ; CHECK-GI-NEXT:    ldp d15, d14, [sp, #240] // 16-byte Folded Reload
1404 ; CHECK-GI-NEXT:    mov v1.h[2], v2.h[0]
1405 ; CHECK-GI-NEXT:    ldr q2, [sp, #208] // 16-byte Folded Reload
1406 ; CHECK-GI-NEXT:    mov v3.h[3], v2.h[0]
1407 ; CHECK-GI-NEXT:    ldr q2, [sp, #48] // 16-byte Folded Reload
1408 ; CHECK-GI-NEXT:    mov v1.h[3], v2.h[0]
1409 ; CHECK-GI-NEXT:    ldr q2, [sp, #160] // 16-byte Folded Reload
1410 ; CHECK-GI-NEXT:    mov v3.h[4], v2.h[0]
1411 ; CHECK-GI-NEXT:    ldr q2, [sp, #80] // 16-byte Folded Reload
1412 ; CHECK-GI-NEXT:    mov v1.h[4], v2.h[0]
1413 ; CHECK-GI-NEXT:    ldp q2, q4, [sp, #112] // 32-byte Folded Reload
1414 ; CHECK-GI-NEXT:    mov v3.h[5], v4.h[0]
1415 ; CHECK-GI-NEXT:    mov v1.h[5], v2.h[0]
1416 ; CHECK-GI-NEXT:    fcvt h2, s0
1417 ; CHECK-GI-NEXT:    ldr q0, [sp, #96] // 16-byte Folded Reload
1418 ; CHECK-GI-NEXT:    mov v3.h[6], v0.h[0]
1419 ; CHECK-GI-NEXT:    ldr q0, [sp, #176] // 16-byte Folded Reload
1420 ; CHECK-GI-NEXT:    mov v1.h[6], v0.h[0]
1421 ; CHECK-GI-NEXT:    ldr q0, [sp, #64] // 16-byte Folded Reload
1422 ; CHECK-GI-NEXT:    mov v3.h[7], v0.h[0]
1423 ; CHECK-GI-NEXT:    mov v1.h[7], v2.h[0]
1424 ; CHECK-GI-NEXT:    mov v0.16b, v3.16b
1425 ; CHECK-GI-NEXT:    add sp, sp, #336
1426 ; CHECK-GI-NEXT:    ret
1427 entry:
1428   %c = call <16 x half> @llvm.powi.v16f16.i32(<16 x half> %a, i32 %b)
1429   ret <16 x half> %c
1432 define <2 x fp128> @powi_v2fp128(<2 x fp128> %a, i32 %b) {
1433 ; CHECK-SD-LABEL: powi_v2fp128:
1434 ; CHECK-SD:       // %bb.0: // %entry
1435 ; CHECK-SD-NEXT:    sub sp, sp, #48
1436 ; CHECK-SD-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
1437 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
1438 ; CHECK-SD-NEXT:    .cfi_offset w19, -8
1439 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
1440 ; CHECK-SD-NEXT:    mov w19, w0
1441 ; CHECK-SD-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1442 ; CHECK-SD-NEXT:    bl __powitf2
1443 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1444 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1445 ; CHECK-SD-NEXT:    mov w0, w19
1446 ; CHECK-SD-NEXT:    bl __powitf2
1447 ; CHECK-SD-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
1448 ; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1449 ; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1450 ; CHECK-SD-NEXT:    add sp, sp, #48
1451 ; CHECK-SD-NEXT:    ret
1453 ; CHECK-GI-LABEL: powi_v2fp128:
1454 ; CHECK-GI:       // %bb.0: // %entry
1455 ; CHECK-GI-NEXT:    sub sp, sp, #48
1456 ; CHECK-GI-NEXT:    stp x30, x19, [sp, #32] // 16-byte Folded Spill
1457 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
1458 ; CHECK-GI-NEXT:    .cfi_offset w19, -8
1459 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
1460 ; CHECK-GI-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
1461 ; CHECK-GI-NEXT:    mov w19, w0
1462 ; CHECK-GI-NEXT:    bl __powitf2
1463 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1464 ; CHECK-GI-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1465 ; CHECK-GI-NEXT:    mov w0, w19
1466 ; CHECK-GI-NEXT:    bl __powitf2
1467 ; CHECK-GI-NEXT:    ldp x30, x19, [sp, #32] // 16-byte Folded Reload
1468 ; CHECK-GI-NEXT:    mov v1.16b, v0.16b
1469 ; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1470 ; CHECK-GI-NEXT:    add sp, sp, #48
1471 ; CHECK-GI-NEXT:    ret
1472 entry:
1473   %c = call <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128> %a, i32 %b)
1474   ret <2 x fp128> %c
1477 declare <1 x double> @llvm.powi.v1f64.i32(<1 x double>, i32)
1478 declare <16 x half> @llvm.powi.v16f16.i32(<16 x half>, i32)
1479 declare <2 x double> @llvm.powi.v2f64.i32(<2 x double>, i32)
1480 declare <2 x float> @llvm.powi.v2f32.i32(<2 x float>, i32)
1481 declare <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128>, i32)
1482 declare <3 x double> @llvm.powi.v3f64.i32(<3 x double>, i32)
1483 declare <3 x float> @llvm.powi.v3f32.i32(<3 x float>, i32)
1484 declare <4 x double> @llvm.powi.v4f64.i32(<4 x double>, i32)
1485 declare <4 x float> @llvm.powi.v4f32.i32(<4 x float>, i32)
1486 declare <4 x half> @llvm.powi.v4f16.i32(<4 x half>, i32)
1487 declare <7 x half> @llvm.powi.v7f16.i32(<7 x half>, i32)
1488 declare <8 x float> @llvm.powi.v8f32.i32(<8 x float>, i32)
1489 declare <8 x half> @llvm.powi.v8f16.i32(<8 x half>, i32)
1490 declare double @llvm.powi.f64.i32(double, i32)
1491 declare float @llvm.powi.f32.i32(float, i32)
1492 declare fp128 @llvm.powi.fp128.i32(fp128, i32)
1493 declare half @llvm.powi.f16.i32(half, i32)