Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
352 changes: 352 additions & 0 deletions llvm/test/CodeGen/MSP430/llvm.sincos.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,352 @@
; 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

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
%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
%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
%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
%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
%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
%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
%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
%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
%result = call { fp128, fp128 } @llvm.sincos.f16(fp128 %a)
ret { fp128, fp128 } %result
}

attributes #0 = { nounwind }