1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9.0 -mcpu=core2 | FileCheck %s --check-prefix=OSX_SINCOS 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-apple-macosx10.8.0 -mcpu=core2 | FileCheck %s --check-prefix=OSX_NOOPT 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=core2 | FileCheck %s --check-prefix=GNU_NOOPT 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=core2 -enable-unsafe-fp-math | FileCheck %s --check-prefix=GNU_SINCOS 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 -mcpu=core2 -enable-unsafe-fp-math | FileCheck %s --check-prefix=GNUX32_SINCOS 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Combine sin / cos into a single call. 8*9880d681SAndroid Build Coastguard Worker; rdar://13087969 9*9880d681SAndroid Build Coastguard Worker; rdar://13599493 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine float @test1(float %x) nounwind { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS-LABEL: test1: 14*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: callq sincosf 15*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: movss 4(%rsp), %xmm0 16*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: addss (%rsp), %xmm0 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS-LABEL: test1: 19*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: callq sincosf 20*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: movss 4(%esp), %xmm0 21*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: addss (%esp), %xmm0 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: test1 24*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: callq sinf 25*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: callq cosf 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS-LABEL: test1: 28*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS: callq ___sincosf_stret 29*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS: movshdup {{.*}} xmm1 = xmm0[1,1,3,3] 30*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS: addss %xmm1, %xmm0 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; OSX_NOOPT: test1 33*9880d681SAndroid Build Coastguard Worker; OSX_NOOPT: callq _sinf 34*9880d681SAndroid Build Coastguard Worker; OSX_NOOPT: callq _cosf 35*9880d681SAndroid Build Coastguard Worker %call = tail call float @sinf(float %x) nounwind readnone 36*9880d681SAndroid Build Coastguard Worker %call1 = tail call float @cosf(float %x) nounwind readnone 37*9880d681SAndroid Build Coastguard Worker %add = fadd float %call, %call1 38*9880d681SAndroid Build Coastguard Worker ret float %add 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine double @test2(double %x) nounwind { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS-LABEL: test2: 44*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: callq sincos 45*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: movsd 16(%rsp), %xmm0 46*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: addsd 8(%rsp), %xmm0 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS-LABEL: test2: 49*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: callq sincos 50*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: movsd 16(%esp), %xmm0 51*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: addsd 8(%esp), %xmm0 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: test2: 54*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: callq sin 55*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: callq cos 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS-LABEL: test2: 58*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS: callq ___sincos_stret 59*9880d681SAndroid Build Coastguard Worker; OSX_SINCOS: addsd %xmm1, %xmm0 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; OSX_NOOPT: test2 62*9880d681SAndroid Build Coastguard Worker; OSX_NOOPT: callq _sin 63*9880d681SAndroid Build Coastguard Worker; OSX_NOOPT: callq _cos 64*9880d681SAndroid Build Coastguard Worker %call = tail call double @sin(double %x) nounwind readnone 65*9880d681SAndroid Build Coastguard Worker %call1 = tail call double @cos(double %x) nounwind readnone 66*9880d681SAndroid Build Coastguard Worker %add = fadd double %call, %call1 67*9880d681SAndroid Build Coastguard Worker ret double %add 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine x86_fp80 @test3(x86_fp80 %x) nounwind { 71*9880d681SAndroid Build Coastguard Workerentry: 72*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS-LABEL: test3: 73*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: callq sinl 74*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: callq cosl 75*9880d681SAndroid Build Coastguard Worker; GNU_SINCOS: ret 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS-LABEL: test3: 78*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: callq sinl 79*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: callq cosl 80*9880d681SAndroid Build Coastguard Worker; GNUX32_SINCOS: ret 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: test3: 83*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: callq sinl 84*9880d681SAndroid Build Coastguard Worker; GNU_NOOPT: callq cosl 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %call = tail call x86_fp80 @sinl(x86_fp80 %x) nounwind 87*9880d681SAndroid Build Coastguard Worker %call1 = tail call x86_fp80 @cosl(x86_fp80 %x) nounwind 88*9880d681SAndroid Build Coastguard Worker %add = fadd x86_fp80 %call, %call1 89*9880d681SAndroid Build Coastguard Worker ret x86_fp80 %add 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdeclare float @sinf(float) readonly 93*9880d681SAndroid Build Coastguard Workerdeclare double @sin(double) readonly 94*9880d681SAndroid Build Coastguard Workerdeclare float @cosf(float) readonly 95*9880d681SAndroid Build Coastguard Workerdeclare double @cos(double) readonly 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdeclare x86_fp80 @sinl(x86_fp80) 98*9880d681SAndroid Build Coastguard Workerdeclare x86_fp80 @cosl(x86_fp80) 99