[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / llvm.sincos.ll
blobc5efc796e7a3c45d0b181980bef1e7a2671b5f53
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
5 define { 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
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
45 define 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
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
75 define 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
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
105 define { <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
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
240 define { 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
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
275 define { <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
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
372 define { <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
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
447 define { 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
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
485 define { <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
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