1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabi -mcpu=cortex-m3 | FileCheck %s -check-prefix=CHECK -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=VFP4-ALL 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=FP-ARMv8 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a8 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP -check-prefix=VFP4-ALL -check-prefix=VFP4-DP 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine float @add_f(float %a, float %b) { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add_f: 9*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_fadd 10*9880d681SAndroid Build Coastguard Worker; HARD: vadd.f32 s0, s0, s1 11*9880d681SAndroid Build Coastguard Worker %0 = fadd float %a, %b 12*9880d681SAndroid Build Coastguard Worker ret float %0 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine double @add_d(double %a, double %b) { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: add_d: 18*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_dadd 19*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_dadd 20*9880d681SAndroid Build Coastguard Worker; DP: vadd.f64 d0, d0, d1 21*9880d681SAndroid Build Coastguard Worker %0 = fadd double %a, %b 22*9880d681SAndroid Build Coastguard Worker ret double %0 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine float @sub_f(float %a, float %b) { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub_f: 28*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_fsub 29*9880d681SAndroid Build Coastguard Worker; HARD: vsub.f32 s 30*9880d681SAndroid Build Coastguard Worker %0 = fsub float %a, %b 31*9880d681SAndroid Build Coastguard Worker ret float %0 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine double @sub_d(double %a, double %b) { 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub_d: 37*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_dsub 38*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_dsub 39*9880d681SAndroid Build Coastguard Worker; DP: vsub.f64 d0, d0, d1 40*9880d681SAndroid Build Coastguard Worker %0 = fsub double %a, %b 41*9880d681SAndroid Build Coastguard Worker ret double %0 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine float @mul_f(float %a, float %b) { 45*9880d681SAndroid Build Coastguard Workerentry: 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul_f: 47*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_fmul 48*9880d681SAndroid Build Coastguard Worker; HARD: vmul.f32 s 49*9880d681SAndroid Build Coastguard Worker %0 = fmul float %a, %b 50*9880d681SAndroid Build Coastguard Worker ret float %0 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine double @mul_d(double %a, double %b) { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mul_d: 56*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_dmul 57*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_dmul 58*9880d681SAndroid Build Coastguard Worker; DP: vmul.f64 d0, d0, d1 59*9880d681SAndroid Build Coastguard Worker %0 = fmul double %a, %b 60*9880d681SAndroid Build Coastguard Worker ret double %0 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine float @div_f(float %a, float %b) { 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: div_f: 66*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_fdiv 67*9880d681SAndroid Build Coastguard Worker; HARD: vdiv.f32 s 68*9880d681SAndroid Build Coastguard Worker %0 = fdiv float %a, %b 69*9880d681SAndroid Build Coastguard Worker ret float %0 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine double @div_d(double %a, double %b) { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: div_d: 75*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_ddiv 76*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_ddiv 77*9880d681SAndroid Build Coastguard Worker; DP: vdiv.f64 d0, d0, d1 78*9880d681SAndroid Build Coastguard Worker %0 = fdiv double %a, %b 79*9880d681SAndroid Build Coastguard Worker ret double %0 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine float @rem_f(float %a, float %b) { 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rem_f: 85*9880d681SAndroid Build Coastguard Worker; NONE: bl fmodf 86*9880d681SAndroid Build Coastguard Worker; HARD: b fmodf 87*9880d681SAndroid Build Coastguard Worker %0 = frem float %a, %b 88*9880d681SAndroid Build Coastguard Worker ret float %0 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine double @rem_d(double %a, double %b) { 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rem_d: 94*9880d681SAndroid Build Coastguard Worker; NONE: bl fmod 95*9880d681SAndroid Build Coastguard Worker; HARD: b fmod 96*9880d681SAndroid Build Coastguard Worker %0 = frem double %a, %b 97*9880d681SAndroid Build Coastguard Worker ret double %0 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine float @load_f(float* %a) { 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_f: 103*9880d681SAndroid Build Coastguard Worker; NONE: ldr r0, [r0] 104*9880d681SAndroid Build Coastguard Worker; HARD: vldr s0, [r0] 105*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %a, align 4 106*9880d681SAndroid Build Coastguard Worker ret float %0 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine double @load_d(double* %a) { 110*9880d681SAndroid Build Coastguard Workerentry: 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_d: 112*9880d681SAndroid Build Coastguard Worker; NONE: ldm r0, {r0, r1} 113*9880d681SAndroid Build Coastguard Worker; HARD: vldr d0, [r0] 114*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %a, align 8 115*9880d681SAndroid Build Coastguard Worker ret double %0 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine void @store_f(float* %a, float %b) { 119*9880d681SAndroid Build Coastguard Workerentry: 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_f: 121*9880d681SAndroid Build Coastguard Worker; NONE: str r1, [r0] 122*9880d681SAndroid Build Coastguard Worker; HARD: vstr s0, [r0] 123*9880d681SAndroid Build Coastguard Worker store float %b, float* %a, align 4 124*9880d681SAndroid Build Coastguard Worker ret void 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine void @store_d(double* %a, double %b) { 128*9880d681SAndroid Build Coastguard Workerentry: 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_d: 130*9880d681SAndroid Build Coastguard Worker; NONE: strd r2, r3, [r0] 131*9880d681SAndroid Build Coastguard Worker; HARD: vstr d0, [r0] 132*9880d681SAndroid Build Coastguard Worker store double %b, double* %a, align 8 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine double @f_to_d(float %a) { 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_d: 138*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_f2d 139*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_f2d 140*9880d681SAndroid Build Coastguard Worker; DP: vcvt.f64.f32 d0, s0 141*9880d681SAndroid Build Coastguard Worker %1 = fpext float %a to double 142*9880d681SAndroid Build Coastguard Worker ret double %1 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine float @d_to_f(double %a) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_f: 147*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_d2f 148*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_d2f 149*9880d681SAndroid Build Coastguard Worker; DP: vcvt.f32.f64 s0, d0 150*9880d681SAndroid Build Coastguard Worker %1 = fptrunc double %a to float 151*9880d681SAndroid Build Coastguard Worker ret float %1 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdefine i32 @f_to_si(float %a) { 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_si: 156*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_f2iz 157*9880d681SAndroid Build Coastguard Worker; HARD: vcvt.s32.f32 s0, s0 158*9880d681SAndroid Build Coastguard Worker; HARD: vmov r0, s0 159*9880d681SAndroid Build Coastguard Worker %1 = fptosi float %a to i32 160*9880d681SAndroid Build Coastguard Worker ret i32 %1 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine i32 @d_to_si(double %a) { 164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_si: 165*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_d2iz 166*9880d681SAndroid Build Coastguard Worker; SP: vmov r0, r1, d0 167*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_d2iz 168*9880d681SAndroid Build Coastguard Worker; DP: vcvt.s32.f64 s0, d0 169*9880d681SAndroid Build Coastguard Worker; DP: vmov r0, s0 170*9880d681SAndroid Build Coastguard Worker %1 = fptosi double %a to i32 171*9880d681SAndroid Build Coastguard Worker ret i32 %1 172*9880d681SAndroid Build Coastguard Worker} 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workerdefine i32 @f_to_ui(float %a) { 175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f_to_ui: 176*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_f2uiz 177*9880d681SAndroid Build Coastguard Worker; HARD: vcvt.u32.f32 s0, s0 178*9880d681SAndroid Build Coastguard Worker; HARD: vmov r0, s0 179*9880d681SAndroid Build Coastguard Worker %1 = fptoui float %a to i32 180*9880d681SAndroid Build Coastguard Worker ret i32 %1 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine i32 @d_to_ui(double %a) { 184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: d_to_ui: 185*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_d2uiz 186*9880d681SAndroid Build Coastguard Worker; SP: vmov r0, r1, d0 187*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_d2uiz 188*9880d681SAndroid Build Coastguard Worker; DP: vcvt.u32.f64 s0, d0 189*9880d681SAndroid Build Coastguard Worker; DP: vmov r0, s0 190*9880d681SAndroid Build Coastguard Worker %1 = fptoui double %a to i32 191*9880d681SAndroid Build Coastguard Worker ret i32 %1 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine float @si_to_f(i32 %a) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: si_to_f: 196*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_i2f 197*9880d681SAndroid Build Coastguard Worker; HARD: vcvt.f32.s32 s0, s0 198*9880d681SAndroid Build Coastguard Worker %1 = sitofp i32 %a to float 199*9880d681SAndroid Build Coastguard Worker ret float %1 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workerdefine double @si_to_d(i32 %a) { 203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: si_to_d: 204*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_i2d 205*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_i2d 206*9880d681SAndroid Build Coastguard Worker; DP: vcvt.f64.s32 d0, s0 207*9880d681SAndroid Build Coastguard Worker %1 = sitofp i32 %a to double 208*9880d681SAndroid Build Coastguard Worker ret double %1 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerdefine float @ui_to_f(i32 %a) { 212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ui_to_f: 213*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_ui2f 214*9880d681SAndroid Build Coastguard Worker; HARD: vcvt.f32.u32 s0, s0 215*9880d681SAndroid Build Coastguard Worker %1 = uitofp i32 %a to float 216*9880d681SAndroid Build Coastguard Worker ret float %1 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdefine double @ui_to_d(i32 %a) { 220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ui_to_d: 221*9880d681SAndroid Build Coastguard Worker; NONE: bl __aeabi_ui2d 222*9880d681SAndroid Build Coastguard Worker; SP: bl __aeabi_ui2d 223*9880d681SAndroid Build Coastguard Worker; DP: vcvt.f64.u32 d0, s0 224*9880d681SAndroid Build Coastguard Worker %1 = uitofp i32 %a to double 225*9880d681SAndroid Build Coastguard Worker ret double %1 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Workerdefine float @bitcast_i_to_f(i32 %a) { 229*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_i_to_f: 230*9880d681SAndroid Build Coastguard Worker; NONE-NOT: mov 231*9880d681SAndroid Build Coastguard Worker; HARD: vmov s0, r0 232*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 %a to float 233*9880d681SAndroid Build Coastguard Worker ret float %1 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerdefine double @bitcast_i_to_d(i64 %a) { 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_i_to_d: 238*9880d681SAndroid Build Coastguard Worker; NONE-NOT: mov 239*9880d681SAndroid Build Coastguard Worker; HARD: vmov d0, r0, r1 240*9880d681SAndroid Build Coastguard Worker %1 = bitcast i64 %a to double 241*9880d681SAndroid Build Coastguard Worker ret double %1 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdefine i32 @bitcast_f_to_i(float %a) { 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_f_to_i: 246*9880d681SAndroid Build Coastguard Worker; NONE-NOT: mov 247*9880d681SAndroid Build Coastguard Worker; HARD: vmov r0, s0 248*9880d681SAndroid Build Coastguard Worker %1 = bitcast float %a to i32 249*9880d681SAndroid Build Coastguard Worker ret i32 %1 250*9880d681SAndroid Build Coastguard Worker} 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerdefine i64 @bitcast_d_to_i(double %a) { 253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_d_to_i: 254*9880d681SAndroid Build Coastguard Worker; NONE-NOT: mov 255*9880d681SAndroid Build Coastguard Worker; HARD: vmov r0, r1, d0 256*9880d681SAndroid Build Coastguard Worker %1 = bitcast double %a to i64 257*9880d681SAndroid Build Coastguard Worker ret i64 %1 258*9880d681SAndroid Build Coastguard Worker} 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Workerdefine float @select_f(float %a, float %b, i1 %c) { 261*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_f: 262*9880d681SAndroid Build Coastguard Worker; NONE: tst.w r2, #1 263*9880d681SAndroid Build Coastguard Worker; NONE: moveq r0, r1 264*9880d681SAndroid Build Coastguard Worker; HARD: tst.w r0, #1 265*9880d681SAndroid Build Coastguard Worker; VFP4-ALL: vmovne.f32 s1, s0 266*9880d681SAndroid Build Coastguard Worker; VFP4-ALL: vmov.f32 s0, s1 267*9880d681SAndroid Build Coastguard Worker; FP-ARMv8: vseleq.f32 s0, s1, s0 268*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, float %a, float %b 269*9880d681SAndroid Build Coastguard Worker ret float %1 270*9880d681SAndroid Build Coastguard Worker} 271*9880d681SAndroid Build Coastguard Worker 272*9880d681SAndroid Build Coastguard Workerdefine double @select_d(double %a, double %b, i1 %c) { 273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_d: 274*9880d681SAndroid Build Coastguard Worker; NONE: ldr.w [[REG:r[0-9]+]], [sp] 275*9880d681SAndroid Build Coastguard Worker; NONE: ands [[REG]], [[REG]], #1 276*9880d681SAndroid Build Coastguard Worker; NONE: moveq r0, r2 277*9880d681SAndroid Build Coastguard Worker; NONE: moveq r1, r3 278*9880d681SAndroid Build Coastguard Worker; SP: ands r0, r0, #1 279*9880d681SAndroid Build Coastguard Worker; SP-DAG: vmov [[ALO:r[0-9]+]], [[AHI:r[0-9]+]], d0 280*9880d681SAndroid Build Coastguard Worker; SP-DAG: vmov [[BLO:r[0-9]+]], [[BHI:r[0-9]+]], d1 281*9880d681SAndroid Build Coastguard Worker; SP: itt ne 282*9880d681SAndroid Build Coastguard Worker; SP-DAG: movne [[BLO]], [[ALO]] 283*9880d681SAndroid Build Coastguard Worker; SP-DAG: movne [[BHI]], [[AHI]] 284*9880d681SAndroid Build Coastguard Worker; SP: vmov d0, [[BLO]], [[BHI]] 285*9880d681SAndroid Build Coastguard Worker; DP: tst.w r0, #1 286*9880d681SAndroid Build Coastguard Worker; VFP4-DP: vmovne.f64 d1, d0 287*9880d681SAndroid Build Coastguard Worker; VFP4-DP: vmov.f64 d0, d1 288*9880d681SAndroid Build Coastguard Worker; FP-ARMV8: vseleq.f64 d0, d1, d0 289*9880d681SAndroid Build Coastguard Worker %1 = select i1 %c, double %a, double %b 290*9880d681SAndroid Build Coastguard Worker ret double %1 291*9880d681SAndroid Build Coastguard Worker} 292