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 } +