Skip to content

MSP430: Add test for llvm.sincos intrinsic #148602

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

arsenm
Copy link
Contributor

@arsenm arsenm commented Jul 14, 2025

Mostly to test libcall behavior

Mostly to test libcall behavior
Copy link
Contributor Author

arsenm commented Jul 14, 2025

This stack of pull requests is managed by Graphite. Learn more about stacking.

@arsenm arsenm requested a review from asl July 14, 2025 10:15
@arsenm arsenm marked this pull request as ready for review July 14, 2025 10:15
@llvmbot
Copy link
Member

llvmbot commented Jul 14, 2025

@llvm/pr-subscribers-backend-msp430

Author: Matt Arsenault (arsenm)

Changes

Mostly to test libcall behavior


Full diff: https://github.com/llvm/llvm-project/pull/148602.diff

1 Files Affected:

  • (added) llvm/test/CodeGen/MSP430/llvm.sincos.ll (+608)
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 }
+

; 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
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not quite sure how these triples are relevant. There is certainly no Linux on 16-bit controller :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm reverse engineering the current mess of an opt-out of libcall system. These currently have a environment driven behavior so these do have different results

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants