[llvm] MSP430: Add test for llvm.sincos intrinsic (PR #148602)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 14 03:15:04 PDT 2025


https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/148602

Mostly to test libcall behavior

>From 5c4105575afc52e96c27d5544e30c14389158437 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Mon, 14 Jul 2025 19:05:56 +0900
Subject: [PATCH] MSP430: Add test for llvm.sincos intrinsic

Mostly to test libcall behavior
---
 llvm/test/CodeGen/MSP430/llvm.sincos.ll | 608 ++++++++++++++++++++++++
 1 file changed, 608 insertions(+)
 create mode 100644 llvm/test/CodeGen/MSP430/llvm.sincos.ll

diff --git a/llvm/test/CodeGen/MSP430/llvm.sincos.ll b/llvm/test/CodeGen/MSP430/llvm.sincos.ll
new file mode 100644
index 0000000000000..5e77cee8c4b79
--- /dev/null
+++ b/llvm/test/CodeGen/MSP430/llvm.sincos.ll
@@ -0,0 +1,608 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
+; RUN: llc -mtriple=msp430-unknown-unknown < %s | FileCheck %s
+; RUN: llc -mtriple=msp430-unknown-linux < %s | FileCheck %s
+; RUN: llc -mtriple=msp430-unknown-linux-gnu < %s | FileCheck -check-prefix=GNU %s
+
+define { half, half } @test_sincos_f16(half %a) #0 {
+; CHECK-LABEL: test_sincos_f16:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    call #__extendhfsf2
+; CHECK-NEXT:    mov r12, r10
+; CHECK-NEXT:    mov r13, r9
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    mov r12, r8
+; CHECK-NEXT:    mov r10, r12
+; CHECK-NEXT:    mov r9, r13
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    mov r12, r14
+; CHECK-NEXT:    mov r8, r12
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_f16:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    push r10
+; GNU-NEXT:    sub #8, r1
+; GNU-NEXT:    call #__extendhfsf2
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #4, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 4(r1), r12
+; GNU-NEXT:    mov 6(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    mov r12, r10
+; GNU-NEXT:    mov 0(r1), r12
+; GNU-NEXT:    mov 2(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    mov r12, r14
+; GNU-NEXT:    mov r10, r12
+; GNU-NEXT:    add #8, r1
+; GNU-NEXT:    pop r10
+; GNU-NEXT:    ret
+  %result = call { half, half } @llvm.sincos.f16(half %a)
+  ret { half, half } %result
+}
+
+define half @test_sincos_f16_only_use_sin(half %a) #0 {
+; CHECK-LABEL: test_sincos_f16_only_use_sin:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    call #__extendhfsf2
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_f16_only_use_sin:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    sub #8, r1
+; GNU-NEXT:    call #__extendhfsf2
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #4, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 4(r1), r12
+; GNU-NEXT:    mov 6(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    add #8, r1
+; GNU-NEXT:    ret
+  %result = call { half, half } @llvm.sincos.f16(half %a)
+  %result.0 = extractvalue { half, half } %result, 0
+  ret half %result.0
+}
+
+define half @test_sincos_f16_only_use_cos(half %a) #0 {
+; CHECK-LABEL: test_sincos_f16_only_use_cos:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    call #__extendhfsf2
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_f16_only_use_cos:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    sub #8, r1
+; GNU-NEXT:    call #__extendhfsf2
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #4, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 0(r1), r12
+; GNU-NEXT:    mov 2(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    add #8, r1
+; GNU-NEXT:    ret
+  %result = call { half, half } @llvm.sincos.f16(half %a)
+  %result.1 = extractvalue { half, half } %result, 1
+  ret half %result.1
+}
+
+define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) #0 {
+; CHECK-LABEL: test_sincos_v2f16:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r5
+; CHECK-NEXT:    push r6
+; CHECK-NEXT:    push r7
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    mov r12, r7
+; CHECK-NEXT:    mov r13, r12
+; CHECK-NEXT:    call #__extendhfsf2
+; CHECK-NEXT:    mov r12, r10
+; CHECK-NEXT:    mov r13, r9
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    mov r12, r8
+; CHECK-NEXT:    mov r7, r12
+; CHECK-NEXT:    call #__extendhfsf2
+; CHECK-NEXT:    mov r12, r6
+; CHECK-NEXT:    mov r13, r5
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    mov r12, r7
+; CHECK-NEXT:    mov r6, r12
+; CHECK-NEXT:    mov r5, r13
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    mov r12, r6
+; CHECK-NEXT:    mov r10, r12
+; CHECK-NEXT:    mov r9, r13
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    call #__truncsfhf2
+; CHECK-NEXT:    mov r12, r15
+; CHECK-NEXT:    mov r6, r12
+; CHECK-NEXT:    mov r8, r13
+; CHECK-NEXT:    mov r7, r14
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    pop r7
+; CHECK-NEXT:    pop r6
+; CHECK-NEXT:    pop r5
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_v2f16:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    push r8
+; GNU-NEXT:    push r9
+; GNU-NEXT:    push r10
+; GNU-NEXT:    sub #16, r1
+; GNU-NEXT:    mov r13, r10
+; GNU-NEXT:    call #__extendhfsf2
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #12, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    add #8, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov r10, r12
+; GNU-NEXT:    call #__extendhfsf2
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #4, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 12(r1), r12
+; GNU-NEXT:    mov 14(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    mov r12, r10
+; GNU-NEXT:    mov 4(r1), r12
+; GNU-NEXT:    mov 6(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    mov r12, r9
+; GNU-NEXT:    mov 8(r1), r12
+; GNU-NEXT:    mov 10(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    mov r12, r8
+; GNU-NEXT:    mov 0(r1), r12
+; GNU-NEXT:    mov 2(r1), r13
+; GNU-NEXT:    call #__truncsfhf2
+; GNU-NEXT:    mov r12, r15
+; GNU-NEXT:    mov r10, r12
+; GNU-NEXT:    mov r9, r13
+; GNU-NEXT:    mov r8, r14
+; GNU-NEXT:    add #16, r1
+; GNU-NEXT:    pop r10
+; GNU-NEXT:    pop r9
+; GNU-NEXT:    pop r8
+; GNU-NEXT:    ret
+  %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)
+  ret { <2 x half>, <2 x half> } %result
+}
+
+define { float, float } @test_sincos_f32(float %a) #0 {
+; CHECK-LABEL: test_sincos_f32:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r7
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    mov r13, r10
+; CHECK-NEXT:    mov r12, r9
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    mov r12, r8
+; CHECK-NEXT:    mov r13, r7
+; CHECK-NEXT:    mov r9, r12
+; CHECK-NEXT:    mov r10, r13
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    mov r12, r14
+; CHECK-NEXT:    mov r13, r15
+; CHECK-NEXT:    mov r8, r12
+; CHECK-NEXT:    mov r7, r13
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    pop r7
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_f32:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    sub #8, r1
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #4, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 4(r1), r12
+; GNU-NEXT:    mov 6(r1), r13
+; GNU-NEXT:    mov 0(r1), r14
+; GNU-NEXT:    mov 2(r1), r15
+; GNU-NEXT:    add #8, r1
+; GNU-NEXT:    ret
+  %result = call { float, float } @llvm.sincos.f32(float %a)
+  ret { float, float } %result
+}
+
+define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) #0 {
+; CHECK-LABEL: test_sincos_v2f32:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r6
+; CHECK-NEXT:    push r7
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    mov r12, r10
+; CHECK-NEXT:    mov 16(r1), r9
+; CHECK-NEXT:    mov 18(r1), r8
+; CHECK-NEXT:    mov r9, r12
+; CHECK-NEXT:    mov r8, r13
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    mov r13, 14(r10)
+; CHECK-NEXT:    mov r12, 12(r10)
+; CHECK-NEXT:    mov 12(r1), r7
+; CHECK-NEXT:    mov 14(r1), r6
+; CHECK-NEXT:    mov r7, r12
+; CHECK-NEXT:    mov r6, r13
+; CHECK-NEXT:    call #cosf
+; CHECK-NEXT:    mov r13, 10(r10)
+; CHECK-NEXT:    mov r12, 8(r10)
+; CHECK-NEXT:    mov r9, r12
+; CHECK-NEXT:    mov r8, r13
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    mov r13, 6(r10)
+; CHECK-NEXT:    mov r12, 4(r10)
+; CHECK-NEXT:    mov r7, r12
+; CHECK-NEXT:    mov r6, r13
+; CHECK-NEXT:    call #sinf
+; CHECK-NEXT:    mov r13, 2(r10)
+; CHECK-NEXT:    mov r12, 0(r10)
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    pop r7
+; CHECK-NEXT:    pop r6
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_v2f32:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    push r10
+; GNU-NEXT:    sub #16, r1
+; GNU-NEXT:    mov r12, r10
+; GNU-NEXT:    mov 24(r1), r12
+; GNU-NEXT:    mov 26(r1), r13
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #12, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    add #8, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 20(r1), r12
+; GNU-NEXT:    mov 22(r1), r13
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #4, r14
+; GNU-NEXT:    mov r1, r15
+; GNU-NEXT:    call #sincosf
+; GNU-NEXT:    mov 10(r1), 14(r10)
+; GNU-NEXT:    mov 8(r1), 12(r10)
+; GNU-NEXT:    mov 2(r1), 10(r10)
+; GNU-NEXT:    mov 0(r1), 8(r10)
+; GNU-NEXT:    mov 14(r1), 6(r10)
+; GNU-NEXT:    mov 12(r1), 4(r10)
+; GNU-NEXT:    mov 6(r1), 2(r10)
+; GNU-NEXT:    mov 4(r1), 0(r10)
+; GNU-NEXT:    add #16, r1
+; GNU-NEXT:    pop r10
+; GNU-NEXT:    ret
+  %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)
+  ret { <2 x float>, <2 x float> } %result
+}
+
+define { double, double } @test_sincos_f64(double %a) #0 {
+; CHECK-LABEL: test_sincos_f64:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r6
+; CHECK-NEXT:    push r7
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    mov r12, r10
+; CHECK-NEXT:    mov 12(r1), r9
+; CHECK-NEXT:    mov 14(r1), r8
+; CHECK-NEXT:    mov 16(r1), r7
+; CHECK-NEXT:    mov 18(r1), r6
+; CHECK-NEXT:    mov r9, r12
+; CHECK-NEXT:    mov r8, r13
+; CHECK-NEXT:    mov r7, r14
+; CHECK-NEXT:    mov r6, r15
+; CHECK-NEXT:    call #cos
+; CHECK-NEXT:    mov r15, 14(r10)
+; CHECK-NEXT:    mov r14, 12(r10)
+; CHECK-NEXT:    mov r13, 10(r10)
+; CHECK-NEXT:    mov r12, 8(r10)
+; CHECK-NEXT:    mov r9, r12
+; CHECK-NEXT:    mov r8, r13
+; CHECK-NEXT:    mov r7, r14
+; CHECK-NEXT:    mov r6, r15
+; CHECK-NEXT:    call #sin
+; CHECK-NEXT:    mov r15, 6(r10)
+; CHECK-NEXT:    mov r14, 4(r10)
+; CHECK-NEXT:    mov r13, 2(r10)
+; CHECK-NEXT:    mov r12, 0(r10)
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    pop r7
+; CHECK-NEXT:    pop r6
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_f64:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    push r10
+; GNU-NEXT:    sub #20, r1
+; GNU-NEXT:    mov r12, r10
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #4, r12
+; GNU-NEXT:    mov r12, 2(r1)
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #12, r12
+; GNU-NEXT:    mov r12, 0(r1)
+; GNU-NEXT:    mov 24(r1), r12
+; GNU-NEXT:    mov 26(r1), r13
+; GNU-NEXT:    mov 28(r1), r14
+; GNU-NEXT:    mov 30(r1), r15
+; GNU-NEXT:    call #sincos
+; GNU-NEXT:    mov 10(r1), 14(r10)
+; GNU-NEXT:    mov 8(r1), 12(r10)
+; GNU-NEXT:    mov 6(r1), 10(r10)
+; GNU-NEXT:    mov 4(r1), 8(r10)
+; GNU-NEXT:    mov 18(r1), 6(r10)
+; GNU-NEXT:    mov 16(r1), 4(r10)
+; GNU-NEXT:    mov 14(r1), 2(r10)
+; GNU-NEXT:    mov 12(r1), 0(r10)
+; GNU-NEXT:    add #20, r1
+; GNU-NEXT:    pop r10
+; GNU-NEXT:    ret
+  %result = call { double, double } @llvm.sincos.f64(double %a)
+  ret { double, double } %result
+}
+
+define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) #0 {
+; CHECK-LABEL: test_sincos_v2f64:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r4
+; CHECK-NEXT:    push r5
+; CHECK-NEXT:    push r6
+; CHECK-NEXT:    push r7
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    mov r12, r10
+; CHECK-NEXT:    mov 24(r1), r12
+; CHECK-NEXT:    mov 26(r1), r13
+; CHECK-NEXT:    mov 28(r1), r7
+; CHECK-NEXT:    mov 30(r1), r6
+; CHECK-NEXT:    mov r7, r14
+; CHECK-NEXT:    mov r6, r15
+; CHECK-NEXT:    call #cos
+; CHECK-NEXT:    mov r15, 30(r10)
+; CHECK-NEXT:    mov r14, 28(r10)
+; CHECK-NEXT:    mov r13, 26(r10)
+; CHECK-NEXT:    mov r12, 24(r10)
+; CHECK-NEXT:    mov 16(r1), r5
+; CHECK-NEXT:    mov 18(r1), r4
+; CHECK-NEXT:    mov 20(r1), r9
+; CHECK-NEXT:    mov 22(r1), r8
+; CHECK-NEXT:    mov r5, r12
+; CHECK-NEXT:    mov r4, r13
+; CHECK-NEXT:    mov r9, r14
+; CHECK-NEXT:    mov r8, r15
+; CHECK-NEXT:    call #cos
+; CHECK-NEXT:    mov r15, 22(r10)
+; CHECK-NEXT:    mov r14, 20(r10)
+; CHECK-NEXT:    mov r13, 18(r10)
+; CHECK-NEXT:    mov r12, 16(r10)
+; CHECK-NEXT:    mov 24(r1), r12
+; CHECK-NEXT:    mov 26(r1), r13
+; CHECK-NEXT:    mov r7, r14
+; CHECK-NEXT:    mov r6, r15
+; CHECK-NEXT:    call #sin
+; CHECK-NEXT:    mov r15, 14(r10)
+; CHECK-NEXT:    mov r14, 12(r10)
+; CHECK-NEXT:    mov r13, 10(r10)
+; CHECK-NEXT:    mov r12, 8(r10)
+; CHECK-NEXT:    mov r5, r12
+; CHECK-NEXT:    mov r4, r13
+; CHECK-NEXT:    mov r9, r14
+; CHECK-NEXT:    mov r8, r15
+; CHECK-NEXT:    call #sin
+; CHECK-NEXT:    mov r15, 6(r10)
+; CHECK-NEXT:    mov r14, 4(r10)
+; CHECK-NEXT:    mov r13, 2(r10)
+; CHECK-NEXT:    mov r12, 0(r10)
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    pop r7
+; CHECK-NEXT:    pop r6
+; CHECK-NEXT:    pop r5
+; CHECK-NEXT:    pop r4
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_v2f64:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    push r10
+; GNU-NEXT:    sub #36, r1
+; GNU-NEXT:    mov r12, r10
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #20, r12
+; GNU-NEXT:    mov r12, 2(r1)
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #28, r12
+; GNU-NEXT:    mov r12, 0(r1)
+; GNU-NEXT:    mov 48(r1), r12
+; GNU-NEXT:    mov 50(r1), r13
+; GNU-NEXT:    mov 52(r1), r14
+; GNU-NEXT:    mov 54(r1), r15
+; GNU-NEXT:    call #sincos
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #4, r12
+; GNU-NEXT:    mov r12, 2(r1)
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #12, r12
+; GNU-NEXT:    mov r12, 0(r1)
+; GNU-NEXT:    mov 40(r1), r12
+; GNU-NEXT:    mov 42(r1), r13
+; GNU-NEXT:    mov 44(r1), r14
+; GNU-NEXT:    mov 46(r1), r15
+; GNU-NEXT:    call #sincos
+; GNU-NEXT:    mov 26(r1), 30(r10)
+; GNU-NEXT:    mov 24(r1), 28(r10)
+; GNU-NEXT:    mov 22(r1), 26(r10)
+; GNU-NEXT:    mov 20(r1), 24(r10)
+; GNU-NEXT:    mov 10(r1), 22(r10)
+; GNU-NEXT:    mov 8(r1), 20(r10)
+; GNU-NEXT:    mov 6(r1), 18(r10)
+; GNU-NEXT:    mov 4(r1), 16(r10)
+; GNU-NEXT:    mov 34(r1), 14(r10)
+; GNU-NEXT:    mov 32(r1), 12(r10)
+; GNU-NEXT:    mov 30(r1), 10(r10)
+; GNU-NEXT:    mov 28(r1), 8(r10)
+; GNU-NEXT:    mov 18(r1), 6(r10)
+; GNU-NEXT:    mov 16(r1), 4(r10)
+; GNU-NEXT:    mov 14(r1), 2(r10)
+; GNU-NEXT:    mov 12(r1), 0(r10)
+; GNU-NEXT:    add #36, r1
+; GNU-NEXT:    pop r10
+; GNU-NEXT:    ret
+  %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)
+  ret { <2 x double>, <2 x double> } %result
+}
+
+define { fp128, fp128 } @test_sincos_f128(fp128 %a) #0 {
+; CHECK-LABEL: test_sincos_f128:
+; CHECK:       ; %bb.0:
+; CHECK-NEXT:    push r4
+; CHECK-NEXT:    push r5
+; CHECK-NEXT:    push r6
+; CHECK-NEXT:    push r7
+; CHECK-NEXT:    push r8
+; CHECK-NEXT:    push r9
+; CHECK-NEXT:    push r10
+; CHECK-NEXT:    sub #48, r1
+; CHECK-NEXT:    mov r12, r10
+; CHECK-NEXT:    mov 78(r1), r12
+; CHECK-NEXT:    mov r12, 14(r1)
+; CHECK-NEXT:    mov 76(r1), r12
+; CHECK-NEXT:    mov r12, 12(r1)
+; CHECK-NEXT:    mov 74(r1), r7
+; CHECK-NEXT:    mov r7, 10(r1)
+; CHECK-NEXT:    mov 72(r1), r6
+; CHECK-NEXT:    mov r6, 8(r1)
+; CHECK-NEXT:    mov 70(r1), r5
+; CHECK-NEXT:    mov r5, 6(r1)
+; CHECK-NEXT:    mov 68(r1), r4
+; CHECK-NEXT:    mov r4, 4(r1)
+; CHECK-NEXT:    mov 66(r1), r9
+; CHECK-NEXT:    mov r9, 2(r1)
+; CHECK-NEXT:    mov 64(r1), r8
+; CHECK-NEXT:    mov r8, 0(r1)
+; CHECK-NEXT:    mov r1, r12
+; CHECK-NEXT:    add #16, r12
+; CHECK-NEXT:    call #cosl
+; CHECK-NEXT:    mov 78(r1), r12
+; CHECK-NEXT:    mov r12, 14(r1)
+; CHECK-NEXT:    mov 76(r1), r12
+; CHECK-NEXT:    mov r12, 12(r1)
+; CHECK-NEXT:    mov r7, 10(r1)
+; CHECK-NEXT:    mov r6, 8(r1)
+; CHECK-NEXT:    mov r5, 6(r1)
+; CHECK-NEXT:    mov r4, 4(r1)
+; CHECK-NEXT:    mov r9, 2(r1)
+; CHECK-NEXT:    mov r8, 0(r1)
+; CHECK-NEXT:    mov r1, r12
+; CHECK-NEXT:    add #32, r12
+; CHECK-NEXT:    call #sinl
+; CHECK-NEXT:    mov 30(r1), 30(r10)
+; CHECK-NEXT:    mov 28(r1), 28(r10)
+; CHECK-NEXT:    mov 26(r1), 26(r10)
+; CHECK-NEXT:    mov 24(r1), 24(r10)
+; CHECK-NEXT:    mov 22(r1), 22(r10)
+; CHECK-NEXT:    mov 20(r1), 20(r10)
+; CHECK-NEXT:    mov 18(r1), 18(r10)
+; CHECK-NEXT:    mov 16(r1), 16(r10)
+; CHECK-NEXT:    mov 46(r1), 14(r10)
+; CHECK-NEXT:    mov 44(r1), 12(r10)
+; CHECK-NEXT:    mov 42(r1), 10(r10)
+; CHECK-NEXT:    mov 40(r1), 8(r10)
+; CHECK-NEXT:    mov 38(r1), 6(r10)
+; CHECK-NEXT:    mov 36(r1), 4(r10)
+; CHECK-NEXT:    mov 34(r1), 2(r10)
+; CHECK-NEXT:    mov 32(r1), 0(r10)
+; CHECK-NEXT:    add #48, r1
+; CHECK-NEXT:    pop r10
+; CHECK-NEXT:    pop r9
+; CHECK-NEXT:    pop r8
+; CHECK-NEXT:    pop r7
+; CHECK-NEXT:    pop r6
+; CHECK-NEXT:    pop r5
+; CHECK-NEXT:    pop r4
+; CHECK-NEXT:    ret
+;
+; GNU-LABEL: test_sincos_f128:
+; GNU:       ; %bb.0:
+; GNU-NEXT:    push r10
+; GNU-NEXT:    sub #64, r1
+; GNU-NEXT:    mov r12, r10
+; GNU-NEXT:    mov 82(r1), 14(r1)
+; GNU-NEXT:    mov 80(r1), 12(r1)
+; GNU-NEXT:    mov 78(r1), 10(r1)
+; GNU-NEXT:    mov 76(r1), 8(r1)
+; GNU-NEXT:    mov 74(r1), 6(r1)
+; GNU-NEXT:    mov 72(r1), 4(r1)
+; GNU-NEXT:    mov 70(r1), 2(r1)
+; GNU-NEXT:    mov 68(r1), 0(r1)
+; GNU-NEXT:    mov r1, r12
+; GNU-NEXT:    add #16, r12
+; GNU-NEXT:    mov r1, r13
+; GNU-NEXT:    add #48, r13
+; GNU-NEXT:    mov r1, r14
+; GNU-NEXT:    add #32, r14
+; GNU-NEXT:    call #sincosl
+; GNU-NEXT:    mov 46(r1), 30(r10)
+; GNU-NEXT:    mov 44(r1), 28(r10)
+; GNU-NEXT:    mov 42(r1), 26(r10)
+; GNU-NEXT:    mov 40(r1), 24(r10)
+; GNU-NEXT:    mov 38(r1), 22(r10)
+; GNU-NEXT:    mov 36(r1), 20(r10)
+; GNU-NEXT:    mov 34(r1), 18(r10)
+; GNU-NEXT:    mov 32(r1), 16(r10)
+; GNU-NEXT:    mov 62(r1), 14(r10)
+; GNU-NEXT:    mov 60(r1), 12(r10)
+; GNU-NEXT:    mov 58(r1), 10(r10)
+; GNU-NEXT:    mov 56(r1), 8(r10)
+; GNU-NEXT:    mov 54(r1), 6(r10)
+; GNU-NEXT:    mov 52(r1), 4(r10)
+; GNU-NEXT:    mov 50(r1), 2(r10)
+; GNU-NEXT:    mov 48(r1), 0(r10)
+; GNU-NEXT:    add #64, r1
+; GNU-NEXT:    pop r10
+; GNU-NEXT:    ret
+  %result = call { fp128, fp128 } @llvm.sincos.f16(fp128 %a)
+  ret { fp128, fp128 } %result
+}
+
+attributes #0 = { nounwind }
+



More information about the llvm-commits mailing list