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=HARD -check-prefix=SP -check-prefix=VMLA 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 -check-prefix=VMLA 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=HARD -check-prefix=SP -check-prefix=FP-ARMv8 -check-prefix=VMLA 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 -check-prefix=NO-VMLA 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 -check-prefix=VMLA 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.sqrt.f32(float %Val) 9*9880d681SAndroid Build Coastguard Workerdefine float @sqrt_f(float %a) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_f: 11*9880d681SAndroid Build Coastguard Worker; SOFT: bl sqrtf 12*9880d681SAndroid Build Coastguard Worker; HARD: vsqrt.f32 s0, s0 13*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.sqrt.f32(float %a) 14*9880d681SAndroid Build Coastguard Worker ret float %1 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.powi.f32(float %Val, i32 %power) 18*9880d681SAndroid Build Coastguard Workerdefine float @powi_f(float %a, i32 %b) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: powi_f: 20*9880d681SAndroid Build Coastguard Worker; SOFT: bl __powisf2 21*9880d681SAndroid Build Coastguard Worker; HARD: b __powisf2 22*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.powi.f32(float %a, i32 %b) 23*9880d681SAndroid Build Coastguard Worker ret float %1 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.sin.f32(float %Val) 27*9880d681SAndroid Build Coastguard Workerdefine float @sin_f(float %a) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sin_f: 29*9880d681SAndroid Build Coastguard Worker; SOFT: bl sinf 30*9880d681SAndroid Build Coastguard Worker; HARD: b sinf 31*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.sin.f32(float %a) 32*9880d681SAndroid Build Coastguard Worker ret float %1 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.cos.f32(float %Val) 36*9880d681SAndroid Build Coastguard Workerdefine float @cos_f(float %a) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cos_f: 38*9880d681SAndroid Build Coastguard Worker; SOFT: bl cosf 39*9880d681SAndroid Build Coastguard Worker; HARD: b cosf 40*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.cos.f32(float %a) 41*9880d681SAndroid Build Coastguard Worker ret float %1 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.pow.f32(float %Val, float %power) 45*9880d681SAndroid Build Coastguard Workerdefine float @pow_f(float %a, float %b) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pow_f: 47*9880d681SAndroid Build Coastguard Worker; SOFT: bl powf 48*9880d681SAndroid Build Coastguard Worker; HARD: b powf 49*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.pow.f32(float %a, float %b) 50*9880d681SAndroid Build Coastguard Worker ret float %1 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.exp.f32(float %Val) 54*9880d681SAndroid Build Coastguard Workerdefine float @exp_f(float %a) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp_f: 56*9880d681SAndroid Build Coastguard Worker; SOFT: bl expf 57*9880d681SAndroid Build Coastguard Worker; HARD: b expf 58*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.exp.f32(float %a) 59*9880d681SAndroid Build Coastguard Worker ret float %1 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.exp2.f32(float %Val) 63*9880d681SAndroid Build Coastguard Workerdefine float @exp2_f(float %a) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp2_f: 65*9880d681SAndroid Build Coastguard Worker; SOFT: bl exp2f 66*9880d681SAndroid Build Coastguard Worker; HARD: b exp2f 67*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.exp2.f32(float %a) 68*9880d681SAndroid Build Coastguard Worker ret float %1 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.log.f32(float %Val) 72*9880d681SAndroid Build Coastguard Workerdefine float @log_f(float %a) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log_f: 74*9880d681SAndroid Build Coastguard Worker; SOFT: bl logf 75*9880d681SAndroid Build Coastguard Worker; HARD: b logf 76*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.log.f32(float %a) 77*9880d681SAndroid Build Coastguard Worker ret float %1 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.log10.f32(float %Val) 81*9880d681SAndroid Build Coastguard Workerdefine float @log10_f(float %a) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log10_f: 83*9880d681SAndroid Build Coastguard Worker; SOFT: bl log10f 84*9880d681SAndroid Build Coastguard Worker; HARD: b log10f 85*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.log10.f32(float %a) 86*9880d681SAndroid Build Coastguard Worker ret float %1 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.log2.f32(float %Val) 90*9880d681SAndroid Build Coastguard Workerdefine float @log2_f(float %a) { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log2_f: 92*9880d681SAndroid Build Coastguard Worker; SOFT: bl log2f 93*9880d681SAndroid Build Coastguard Worker; HARD: b log2f 94*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.log2.f32(float %a) 95*9880d681SAndroid Build Coastguard Worker ret float %1 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float %a, float %b, float %c) 99*9880d681SAndroid Build Coastguard Workerdefine float @fma_f(float %a, float %b, float %c) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma_f: 101*9880d681SAndroid Build Coastguard Worker; SOFT: bl fmaf 102*9880d681SAndroid Build Coastguard Worker; HARD: vfma.f32 103*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.fma.f32(float %a, float %b, float %c) 104*9880d681SAndroid Build Coastguard Worker ret float %1 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float %Val) 108*9880d681SAndroid Build Coastguard Workerdefine float @abs_f(float %a) { 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: abs_f: 110*9880d681SAndroid Build Coastguard Worker; SOFT: bic r0, r0, #-2147483648 111*9880d681SAndroid Build Coastguard Worker; HARD: vabs.f32 112*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.fabs.f32(float %a) 113*9880d681SAndroid Build Coastguard Worker ret float %1 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.copysign.f32(float %Mag, float %Sgn) 117*9880d681SAndroid Build Coastguard Workerdefine float @copysign_f(float %a, float %b) { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copysign_f: 119*9880d681SAndroid Build Coastguard Worker; NONE: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31 120*9880d681SAndroid Build Coastguard Worker; NONE: bfi r{{[0-9]+}}, [[REG]], #31, #1 121*9880d681SAndroid Build Coastguard Worker; SP: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31 122*9880d681SAndroid Build Coastguard Worker; SP: bfi r{{[0-9]+}}, [[REG]], #31, #1 123*9880d681SAndroid Build Coastguard Worker; VFP: lsrs [[REG:r[0-9]+]], r{{[0-9]+}}, #31 124*9880d681SAndroid Build Coastguard Worker; VFP: bfi r{{[0-9]+}}, [[REG]], #31, #1 125*9880d681SAndroid Build Coastguard Worker; NEON: vmov.i32 [[REG:d[0-9]+]], #0x80000000 126*9880d681SAndroid Build Coastguard Worker; NEON: vbsl [[REG]], d 127*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.copysign.f32(float %a, float %b) 128*9880d681SAndroid Build Coastguard Worker ret float %1 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.floor.f32(float %Val) 132*9880d681SAndroid Build Coastguard Workerdefine float @floor_f(float %a) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: floor_f: 134*9880d681SAndroid Build Coastguard Worker; SOFT: bl floorf 135*9880d681SAndroid Build Coastguard Worker; VFP4: b floorf 136*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintm.f32 137*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.floor.f32(float %a) 138*9880d681SAndroid Build Coastguard Worker ret float %1 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.ceil.f32(float %Val) 142*9880d681SAndroid Build Coastguard Workerdefine float @ceil_f(float %a) { 143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ceil_f: 144*9880d681SAndroid Build Coastguard Worker; SOFT: bl ceilf 145*9880d681SAndroid Build Coastguard Worker; VFP4: b ceilf 146*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintp.f32 147*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.ceil.f32(float %a) 148*9880d681SAndroid Build Coastguard Worker ret float %1 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.trunc.f32(float %Val) 152*9880d681SAndroid Build Coastguard Workerdefine float @trunc_f(float %a) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: trunc_f: 154*9880d681SAndroid Build Coastguard Worker; SOFT: bl truncf 155*9880d681SAndroid Build Coastguard Worker; VFP4: b truncf 156*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintz.f32 157*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.trunc.f32(float %a) 158*9880d681SAndroid Build Coastguard Worker ret float %1 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.rint.f32(float %Val) 162*9880d681SAndroid Build Coastguard Workerdefine float @rint_f(float %a) { 163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rint_f: 164*9880d681SAndroid Build Coastguard Worker; SOFT: bl rintf 165*9880d681SAndroid Build Coastguard Worker; VFP4: b rintf 166*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintx.f32 167*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.rint.f32(float %a) 168*9880d681SAndroid Build Coastguard Worker ret float %1 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nearbyint.f32(float %Val) 172*9880d681SAndroid Build Coastguard Workerdefine float @nearbyint_f(float %a) { 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearbyint_f: 174*9880d681SAndroid Build Coastguard Worker; SOFT: bl nearbyintf 175*9880d681SAndroid Build Coastguard Worker; VFP4: b nearbyintf 176*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrintr.f32 177*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.nearbyint.f32(float %a) 178*9880d681SAndroid Build Coastguard Worker ret float %1 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.round.f32(float %Val) 182*9880d681SAndroid Build Coastguard Workerdefine float @round_f(float %a) { 183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: round_f: 184*9880d681SAndroid Build Coastguard Worker; SOFT: bl roundf 185*9880d681SAndroid Build Coastguard Worker; VFP4: b roundf 186*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vrinta.f32 187*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.round.f32(float %a) 188*9880d681SAndroid Build Coastguard Worker ret float %1 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker; FIXME: why does cortex-m4 use vmla, while cortex-a7 uses vmul+vadd? 192*9880d681SAndroid Build Coastguard Worker; (these should be equivalent, even the rounding is the same) 193*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fmuladd.f32(float %a, float %b, float %c) 194*9880d681SAndroid Build Coastguard Workerdefine float @fmuladd_f(float %a, float %b, float %c) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmuladd_f: 196*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_fmul 197*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_fadd 198*9880d681SAndroid Build Coastguard Worker; VMLA: vmla.f32 199*9880d681SAndroid Build Coastguard Worker; NO-VMLA: vmul.f32 200*9880d681SAndroid Build Coastguard Worker; NO-VMLA: vadd.f32 201*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c) 202*9880d681SAndroid Build Coastguard Worker ret float %1 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f32(float %a) 206*9880d681SAndroid Build Coastguard Workerdefine i16 @f_to_h(float %a) { 207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_h: 208*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_f2h 209*9880d681SAndroid Build Coastguard Worker; HARD: vcvt{{[bt]}}.f16.f32 210*9880d681SAndroid Build Coastguard Worker %1 = call i16 @llvm.convert.to.fp16.f32(float %a) 211*9880d681SAndroid Build Coastguard Worker ret i16 %1 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.convert.from.fp16.f32(i16 %a) 215*9880d681SAndroid Build Coastguard Workerdefine float @h_to_f(i16 %a) { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: h_to_f: 217*9880d681SAndroid Build Coastguard Worker; SOFT: bl __aeabi_h2f 218*9880d681SAndroid Build Coastguard Worker; HARD: vcvt{{[bt]}}.f32.f16 219*9880d681SAndroid Build Coastguard Worker %1 = call float @llvm.convert.from.fp16.f32(i16 %a) 220*9880d681SAndroid Build Coastguard Worker ret float %1 221*9880d681SAndroid Build Coastguard Worker} 222