xref: /llvm-project/llvm/test/CodeGen/AArch64/llvm.sincos.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=aarch64-gnu-linux < %s | FileCheck -check-prefixes=CHECK %s
3; RUN: llc -mtriple=aarch64-none-linux < %s | FileCheck -check-prefixes=NO-LIBCALL %s
4
5define { half, half } @test_sincos_f16(half %a) {
6; CHECK-LABEL: test_sincos_f16:
7; CHECK:       // %bb.0:
8; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
9; CHECK-NEXT:    .cfi_def_cfa_offset 16
10; CHECK-NEXT:    .cfi_offset w30, -16
11; CHECK-NEXT:    fcvt s0, h0
12; CHECK-NEXT:    add x0, sp, #12
13; CHECK-NEXT:    add x1, sp, #8
14; CHECK-NEXT:    bl sincosf
15; CHECK-NEXT:    ldp s1, s0, [sp, #8]
16; CHECK-NEXT:    fcvt h0, s0
17; CHECK-NEXT:    fcvt h1, s1
18; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
19; CHECK-NEXT:    ret
20;
21; NO-LIBCALL-LABEL: test_sincos_f16:
22; NO-LIBCALL:       // %bb.0:
23; NO-LIBCALL-NEXT:    stp d9, d8, [sp, #-32]! // 16-byte Folded Spill
24; NO-LIBCALL-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
25; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 32
26; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
27; NO-LIBCALL-NEXT:    .cfi_offset b8, -24
28; NO-LIBCALL-NEXT:    .cfi_offset b9, -32
29; NO-LIBCALL-NEXT:    fcvt s8, h0
30; NO-LIBCALL-NEXT:    fmov s0, s8
31; NO-LIBCALL-NEXT:    bl sinf
32; NO-LIBCALL-NEXT:    fcvt h9, s0
33; NO-LIBCALL-NEXT:    fmov s0, s8
34; NO-LIBCALL-NEXT:    bl cosf
35; NO-LIBCALL-NEXT:    fmov s1, s0
36; NO-LIBCALL-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
37; NO-LIBCALL-NEXT:    fmov s0, s9
38; NO-LIBCALL-NEXT:    fcvt h1, s1
39; NO-LIBCALL-NEXT:    ldp d9, d8, [sp], #32 // 16-byte Folded Reload
40; NO-LIBCALL-NEXT:    ret
41  %result = call { half, half } @llvm.sincos.f16(half %a)
42  ret { half, half } %result
43}
44
45define half @test_sincos_f16_only_use_sin(half %a) {
46; CHECK-LABEL: test_sincos_f16_only_use_sin:
47; CHECK:       // %bb.0:
48; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
49; CHECK-NEXT:    .cfi_def_cfa_offset 16
50; CHECK-NEXT:    .cfi_offset w30, -16
51; CHECK-NEXT:    fcvt s0, h0
52; CHECK-NEXT:    add x0, sp, #12
53; CHECK-NEXT:    add x1, sp, #8
54; CHECK-NEXT:    bl sincosf
55; CHECK-NEXT:    ldr s0, [sp, #12]
56; CHECK-NEXT:    fcvt h0, s0
57; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
58; CHECK-NEXT:    ret
59;
60; NO-LIBCALL-LABEL: test_sincos_f16_only_use_sin:
61; NO-LIBCALL:       // %bb.0:
62; NO-LIBCALL-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
63; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 16
64; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
65; NO-LIBCALL-NEXT:    fcvt s0, h0
66; NO-LIBCALL-NEXT:    bl sinf
67; NO-LIBCALL-NEXT:    fcvt h0, s0
68; NO-LIBCALL-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
69; NO-LIBCALL-NEXT:    ret
70  %result = call { half, half } @llvm.sincos.f16(half %a)
71  %result.0 = extractvalue { half, half } %result, 0
72  ret half %result.0
73}
74
75define half @test_sincos_f16_only_use_cos(half %a) {
76; CHECK-LABEL: test_sincos_f16_only_use_cos:
77; CHECK:       // %bb.0:
78; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
79; CHECK-NEXT:    .cfi_def_cfa_offset 16
80; CHECK-NEXT:    .cfi_offset w30, -16
81; CHECK-NEXT:    fcvt s0, h0
82; CHECK-NEXT:    add x0, sp, #12
83; CHECK-NEXT:    add x1, sp, #8
84; CHECK-NEXT:    bl sincosf
85; CHECK-NEXT:    ldr s0, [sp, #8]
86; CHECK-NEXT:    fcvt h0, s0
87; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
88; CHECK-NEXT:    ret
89;
90; NO-LIBCALL-LABEL: test_sincos_f16_only_use_cos:
91; NO-LIBCALL:       // %bb.0:
92; NO-LIBCALL-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
93; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 16
94; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
95; NO-LIBCALL-NEXT:    fcvt s0, h0
96; NO-LIBCALL-NEXT:    bl cosf
97; NO-LIBCALL-NEXT:    fcvt h0, s0
98; NO-LIBCALL-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
99; NO-LIBCALL-NEXT:    ret
100  %result = call { half, half } @llvm.sincos.f16(half %a)
101  %result.1 = extractvalue { half, half } %result, 1
102  ret half %result.1
103}
104
105define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) {
106; CHECK-LABEL: test_sincos_v2f16:
107; CHECK:       // %bb.0:
108; CHECK-NEXT:    sub sp, sp, #64
109; CHECK-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
110; CHECK-NEXT:    .cfi_def_cfa_offset 64
111; CHECK-NEXT:    .cfi_offset w30, -16
112; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
113; CHECK-NEXT:    mov h1, v0.h[1]
114; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
115; CHECK-NEXT:    add x0, sp, #36
116; CHECK-NEXT:    add x1, sp, #32
117; CHECK-NEXT:    fcvt s0, h1
118; CHECK-NEXT:    bl sincosf
119; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
120; CHECK-NEXT:    add x0, sp, #28
121; CHECK-NEXT:    add x1, sp, #24
122; CHECK-NEXT:    fcvt s0, h0
123; CHECK-NEXT:    bl sincosf
124; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
125; CHECK-NEXT:    add x0, sp, #44
126; CHECK-NEXT:    add x1, sp, #40
127; CHECK-NEXT:    mov h0, v0.h[2]
128; CHECK-NEXT:    fcvt s0, h0
129; CHECK-NEXT:    bl sincosf
130; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
131; CHECK-NEXT:    add x0, sp, #60
132; CHECK-NEXT:    add x1, sp, #56
133; CHECK-NEXT:    mov h0, v0.h[3]
134; CHECK-NEXT:    fcvt s0, h0
135; CHECK-NEXT:    bl sincosf
136; CHECK-NEXT:    ldp s2, s0, [sp, #32]
137; CHECK-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
138; CHECK-NEXT:    ldp s3, s1, [sp, #24]
139; CHECK-NEXT:    fcvt h4, s0
140; CHECK-NEXT:    fcvt h2, s2
141; CHECK-NEXT:    fcvt h0, s1
142; CHECK-NEXT:    fcvt h1, s3
143; CHECK-NEXT:    ldp s5, s3, [sp, #40]
144; CHECK-NEXT:    fcvt h3, s3
145; CHECK-NEXT:    mov v0.h[1], v4.h[0]
146; CHECK-NEXT:    fcvt h4, s5
147; CHECK-NEXT:    mov v1.h[1], v2.h[0]
148; CHECK-NEXT:    ldp s5, s2, [sp, #56]
149; CHECK-NEXT:    mov v0.h[2], v3.h[0]
150; CHECK-NEXT:    fcvt h2, s2
151; CHECK-NEXT:    fcvt h3, s5
152; CHECK-NEXT:    mov v1.h[2], v4.h[0]
153; CHECK-NEXT:    mov v0.h[3], v2.h[0]
154; CHECK-NEXT:    mov v1.h[3], v3.h[0]
155; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
156; CHECK-NEXT:    // kill: def $d1 killed $d1 killed $q1
157; CHECK-NEXT:    add sp, sp, #64
158; CHECK-NEXT:    ret
159;
160; NO-LIBCALL-LABEL: test_sincos_v2f16:
161; NO-LIBCALL:       // %bb.0:
162; NO-LIBCALL-NEXT:    sub sp, sp, #80
163; NO-LIBCALL-NEXT:    stp d11, d10, [sp, #32] // 16-byte Folded Spill
164; NO-LIBCALL-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
165; NO-LIBCALL-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
166; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 80
167; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
168; NO-LIBCALL-NEXT:    .cfi_offset b8, -24
169; NO-LIBCALL-NEXT:    .cfi_offset b9, -32
170; NO-LIBCALL-NEXT:    .cfi_offset b10, -40
171; NO-LIBCALL-NEXT:    .cfi_offset b11, -48
172; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 def $q0
173; NO-LIBCALL-NEXT:    mov h1, v0.h[1]
174; NO-LIBCALL-NEXT:    str q0, [sp] // 16-byte Folded Spill
175; NO-LIBCALL-NEXT:    fcvt s8, h1
176; NO-LIBCALL-NEXT:    fmov s0, s8
177; NO-LIBCALL-NEXT:    bl sinf
178; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
179; NO-LIBCALL-NEXT:    fcvt h0, s0
180; NO-LIBCALL-NEXT:    fcvt s9, h1
181; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
182; NO-LIBCALL-NEXT:    fmov s0, s9
183; NO-LIBCALL-NEXT:    bl sinf
184; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
185; NO-LIBCALL-NEXT:    fcvt h0, s0
186; NO-LIBCALL-NEXT:    mov h1, v1.h[2]
187; NO-LIBCALL-NEXT:    fcvt s10, h1
188; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
189; NO-LIBCALL-NEXT:    mov v0.h[1], v1.h[0]
190; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
191; NO-LIBCALL-NEXT:    fmov s0, s10
192; NO-LIBCALL-NEXT:    bl sinf
193; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
194; NO-LIBCALL-NEXT:    fcvt h0, s0
195; NO-LIBCALL-NEXT:    mov h1, v1.h[3]
196; NO-LIBCALL-NEXT:    fcvt s11, h1
197; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
198; NO-LIBCALL-NEXT:    mov v1.h[2], v0.h[0]
199; NO-LIBCALL-NEXT:    fmov s0, s11
200; NO-LIBCALL-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
201; NO-LIBCALL-NEXT:    bl sinf
202; NO-LIBCALL-NEXT:    fcvt h0, s0
203; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
204; NO-LIBCALL-NEXT:    mov v1.h[3], v0.h[0]
205; NO-LIBCALL-NEXT:    fmov s0, s8
206; NO-LIBCALL-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
207; NO-LIBCALL-NEXT:    bl cosf
208; NO-LIBCALL-NEXT:    fcvt h0, s0
209; NO-LIBCALL-NEXT:    str q0, [sp] // 16-byte Folded Spill
210; NO-LIBCALL-NEXT:    fmov s0, s9
211; NO-LIBCALL-NEXT:    bl cosf
212; NO-LIBCALL-NEXT:    fcvt h0, s0
213; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
214; NO-LIBCALL-NEXT:    mov v0.h[1], v1.h[0]
215; NO-LIBCALL-NEXT:    str q0, [sp] // 16-byte Folded Spill
216; NO-LIBCALL-NEXT:    fmov s0, s10
217; NO-LIBCALL-NEXT:    bl cosf
218; NO-LIBCALL-NEXT:    fcvt h0, s0
219; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
220; NO-LIBCALL-NEXT:    mov v1.h[2], v0.h[0]
221; NO-LIBCALL-NEXT:    fmov s0, s11
222; NO-LIBCALL-NEXT:    str q1, [sp] // 16-byte Folded Spill
223; NO-LIBCALL-NEXT:    bl cosf
224; NO-LIBCALL-NEXT:    fmov s1, s0
225; NO-LIBCALL-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
226; NO-LIBCALL-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload
227; NO-LIBCALL-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
228; NO-LIBCALL-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
229; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 killed $q0
230; NO-LIBCALL-NEXT:    fcvt h2, s1
231; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
232; NO-LIBCALL-NEXT:    mov v1.h[3], v2.h[0]
233; NO-LIBCALL-NEXT:    // kill: def $d1 killed $d1 killed $q1
234; NO-LIBCALL-NEXT:    add sp, sp, #80
235; NO-LIBCALL-NEXT:    ret
236  %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)
237  ret { <2 x half>, <2 x half> } %result
238}
239
240define { float, float } @test_sincos_f32(float %a) {
241; CHECK-LABEL: test_sincos_f32:
242; CHECK:       // %bb.0:
243; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
244; CHECK-NEXT:    .cfi_def_cfa_offset 16
245; CHECK-NEXT:    .cfi_offset w30, -16
246; CHECK-NEXT:    add x0, sp, #12
247; CHECK-NEXT:    add x1, sp, #8
248; CHECK-NEXT:    bl sincosf
249; CHECK-NEXT:    ldp s1, s0, [sp, #8]
250; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
251; CHECK-NEXT:    ret
252;
253; NO-LIBCALL-LABEL: test_sincos_f32:
254; NO-LIBCALL:       // %bb.0:
255; NO-LIBCALL-NEXT:    stp d9, d8, [sp, #-32]! // 16-byte Folded Spill
256; NO-LIBCALL-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
257; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 32
258; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
259; NO-LIBCALL-NEXT:    .cfi_offset b8, -24
260; NO-LIBCALL-NEXT:    .cfi_offset b9, -32
261; NO-LIBCALL-NEXT:    fmov s8, s0
262; NO-LIBCALL-NEXT:    bl sinf
263; NO-LIBCALL-NEXT:    fmov s9, s0
264; NO-LIBCALL-NEXT:    fmov s0, s8
265; NO-LIBCALL-NEXT:    bl cosf
266; NO-LIBCALL-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
267; NO-LIBCALL-NEXT:    fmov s1, s0
268; NO-LIBCALL-NEXT:    fmov s0, s9
269; NO-LIBCALL-NEXT:    ldp d9, d8, [sp], #32 // 16-byte Folded Reload
270; NO-LIBCALL-NEXT:    ret
271  %result = call { float, float } @llvm.sincos.f32(float %a)
272  ret { float, float } %result
273}
274
275define { <3 x float>, <3 x float> } @test_sincos_v3f32(<3 x float> %a) {
276; CHECK-LABEL: test_sincos_v3f32:
277; CHECK:       // %bb.0:
278; CHECK-NEXT:    sub sp, sp, #80
279; CHECK-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
280; CHECK-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
281; CHECK-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
282; CHECK-NEXT:    .cfi_def_cfa_offset 80
283; CHECK-NEXT:    .cfi_offset w19, -8
284; CHECK-NEXT:    .cfi_offset w20, -16
285; CHECK-NEXT:    .cfi_offset w21, -24
286; CHECK-NEXT:    .cfi_offset w22, -32
287; CHECK-NEXT:    .cfi_offset w30, -48
288; CHECK-NEXT:    add x0, sp, #20
289; CHECK-NEXT:    add x1, sp, #16
290; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
291; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0
292; CHECK-NEXT:    bl sincosf
293; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
294; CHECK-NEXT:    add x0, sp, #28
295; CHECK-NEXT:    add x1, sp, #24
296; CHECK-NEXT:    add x19, sp, #28
297; CHECK-NEXT:    add x20, sp, #24
298; CHECK-NEXT:    mov s0, v0.s[1]
299; CHECK-NEXT:    bl sincosf
300; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
301; CHECK-NEXT:    add x0, sp, #44
302; CHECK-NEXT:    add x1, sp, #40
303; CHECK-NEXT:    add x21, sp, #44
304; CHECK-NEXT:    add x22, sp, #40
305; CHECK-NEXT:    mov s0, v0.s[2]
306; CHECK-NEXT:    bl sincosf
307; CHECK-NEXT:    ldp s1, s0, [sp, #16]
308; CHECK-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
309; CHECK-NEXT:    ld1 { v0.s }[1], [x19]
310; CHECK-NEXT:    ld1 { v1.s }[1], [x20]
311; CHECK-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
312; CHECK-NEXT:    ld1 { v0.s }[2], [x21]
313; CHECK-NEXT:    ld1 { v1.s }[2], [x22]
314; CHECK-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
315; CHECK-NEXT:    add sp, sp, #80
316; CHECK-NEXT:    ret
317;
318; NO-LIBCALL-LABEL: test_sincos_v3f32:
319; NO-LIBCALL:       // %bb.0:
320; NO-LIBCALL-NEXT:    sub sp, sp, #80
321; NO-LIBCALL-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
322; NO-LIBCALL-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
323; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 80
324; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
325; NO-LIBCALL-NEXT:    .cfi_offset b8, -24
326; NO-LIBCALL-NEXT:    .cfi_offset b9, -32
327; NO-LIBCALL-NEXT:    mov s8, v0.s[1]
328; NO-LIBCALL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
329; NO-LIBCALL-NEXT:    fmov s0, s8
330; NO-LIBCALL-NEXT:    bl sinf
331; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
332; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
333; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
334; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 killed $q0
335; NO-LIBCALL-NEXT:    bl sinf
336; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
337; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
338; NO-LIBCALL-NEXT:    mov v0.s[1], v1.s[0]
339; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
340; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
341; NO-LIBCALL-NEXT:    mov s9, v0.s[2]
342; NO-LIBCALL-NEXT:    fmov s0, s9
343; NO-LIBCALL-NEXT:    bl sinf
344; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
345; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
346; NO-LIBCALL-NEXT:    mov v1.s[2], v0.s[0]
347; NO-LIBCALL-NEXT:    fmov s0, s8
348; NO-LIBCALL-NEXT:    str q1, [sp, #16] // 16-byte Folded Spill
349; NO-LIBCALL-NEXT:    bl cosf
350; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
351; NO-LIBCALL-NEXT:    str q0, [sp] // 16-byte Folded Spill
352; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
353; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 killed $q0
354; NO-LIBCALL-NEXT:    bl cosf
355; NO-LIBCALL-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
356; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
357; NO-LIBCALL-NEXT:    mov v0.s[1], v1.s[0]
358; NO-LIBCALL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
359; NO-LIBCALL-NEXT:    fmov s0, s9
360; NO-LIBCALL-NEXT:    bl cosf
361; NO-LIBCALL-NEXT:    fmov s2, s0
362; NO-LIBCALL-NEXT:    ldp q0, q1, [sp, #16] // 32-byte Folded Reload
363; NO-LIBCALL-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
364; NO-LIBCALL-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
365; NO-LIBCALL-NEXT:    mov v1.s[2], v2.s[0]
366; NO-LIBCALL-NEXT:    add sp, sp, #80
367; NO-LIBCALL-NEXT:    ret
368  %result = call { <3 x float>, <3 x float> } @llvm.sincos.v3f32(<3 x float> %a)
369  ret { <3 x float>, <3 x float> } %result
370}
371
372define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) {
373; CHECK-LABEL: test_sincos_v2f32:
374; CHECK:       // %bb.0:
375; CHECK-NEXT:    sub sp, sp, #64
376; CHECK-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
377; CHECK-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
378; CHECK-NEXT:    .cfi_def_cfa_offset 64
379; CHECK-NEXT:    .cfi_offset w19, -8
380; CHECK-NEXT:    .cfi_offset w20, -16
381; CHECK-NEXT:    .cfi_offset w30, -32
382; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
383; CHECK-NEXT:    add x0, sp, #44
384; CHECK-NEXT:    add x1, sp, #40
385; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
386; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0
387; CHECK-NEXT:    bl sincosf
388; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
389; CHECK-NEXT:    add x0, sp, #28
390; CHECK-NEXT:    add x1, sp, #24
391; CHECK-NEXT:    add x19, sp, #28
392; CHECK-NEXT:    add x20, sp, #24
393; CHECK-NEXT:    mov s0, v0.s[1]
394; CHECK-NEXT:    bl sincosf
395; CHECK-NEXT:    ldp s1, s0, [sp, #40]
396; CHECK-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
397; CHECK-NEXT:    ld1 { v0.s }[1], [x19]
398; CHECK-NEXT:    ld1 { v1.s }[1], [x20]
399; CHECK-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
400; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
401; CHECK-NEXT:    // kill: def $d1 killed $d1 killed $q1
402; CHECK-NEXT:    add sp, sp, #64
403; CHECK-NEXT:    ret
404;
405; NO-LIBCALL-LABEL: test_sincos_v2f32:
406; NO-LIBCALL:       // %bb.0:
407; NO-LIBCALL-NEXT:    sub sp, sp, #64
408; NO-LIBCALL-NEXT:    str d8, [sp, #48] // 8-byte Folded Spill
409; NO-LIBCALL-NEXT:    str x30, [sp, #56] // 8-byte Folded Spill
410; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 64
411; NO-LIBCALL-NEXT:    .cfi_offset w30, -8
412; NO-LIBCALL-NEXT:    .cfi_offset b8, -16
413; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 def $q0
414; NO-LIBCALL-NEXT:    mov s8, v0.s[1]
415; NO-LIBCALL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
416; NO-LIBCALL-NEXT:    fmov s0, s8
417; NO-LIBCALL-NEXT:    bl sinf
418; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
419; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
420; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
421; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 killed $q0
422; NO-LIBCALL-NEXT:    bl sinf
423; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
424; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
425; NO-LIBCALL-NEXT:    mov v0.s[1], v1.s[0]
426; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
427; NO-LIBCALL-NEXT:    fmov s0, s8
428; NO-LIBCALL-NEXT:    bl cosf
429; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 def $q0
430; NO-LIBCALL-NEXT:    str q0, [sp] // 16-byte Folded Spill
431; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
432; NO-LIBCALL-NEXT:    // kill: def $s0 killed $s0 killed $q0
433; NO-LIBCALL-NEXT:    bl cosf
434; NO-LIBCALL-NEXT:    fmov s1, s0
435; NO-LIBCALL-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
436; NO-LIBCALL-NEXT:    ldr x30, [sp, #56] // 8-byte Folded Reload
437; NO-LIBCALL-NEXT:    ldr d8, [sp, #48] // 8-byte Folded Reload
438; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 killed $q0
439; NO-LIBCALL-NEXT:    mov v1.s[1], v2.s[0]
440; NO-LIBCALL-NEXT:    // kill: def $d1 killed $d1 killed $q1
441; NO-LIBCALL-NEXT:    add sp, sp, #64
442; NO-LIBCALL-NEXT:    ret
443  %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)
444  ret { <2 x float>, <2 x float> } %result
445}
446
447define { double, double } @test_sincos_f64(double %a) {
448; CHECK-LABEL: test_sincos_f64:
449; CHECK:       // %bb.0:
450; CHECK-NEXT:    sub sp, sp, #32
451; CHECK-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
452; CHECK-NEXT:    .cfi_def_cfa_offset 32
453; CHECK-NEXT:    .cfi_offset w30, -16
454; CHECK-NEXT:    add x0, sp, #24
455; CHECK-NEXT:    add x1, sp, #8
456; CHECK-NEXT:    bl sincos
457; CHECK-NEXT:    ldr d0, [sp, #24]
458; CHECK-NEXT:    ldr d1, [sp, #8]
459; CHECK-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
460; CHECK-NEXT:    add sp, sp, #32
461; CHECK-NEXT:    ret
462;
463; NO-LIBCALL-LABEL: test_sincos_f64:
464; NO-LIBCALL:       // %bb.0:
465; NO-LIBCALL-NEXT:    stp d9, d8, [sp, #-32]! // 16-byte Folded Spill
466; NO-LIBCALL-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
467; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 32
468; NO-LIBCALL-NEXT:    .cfi_offset w30, -16
469; NO-LIBCALL-NEXT:    .cfi_offset b8, -24
470; NO-LIBCALL-NEXT:    .cfi_offset b9, -32
471; NO-LIBCALL-NEXT:    fmov d8, d0
472; NO-LIBCALL-NEXT:    bl sin
473; NO-LIBCALL-NEXT:    fmov d9, d0
474; NO-LIBCALL-NEXT:    fmov d0, d8
475; NO-LIBCALL-NEXT:    bl cos
476; NO-LIBCALL-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
477; NO-LIBCALL-NEXT:    fmov d1, d0
478; NO-LIBCALL-NEXT:    fmov d0, d9
479; NO-LIBCALL-NEXT:    ldp d9, d8, [sp], #32 // 16-byte Folded Reload
480; NO-LIBCALL-NEXT:    ret
481  %result = call { double, double } @llvm.sincos.f64(double %a)
482  ret { double, double } %result
483}
484
485define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) {
486; CHECK-LABEL: test_sincos_v2f64:
487; CHECK:       // %bb.0:
488; CHECK-NEXT:    sub sp, sp, #80
489; CHECK-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
490; CHECK-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
491; CHECK-NEXT:    .cfi_def_cfa_offset 80
492; CHECK-NEXT:    .cfi_offset w19, -8
493; CHECK-NEXT:    .cfi_offset w20, -16
494; CHECK-NEXT:    .cfi_offset w30, -32
495; CHECK-NEXT:    add x0, sp, #56
496; CHECK-NEXT:    add x1, sp, #40
497; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
498; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
499; CHECK-NEXT:    bl sincos
500; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
501; CHECK-NEXT:    add x0, sp, #32
502; CHECK-NEXT:    add x1, sp, #24
503; CHECK-NEXT:    add x19, sp, #32
504; CHECK-NEXT:    add x20, sp, #24
505; CHECK-NEXT:    mov d0, v0.d[1]
506; CHECK-NEXT:    bl sincos
507; CHECK-NEXT:    ldr d0, [sp, #56]
508; CHECK-NEXT:    ldr d1, [sp, #40]
509; CHECK-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
510; CHECK-NEXT:    ld1 { v0.d }[1], [x19]
511; CHECK-NEXT:    ld1 { v1.d }[1], [x20]
512; CHECK-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
513; CHECK-NEXT:    add sp, sp, #80
514; CHECK-NEXT:    ret
515;
516; NO-LIBCALL-LABEL: test_sincos_v2f64:
517; NO-LIBCALL:       // %bb.0:
518; NO-LIBCALL-NEXT:    sub sp, sp, #64
519; NO-LIBCALL-NEXT:    str d8, [sp, #48] // 8-byte Folded Spill
520; NO-LIBCALL-NEXT:    str x30, [sp, #56] // 8-byte Folded Spill
521; NO-LIBCALL-NEXT:    .cfi_def_cfa_offset 64
522; NO-LIBCALL-NEXT:    .cfi_offset w30, -8
523; NO-LIBCALL-NEXT:    .cfi_offset b8, -16
524; NO-LIBCALL-NEXT:    mov d8, v0.d[1]
525; NO-LIBCALL-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
526; NO-LIBCALL-NEXT:    fmov d0, d8
527; NO-LIBCALL-NEXT:    bl sin
528; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 def $q0
529; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
530; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
531; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 killed $q0
532; NO-LIBCALL-NEXT:    bl sin
533; NO-LIBCALL-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
534; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 def $q0
535; NO-LIBCALL-NEXT:    mov v0.d[1], v1.d[0]
536; NO-LIBCALL-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
537; NO-LIBCALL-NEXT:    fmov d0, d8
538; NO-LIBCALL-NEXT:    bl cos
539; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 def $q0
540; NO-LIBCALL-NEXT:    str q0, [sp] // 16-byte Folded Spill
541; NO-LIBCALL-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
542; NO-LIBCALL-NEXT:    // kill: def $d0 killed $d0 killed $q0
543; NO-LIBCALL-NEXT:    bl cos
544; NO-LIBCALL-NEXT:    fmov d1, d0
545; NO-LIBCALL-NEXT:    ldp q2, q0, [sp] // 32-byte Folded Reload
546; NO-LIBCALL-NEXT:    ldr x30, [sp, #56] // 8-byte Folded Reload
547; NO-LIBCALL-NEXT:    ldr d8, [sp, #48] // 8-byte Folded Reload
548; NO-LIBCALL-NEXT:    mov v1.d[1], v2.d[0]
549; NO-LIBCALL-NEXT:    add sp, sp, #64
550; NO-LIBCALL-NEXT:    ret
551  %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)
552  ret { <2 x double>, <2 x double> } %result
553}
554