1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabi -mcpu=cortex-m3 | FileCheck %s -check-prefix=CHECK -check-prefix=SOFT -check-prefix=NONE 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m4 | FileCheck %s -check-prefix=CHECK -check-prefix=SOFT -check-prefix=SP 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m7 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=VFP -check-prefix=FP-ARMv8 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m7 -mattr=+fp-only-sp | FileCheck %s -check-prefix=CHECK -check-prefix=SOFT -check-prefix=SP 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a7 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=NEON -check-prefix=VFP4 6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a57 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=NEON -check-prefix=FP-ARMv8 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sqrt.f64(double %Val) 9*9880d681SAndroid Build Coastguard Workerdefine double @sqrt_d(double %a) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_d: 11*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} sqrt 12*9880d681SAndroid Build Coastguard Worker; HARD: vsqrt.f64 d0, d0 13*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.sqrt.f64(double %a) 14*9880d681SAndroid Build Coastguard Worker ret double %1 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.powi.f64(double %Val, i32 %power) 18*9880d681SAndroid Build Coastguard Workerdefine double @powi_d(double %a, i32 %b) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: powi_d: 20*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} __powidf2 21*9880d681SAndroid Build Coastguard Worker; HARD: b __powidf2 22*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.powi.f64(double %a, i32 %b) 23*9880d681SAndroid Build Coastguard Worker ret double %1 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sin.f64(double %Val) 27*9880d681SAndroid Build Coastguard Workerdefine double @sin_d(double %a) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sin_d: 29*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} sin 30*9880d681SAndroid Build Coastguard Worker; HARD: b sin 31*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.sin.f64(double %a) 32*9880d681SAndroid Build Coastguard Worker ret double %1 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.cos.f64(double %Val) 36*9880d681SAndroid Build Coastguard Workerdefine double @cos_d(double %a) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cos_d: 38*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} cos 39*9880d681SAndroid Build Coastguard Worker; HARD: b cos 40*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.cos.f64(double %a) 41*9880d681SAndroid Build Coastguard Worker ret double %1 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.pow.f64(double %Val, double %power) 45*9880d681SAndroid Build Coastguard Workerdefine double @pow_d(double %a, double %b) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pow_d: 47*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} pow 48*9880d681SAndroid Build Coastguard Worker; HARD: b pow 49*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.pow.f64(double %a, double %b) 50*9880d681SAndroid Build Coastguard Worker ret double %1 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.exp.f64(double %Val) 54*9880d681SAndroid Build Coastguard Workerdefine double @exp_d(double %a) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp_d: 56*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} exp 57*9880d681SAndroid Build Coastguard Worker; HARD: b exp 58*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.exp.f64(double %a) 59*9880d681SAndroid Build Coastguard Worker ret double %1 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.exp2.f64(double %Val) 63*9880d681SAndroid Build Coastguard Workerdefine double @exp2_d(double %a) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp2_d: 65*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} exp2 66*9880d681SAndroid Build Coastguard Worker; HARD: b exp2 67*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.exp2.f64(double %a) 68*9880d681SAndroid Build Coastguard Worker ret double %1 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.log.f64(double %Val) 72*9880d681SAndroid Build Coastguard Workerdefine double @log_d(double %a) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log_d: 74*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} log 75*9880d681SAndroid Build Coastguard Worker; HARD: b log 76*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.log.f64(double %a) 77*9880d681SAndroid Build Coastguard Worker ret double %1 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.log10.f64(double %Val) 81*9880d681SAndroid Build Coastguard Workerdefine double @log10_d(double %a) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log10_d: 83*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} log10 84*9880d681SAndroid Build Coastguard Worker; HARD: b log10 85*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.log10.f64(double %a) 86*9880d681SAndroid Build Coastguard Worker ret double %1 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.log2.f64(double %Val) 90*9880d681SAndroid Build Coastguard Workerdefine double @log2_d(double %a) { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log2_d: 92*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} log2 93*9880d681SAndroid Build Coastguard Worker; HARD: b log2 94*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.log2.f64(double %a) 95*9880d681SAndroid Build Coastguard Worker ret double %1 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double %a, double %b, double %c) 99*9880d681SAndroid Build Coastguard Workerdefine double @fma_d(double %a, double %b, double %c) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma_d: 101*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} fma 102*9880d681SAndroid Build Coastguard Worker; HARD: vfma.f64 103*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.fma.f64(double %a, double %b, double %c) 104*9880d681SAndroid Build Coastguard Worker ret double %1 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; FIXME: the FPv4-SP version is less efficient than the no-FPU version 108*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double %Val) 109*9880d681SAndroid Build Coastguard Workerdefine double @abs_d(double %a) { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: abs_d: 111*9880d681SAndroid Build Coastguard Worker; NONE: bic r1, r1, #-2147483648 112*9880d681SAndroid Build Coastguard Worker; SP: vldr d1, .LCPI{{.*}} 113*9880d681SAndroid Build Coastguard Worker; SP: vmov r0, r1, d0 114*9880d681SAndroid Build Coastguard Worker; SP: vmov r2, r3, d1 115*9880d681SAndroid Build Coastguard Worker; SP: lsrs r2, r3, #31 116*9880d681SAndroid Build Coastguard Worker; SP: bfi r1, r2, #31, #1 117*9880d681SAndroid Build Coastguard Worker; SP: vmov d0, r0, r1 118*9880d681SAndroid Build Coastguard Worker; DP: vabs.f64 d0, d0 119*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.fabs.f64(double %a) 120*9880d681SAndroid Build Coastguard Worker ret double %1 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.copysign.f64(double %Mag, double %Sgn) 124*9880d681SAndroid Build Coastguard Workerdefine double @copysign_d(double %a, double %b) { 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copysign_d: 126*9880d681SAndroid Build Coastguard Worker; SOFT: lsrs [[REG:r[0-9]+]], r3, #31 127*9880d681SAndroid Build Coastguard Worker; SOFT: bfi r1, [[REG]], #31, #1 128*9880d681SAndroid Build Coastguard Worker; VFP: lsrs [[REG:r[0-9]+]], r3, #31 129*9880d681SAndroid Build Coastguard Worker; VFP: bfi r1, [[REG]], #31, #1 130*9880d681SAndroid Build Coastguard Worker; NEON: vmov.i32 [[REG:d[0-9]+]], #0x80000000 131*9880d681SAndroid Build Coastguard Worker; NEON: vshl.i64 [[REG]], [[REG]], #32 132*9880d681SAndroid Build Coastguard Worker; NEON: vbsl [[REG]], d 133*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.copysign.f64(double %a, double %b) 134*9880d681SAndroid Build Coastguard Worker ret double %1 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.floor.f64(double %Val) 138*9880d681SAndroid Build Coastguard Workerdefine double @floor_d(double %a) { 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: floor_d: 140*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} floor 141*9880d681SAndroid Build Coastguard Worker; VFP4: b floor 142*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintm.f64 143*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.floor.f64(double %a) 144*9880d681SAndroid Build Coastguard Worker ret double %1 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.ceil.f64(double %Val) 148*9880d681SAndroid Build Coastguard Workerdefine double @ceil_d(double %a) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ceil_d: 150*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} ceil 151*9880d681SAndroid Build Coastguard Worker; VFP4: b ceil 152*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintp.f64 153*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.ceil.f64(double %a) 154*9880d681SAndroid Build Coastguard Worker ret double %1 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.trunc.f64(double %Val) 158*9880d681SAndroid Build Coastguard Workerdefine double @trunc_d(double %a) { 159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: trunc_d: 160*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} trunc 161*9880d681SAndroid Build Coastguard Worker; FFP4: b trunc 162*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintz.f64 163*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.trunc.f64(double %a) 164*9880d681SAndroid Build Coastguard Worker ret double %1 165*9880d681SAndroid Build Coastguard Worker} 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.rint.f64(double %Val) 168*9880d681SAndroid Build Coastguard Workerdefine double @rint_d(double %a) { 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rint_d: 170*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} rint 171*9880d681SAndroid Build Coastguard Worker; VFP4: b rint 172*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintx.f64 173*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.rint.f64(double %a) 174*9880d681SAndroid Build Coastguard Worker ret double %1 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.nearbyint.f64(double %Val) 178*9880d681SAndroid Build Coastguard Workerdefine double @nearbyint_d(double %a) { 179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearbyint_d: 180*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} nearbyint 181*9880d681SAndroid Build Coastguard Worker; VFP4: b nearbyint 182*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintr.f64 183*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.nearbyint.f64(double %a) 184*9880d681SAndroid Build Coastguard Worker ret double %1 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.round.f64(double %Val) 188*9880d681SAndroid Build Coastguard Workerdefine double @round_d(double %a) { 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: round_d: 190*9880d681SAndroid Build Coastguard Worker; SOFT: {{(bl|b)}} round 191*9880d681SAndroid Build Coastguard Worker; VFP4: b round 192*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrinta.f64 193*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.round.f64(double %a) 194*9880d681SAndroid Build Coastguard Worker ret double %1 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fmuladd.f64(double %a, double %b, double %c) 198*9880d681SAndroid Build Coastguard Workerdefine double @fmuladd_d(double %a, double %b, double %c) { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmuladd_d: 200*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_dmul 201*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_dadd 202*9880d681SAndroid Build Coastguard Worker; VFP4: vmul.f64 203*9880d681SAndroid Build Coastguard Worker; VFP4: vadd.f64 204*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vmla.f64 205*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.fmuladd.f64(double %a, double %b, double %c) 206*9880d681SAndroid Build Coastguard Worker ret double %1 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f64(double %a) 210*9880d681SAndroid Build Coastguard Workerdefine i16 @d_to_h(double %a) { 211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_h: 212*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_d2h 213*9880d681SAndroid Build Coastguard Worker; VFP4: bl __aeabi_d2h 214*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vcvt{{[bt]}}.f16.f64 215*9880d681SAndroid Build Coastguard Worker %1 = call i16 @llvm.convert.to.fp16.f64(double %a) 216*9880d681SAndroid Build Coastguard Worker ret i16 %1 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.convert.from.fp16.f64(i16 %a) 220*9880d681SAndroid Build Coastguard Workerdefine double @h_to_d(i16 %a) { 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: h_to_d: 222*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_h2f 223*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_f2d 224*9880d681SAndroid Build Coastguard Worker; SP: vcvt{{[bt]}}.f32.f16 225*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_f2d 226*9880d681SAndroid Build Coastguard Worker; VFPv4: vcvt{{[bt]}}.f32.f16 227*9880d681SAndroid Build Coastguard Worker; VFPv4: vcvt.f64.f32 228*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vcvt{{[bt]}}.f64.f16 229*9880d681SAndroid Build Coastguard Worker %1 = call double @llvm.convert.from.fp16.f64(i16 %a) 230*9880d681SAndroid Build Coastguard Worker ret double %1 231*9880d681SAndroid Build Coastguard Worker} 232