blob: 1708859fd834247ccb92c229630b4d7ca17f28b9 [file] [log] [blame]
Sanjay Patel49a82802018-08-15 17:06:21 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s
3
4; PR38527 - https://bugs.llvm.org/show_bug.cgi?id=38527
5
6; Use fsin as the representative test for various data types.
7
8declare <1 x float> @llvm.sin.v1f32(<1 x float>)
9declare <2 x float> @llvm.sin.v2f32(<2 x float>)
10declare <3 x float> @llvm.sin.v3f32(<3 x float>)
11declare <4 x float> @llvm.sin.v4f32(<4 x float>)
12declare <5 x float> @llvm.sin.v5f32(<5 x float>)
13declare <6 x float> @llvm.sin.v6f32(<6 x float>)
14declare <3 x double> @llvm.sin.v3f64(<3 x double>)
15
16; Verify that all of the potential libcall candidates are handled.
17; Some of these have custom lowering, so those cases won't have
18; libcalls.
19
20declare <3 x float> @llvm.fabs.v3f32(<3 x float>)
21declare <3 x float> @llvm.ceil.v3f32(<3 x float>)
22declare <3 x float> @llvm.cos.v3f32(<3 x float>)
23declare <3 x float> @llvm.exp.v3f32(<3 x float>)
24declare <3 x float> @llvm.exp2.v3f32(<3 x float>)
25declare <3 x float> @llvm.floor.v3f32(<3 x float>)
26declare <3 x float> @llvm.log.v3f32(<3 x float>)
27declare <3 x float> @llvm.log10.v3f32(<3 x float>)
28declare <3 x float> @llvm.log2.v3f32(<3 x float>)
29declare <3 x float> @llvm.nearbyint.v3f32(<3 x float>)
30declare <3 x float> @llvm.rint.v3f32(<3 x float>)
31declare <3 x float> @llvm.round.v3f32(<3 x float>)
32declare <3 x float> @llvm.sqrt.v3f32(<3 x float>)
33declare <3 x float> @llvm.trunc.v3f32(<3 x float>)
34
35define <1 x float> @sin_v1f32(<1 x float> %x) nounwind {
36; CHECK-LABEL: sin_v1f32:
37; CHECK: // %bb.0:
38; CHECK-NEXT: sub sp, sp, #48 // =48
39; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
40; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
41; CHECK-NEXT: mov s0, v0.s[1]
42; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
43; CHECK-NEXT: bl sinf
44; CHECK-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
45; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
46; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
47; CHECK-NEXT: bl sinf
48; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
49; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
50; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
51; CHECK-NEXT: mov v0.s[1], v1.s[0]
52; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
53; CHECK-NEXT: add sp, sp, #48 // =48
54; CHECK-NEXT: ret
55 %r = call <1 x float> @llvm.sin.v1f32(<1 x float> %x)
56 ret <1 x float> %r
57}
58
59define <2 x float> @sin_v2f32(<2 x float> %x) nounwind {
60; CHECK-LABEL: sin_v2f32:
61; CHECK: // %bb.0:
62; CHECK-NEXT: sub sp, sp, #48 // =48
63; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
64; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
65; CHECK-NEXT: mov s0, v0.s[1]
66; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
67; CHECK-NEXT: bl sinf
68; CHECK-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
69; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
70; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
71; CHECK-NEXT: bl sinf
72; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
73; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
74; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
75; CHECK-NEXT: mov v0.s[1], v1.s[0]
76; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
77; CHECK-NEXT: add sp, sp, #48 // =48
78; CHECK-NEXT: ret
79 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %x)
80 ret <2 x float> %r
81}
82
83define <3 x float> @sin_v3f32(<3 x float> %x) nounwind {
84; CHECK-LABEL: sin_v3f32:
85; CHECK: // %bb.0:
86; CHECK-NEXT: sub sp, sp, #48 // =48
87; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
88; CHECK-NEXT: mov s0, v0.s[1]
89; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
90; CHECK-NEXT: bl sinf
91; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
92; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
93; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
94; CHECK-NEXT: bl sinf
95; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
96; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
97; CHECK-NEXT: mov v0.s[1], v1.s[0]
98; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
99; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
100; CHECK-NEXT: mov s0, v0.s[2]
101; CHECK-NEXT: bl sinf
102; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
103; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
104; CHECK-NEXT: mov v1.s[2], v0.s[0]
105; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
106; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
107; CHECK-NEXT: mov s0, v0.s[3]
108; CHECK-NEXT: bl sinf
109; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
110; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
111; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
112; CHECK-NEXT: mov v1.s[3], v0.s[0]
113; CHECK-NEXT: mov v0.16b, v1.16b
114; CHECK-NEXT: add sp, sp, #48 // =48
115; CHECK-NEXT: ret
116 %r = call <3 x float> @llvm.sin.v3f32(<3 x float> %x)
117 ret <3 x float> %r
118}
119
120define <4 x float> @sin_v4f32(<4 x float> %x) nounwind {
121; CHECK-LABEL: sin_v4f32:
122; CHECK: // %bb.0:
123; CHECK-NEXT: sub sp, sp, #48 // =48
124; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
125; CHECK-NEXT: mov s0, v0.s[1]
126; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
127; CHECK-NEXT: bl sinf
128; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
129; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
130; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
131; CHECK-NEXT: bl sinf
132; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
133; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
134; CHECK-NEXT: mov v0.s[1], v1.s[0]
135; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
136; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
137; CHECK-NEXT: mov s0, v0.s[2]
138; CHECK-NEXT: bl sinf
139; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
140; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
141; CHECK-NEXT: mov v1.s[2], v0.s[0]
142; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
143; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
144; CHECK-NEXT: mov s0, v0.s[3]
145; CHECK-NEXT: bl sinf
146; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
147; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
148; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
149; CHECK-NEXT: mov v1.s[3], v0.s[0]
150; CHECK-NEXT: mov v0.16b, v1.16b
151; CHECK-NEXT: add sp, sp, #48 // =48
152; CHECK-NEXT: ret
153 %r = call <4 x float> @llvm.sin.v4f32(<4 x float> %x)
154 ret <4 x float> %r
155}
156
157define <5 x float> @sin_v5f32(<5 x float> %x) nounwind {
158; CHECK-LABEL: sin_v5f32:
159; CHECK: // %bb.0:
160; CHECK-NEXT: str d12, [sp, #-48]! // 8-byte Folded Spill
161; CHECK-NEXT: stp d11, d10, [sp, #8] // 8-byte Folded Spill
162; CHECK-NEXT: stp d9, d8, [sp, #24] // 8-byte Folded Spill
163; CHECK-NEXT: str x30, [sp, #40] // 8-byte Folded Spill
164; CHECK-NEXT: mov v8.16b, v4.16b
165; CHECK-NEXT: mov v9.16b, v3.16b
166; CHECK-NEXT: mov v10.16b, v2.16b
167; CHECK-NEXT: mov v11.16b, v1.16b
168; CHECK-NEXT: bl sinf
169; CHECK-NEXT: mov v12.16b, v0.16b
170; CHECK-NEXT: mov v0.16b, v11.16b
171; CHECK-NEXT: bl sinf
172; CHECK-NEXT: mov v11.16b, v0.16b
173; CHECK-NEXT: mov v0.16b, v10.16b
174; CHECK-NEXT: bl sinf
175; CHECK-NEXT: mov v10.16b, v0.16b
176; CHECK-NEXT: mov v0.16b, v9.16b
177; CHECK-NEXT: bl sinf
178; CHECK-NEXT: mov v9.16b, v0.16b
179; CHECK-NEXT: mov v0.16b, v8.16b
180; CHECK-NEXT: bl sinf
181; CHECK-NEXT: mov v1.16b, v11.16b
182; CHECK-NEXT: mov v2.16b, v10.16b
183; CHECK-NEXT: mov v3.16b, v9.16b
184; CHECK-NEXT: ldr x30, [sp, #40] // 8-byte Folded Reload
185; CHECK-NEXT: ldp d9, d8, [sp, #24] // 8-byte Folded Reload
186; CHECK-NEXT: ldp d11, d10, [sp, #8] // 8-byte Folded Reload
187; CHECK-NEXT: mov v4.16b, v0.16b
188; CHECK-NEXT: mov v0.16b, v12.16b
189; CHECK-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload
190; CHECK-NEXT: ret
191 %r = call <5 x float> @llvm.sin.v5f32(<5 x float> %x)
192 ret <5 x float> %r
193}
194
195define <6 x float> @sin_v6f32(<6 x float> %x) nounwind {
196; CHECK-LABEL: sin_v6f32:
197; CHECK: // %bb.0:
198; CHECK-NEXT: sub sp, sp, #80 // =80
199; CHECK-NEXT: str d12, [sp, #32] // 8-byte Folded Spill
200; CHECK-NEXT: mov v12.16b, v0.16b
201; CHECK-NEXT: mov v0.16b, v5.16b
202; CHECK-NEXT: stp d11, d10, [sp, #40] // 8-byte Folded Spill
203; CHECK-NEXT: stp d9, d8, [sp, #56] // 8-byte Folded Spill
204; CHECK-NEXT: str x30, [sp, #72] // 8-byte Folded Spill
205; CHECK-NEXT: mov v8.16b, v4.16b
206; CHECK-NEXT: mov v9.16b, v3.16b
207; CHECK-NEXT: mov v10.16b, v2.16b
208; CHECK-NEXT: mov v11.16b, v1.16b
209; CHECK-NEXT: bl sinf
210; CHECK-NEXT: str d0, [sp, #16] // 16-byte Folded Spill
211; CHECK-NEXT: mov v0.16b, v8.16b
212; CHECK-NEXT: bl sinf
213; CHECK-NEXT: mov v1.16b, v0.16b
214; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
215; CHECK-NEXT: mov v1.s[1], v0.s[0]
216; CHECK-NEXT: mov v0.16b, v12.16b
217; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
218; CHECK-NEXT: bl sinf
219; CHECK-NEXT: mov v8.16b, v0.16b
220; CHECK-NEXT: mov v0.16b, v11.16b
221; CHECK-NEXT: bl sinf
222; CHECK-NEXT: mov v11.16b, v0.16b
223; CHECK-NEXT: mov v0.16b, v10.16b
224; CHECK-NEXT: bl sinf
225; CHECK-NEXT: mov v10.16b, v0.16b
226; CHECK-NEXT: mov v0.16b, v9.16b
227; CHECK-NEXT: bl sinf
228; CHECK-NEXT: ldp q4, q5, [sp] // 16-byte Folded Reload
229; CHECK-NEXT: mov v3.16b, v0.16b
230; CHECK-NEXT: mov v0.16b, v8.16b
231; CHECK-NEXT: mov v1.16b, v11.16b
232; CHECK-NEXT: mov v2.16b, v10.16b
233; CHECK-NEXT: ldr x30, [sp, #72] // 8-byte Folded Reload
234; CHECK-NEXT: ldp d9, d8, [sp, #56] // 8-byte Folded Reload
235; CHECK-NEXT: ldp d11, d10, [sp, #40] // 8-byte Folded Reload
236; CHECK-NEXT: ldr d12, [sp, #32] // 8-byte Folded Reload
237; CHECK-NEXT: // kill: def $s4 killed $s4 killed $q4
238; CHECK-NEXT: // kill: def $s5 killed $s5 killed $q5
239; CHECK-NEXT: add sp, sp, #80 // =80
240; CHECK-NEXT: ret
241 %r = call <6 x float> @llvm.sin.v6f32(<6 x float> %x)
242 ret <6 x float> %r
243}
244
245define <3 x double> @sin_v3f64(<3 x double> %x) nounwind {
246; CHECK-LABEL: sin_v3f64:
247; CHECK: // %bb.0:
248; CHECK-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill
249; CHECK-NEXT: stp d9, d8, [sp, #8] // 8-byte Folded Spill
250; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
251; CHECK-NEXT: mov v8.16b, v2.16b
252; CHECK-NEXT: mov v9.16b, v1.16b
253; CHECK-NEXT: bl sin
254; CHECK-NEXT: mov v10.16b, v0.16b
255; CHECK-NEXT: mov v0.16b, v9.16b
256; CHECK-NEXT: bl sin
257; CHECK-NEXT: mov v9.16b, v0.16b
258; CHECK-NEXT: mov v0.16b, v8.16b
259; CHECK-NEXT: bl sin
260; CHECK-NEXT: mov v1.16b, v9.16b
261; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
262; CHECK-NEXT: ldp d9, d8, [sp, #8] // 8-byte Folded Reload
263; CHECK-NEXT: mov v2.16b, v0.16b
264; CHECK-NEXT: mov v0.16b, v10.16b
265; CHECK-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload
266; CHECK-NEXT: ret
267 %r = call <3 x double> @llvm.sin.v3f64(<3 x double> %x)
268 ret <3 x double> %r
269}
270
271define <3 x float> @fabs_v3f32(<3 x float> %x) nounwind {
272; CHECK-LABEL: fabs_v3f32:
273; CHECK: // %bb.0:
274; CHECK-NEXT: fabs v0.4s, v0.4s
275; CHECK-NEXT: ret
276 %r = call <3 x float> @llvm.fabs.v3f32(<3 x float> %x)
277 ret <3 x float> %r
278}
279
280define <3 x float> @ceil_v3f32(<3 x float> %x) nounwind {
281; CHECK-LABEL: ceil_v3f32:
282; CHECK: // %bb.0:
283; CHECK-NEXT: frintp v0.4s, v0.4s
284; CHECK-NEXT: ret
285 %r = call <3 x float> @llvm.ceil.v3f32(<3 x float> %x)
286 ret <3 x float> %r
287}
288
289define <3 x float> @cos_v3f32(<3 x float> %x) nounwind {
290; CHECK-LABEL: cos_v3f32:
291; CHECK: // %bb.0:
292; CHECK-NEXT: sub sp, sp, #48 // =48
293; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
294; CHECK-NEXT: mov s0, v0.s[1]
295; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
296; CHECK-NEXT: bl cosf
297; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
298; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
299; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
300; CHECK-NEXT: bl cosf
301; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
302; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
303; CHECK-NEXT: mov v0.s[1], v1.s[0]
304; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
305; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
306; CHECK-NEXT: mov s0, v0.s[2]
307; CHECK-NEXT: bl cosf
308; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
309; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
310; CHECK-NEXT: mov v1.s[2], v0.s[0]
311; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
312; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
313; CHECK-NEXT: mov s0, v0.s[3]
314; CHECK-NEXT: bl cosf
315; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
316; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
317; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
318; CHECK-NEXT: mov v1.s[3], v0.s[0]
319; CHECK-NEXT: mov v0.16b, v1.16b
320; CHECK-NEXT: add sp, sp, #48 // =48
321; CHECK-NEXT: ret
322 %r = call <3 x float> @llvm.cos.v3f32(<3 x float> %x)
323 ret <3 x float> %r
324}
325
326define <3 x float> @exp_v3f32(<3 x float> %x) nounwind {
327; CHECK-LABEL: exp_v3f32:
328; CHECK: // %bb.0:
329; CHECK-NEXT: sub sp, sp, #48 // =48
330; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
331; CHECK-NEXT: mov s0, v0.s[1]
332; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
333; CHECK-NEXT: bl expf
334; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
335; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
336; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
337; CHECK-NEXT: bl expf
338; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
339; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
340; CHECK-NEXT: mov v0.s[1], v1.s[0]
341; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
342; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
343; CHECK-NEXT: mov s0, v0.s[2]
344; CHECK-NEXT: bl expf
345; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
346; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
347; CHECK-NEXT: mov v1.s[2], v0.s[0]
348; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
349; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
350; CHECK-NEXT: mov s0, v0.s[3]
351; CHECK-NEXT: bl expf
352; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
353; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
354; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
355; CHECK-NEXT: mov v1.s[3], v0.s[0]
356; CHECK-NEXT: mov v0.16b, v1.16b
357; CHECK-NEXT: add sp, sp, #48 // =48
358; CHECK-NEXT: ret
359 %r = call <3 x float> @llvm.exp.v3f32(<3 x float> %x)
360 ret <3 x float> %r
361}
362
363define <3 x float> @exp2_v3f32(<3 x float> %x) nounwind {
364; CHECK-LABEL: exp2_v3f32:
365; CHECK: // %bb.0:
366; CHECK-NEXT: sub sp, sp, #48 // =48
367; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
368; CHECK-NEXT: mov s0, v0.s[1]
369; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
370; CHECK-NEXT: bl exp2f
371; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
372; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
373; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
374; CHECK-NEXT: bl exp2f
375; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
376; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
377; CHECK-NEXT: mov v0.s[1], v1.s[0]
378; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
379; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
380; CHECK-NEXT: mov s0, v0.s[2]
381; CHECK-NEXT: bl exp2f
382; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
383; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
384; CHECK-NEXT: mov v1.s[2], v0.s[0]
385; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
386; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
387; CHECK-NEXT: mov s0, v0.s[3]
388; CHECK-NEXT: bl exp2f
389; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
390; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
391; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
392; CHECK-NEXT: mov v1.s[3], v0.s[0]
393; CHECK-NEXT: mov v0.16b, v1.16b
394; CHECK-NEXT: add sp, sp, #48 // =48
395; CHECK-NEXT: ret
396 %r = call <3 x float> @llvm.exp2.v3f32(<3 x float> %x)
397 ret <3 x float> %r
398}
399
400define <3 x float> @floor_v3f32(<3 x float> %x) nounwind {
401; CHECK-LABEL: floor_v3f32:
402; CHECK: // %bb.0:
403; CHECK-NEXT: frintm v0.4s, v0.4s
404; CHECK-NEXT: ret
405 %r = call <3 x float> @llvm.floor.v3f32(<3 x float> %x)
406 ret <3 x float> %r
407}
408
409define <3 x float> @log_v3f32(<3 x float> %x) nounwind {
410; CHECK-LABEL: log_v3f32:
411; CHECK: // %bb.0:
412; CHECK-NEXT: sub sp, sp, #48 // =48
413; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
414; CHECK-NEXT: mov s0, v0.s[1]
415; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
416; CHECK-NEXT: bl logf
417; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
418; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
419; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
420; CHECK-NEXT: bl logf
421; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
422; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
423; CHECK-NEXT: mov v0.s[1], v1.s[0]
424; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
425; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
426; CHECK-NEXT: mov s0, v0.s[2]
427; CHECK-NEXT: bl logf
428; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
429; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
430; CHECK-NEXT: mov v1.s[2], v0.s[0]
431; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
432; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
433; CHECK-NEXT: mov s0, v0.s[3]
434; CHECK-NEXT: bl logf
435; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
436; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
437; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
438; CHECK-NEXT: mov v1.s[3], v0.s[0]
439; CHECK-NEXT: mov v0.16b, v1.16b
440; CHECK-NEXT: add sp, sp, #48 // =48
441; CHECK-NEXT: ret
442 %r = call <3 x float> @llvm.log.v3f32(<3 x float> %x)
443 ret <3 x float> %r
444}
445
446define <3 x float> @log10_v3f32(<3 x float> %x) nounwind {
447; CHECK-LABEL: log10_v3f32:
448; CHECK: // %bb.0:
449; CHECK-NEXT: sub sp, sp, #48 // =48
450; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
451; CHECK-NEXT: mov s0, v0.s[1]
452; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
453; CHECK-NEXT: bl log10f
454; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
455; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
456; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
457; CHECK-NEXT: bl log10f
458; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
459; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
460; CHECK-NEXT: mov v0.s[1], v1.s[0]
461; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
462; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
463; CHECK-NEXT: mov s0, v0.s[2]
464; CHECK-NEXT: bl log10f
465; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
466; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
467; CHECK-NEXT: mov v1.s[2], v0.s[0]
468; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
469; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
470; CHECK-NEXT: mov s0, v0.s[3]
471; CHECK-NEXT: bl log10f
472; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
473; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
474; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
475; CHECK-NEXT: mov v1.s[3], v0.s[0]
476; CHECK-NEXT: mov v0.16b, v1.16b
477; CHECK-NEXT: add sp, sp, #48 // =48
478; CHECK-NEXT: ret
479 %r = call <3 x float> @llvm.log10.v3f32(<3 x float> %x)
480 ret <3 x float> %r
481}
482
483define <3 x float> @log2_v3f32(<3 x float> %x) nounwind {
484; CHECK-LABEL: log2_v3f32:
485; CHECK: // %bb.0:
486; CHECK-NEXT: sub sp, sp, #48 // =48
487; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
488; CHECK-NEXT: mov s0, v0.s[1]
489; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
490; CHECK-NEXT: bl log2f
491; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill
492; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
493; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0
494; CHECK-NEXT: bl log2f
495; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
496; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
497; CHECK-NEXT: mov v0.s[1], v1.s[0]
498; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
499; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
500; CHECK-NEXT: mov s0, v0.s[2]
501; CHECK-NEXT: bl log2f
502; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
503; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
504; CHECK-NEXT: mov v1.s[2], v0.s[0]
505; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
506; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill
507; CHECK-NEXT: mov s0, v0.s[3]
508; CHECK-NEXT: bl log2f
509; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
510; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
511; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0
512; CHECK-NEXT: mov v1.s[3], v0.s[0]
513; CHECK-NEXT: mov v0.16b, v1.16b
514; CHECK-NEXT: add sp, sp, #48 // =48
515; CHECK-NEXT: ret
516 %r = call <3 x float> @llvm.log2.v3f32(<3 x float> %x)
517 ret <3 x float> %r
518}
519
520define <3 x float> @nearbyint__v3f32(<3 x float> %x) nounwind {
521; CHECK-LABEL: nearbyint__v3f32:
522; CHECK: // %bb.0:
523; CHECK-NEXT: frinti v0.4s, v0.4s
524; CHECK-NEXT: ret
525 %r = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %x)
526 ret <3 x float> %r
527}
528
529define <3 x float> @rint_v3f32(<3 x float> %x) nounwind {
530; CHECK-LABEL: rint_v3f32:
531; CHECK: // %bb.0:
532; CHECK-NEXT: frintx v0.4s, v0.4s
533; CHECK-NEXT: ret
534 %r = call <3 x float> @llvm.rint.v3f32(<3 x float> %x)
535 ret <3 x float> %r
536}
537
538define <3 x float> @round_v3f32(<3 x float> %x) nounwind {
539; CHECK-LABEL: round_v3f32:
540; CHECK: // %bb.0:
541; CHECK-NEXT: frinta v0.4s, v0.4s
542; CHECK-NEXT: ret
543 %r = call <3 x float> @llvm.round.v3f32(<3 x float> %x)
544 ret <3 x float> %r
545}
546
547define <3 x float> @sqrt_v3f32(<3 x float> %x) nounwind {
548; CHECK-LABEL: sqrt_v3f32:
549; CHECK: // %bb.0:
550; CHECK-NEXT: fsqrt v0.4s, v0.4s
551; CHECK-NEXT: ret
552 %r = call <3 x float> @llvm.sqrt.v3f32(<3 x float> %x)
553 ret <3 x float> %r
554}
555
556define <3 x float> @trunc_v3f32(<3 x float> %x) nounwind {
557; CHECK-LABEL: trunc_v3f32:
558; CHECK: // %bb.0:
559; CHECK-NEXT: frintz v0.4s, v0.4s
560; CHECK-NEXT: ret
561 %r = call <3 x float> @llvm.trunc.v3f32(<3 x float> %x)
562 ret <3 x float> %r
563}
564