@@ -215,6 +215,133 @@ define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) nounwind {
215215 ret { <2 x half >, <2 x half > } %result
216216}
217217
218+ define { <3 x half >, <3 x half > } @test_sincos_v3f16 (<3 x half > %a ) nounwind {
219+ ; CHECK-LABEL: test_sincos_v3f16:
220+ ; CHECK: // %bb.0:
221+ ; CHECK-NEXT: sub sp, sp, #64
222+ ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
223+ ; CHECK-NEXT: mov h1, v0.h[1]
224+ ; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
225+ ; CHECK-NEXT: add x0, sp, #36
226+ ; CHECK-NEXT: add x1, sp, #32
227+ ; CHECK-NEXT: str x30, [sp, #48] // 8-byte Folded Spill
228+ ; CHECK-NEXT: fcvt s0, h1
229+ ; CHECK-NEXT: bl sincosf
230+ ; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
231+ ; CHECK-NEXT: add x0, sp, #28
232+ ; CHECK-NEXT: add x1, sp, #24
233+ ; CHECK-NEXT: fcvt s0, h0
234+ ; CHECK-NEXT: bl sincosf
235+ ; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
236+ ; CHECK-NEXT: add x0, sp, #44
237+ ; CHECK-NEXT: add x1, sp, #40
238+ ; CHECK-NEXT: mov h0, v0.h[2]
239+ ; CHECK-NEXT: fcvt s0, h0
240+ ; CHECK-NEXT: bl sincosf
241+ ; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
242+ ; CHECK-NEXT: add x0, sp, #60
243+ ; CHECK-NEXT: add x1, sp, #56
244+ ; CHECK-NEXT: mov h0, v0.h[3]
245+ ; CHECK-NEXT: fcvt s0, h0
246+ ; CHECK-NEXT: bl sincosf
247+ ; CHECK-NEXT: ldp s2, s0, [sp, #32]
248+ ; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload
249+ ; CHECK-NEXT: ldp s3, s1, [sp, #24]
250+ ; CHECK-NEXT: fcvt h4, s0
251+ ; CHECK-NEXT: fcvt h2, s2
252+ ; CHECK-NEXT: fcvt h0, s1
253+ ; CHECK-NEXT: fcvt h1, s3
254+ ; CHECK-NEXT: ldp s5, s3, [sp, #40]
255+ ; CHECK-NEXT: fcvt h3, s3
256+ ; CHECK-NEXT: mov v0.h[1], v4.h[0]
257+ ; CHECK-NEXT: fcvt h4, s5
258+ ; CHECK-NEXT: mov v1.h[1], v2.h[0]
259+ ; CHECK-NEXT: ldp s5, s2, [sp, #56]
260+ ; CHECK-NEXT: mov v0.h[2], v3.h[0]
261+ ; CHECK-NEXT: fcvt h2, s2
262+ ; CHECK-NEXT: fcvt h3, s5
263+ ; CHECK-NEXT: mov v1.h[2], v4.h[0]
264+ ; CHECK-NEXT: mov v0.h[3], v2.h[0]
265+ ; CHECK-NEXT: mov v1.h[3], v3.h[0]
266+ ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
267+ ; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1
268+ ; CHECK-NEXT: add sp, sp, #64
269+ ; CHECK-NEXT: ret
270+ ;
271+ ; NO-LIBCALL-LABEL: test_sincos_v3f16:
272+ ; NO-LIBCALL: // %bb.0:
273+ ; NO-LIBCALL-NEXT: sub sp, sp, #80
274+ ; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0
275+ ; NO-LIBCALL-NEXT: mov h1, v0.h[1]
276+ ; NO-LIBCALL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
277+ ; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill
278+ ; NO-LIBCALL-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
279+ ; NO-LIBCALL-NEXT: str x30, [sp, #64] // 8-byte Folded Spill
280+ ; NO-LIBCALL-NEXT: fcvt s8, h1
281+ ; NO-LIBCALL-NEXT: fmov s0, s8
282+ ; NO-LIBCALL-NEXT: bl sinf
283+ ; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
284+ ; NO-LIBCALL-NEXT: fcvt h0, s0
285+ ; NO-LIBCALL-NEXT: fcvt s9, h1
286+ ; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
287+ ; NO-LIBCALL-NEXT: fmov s0, s9
288+ ; NO-LIBCALL-NEXT: bl sinf
289+ ; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
290+ ; NO-LIBCALL-NEXT: fcvt h0, s0
291+ ; NO-LIBCALL-NEXT: mov h1, v1.h[2]
292+ ; NO-LIBCALL-NEXT: fcvt s10, h1
293+ ; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
294+ ; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0]
295+ ; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
296+ ; NO-LIBCALL-NEXT: fmov s0, s10
297+ ; NO-LIBCALL-NEXT: bl sinf
298+ ; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
299+ ; NO-LIBCALL-NEXT: fcvt h0, s0
300+ ; NO-LIBCALL-NEXT: mov h1, v1.h[3]
301+ ; NO-LIBCALL-NEXT: fcvt s11, h1
302+ ; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
303+ ; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0]
304+ ; NO-LIBCALL-NEXT: fmov s0, s11
305+ ; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
306+ ; NO-LIBCALL-NEXT: bl sinf
307+ ; NO-LIBCALL-NEXT: fcvt h0, s0
308+ ; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
309+ ; NO-LIBCALL-NEXT: mov v1.h[3], v0.h[0]
310+ ; NO-LIBCALL-NEXT: fmov s0, s8
311+ ; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
312+ ; NO-LIBCALL-NEXT: bl cosf
313+ ; NO-LIBCALL-NEXT: fcvt h0, s0
314+ ; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill
315+ ; NO-LIBCALL-NEXT: fmov s0, s9
316+ ; NO-LIBCALL-NEXT: bl cosf
317+ ; NO-LIBCALL-NEXT: fcvt h0, s0
318+ ; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
319+ ; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0]
320+ ; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Folded Spill
321+ ; NO-LIBCALL-NEXT: fmov s0, s10
322+ ; NO-LIBCALL-NEXT: bl cosf
323+ ; NO-LIBCALL-NEXT: fcvt h0, s0
324+ ; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
325+ ; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0]
326+ ; NO-LIBCALL-NEXT: fmov s0, s11
327+ ; NO-LIBCALL-NEXT: str q1, [sp] // 16-byte Folded Spill
328+ ; NO-LIBCALL-NEXT: bl cosf
329+ ; NO-LIBCALL-NEXT: fmov s1, s0
330+ ; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
331+ ; NO-LIBCALL-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
332+ ; NO-LIBCALL-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
333+ ; NO-LIBCALL-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
334+ ; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0
335+ ; NO-LIBCALL-NEXT: fcvt h2, s1
336+ ; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Folded Reload
337+ ; NO-LIBCALL-NEXT: mov v1.h[3], v2.h[0]
338+ ; NO-LIBCALL-NEXT: // kill: def $d1 killed $d1 killed $q1
339+ ; NO-LIBCALL-NEXT: add sp, sp, #80
340+ ; NO-LIBCALL-NEXT: ret
341+ %result = call { <3 x half >, <3 x half > } @llvm.sincos.v3f16 (<3 x half > %a )
342+ ret { <3 x half >, <3 x half > } %result
343+ }
344+
218345define { float , float } @test_sincos_f32 (float %a ) nounwind {
219346; CHECK-LABEL: test_sincos_f32:
220347; CHECK: // %bb.0:
@@ -493,3 +620,71 @@ define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) nounwi
493620 %result = call { <2 x double >, <2 x double > } @llvm.sincos.v2f64 (<2 x double > %a )
494621 ret { <2 x double >, <2 x double > } %result
495622}
623+
624+ define { <3 x double >, <3 x double > } @test_sincos_v3f64 (<3 x double > %a ) nounwind {
625+ ; CHECK-LABEL: test_sincos_v3f64:
626+ ; CHECK: // %bb.0:
627+ ; CHECK-NEXT: sub sp, sp, #80
628+ ; CHECK-NEXT: add x0, sp, #16
629+ ; CHECK-NEXT: add x1, sp, #8
630+ ; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
631+ ; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill
632+ ; CHECK-NEXT: fmov d8, d2
633+ ; CHECK-NEXT: fmov d9, d1
634+ ; CHECK-NEXT: bl sincos
635+ ; CHECK-NEXT: fmov d0, d9
636+ ; CHECK-NEXT: add x0, sp, #32
637+ ; CHECK-NEXT: add x1, sp, #24
638+ ; CHECK-NEXT: bl sincos
639+ ; CHECK-NEXT: fmov d0, d8
640+ ; CHECK-NEXT: add x0, sp, #72
641+ ; CHECK-NEXT: add x1, sp, #40
642+ ; CHECK-NEXT: bl sincos
643+ ; CHECK-NEXT: ldp d3, d0, [sp, #8]
644+ ; CHECK-NEXT: ldr d2, [sp, #72]
645+ ; CHECK-NEXT: ldp d4, d1, [sp, #24]
646+ ; CHECK-NEXT: ldr d5, [sp, #40]
647+ ; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
648+ ; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
649+ ; CHECK-NEXT: add sp, sp, #80
650+ ; CHECK-NEXT: ret
651+ ;
652+ ; NO-LIBCALL-LABEL: test_sincos_v3f64:
653+ ; NO-LIBCALL: // %bb.0:
654+ ; NO-LIBCALL-NEXT: stp d13, d12, [sp, #-64]! // 16-byte Folded Spill
655+ ; NO-LIBCALL-NEXT: stp d11, d10, [sp, #16] // 16-byte Folded Spill
656+ ; NO-LIBCALL-NEXT: fmov d10, d0
657+ ; NO-LIBCALL-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill
658+ ; NO-LIBCALL-NEXT: fmov d8, d2
659+ ; NO-LIBCALL-NEXT: fmov d9, d1
660+ ; NO-LIBCALL-NEXT: str x30, [sp, #48] // 8-byte Folded Spill
661+ ; NO-LIBCALL-NEXT: bl sin
662+ ; NO-LIBCALL-NEXT: fmov d11, d0
663+ ; NO-LIBCALL-NEXT: fmov d0, d9
664+ ; NO-LIBCALL-NEXT: bl sin
665+ ; NO-LIBCALL-NEXT: fmov d12, d0
666+ ; NO-LIBCALL-NEXT: fmov d0, d8
667+ ; NO-LIBCALL-NEXT: bl sin
668+ ; NO-LIBCALL-NEXT: fmov d13, d0
669+ ; NO-LIBCALL-NEXT: fmov d0, d10
670+ ; NO-LIBCALL-NEXT: bl cos
671+ ; NO-LIBCALL-NEXT: fmov d10, d0
672+ ; NO-LIBCALL-NEXT: fmov d0, d9
673+ ; NO-LIBCALL-NEXT: bl cos
674+ ; NO-LIBCALL-NEXT: fmov d9, d0
675+ ; NO-LIBCALL-NEXT: fmov d0, d8
676+ ; NO-LIBCALL-NEXT: bl cos
677+ ; NO-LIBCALL-NEXT: fmov d5, d0
678+ ; NO-LIBCALL-NEXT: fmov d0, d11
679+ ; NO-LIBCALL-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload
680+ ; NO-LIBCALL-NEXT: fmov d3, d10
681+ ; NO-LIBCALL-NEXT: fmov d4, d9
682+ ; NO-LIBCALL-NEXT: fmov d1, d12
683+ ; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload
684+ ; NO-LIBCALL-NEXT: fmov d2, d13
685+ ; NO-LIBCALL-NEXT: ldp d11, d10, [sp, #16] // 16-byte Folded Reload
686+ ; NO-LIBCALL-NEXT: ldp d13, d12, [sp], #64 // 16-byte Folded Reload
687+ ; NO-LIBCALL-NEXT: ret
688+ %result = call { <3 x double >, <3 x double > } @llvm.sincos.v3f64 (<3 x double > %a )
689+ ret { <3 x double >, <3 x double > } %result
690+ }
0 commit comments