xref: /llvm-project/llvm/test/CodeGen/AArch64/llvm.exp10.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -global-isel=0 -mtriple=aarch64-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,CVT,SDAG,CVT-SDAG %s
3; RUN: llc -global-isel=0 -mtriple=aarch64-unknown-unknown -mattr=+fullfp16 < %s | FileCheck -check-prefixes=CHECK,FP16,SDAG,FP16-SDAG %s
4; RUN: llc -global-isel=1 -mtriple=aarch64-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,CVT,GISEL,CVT-GISEL %s
5; RUN: llc -global-isel=1 -mtriple=aarch64-unknown-unknown -mattr=+fullfp16 < %s | FileCheck -check-prefixes=CHECK,FP16,GISEL,FP16-GISEL %s
6
7declare half @llvm.exp10.f16(half)
8declare <1 x half> @llvm.exp10.v1f16(<1 x half>)
9declare <2 x half> @llvm.exp10.v2f16(<2 x half>)
10declare <3 x half> @llvm.exp10.v3f16(<3 x half>)
11declare <4 x half> @llvm.exp10.v4f16(<4 x half>)
12declare float @llvm.exp10.f32(float)
13declare <1 x float> @llvm.exp10.v1f32(<1 x float>)
14declare <2 x float> @llvm.exp10.v2f32(<2 x float>)
15declare <3 x float> @llvm.exp10.v3f32(<3 x float>)
16declare <4 x float> @llvm.exp10.v4f32(<4 x float>)
17declare double @llvm.exp10.f64(double)
18declare <1 x double> @llvm.exp10.v1f64(<1 x double>)
19declare <2 x double> @llvm.exp10.v2f64(<2 x double>)
20declare <3 x double> @llvm.exp10.v3f64(<3 x double>)
21declare <4 x double> @llvm.exp10.v4f64(<4 x double>)
22
23define half @exp10_f16(half %x) {
24; CHECK-LABEL: exp10_f16:
25; CHECK:       // %bb.0:
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 exp10f
31; CHECK-NEXT:    fcvt h0, s0
32; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
33; CHECK-NEXT:    ret
34  %r = call half @llvm.exp10.f16(half %x)
35  ret half %r
36}
37
38define <1 x half> @exp10_v1f16(<1 x half> %x) {
39; CHECK-LABEL: exp10_v1f16:
40; CHECK:       // %bb.0:
41; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
42; CHECK-NEXT:    .cfi_def_cfa_offset 16
43; CHECK-NEXT:    .cfi_offset w30, -16
44; CHECK-NEXT:    fcvt s0, h0
45; CHECK-NEXT:    bl exp10f
46; CHECK-NEXT:    fcvt h0, s0
47; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
48; CHECK-NEXT:    ret
49  %r = call <1 x half> @llvm.exp10.v1f16(<1 x half> %x)
50  ret <1 x half> %r
51}
52
53define <2 x half> @exp10_v2f16(<2 x half> %x) {
54; SDAG-LABEL: exp10_v2f16:
55; SDAG:       // %bb.0:
56; SDAG-NEXT:    sub sp, sp, #48
57; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
58; SDAG-NEXT:    .cfi_def_cfa_offset 48
59; SDAG-NEXT:    .cfi_offset w30, -16
60; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
61; SDAG-NEXT:    mov h1, v0.h[1]
62; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
63; SDAG-NEXT:    fcvt s0, h1
64; SDAG-NEXT:    bl exp10f
65; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
66; SDAG-NEXT:    fcvt h0, s0
67; SDAG-NEXT:    fcvt s1, h1
68; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
69; SDAG-NEXT:    fmov s0, s1
70; SDAG-NEXT:    bl exp10f
71; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
72; SDAG-NEXT:    fcvt h2, s0
73; SDAG-NEXT:    mov h1, v1.h[2]
74; SDAG-NEXT:    fcvt s0, h1
75; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
76; SDAG-NEXT:    mov v2.h[1], v1.h[0]
77; SDAG-NEXT:    str q2, [sp] // 16-byte Folded Spill
78; SDAG-NEXT:    bl exp10f
79; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
80; SDAG-NEXT:    fcvt h2, s0
81; SDAG-NEXT:    mov h1, v1.h[3]
82; SDAG-NEXT:    fcvt s0, h1
83; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
84; SDAG-NEXT:    mov v1.h[2], v2.h[0]
85; SDAG-NEXT:    str q1, [sp] // 16-byte Folded Spill
86; SDAG-NEXT:    bl exp10f
87; SDAG-NEXT:    fcvt h1, s0
88; SDAG-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
89; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
90; SDAG-NEXT:    mov v0.h[3], v1.h[0]
91; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
92; SDAG-NEXT:    add sp, sp, #48
93; SDAG-NEXT:    ret
94;
95; GISEL-LABEL: exp10_v2f16:
96; GISEL:       // %bb.0:
97; GISEL-NEXT:    sub sp, sp, #32
98; GISEL-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
99; GISEL-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
100; GISEL-NEXT:    .cfi_def_cfa_offset 32
101; GISEL-NEXT:    .cfi_offset w30, -8
102; GISEL-NEXT:    .cfi_offset b8, -16
103; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
104; GISEL-NEXT:    mov h8, v0.h[1]
105; GISEL-NEXT:    fcvt s0, h0
106; GISEL-NEXT:    bl exp10f
107; GISEL-NEXT:    fcvt s1, h8
108; GISEL-NEXT:    fcvt h0, s0
109; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
110; GISEL-NEXT:    fmov s0, s1
111; GISEL-NEXT:    bl exp10f
112; GISEL-NEXT:    fcvt h1, s0
113; GISEL-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
114; GISEL-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
115; GISEL-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
116; GISEL-NEXT:    mov v0.h[1], v1.h[0]
117; GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
118; GISEL-NEXT:    add sp, sp, #32
119; GISEL-NEXT:    ret
120  %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x)
121  ret <2 x half> %r
122}
123
124define <3 x half> @exp10_v3f16(<3 x half> %x) {
125; SDAG-LABEL: exp10_v3f16:
126; SDAG:       // %bb.0:
127; SDAG-NEXT:    sub sp, sp, #48
128; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
129; SDAG-NEXT:    .cfi_def_cfa_offset 48
130; SDAG-NEXT:    .cfi_offset w30, -16
131; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
132; SDAG-NEXT:    mov h1, v0.h[1]
133; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
134; SDAG-NEXT:    fcvt s0, h1
135; SDAG-NEXT:    bl exp10f
136; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
137; SDAG-NEXT:    fcvt h0, s0
138; SDAG-NEXT:    fcvt s1, h1
139; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
140; SDAG-NEXT:    fmov s0, s1
141; SDAG-NEXT:    bl exp10f
142; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
143; SDAG-NEXT:    fcvt h2, s0
144; SDAG-NEXT:    mov h1, v1.h[2]
145; SDAG-NEXT:    fcvt s0, h1
146; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
147; SDAG-NEXT:    mov v2.h[1], v1.h[0]
148; SDAG-NEXT:    str q2, [sp] // 16-byte Folded Spill
149; SDAG-NEXT:    bl exp10f
150; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
151; SDAG-NEXT:    fcvt h2, s0
152; SDAG-NEXT:    mov h1, v1.h[3]
153; SDAG-NEXT:    fcvt s0, h1
154; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
155; SDAG-NEXT:    mov v1.h[2], v2.h[0]
156; SDAG-NEXT:    str q1, [sp] // 16-byte Folded Spill
157; SDAG-NEXT:    bl exp10f
158; SDAG-NEXT:    fcvt h1, s0
159; SDAG-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
160; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
161; SDAG-NEXT:    mov v0.h[3], v1.h[0]
162; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
163; SDAG-NEXT:    add sp, sp, #48
164; SDAG-NEXT:    ret
165;
166; GISEL-LABEL: exp10_v3f16:
167; GISEL:       // %bb.0:
168; GISEL-NEXT:    sub sp, sp, #64
169; GISEL-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
170; GISEL-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
171; GISEL-NEXT:    .cfi_def_cfa_offset 64
172; GISEL-NEXT:    .cfi_offset w30, -16
173; GISEL-NEXT:    .cfi_offset b8, -24
174; GISEL-NEXT:    .cfi_offset b9, -32
175; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
176; GISEL-NEXT:    mov h8, v0.h[1]
177; GISEL-NEXT:    mov h9, v0.h[2]
178; GISEL-NEXT:    fcvt s0, h0
179; GISEL-NEXT:    bl exp10f
180; GISEL-NEXT:    fcvt s1, h8
181; GISEL-NEXT:    fcvt h0, s0
182; GISEL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
183; GISEL-NEXT:    fmov s0, s1
184; GISEL-NEXT:    bl exp10f
185; GISEL-NEXT:    fcvt s1, h9
186; GISEL-NEXT:    fcvt h0, s0
187; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
188; GISEL-NEXT:    fmov s0, s1
189; GISEL-NEXT:    bl exp10f
190; GISEL-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
191; GISEL-NEXT:    fcvt h0, s0
192; GISEL-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
193; GISEL-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
194; GISEL-NEXT:    mov v1.h[1], v2.h[0]
195; GISEL-NEXT:    mov v1.h[2], v0.h[0]
196; GISEL-NEXT:    mov v0.16b, v1.16b
197; GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
198; GISEL-NEXT:    add sp, sp, #64
199; GISEL-NEXT:    ret
200  %r = call <3 x half> @llvm.exp10.v3f16(<3 x half> %x)
201  ret <3 x half> %r
202}
203
204define <4 x half> @exp10_v4f16(<4 x half> %x) {
205; SDAG-LABEL: exp10_v4f16:
206; SDAG:       // %bb.0:
207; SDAG-NEXT:    sub sp, sp, #48
208; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
209; SDAG-NEXT:    .cfi_def_cfa_offset 48
210; SDAG-NEXT:    .cfi_offset w30, -16
211; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
212; SDAG-NEXT:    mov h1, v0.h[1]
213; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
214; SDAG-NEXT:    fcvt s0, h1
215; SDAG-NEXT:    bl exp10f
216; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
217; SDAG-NEXT:    fcvt h0, s0
218; SDAG-NEXT:    fcvt s1, h1
219; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
220; SDAG-NEXT:    fmov s0, s1
221; SDAG-NEXT:    bl exp10f
222; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
223; SDAG-NEXT:    fcvt h2, s0
224; SDAG-NEXT:    mov h1, v1.h[2]
225; SDAG-NEXT:    fcvt s0, h1
226; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
227; SDAG-NEXT:    mov v2.h[1], v1.h[0]
228; SDAG-NEXT:    str q2, [sp] // 16-byte Folded Spill
229; SDAG-NEXT:    bl exp10f
230; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
231; SDAG-NEXT:    fcvt h2, s0
232; SDAG-NEXT:    mov h1, v1.h[3]
233; SDAG-NEXT:    fcvt s0, h1
234; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
235; SDAG-NEXT:    mov v1.h[2], v2.h[0]
236; SDAG-NEXT:    str q1, [sp] // 16-byte Folded Spill
237; SDAG-NEXT:    bl exp10f
238; SDAG-NEXT:    fcvt h1, s0
239; SDAG-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
240; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
241; SDAG-NEXT:    mov v0.h[3], v1.h[0]
242; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
243; SDAG-NEXT:    add sp, sp, #48
244; SDAG-NEXT:    ret
245;
246; GISEL-LABEL: exp10_v4f16:
247; GISEL:       // %bb.0:
248; GISEL-NEXT:    sub sp, sp, #80
249; GISEL-NEXT:    str d10, [sp, #48] // 8-byte Folded Spill
250; GISEL-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
251; GISEL-NEXT:    str x30, [sp, #72] // 8-byte Folded Spill
252; GISEL-NEXT:    .cfi_def_cfa_offset 80
253; GISEL-NEXT:    .cfi_offset w30, -8
254; GISEL-NEXT:    .cfi_offset b8, -16
255; GISEL-NEXT:    .cfi_offset b9, -24
256; GISEL-NEXT:    .cfi_offset b10, -32
257; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
258; GISEL-NEXT:    mov h8, v0.h[1]
259; GISEL-NEXT:    mov h9, v0.h[2]
260; GISEL-NEXT:    mov h10, v0.h[3]
261; GISEL-NEXT:    fcvt s0, h0
262; GISEL-NEXT:    bl exp10f
263; GISEL-NEXT:    fcvt s1, h8
264; GISEL-NEXT:    fcvt h0, s0
265; GISEL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
266; GISEL-NEXT:    fmov s0, s1
267; GISEL-NEXT:    bl exp10f
268; GISEL-NEXT:    fcvt s1, h9
269; GISEL-NEXT:    fcvt h0, s0
270; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
271; GISEL-NEXT:    fmov s0, s1
272; GISEL-NEXT:    bl exp10f
273; GISEL-NEXT:    fcvt s1, h10
274; GISEL-NEXT:    fcvt h0, s0
275; GISEL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
276; GISEL-NEXT:    fmov s0, s1
277; GISEL-NEXT:    bl exp10f
278; GISEL-NEXT:    ldp q3, q2, [sp] // 32-byte Folded Reload
279; GISEL-NEXT:    fcvt h0, s0
280; GISEL-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
281; GISEL-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
282; GISEL-NEXT:    ldr x30, [sp, #72] // 8-byte Folded Reload
283; GISEL-NEXT:    ldr d10, [sp, #48] // 8-byte Folded Reload
284; GISEL-NEXT:    mov v1.h[1], v3.h[0]
285; GISEL-NEXT:    mov v1.h[2], v2.h[0]
286; GISEL-NEXT:    mov v1.h[3], v0.h[0]
287; GISEL-NEXT:    mov v0.16b, v1.16b
288; GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
289; GISEL-NEXT:    add sp, sp, #80
290; GISEL-NEXT:    ret
291  %r = call <4 x half> @llvm.exp10.v4f16(<4 x half> %x)
292  ret <4 x half> %r
293}
294
295define float @exp10_f32(float %x) {
296; CHECK-LABEL: exp10_f32:
297; CHECK:       // %bb.0:
298; CHECK-NEXT:    b exp10f
299  %r = call float @llvm.exp10.f32(float %x)
300  ret float %r
301}
302
303define <1 x float> @exp10_v1f32(<1 x float> %x) {
304; SDAG-LABEL: exp10_v1f32:
305; SDAG:       // %bb.0:
306; SDAG-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
307; SDAG-NEXT:    .cfi_def_cfa_offset 16
308; SDAG-NEXT:    .cfi_offset w30, -16
309; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
310; SDAG-NEXT:    // kill: def $s0 killed $s0 killed $q0
311; SDAG-NEXT:    bl exp10f
312; SDAG-NEXT:    // kill: def $s0 killed $s0 def $d0
313; SDAG-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
314; SDAG-NEXT:    ret
315;
316; GISEL-LABEL: exp10_v1f32:
317; GISEL:       // %bb.0:
318; GISEL-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
319; GISEL-NEXT:    .cfi_def_cfa_offset 16
320; GISEL-NEXT:    .cfi_offset w30, -16
321; GISEL-NEXT:    // kill: def $s0 killed $s0 killed $d0
322; GISEL-NEXT:    bl exp10f
323; GISEL-NEXT:    // kill: def $s0 killed $s0 def $d0
324; GISEL-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
325; GISEL-NEXT:    ret
326  %r = call <1 x float> @llvm.exp10.v1f32(<1 x float> %x)
327  ret <1 x float> %r
328}
329
330define <2 x float> @exp10_v2f32(<2 x float> %x) {
331; SDAG-LABEL: exp10_v2f32:
332; SDAG:       // %bb.0:
333; SDAG-NEXT:    sub sp, sp, #48
334; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
335; SDAG-NEXT:    .cfi_def_cfa_offset 48
336; SDAG-NEXT:    .cfi_offset w30, -16
337; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
338; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
339; SDAG-NEXT:    mov s0, v0.s[1]
340; SDAG-NEXT:    bl exp10f
341; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
342; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
343; SDAG-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
344; SDAG-NEXT:    // kill: def $s0 killed $s0 killed $q0
345; SDAG-NEXT:    bl exp10f
346; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
347; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
348; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
349; SDAG-NEXT:    mov v0.s[1], v1.s[0]
350; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
351; SDAG-NEXT:    add sp, sp, #48
352; SDAG-NEXT:    ret
353;
354; GISEL-LABEL: exp10_v2f32:
355; GISEL:       // %bb.0:
356; GISEL-NEXT:    sub sp, sp, #32
357; GISEL-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
358; GISEL-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
359; GISEL-NEXT:    .cfi_def_cfa_offset 32
360; GISEL-NEXT:    .cfi_offset w30, -8
361; GISEL-NEXT:    .cfi_offset b8, -16
362; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
363; GISEL-NEXT:    mov s8, v0.s[1]
364; GISEL-NEXT:    // kill: def $s0 killed $s0 killed $q0
365; GISEL-NEXT:    bl exp10f
366; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
367; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
368; GISEL-NEXT:    fmov s0, s8
369; GISEL-NEXT:    bl exp10f
370; GISEL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
371; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
372; GISEL-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
373; GISEL-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
374; GISEL-NEXT:    mov v1.s[1], v0.s[0]
375; GISEL-NEXT:    fmov d0, d1
376; GISEL-NEXT:    add sp, sp, #32
377; GISEL-NEXT:    ret
378  %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x)
379  ret <2 x float> %r
380}
381
382define <3 x float> @exp10_v3f32(<3 x float> %x) {
383; SDAG-LABEL: exp10_v3f32:
384; SDAG:       // %bb.0:
385; SDAG-NEXT:    sub sp, sp, #48
386; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
387; SDAG-NEXT:    .cfi_def_cfa_offset 48
388; SDAG-NEXT:    .cfi_offset w30, -16
389; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
390; SDAG-NEXT:    mov s0, v0.s[1]
391; SDAG-NEXT:    bl exp10f
392; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
393; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
394; SDAG-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
395; SDAG-NEXT:    // kill: def $s0 killed $s0 killed $q0
396; SDAG-NEXT:    bl exp10f
397; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
398; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
399; SDAG-NEXT:    mov v0.s[1], v1.s[0]
400; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
401; SDAG-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
402; SDAG-NEXT:    mov s0, v0.s[2]
403; SDAG-NEXT:    bl exp10f
404; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
405; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
406; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
407; SDAG-NEXT:    mov v1.s[2], v0.s[0]
408; SDAG-NEXT:    mov v0.16b, v1.16b
409; SDAG-NEXT:    add sp, sp, #48
410; SDAG-NEXT:    ret
411;
412; GISEL-LABEL: exp10_v3f32:
413; GISEL:       // %bb.0:
414; GISEL-NEXT:    sub sp, sp, #64
415; GISEL-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
416; GISEL-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
417; GISEL-NEXT:    .cfi_def_cfa_offset 64
418; GISEL-NEXT:    .cfi_offset w30, -16
419; GISEL-NEXT:    .cfi_offset b8, -24
420; GISEL-NEXT:    .cfi_offset b9, -32
421; GISEL-NEXT:    mov s8, v0.s[1]
422; GISEL-NEXT:    mov s9, v0.s[2]
423; GISEL-NEXT:    // kill: def $s0 killed $s0 killed $q0
424; GISEL-NEXT:    bl exp10f
425; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
426; GISEL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
427; GISEL-NEXT:    fmov s0, s8
428; GISEL-NEXT:    bl exp10f
429; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
430; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
431; GISEL-NEXT:    fmov s0, s9
432; GISEL-NEXT:    bl exp10f
433; GISEL-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
434; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
435; GISEL-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
436; GISEL-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
437; GISEL-NEXT:    mov v1.s[1], v2.s[0]
438; GISEL-NEXT:    mov v1.s[2], v0.s[0]
439; GISEL-NEXT:    mov v0.16b, v1.16b
440; GISEL-NEXT:    add sp, sp, #64
441; GISEL-NEXT:    ret
442  %r = call <3 x float> @llvm.exp10.v3f32(<3 x float> %x)
443  ret <3 x float> %r
444}
445
446define <4 x float> @exp10_v4f32(<4 x float> %x) {
447; SDAG-LABEL: exp10_v4f32:
448; SDAG:       // %bb.0:
449; SDAG-NEXT:    sub sp, sp, #48
450; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
451; SDAG-NEXT:    .cfi_def_cfa_offset 48
452; SDAG-NEXT:    .cfi_offset w30, -16
453; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
454; SDAG-NEXT:    mov s0, v0.s[1]
455; SDAG-NEXT:    bl exp10f
456; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
457; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
458; SDAG-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
459; SDAG-NEXT:    // kill: def $s0 killed $s0 killed $q0
460; SDAG-NEXT:    bl exp10f
461; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
462; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
463; SDAG-NEXT:    mov v0.s[1], v1.s[0]
464; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
465; SDAG-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
466; SDAG-NEXT:    mov s0, v0.s[2]
467; SDAG-NEXT:    bl exp10f
468; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
469; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
470; SDAG-NEXT:    mov v1.s[2], v0.s[0]
471; SDAG-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
472; SDAG-NEXT:    mov s0, v0.s[3]
473; SDAG-NEXT:    str q1, [sp] // 16-byte Folded Spill
474; SDAG-NEXT:    bl exp10f
475; SDAG-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
476; SDAG-NEXT:    // kill: def $s0 killed $s0 def $q0
477; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
478; SDAG-NEXT:    mov v1.s[3], v0.s[0]
479; SDAG-NEXT:    mov v0.16b, v1.16b
480; SDAG-NEXT:    add sp, sp, #48
481; SDAG-NEXT:    ret
482;
483; GISEL-LABEL: exp10_v4f32:
484; GISEL:       // %bb.0:
485; GISEL-NEXT:    sub sp, sp, #80
486; GISEL-NEXT:    str d10, [sp, #48] // 8-byte Folded Spill
487; GISEL-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
488; GISEL-NEXT:    str x30, [sp, #72] // 8-byte Folded Spill
489; GISEL-NEXT:    .cfi_def_cfa_offset 80
490; GISEL-NEXT:    .cfi_offset w30, -8
491; GISEL-NEXT:    .cfi_offset b8, -16
492; GISEL-NEXT:    .cfi_offset b9, -24
493; GISEL-NEXT:    .cfi_offset b10, -32
494; GISEL-NEXT:    mov s8, v0.s[1]
495; GISEL-NEXT:    mov s9, v0.s[2]
496; GISEL-NEXT:    mov s10, v0.s[3]
497; GISEL-NEXT:    // kill: def $s0 killed $s0 killed $q0
498; GISEL-NEXT:    bl exp10f
499; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
500; GISEL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
501; GISEL-NEXT:    fmov s0, s8
502; GISEL-NEXT:    bl exp10f
503; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
504; GISEL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
505; GISEL-NEXT:    fmov s0, s9
506; GISEL-NEXT:    bl exp10f
507; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
508; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
509; GISEL-NEXT:    fmov s0, s10
510; GISEL-NEXT:    bl exp10f
511; GISEL-NEXT:    ldp q2, q1, [sp, #16] // 32-byte Folded Reload
512; GISEL-NEXT:    // kill: def $s0 killed $s0 def $q0
513; GISEL-NEXT:    ldr x30, [sp, #72] // 8-byte Folded Reload
514; GISEL-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
515; GISEL-NEXT:    ldr d10, [sp, #48] // 8-byte Folded Reload
516; GISEL-NEXT:    mov v1.s[1], v2.s[0]
517; GISEL-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
518; GISEL-NEXT:    mov v1.s[2], v2.s[0]
519; GISEL-NEXT:    mov v1.s[3], v0.s[0]
520; GISEL-NEXT:    mov v0.16b, v1.16b
521; GISEL-NEXT:    add sp, sp, #80
522; GISEL-NEXT:    ret
523  %r = call <4 x float> @llvm.exp10.v4f32(<4 x float> %x)
524  ret <4 x float> %r
525}
526
527define double @exp10_f64(double %x) {
528; CHECK-LABEL: exp10_f64:
529; CHECK:       // %bb.0:
530; CHECK-NEXT:    b exp10
531  %r = call double @llvm.exp10.f64(double %x)
532  ret double %r
533}
534
535define <1 x double> @exp10_v1f64(<1 x double> %x) {
536; CHECK-LABEL: exp10_v1f64:
537; CHECK:       // %bb.0:
538; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
539; CHECK-NEXT:    .cfi_def_cfa_offset 16
540; CHECK-NEXT:    .cfi_offset w30, -16
541; CHECK-NEXT:    bl exp10
542; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
543; CHECK-NEXT:    ret
544  %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x)
545  ret <1 x double> %r
546}
547
548define <2 x double> @exp10_v2f64(<2 x double> %x) {
549; SDAG-LABEL: exp10_v2f64:
550; SDAG:       // %bb.0:
551; SDAG-NEXT:    sub sp, sp, #48
552; SDAG-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
553; SDAG-NEXT:    .cfi_def_cfa_offset 48
554; SDAG-NEXT:    .cfi_offset w30, -16
555; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
556; SDAG-NEXT:    mov d0, v0.d[1]
557; SDAG-NEXT:    bl exp10
558; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
559; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
560; SDAG-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
561; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
562; SDAG-NEXT:    bl exp10
563; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
564; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
565; SDAG-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
566; SDAG-NEXT:    mov v0.d[1], v1.d[0]
567; SDAG-NEXT:    add sp, sp, #48
568; SDAG-NEXT:    ret
569;
570; GISEL-LABEL: exp10_v2f64:
571; GISEL:       // %bb.0:
572; GISEL-NEXT:    sub sp, sp, #32
573; GISEL-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
574; GISEL-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
575; GISEL-NEXT:    .cfi_def_cfa_offset 32
576; GISEL-NEXT:    .cfi_offset w30, -8
577; GISEL-NEXT:    .cfi_offset b8, -16
578; GISEL-NEXT:    mov d8, v0.d[1]
579; GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
580; GISEL-NEXT:    bl exp10
581; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
582; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
583; GISEL-NEXT:    fmov d0, d8
584; GISEL-NEXT:    bl exp10
585; GISEL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
586; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
587; GISEL-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
588; GISEL-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
589; GISEL-NEXT:    mov v1.d[1], v0.d[0]
590; GISEL-NEXT:    mov v0.16b, v1.16b
591; GISEL-NEXT:    add sp, sp, #32
592; GISEL-NEXT:    ret
593  %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x)
594  ret <2 x double> %r
595}
596
597define <3 x double> @exp10_v3f64(<3 x double> %x) {
598; SDAG-LABEL: exp10_v3f64:
599; SDAG:       // %bb.0:
600; SDAG-NEXT:    str d10, [sp, #-32]! // 8-byte Folded Spill
601; SDAG-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
602; SDAG-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
603; SDAG-NEXT:    .cfi_def_cfa_offset 32
604; SDAG-NEXT:    .cfi_offset w30, -8
605; SDAG-NEXT:    .cfi_offset b8, -16
606; SDAG-NEXT:    .cfi_offset b9, -24
607; SDAG-NEXT:    .cfi_offset b10, -32
608; SDAG-NEXT:    fmov d8, d2
609; SDAG-NEXT:    fmov d9, d1
610; SDAG-NEXT:    bl exp10
611; SDAG-NEXT:    fmov d10, d0
612; SDAG-NEXT:    fmov d0, d9
613; SDAG-NEXT:    bl exp10
614; SDAG-NEXT:    fmov d9, d0
615; SDAG-NEXT:    fmov d0, d8
616; SDAG-NEXT:    bl exp10
617; SDAG-NEXT:    fmov d1, d9
618; SDAG-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
619; SDAG-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
620; SDAG-NEXT:    fmov d2, d0
621; SDAG-NEXT:    fmov d0, d10
622; SDAG-NEXT:    ldr d10, [sp], #32 // 8-byte Folded Reload
623; SDAG-NEXT:    ret
624;
625; GISEL-LABEL: exp10_v3f64:
626; GISEL:       // %bb.0:
627; GISEL-NEXT:    str d10, [sp, #-32]! // 8-byte Folded Spill
628; GISEL-NEXT:    stp d9, d8, [sp, #8] // 16-byte Folded Spill
629; GISEL-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
630; GISEL-NEXT:    .cfi_def_cfa_offset 32
631; GISEL-NEXT:    .cfi_offset w30, -8
632; GISEL-NEXT:    .cfi_offset b8, -16
633; GISEL-NEXT:    .cfi_offset b9, -24
634; GISEL-NEXT:    .cfi_offset b10, -32
635; GISEL-NEXT:    fmov d8, d1
636; GISEL-NEXT:    fmov d9, d2
637; GISEL-NEXT:    bl exp10
638; GISEL-NEXT:    fmov d10, d0
639; GISEL-NEXT:    fmov d0, d8
640; GISEL-NEXT:    bl exp10
641; GISEL-NEXT:    fmov d8, d0
642; GISEL-NEXT:    fmov d0, d9
643; GISEL-NEXT:    bl exp10
644; GISEL-NEXT:    fmov d1, d8
645; GISEL-NEXT:    ldp d9, d8, [sp, #8] // 16-byte Folded Reload
646; GISEL-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
647; GISEL-NEXT:    fmov d2, d0
648; GISEL-NEXT:    fmov d0, d10
649; GISEL-NEXT:    ldr d10, [sp], #32 // 8-byte Folded Reload
650; GISEL-NEXT:    ret
651  %r = call <3 x double> @llvm.exp10.v3f64(<3 x double> %x)
652  ret <3 x double> %r
653}
654
655define <4 x double> @exp10_v4f64(<4 x double> %x) {
656; SDAG-LABEL: exp10_v4f64:
657; SDAG:       // %bb.0:
658; SDAG-NEXT:    sub sp, sp, #64
659; SDAG-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
660; SDAG-NEXT:    .cfi_def_cfa_offset 64
661; SDAG-NEXT:    .cfi_offset w30, -16
662; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
663; SDAG-NEXT:    mov d0, v0.d[1]
664; SDAG-NEXT:    str q1, [sp, #32] // 16-byte Folded Spill
665; SDAG-NEXT:    bl exp10
666; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
667; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
668; SDAG-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
669; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
670; SDAG-NEXT:    bl exp10
671; SDAG-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
672; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
673; SDAG-NEXT:    mov v0.d[1], v1.d[0]
674; SDAG-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
675; SDAG-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
676; SDAG-NEXT:    mov d0, v0.d[1]
677; SDAG-NEXT:    bl exp10
678; SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
679; SDAG-NEXT:    str q0, [sp] // 16-byte Folded Spill
680; SDAG-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
681; SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
682; SDAG-NEXT:    bl exp10
683; SDAG-NEXT:    fmov d1, d0
684; SDAG-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
685; SDAG-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
686; SDAG-NEXT:    mov v1.d[1], v2.d[0]
687; SDAG-NEXT:    add sp, sp, #64
688; SDAG-NEXT:    ret
689;
690; GISEL-LABEL: exp10_v4f64:
691; GISEL:       // %bb.0:
692; GISEL-NEXT:    sub sp, sp, #80
693; GISEL-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
694; GISEL-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
695; GISEL-NEXT:    .cfi_def_cfa_offset 80
696; GISEL-NEXT:    .cfi_offset w30, -16
697; GISEL-NEXT:    .cfi_offset b8, -24
698; GISEL-NEXT:    .cfi_offset b9, -32
699; GISEL-NEXT:    str q1, [sp] // 16-byte Folded Spill
700; GISEL-NEXT:    mov d8, v0.d[1]
701; GISEL-NEXT:    mov d9, v1.d[1]
702; GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
703; GISEL-NEXT:    bl exp10
704; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
705; GISEL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
706; GISEL-NEXT:    fmov d0, d8
707; GISEL-NEXT:    bl exp10
708; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
709; GISEL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
710; GISEL-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
711; GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
712; GISEL-NEXT:    bl exp10
713; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
714; GISEL-NEXT:    str q0, [sp] // 16-byte Folded Spill
715; GISEL-NEXT:    fmov d0, d9
716; GISEL-NEXT:    bl exp10
717; GISEL-NEXT:    ldp q1, q2, [sp, #16] // 32-byte Folded Reload
718; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
719; GISEL-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
720; GISEL-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
721; GISEL-NEXT:    mov v2.d[1], v1.d[0]
722; GISEL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
723; GISEL-NEXT:    mov v1.d[1], v0.d[0]
724; GISEL-NEXT:    mov v0.16b, v2.16b
725; GISEL-NEXT:    add sp, sp, #80
726; GISEL-NEXT:    ret
727  %r = call <4 x double> @llvm.exp10.v4f64(<4 x double> %x)
728  ret <4 x double> %r
729}
730;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
731; CVT: {{.*}}
732; CVT-GISEL: {{.*}}
733; CVT-SDAG: {{.*}}
734; FP16: {{.*}}
735; FP16-GISEL: {{.*}}
736; FP16-SDAG: {{.*}}
737