xref: /llvm-project/llvm/test/CodeGen/AArch64/fpowi.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
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
4
5define double @powi_f64(double %a, i32 %b) {
6; CHECK-LABEL: powi_f64:
7; CHECK:       // %bb.0: // %entry
8; CHECK-NEXT:    b __powidf2
9entry:
10  %c = call double @llvm.powi.f64.i32(double %a, i32 %b)
11  ret double %c
12}
13
14define float @powi_f32(float %a, i32 %b) {
15; CHECK-LABEL: powi_f32:
16; CHECK:       // %bb.0: // %entry
17; CHECK-NEXT:    b __powisf2
18entry:
19  %c = call float @llvm.powi.f32.i32(float %a, i32 %b)
20  ret float %c
21}
22
23define 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
34entry:
35  %c = call half @llvm.powi.f16.i32(half %a, i32 %b)
36  ret half %c
37}
38
39define fp128 @powi_fp128(fp128 %a, i32 %b) {
40; CHECK-LABEL: powi_fp128:
41; CHECK:       // %bb.0: // %entry
42; CHECK-NEXT:    b __powitf2
43entry:
44  %c = call fp128 @llvm.powi.fp128.i32(fp128 %a, i32 %b)
45  ret fp128 %c
46}
47
48define <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
57entry:
58  %c = call <1 x double> @llvm.powi.v1f64.i32(<1 x double> %a, i32 %b)
59  ret <1 x double> %c
60}
61
62define <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
86;
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
113entry:
114  %c = call <2 x double> @llvm.powi.v2f64.i32(<2 x double> %a, i32 %b)
115  ret <2 x double> %c
116}
117
118define <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
149;
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
180entry:
181  %c = call <3 x double> @llvm.powi.v3f64.i32(<3 x double> %a, i32 %b)
182  ret <3 x double> %c
183}
184
185define <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
224;
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
267entry:
268  %c = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %a, i32 %b)
269  ret <4 x double> %c
270}
271
272define <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
298;
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
326entry:
327  %c = call <2 x float> @llvm.powi.v2f32.i32(<2 x float> %a, i32 %b)
328  ret <2 x float> %c
329}
330
331define <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
364;
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
399entry:
400  %c = call <3 x float> @llvm.powi.v3f32.i32(<3 x float> %a, i32 %b)
401  ret <3 x float> %c
402}
403
404define <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
445;
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
491entry:
492  %c = call <4 x float> @llvm.powi.v4f32.i32(<4 x float> %a, i32 %b)
493  ret <4 x float> %c
494}
495
496define <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
567;
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
652entry:
653  %c = call <8 x float> @llvm.powi.v8f32.i32(<8 x float> %a, i32 %b)
654  ret <8 x float> %c
655}
656
657define <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
736;
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
815entry:
816  %c = call <7 x half> @llvm.powi.v7f16.i32(<7 x half> %a, i32 %b)
817  ret <7 x half> %c
818}
819
820define <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
866;
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
917entry:
918  %c = call <4 x half> @llvm.powi.v4f16.i32(<4 x half> %a, i32 %b)
919  ret <4 x half> %c
920}
921
922define <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
1001;
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
1092entry:
1093  %c = call <8 x half> @llvm.powi.v8f16.i32(<8 x half> %a, i32 %b)
1094  ret <8 x half> %c
1095}
1096
1097define <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
1246;
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
1427entry:
1428  %c = call <16 x half> @llvm.powi.v16f16.i32(<16 x half> %a, i32 %b)
1429  ret <16 x half> %c
1430}
1431
1432define <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
1452;
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
1472entry:
1473  %c = call <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128> %a, i32 %b)
1474  ret <2 x fp128> %c
1475}
1476
1477declare <1 x double> @llvm.powi.v1f64.i32(<1 x double>, i32)
1478declare <16 x half> @llvm.powi.v16f16.i32(<16 x half>, i32)
1479declare <2 x double> @llvm.powi.v2f64.i32(<2 x double>, i32)
1480declare <2 x float> @llvm.powi.v2f32.i32(<2 x float>, i32)
1481declare <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128>, i32)
1482declare <3 x double> @llvm.powi.v3f64.i32(<3 x double>, i32)
1483declare <3 x float> @llvm.powi.v3f32.i32(<3 x float>, i32)
1484declare <4 x double> @llvm.powi.v4f64.i32(<4 x double>, i32)
1485declare <4 x float> @llvm.powi.v4f32.i32(<4 x float>, i32)
1486declare <4 x half> @llvm.powi.v4f16.i32(<4 x half>, i32)
1487declare <7 x half> @llvm.powi.v7f16.i32(<7 x half>, i32)
1488declare <8 x float> @llvm.powi.v8f32.i32(<8 x float>, i32)
1489declare <8 x half> @llvm.powi.v8f16.i32(<8 x half>, i32)
1490declare double @llvm.powi.f64.i32(double, i32)
1491declare float @llvm.powi.f32.i32(float, i32)
1492declare fp128 @llvm.powi.fp128.i32(fp128, i32)
1493declare half @llvm.powi.f16.i32(half, i32)
1494