1 ; Test that combined sin/cos library call is emitted when appropriate 2 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s --check-prefix=CHECK-NOOPT 4 ; RUN: llc < %s -mtriple=s390x-linux-gnu -enable-unsafe-fp-math | FileCheck %s --check-prefix=CHECK-OPT 5 6 define float @f1(float %x) { 7 ; CHECK-OPT-LABEL: f1: 8 ; CHECK-OPT: brasl %r14, sincosf@PLT 9 ; CHECK-OPT: le %f0, 164(%r15) 10 ; CHECK-OPT: aeb %f0, 160(%r15) 11 12 ; CHECK-NOOPT-LABEL: f1: 13 ; CHECK-NOOPT: brasl %r14, sinf@PLT 14 ; CHECK-NOOPT: brasl %r14, cosf@PLT 15 %tmp1 = call float @sinf(float %x) 16 %tmp2 = call float @cosf(float %x) 17 %add = fadd float %tmp1, %tmp2 18 ret float %add 19 } 20 21 define double @f2(double %x) { 22 ; CHECK-OPT-LABEL: f2: 23 ; CHECK-OPT: brasl %r14, sincos@PLT 24 ; CHECK-OPT: ld %f0, 168(%r15) 25 ; CHECK-OPT: adb %f0, 160(%r15) 26 27 ; CHECK-NOOPT-LABEL: f2: 28 ; CHECK-NOOPT: brasl %r14, sin@PLT 29 ; CHECK-NOOPT: brasl %r14, cos@PLT 30 %tmp1 = call double @sin(double %x) 31 %tmp2 = call double @cos(double %x) 32 %add = fadd double %tmp1, %tmp2 33 ret double %add 34 } 35 36 define fp128 @f3(fp128 %x) { 37 ; CHECK-OPT-LABEL: f3: 38 ; CHECK-OPT: brasl %r14, sincosl@PLT 39 ; CHECK-OPT: axbr 40 41 ; CHECK-NOOPT-LABEL: f3: 42 ; CHECK-NOOPT: brasl %r14, sinl@PLT 43 ; CHECK-NOOPT: brasl %r14, cosl@PLT 44 %tmp1 = call fp128 @sinl(fp128 %x) 45 %tmp2 = call fp128 @cosl(fp128 %x) 46 %add = fadd fp128 %tmp1, %tmp2 47 ret fp128 %add 48 } 49 50 declare float @sinf(float) readonly 51 declare double @sin(double) readonly 52 declare fp128 @sinl(fp128) readonly 53 declare float @cosf(float) readonly 54 declare double @cos(double) readonly 55 declare fp128 @cosl(fp128) readonly 56 57