1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cyclone -aarch64-neon-syntax=apple | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cortex-a57 | FileCheck --check-prefix=CHECK-A57 %s 3*9880d681SAndroid Build Coastguard Worker; rdar://13082402 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine float @t1(i32* nocapture %src) nounwind ssp { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1: 8*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s0, [x0] 9*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf s0, s0 10*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %src, align 4 11*9880d681SAndroid Build Coastguard Worker %tmp2 = sitofp i32 %tmp1 to float 12*9880d681SAndroid Build Coastguard Worker ret float %tmp2 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine float @t2(i32* nocapture %src) nounwind ssp { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2: 18*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s0, [x0] 19*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf s0, s0 20*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %src, align 4 21*9880d681SAndroid Build Coastguard Worker %tmp2 = uitofp i32 %tmp1 to float 22*9880d681SAndroid Build Coastguard Worker ret float %tmp2 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine double @t3(i64* nocapture %src) nounwind ssp { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3: 28*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0] 29*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf d0, d0 30*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %src, align 4 31*9880d681SAndroid Build Coastguard Worker %tmp2 = sitofp i64 %tmp1 to double 32*9880d681SAndroid Build Coastguard Worker ret double %tmp2 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine double @t4(i64* nocapture %src) nounwind ssp { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4: 38*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0] 39*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf d0, d0 40*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %src, align 4 41*9880d681SAndroid Build Coastguard Worker %tmp2 = uitofp i64 %tmp1 to double 42*9880d681SAndroid Build Coastguard Worker ret double %tmp2 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; rdar://13136456 46*9880d681SAndroid Build Coastguard Workerdefine double @t5(i32* nocapture %src) nounwind ssp optsize { 47*9880d681SAndroid Build Coastguard Workerentry: 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5: 49*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[REG:w[0-9]+]], [x0] 50*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf d0, [[REG]] 51*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %src, align 4 52*9880d681SAndroid Build Coastguard Worker %tmp2 = sitofp i32 %tmp1 to double 53*9880d681SAndroid Build Coastguard Worker ret double %tmp2 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; Check that we load in FP register when we want to convert into 57*9880d681SAndroid Build Coastguard Worker; floating point value. 58*9880d681SAndroid Build Coastguard Worker; This is much faster than loading on GPR and making the conversion 59*9880d681SAndroid Build Coastguard Worker; GPR -> FPR. 60*9880d681SAndroid Build Coastguard Worker; <rdar://problem/14599607> 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker; Check the flollowing patterns for signed/unsigned: 63*9880d681SAndroid Build Coastguard Worker; 1. load with scaled imm to float. 64*9880d681SAndroid Build Coastguard Worker; 2. load with scaled register to float. 65*9880d681SAndroid Build Coastguard Worker; 3. load with scaled imm to double. 66*9880d681SAndroid Build Coastguard Worker; 4. load with scaled register to double. 67*9880d681SAndroid Build Coastguard Worker; 5. load with unscaled imm to float. 68*9880d681SAndroid Build Coastguard Worker; 6. load with unscaled imm to double. 69*9880d681SAndroid Build Coastguard Worker; With loading size: 8, 16, 32, and 64-bits. 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; ********* 1. load with scaled imm to float. ********* 72*9880d681SAndroid Build Coastguard Workerdefine float @fct1(i8* nocapture %sp0) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct1: 74*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1] 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 1 79*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 80*9880d681SAndroid Build Coastguard Worker %val = uitofp i8 %pix_sp0.0.copyload to float 81*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 82*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine float @fct2(i16* nocapture %sp0) { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct2: 87*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2] 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 1 92*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 93*9880d681SAndroid Build Coastguard Worker %val = uitofp i16 %pix_sp0.0.copyload to float 94*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 95*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine float @fct3(i32* nocapture %sp0) { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct3: 100*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4] 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 103*9880d681SAndroid Build Coastguard Workerentry: 104*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 1 105*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 106*9880d681SAndroid Build Coastguard Worker %val = uitofp i32 %pix_sp0.0.copyload to float 107*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 108*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit. 112*9880d681SAndroid Build Coastguard Workerdefine float @fct4(i64* nocapture %sp0) { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct4: 114*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, #8] 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], x[[REGNUM]] 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 117*9880d681SAndroid Build Coastguard Workerentry: 118*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 1 119*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 120*9880d681SAndroid Build Coastguard Worker %val = uitofp i64 %pix_sp0.0.copyload to float 121*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 122*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; ********* 2. load with scaled register to float. ********* 126*9880d681SAndroid Build Coastguard Workerdefine float @fct5(i8* nocapture %sp0, i64 %offset) { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct5: 128*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1] 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 131*9880d681SAndroid Build Coastguard Workerentry: 132*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 %offset 133*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 134*9880d681SAndroid Build Coastguard Worker %val = uitofp i8 %pix_sp0.0.copyload to float 135*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 136*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine float @fct6(i16* nocapture %sp0, i64 %offset) { 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct6: 141*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1] 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 144*9880d681SAndroid Build Coastguard Workerentry: 145*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 %offset 146*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 147*9880d681SAndroid Build Coastguard Worker %val = uitofp i16 %pix_sp0.0.copyload to float 148*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 149*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine float @fct7(i32* nocapture %sp0, i64 %offset) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct7: 154*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2] 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 157*9880d681SAndroid Build Coastguard Workerentry: 158*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 %offset 159*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 160*9880d681SAndroid Build Coastguard Worker %val = uitofp i32 %pix_sp0.0.copyload to float 161*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 162*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit. 166*9880d681SAndroid Build Coastguard Workerdefine float @fct8(i64* nocapture %sp0, i64 %offset) { 167*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct8: 168*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, x1, lsl #3] 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], x[[REGNUM]] 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 171*9880d681SAndroid Build Coastguard Workerentry: 172*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 %offset 173*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 174*9880d681SAndroid Build Coastguard Worker %val = uitofp i64 %pix_sp0.0.copyload to float 175*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 176*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker; ********* 3. load with scaled imm to double. ********* 181*9880d681SAndroid Build Coastguard Workerdefine double @fct9(i8* nocapture %sp0) { 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct9: 183*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1] 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 186*9880d681SAndroid Build Coastguard Workerentry: 187*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 1 188*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 189*9880d681SAndroid Build Coastguard Worker %val = uitofp i8 %pix_sp0.0.copyload to double 190*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 191*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine double @fct10(i16* nocapture %sp0) { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct10: 196*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2] 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 199*9880d681SAndroid Build Coastguard Workerentry: 200*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 1 201*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 202*9880d681SAndroid Build Coastguard Worker %val = uitofp i16 %pix_sp0.0.copyload to double 203*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 204*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdefine double @fct11(i32* nocapture %sp0) { 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct11: 209*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4] 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 212*9880d681SAndroid Build Coastguard Workerentry: 213*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 1 214*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 215*9880d681SAndroid Build Coastguard Worker %val = uitofp i32 %pix_sp0.0.copyload to double 216*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 217*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 218*9880d681SAndroid Build Coastguard Worker} 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerdefine double @fct12(i64* nocapture %sp0) { 221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct12: 222*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, #8] 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 225*9880d681SAndroid Build Coastguard Workerentry: 226*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 1 227*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 228*9880d681SAndroid Build Coastguard Worker %val = uitofp i64 %pix_sp0.0.copyload to double 229*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 230*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker; ********* 4. load with scaled register to double. ********* 234*9880d681SAndroid Build Coastguard Workerdefine double @fct13(i8* nocapture %sp0, i64 %offset) { 235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct13: 236*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1] 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 239*9880d681SAndroid Build Coastguard Workerentry: 240*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 %offset 241*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 242*9880d681SAndroid Build Coastguard Worker %val = uitofp i8 %pix_sp0.0.copyload to double 243*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 244*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine double @fct14(i16* nocapture %sp0, i64 %offset) { 248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct14: 249*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1] 250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 252*9880d681SAndroid Build Coastguard Workerentry: 253*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 %offset 254*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 255*9880d681SAndroid Build Coastguard Worker %val = uitofp i16 %pix_sp0.0.copyload to double 256*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 257*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 258*9880d681SAndroid Build Coastguard Worker} 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Workerdefine double @fct15(i32* nocapture %sp0, i64 %offset) { 261*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct15: 262*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2] 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 265*9880d681SAndroid Build Coastguard Workerentry: 266*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 %offset 267*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 268*9880d681SAndroid Build Coastguard Worker %val = uitofp i32 %pix_sp0.0.copyload to double 269*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 270*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 271*9880d681SAndroid Build Coastguard Worker} 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerdefine double @fct16(i64* nocapture %sp0, i64 %offset) { 274*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct16: 275*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, x1, lsl #3] 276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 278*9880d681SAndroid Build Coastguard Workerentry: 279*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 %offset 280*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 281*9880d681SAndroid Build Coastguard Worker %val = uitofp i64 %pix_sp0.0.copyload to double 282*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 283*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 284*9880d681SAndroid Build Coastguard Worker} 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker; ********* 5. load with unscaled imm to float. ********* 287*9880d681SAndroid Build Coastguard Workerdefine float @fct17(i8* nocapture %sp0) { 288*9880d681SAndroid Build Coastguard Workerentry: 289*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct17: 290*9880d681SAndroid Build Coastguard Worker; CHECK: ldur b[[REGNUM:[0-9]+]], [x0, #-1] 291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 293*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i8* %sp0 to i64 294*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, -1 295*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i8* 296*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 297*9880d681SAndroid Build Coastguard Worker %val = uitofp i8 %pix_sp0.0.copyload to float 298*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 299*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerdefine float @fct18(i16* nocapture %sp0) { 303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct18: 304*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1] 305*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 307*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i16* %sp0 to i64 308*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 309*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i16* 310*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 311*9880d681SAndroid Build Coastguard Worker %val = uitofp i16 %pix_sp0.0.copyload to float 312*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 313*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 314*9880d681SAndroid Build Coastguard Worker} 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Workerdefine float @fct19(i32* nocapture %sp0) { 317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct19: 318*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1] 319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], s[[REGNUM]] 320*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 321*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i32* %sp0 to i64 322*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 323*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i32* 324*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 325*9880d681SAndroid Build Coastguard Worker %val = uitofp i32 %pix_sp0.0.copyload to float 326*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 327*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 328*9880d681SAndroid Build Coastguard Worker} 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit. 331*9880d681SAndroid Build Coastguard Workerdefine float @fct20(i64* nocapture %sp0) { 332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct20: 333*9880d681SAndroid Build Coastguard Worker; CHECK: ldur x[[REGNUM:[0-9]+]], [x0, #1] 334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:s[0-9]+]], x[[REGNUM]] 335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 336*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i64* %sp0 to i64 337*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 338*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i64* 339*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 340*9880d681SAndroid Build Coastguard Worker %val = uitofp i64 %pix_sp0.0.copyload to float 341*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 342*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker} 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker; ********* 6. load with unscaled imm to double. ********* 347*9880d681SAndroid Build Coastguard Workerdefine double @fct21(i8* nocapture %sp0) { 348*9880d681SAndroid Build Coastguard Workerentry: 349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct21: 350*9880d681SAndroid Build Coastguard Worker; CHECK: ldur b[[REGNUM:[0-9]+]], [x0, #-1] 351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 353*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i8* %sp0 to i64 354*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, -1 355*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i8* 356*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 357*9880d681SAndroid Build Coastguard Worker %val = uitofp i8 %pix_sp0.0.copyload to double 358*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 359*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdefine double @fct22(i16* nocapture %sp0) { 363*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct22: 364*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1] 365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 367*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i16* %sp0 to i64 368*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 369*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i16* 370*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 371*9880d681SAndroid Build Coastguard Worker %val = uitofp i16 %pix_sp0.0.copyload to double 372*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 373*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 374*9880d681SAndroid Build Coastguard Worker} 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerdefine double @fct23(i32* nocapture %sp0) { 377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct23: 378*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1] 379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 381*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i32* %sp0 to i64 382*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 383*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i32* 384*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 385*9880d681SAndroid Build Coastguard Worker %val = uitofp i32 %pix_sp0.0.copyload to double 386*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 387*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Workerdefine double @fct24(i64* nocapture %sp0) { 391*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fct24: 392*9880d681SAndroid Build Coastguard Worker; CHECK: ldur d[[REGNUM:[0-9]+]], [x0, #1] 393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ucvtf [[REG:d[0-9]+]], d[[REGNUM]] 394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 395*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i64* %sp0 to i64 396*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 397*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i64* 398*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 399*9880d681SAndroid Build Coastguard Worker %val = uitofp i64 %pix_sp0.0.copyload to double 400*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 401*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Worker} 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker; ********* 1s. load with scaled imm to float. ********* 406*9880d681SAndroid Build Coastguard Workerdefine float @sfct1(i8* nocapture %sp0) { 407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct1: 408*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, #1] 409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0 410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0 411*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 413*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct1: 414*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsb w[[REGNUM:[0-9]+]], [x0, #1] 415*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]] 416*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul s0, [[REG]], [[REG]] 417*9880d681SAndroid Build Coastguard Workerentry: 418*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 1 419*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 420*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to float 421*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 422*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 423*9880d681SAndroid Build Coastguard Worker} 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Workerdefine float @sfct2(i16* nocapture %sp0) { 426*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct2: 427*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2] 428*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0 429*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 431*9880d681SAndroid Build Coastguard Workerentry: 432*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 1 433*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 434*9880d681SAndroid Build Coastguard Worker %val = sitofp i16 %pix_sp0.0.copyload to float 435*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 436*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 437*9880d681SAndroid Build Coastguard Worker} 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Workerdefine float @sfct3(i32* nocapture %sp0) { 440*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct3: 441*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4] 442*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 444*9880d681SAndroid Build Coastguard Workerentry: 445*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 1 446*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 447*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to float 448*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 449*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 450*9880d681SAndroid Build Coastguard Worker} 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit. 453*9880d681SAndroid Build Coastguard Workerdefine float @sfct4(i64* nocapture %sp0) { 454*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct4: 455*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, #8] 456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], x[[REGNUM]] 457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 458*9880d681SAndroid Build Coastguard Workerentry: 459*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 1 460*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 461*9880d681SAndroid Build Coastguard Worker %val = sitofp i64 %pix_sp0.0.copyload to float 462*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 463*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 464*9880d681SAndroid Build Coastguard Worker} 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Worker; ********* 2s. load with scaled register to float. ********* 467*9880d681SAndroid Build Coastguard Workerdefine float @sfct5(i8* nocapture %sp0, i64 %offset) { 468*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct5: 469*9880d681SAndroid Build Coastguard Worker; CHECK: ldr b[[REGNUM:[0-9]+]], [x0, x1] 470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0 471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0 472*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 473*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 474*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct5: 475*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsb w[[REGNUM:[0-9]+]], [x0, x1] 476*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]] 477*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul s0, [[REG]], [[REG]] 478*9880d681SAndroid Build Coastguard Workerentry: 479*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 %offset 480*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 481*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to float 482*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 483*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 484*9880d681SAndroid Build Coastguard Worker} 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Workerdefine float @sfct6(i16* nocapture %sp0, i64 %offset) { 487*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct6: 488*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1] 489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0 490*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 491*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 492*9880d681SAndroid Build Coastguard Workerentry: 493*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 %offset 494*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 495*9880d681SAndroid Build Coastguard Worker %val = sitofp i16 %pix_sp0.0.copyload to float 496*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 497*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 498*9880d681SAndroid Build Coastguard Worker} 499*9880d681SAndroid Build Coastguard Worker 500*9880d681SAndroid Build Coastguard Workerdefine float @sfct7(i32* nocapture %sp0, i64 %offset) { 501*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct7: 502*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2] 503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 505*9880d681SAndroid Build Coastguard Workerentry: 506*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 %offset 507*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 508*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to float 509*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 510*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 511*9880d681SAndroid Build Coastguard Worker} 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit. 514*9880d681SAndroid Build Coastguard Workerdefine float @sfct8(i64* nocapture %sp0, i64 %offset) { 515*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct8: 516*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REGNUM:[0-9]+]], [x0, x1, lsl #3] 517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], x[[REGNUM]] 518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 519*9880d681SAndroid Build Coastguard Workerentry: 520*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 %offset 521*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 522*9880d681SAndroid Build Coastguard Worker %val = sitofp i64 %pix_sp0.0.copyload to float 523*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 524*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 525*9880d681SAndroid Build Coastguard Worker} 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Worker; ********* 3s. load with scaled imm to double. ********* 528*9880d681SAndroid Build Coastguard Workerdefine double @sfct9(i8* nocapture %sp0) { 529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct9: 530*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb w[[REGNUM:[0-9]+]], [x0, #1] 531*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 532*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 533*9880d681SAndroid Build Coastguard Workerentry: 534*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 1 535*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 536*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to double 537*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 538*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 539*9880d681SAndroid Build Coastguard Worker} 540*9880d681SAndroid Build Coastguard Worker 541*9880d681SAndroid Build Coastguard Workerdefine double @sfct10(i16* nocapture %sp0) { 542*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct10: 543*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, #2] 544*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0 545*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0 546*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 547*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 548*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct10: 549*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsh w[[REGNUM:[0-9]+]], [x0, #2] 550*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 551*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul d0, [[REG]], [[REG]] 552*9880d681SAndroid Build Coastguard Workerentry: 553*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 1 554*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 555*9880d681SAndroid Build Coastguard Worker %val = sitofp i16 %pix_sp0.0.copyload to double 556*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 557*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 558*9880d681SAndroid Build Coastguard Worker} 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Workerdefine double @sfct11(i32* nocapture %sp0) { 561*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct11: 562*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, #4] 563*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0 564*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 565*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 566*9880d681SAndroid Build Coastguard Workerentry: 567*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 1 568*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 569*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to double 570*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 571*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 572*9880d681SAndroid Build Coastguard Worker} 573*9880d681SAndroid Build Coastguard Worker 574*9880d681SAndroid Build Coastguard Workerdefine double @sfct12(i64* nocapture %sp0) { 575*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct12: 576*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, #8] 577*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 578*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 579*9880d681SAndroid Build Coastguard Workerentry: 580*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 1 581*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 582*9880d681SAndroid Build Coastguard Worker %val = sitofp i64 %pix_sp0.0.copyload to double 583*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 584*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 585*9880d681SAndroid Build Coastguard Worker} 586*9880d681SAndroid Build Coastguard Worker 587*9880d681SAndroid Build Coastguard Worker; ********* 4s. load with scaled register to double. ********* 588*9880d681SAndroid Build Coastguard Workerdefine double @sfct13(i8* nocapture %sp0, i64 %offset) { 589*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct13: 590*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb w[[REGNUM:[0-9]+]], [x0, x1] 591*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 592*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 593*9880d681SAndroid Build Coastguard Workerentry: 594*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i8, i8* %sp0, i64 %offset 595*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 596*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to double 597*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 598*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 599*9880d681SAndroid Build Coastguard Worker} 600*9880d681SAndroid Build Coastguard Worker 601*9880d681SAndroid Build Coastguard Workerdefine double @sfct14(i16* nocapture %sp0, i64 %offset) { 602*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct14: 603*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h[[REGNUM:[0-9]+]], [x0, x1, lsl #1] 604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0 605*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0 606*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 607*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 608*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct14: 609*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldrsh w[[REGNUM:[0-9]+]], [x0, x1, lsl #1] 610*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 611*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul d0, [[REG]], [[REG]] 612*9880d681SAndroid Build Coastguard Workerentry: 613*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i16, i16* %sp0, i64 %offset 614*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 615*9880d681SAndroid Build Coastguard Worker %val = sitofp i16 %pix_sp0.0.copyload to double 616*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 617*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 618*9880d681SAndroid Build Coastguard Worker} 619*9880d681SAndroid Build Coastguard Worker 620*9880d681SAndroid Build Coastguard Workerdefine double @sfct15(i32* nocapture %sp0, i64 %offset) { 621*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct15: 622*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s[[REGNUM:[0-9]+]], [x0, x1, lsl #2] 623*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0 624*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 625*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 626*9880d681SAndroid Build Coastguard Workerentry: 627*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 %offset 628*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 629*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to double 630*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 631*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 632*9880d681SAndroid Build Coastguard Worker} 633*9880d681SAndroid Build Coastguard Worker 634*9880d681SAndroid Build Coastguard Workerdefine double @sfct16(i64* nocapture %sp0, i64 %offset) { 635*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct16: 636*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d[[REGNUM:[0-9]+]], [x0, x1, lsl #3] 637*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 638*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 639*9880d681SAndroid Build Coastguard Workerentry: 640*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i64, i64* %sp0, i64 %offset 641*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 642*9880d681SAndroid Build Coastguard Worker %val = sitofp i64 %pix_sp0.0.copyload to double 643*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 644*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 645*9880d681SAndroid Build Coastguard Worker} 646*9880d681SAndroid Build Coastguard Worker 647*9880d681SAndroid Build Coastguard Worker; ********* 5s. load with unscaled imm to float. ********* 648*9880d681SAndroid Build Coastguard Workerdefine float @sfct17(i8* nocapture %sp0) { 649*9880d681SAndroid Build Coastguard Workerentry: 650*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct17: 651*9880d681SAndroid Build Coastguard Worker; CHECK: ldur b[[REGNUM:[0-9]+]], [x0, #-1] 652*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.8h [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0 653*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0 654*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 655*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 656*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct17: 657*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldursb w[[REGNUM:[0-9]+]], [x0, #-1] 658*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]] 659*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul s0, [[REG]], [[REG]] 660*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i8* %sp0 to i64 661*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, -1 662*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i8* 663*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 664*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to float 665*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 666*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 667*9880d681SAndroid Build Coastguard Worker} 668*9880d681SAndroid Build Coastguard Worker 669*9880d681SAndroid Build Coastguard Workerdefine float @sfct18(i16* nocapture %sp0) { 670*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct18: 671*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1] 672*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0 673*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 674*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 675*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i16* %sp0 to i64 676*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 677*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i16* 678*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 679*9880d681SAndroid Build Coastguard Worker %val = sitofp i16 %pix_sp0.0.copyload to float 680*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 681*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 682*9880d681SAndroid Build Coastguard Worker} 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerdefine float @sfct19(i32* nocapture %sp0) { 685*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct19: 686*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1] 687*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], s[[SEXTREG]] 688*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 689*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i32* %sp0 to i64 690*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 691*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i32* 692*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 693*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to float 694*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 695*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 696*9880d681SAndroid Build Coastguard Worker} 697*9880d681SAndroid Build Coastguard Worker 698*9880d681SAndroid Build Coastguard Worker; i64 -> f32 is not supported on floating point unit. 699*9880d681SAndroid Build Coastguard Workerdefine float @sfct20(i64* nocapture %sp0) { 700*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct20: 701*9880d681SAndroid Build Coastguard Worker; CHECK: ldur x[[REGNUM:[0-9]+]], [x0, #1] 702*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], x[[REGNUM]] 703*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 704*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i64* %sp0 to i64 705*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 706*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i64* 707*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 708*9880d681SAndroid Build Coastguard Worker %val = sitofp i64 %pix_sp0.0.copyload to float 709*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 710*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 711*9880d681SAndroid Build Coastguard Worker 712*9880d681SAndroid Build Coastguard Worker} 713*9880d681SAndroid Build Coastguard Worker 714*9880d681SAndroid Build Coastguard Worker; ********* 6s. load with unscaled imm to double. ********* 715*9880d681SAndroid Build Coastguard Workerdefine double @sfct21(i8* nocapture %sp0) { 716*9880d681SAndroid Build Coastguard Workerentry: 717*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct21: 718*9880d681SAndroid Build Coastguard Worker; CHECK: ldursb w[[REGNUM:[0-9]+]], [x0, #-1] 719*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 720*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 721*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i8* %sp0 to i64 722*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, -1 723*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i8* 724*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 725*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to double 726*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 727*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 728*9880d681SAndroid Build Coastguard Worker} 729*9880d681SAndroid Build Coastguard Worker 730*9880d681SAndroid Build Coastguard Workerdefine double @sfct22(i16* nocapture %sp0) { 731*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct22: 732*9880d681SAndroid Build Coastguard Worker; CHECK: ldur h[[REGNUM:[0-9]+]], [x0, #1] 733*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.4s [[SEXTREG1:v[0-9]+]], v[[REGNUM]], #0 734*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], [[SEXTREG1]], #0 735*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 736*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 737*9880d681SAndroid Build Coastguard Worker; CHECK-A57-LABEL: sfct22: 738*9880d681SAndroid Build Coastguard Worker; CHECK-A57: ldursh w[[REGNUM:[0-9]+]], [x0, #1] 739*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 740*9880d681SAndroid Build Coastguard Worker; CHECK-A57-NEXT: fmul d0, [[REG]], [[REG]] 741*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i16* %sp0 to i64 742*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 743*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i16* 744*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i16, i16* %addr, align 1 745*9880d681SAndroid Build Coastguard Worker %val = sitofp i16 %pix_sp0.0.copyload to double 746*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 747*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 748*9880d681SAndroid Build Coastguard Worker} 749*9880d681SAndroid Build Coastguard Worker 750*9880d681SAndroid Build Coastguard Workerdefine double @sfct23(i32* nocapture %sp0) { 751*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct23: 752*9880d681SAndroid Build Coastguard Worker; CHECK: ldur s[[REGNUM:[0-9]+]], [x0, #1] 753*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sshll.2d v[[SEXTREG:[0-9]+]], v[[REGNUM]], #0 754*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 755*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 756*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i32* %sp0 to i64 757*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 758*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i32* 759*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 760*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to double 761*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 762*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 763*9880d681SAndroid Build Coastguard Worker} 764*9880d681SAndroid Build Coastguard Worker 765*9880d681SAndroid Build Coastguard Workerdefine double @sfct24(i64* nocapture %sp0) { 766*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct24: 767*9880d681SAndroid Build Coastguard Worker; CHECK: ldur d[[REGNUM:[0-9]+]], [x0, #1] 768*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], d[[SEXTREG]] 769*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 770*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i64* %sp0 to i64 771*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, 1 772*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i64* 773*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i64, i64* %addr, align 1 774*9880d681SAndroid Build Coastguard Worker %val = sitofp i64 %pix_sp0.0.copyload to double 775*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 776*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 777*9880d681SAndroid Build Coastguard Worker 778*9880d681SAndroid Build Coastguard Worker} 779*9880d681SAndroid Build Coastguard Worker 780*9880d681SAndroid Build Coastguard Worker; Check that we do not use SSHLL code sequence when code size is a concern. 781*9880d681SAndroid Build Coastguard Workerdefine float @codesize_sfct17(i8* nocapture %sp0) optsize { 782*9880d681SAndroid Build Coastguard Workerentry: 783*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: codesize_sfct17: 784*9880d681SAndroid Build Coastguard Worker; CHECK: ldursb w[[REGNUM:[0-9]+]], [x0, #-1] 785*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:s[0-9]+]], w[[REGNUM]] 786*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul s0, [[REG]], [[REG]] 787*9880d681SAndroid Build Coastguard Worker %bitcast = ptrtoint i8* %sp0 to i64 788*9880d681SAndroid Build Coastguard Worker %add = add i64 %bitcast, -1 789*9880d681SAndroid Build Coastguard Worker %addr = inttoptr i64 %add to i8* 790*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i8, i8* %addr, align 1 791*9880d681SAndroid Build Coastguard Worker %val = sitofp i8 %pix_sp0.0.copyload to float 792*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul float %val, %val 793*9880d681SAndroid Build Coastguard Worker ret float %vmull.i 794*9880d681SAndroid Build Coastguard Worker} 795*9880d681SAndroid Build Coastguard Worker 796*9880d681SAndroid Build Coastguard Workerdefine double @codesize_sfct11(i32* nocapture %sp0) minsize { 797*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sfct11: 798*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w[[REGNUM:[0-9]+]], [x0, #4] 799*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: scvtf [[REG:d[0-9]+]], w[[REGNUM]] 800*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmul d0, [[REG]], [[REG]] 801*9880d681SAndroid Build Coastguard Workerentry: 802*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* %sp0, i64 1 803*9880d681SAndroid Build Coastguard Worker %pix_sp0.0.copyload = load i32, i32* %addr, align 1 804*9880d681SAndroid Build Coastguard Worker %val = sitofp i32 %pix_sp0.0.copyload to double 805*9880d681SAndroid Build Coastguard Worker %vmull.i = fmul double %val, %val 806*9880d681SAndroid Build Coastguard Worker ret double %vmull.i 807*9880d681SAndroid Build Coastguard Worker} 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Worker; Adding fp128 custom lowering makes these a little fragile since we have to 810*9880d681SAndroid Build Coastguard Worker; return the correct mix of Legal/Expand from the custom method. 811*9880d681SAndroid Build Coastguard Worker; 812*9880d681SAndroid Build Coastguard Worker; rdar://problem/14991489 813*9880d681SAndroid Build Coastguard Worker 814*9880d681SAndroid Build Coastguard Workerdefine float @float_from_i128(i128 %in) { 815*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: float_from_i128: 816*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__floatuntisf}} 817*9880d681SAndroid Build Coastguard Worker %conv = uitofp i128 %in to float 818*9880d681SAndroid Build Coastguard Worker ret float %conv 819*9880d681SAndroid Build Coastguard Worker} 820*9880d681SAndroid Build Coastguard Worker 821*9880d681SAndroid Build Coastguard Workerdefine double @double_from_i128(i128 %in) { 822*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: double_from_i128: 823*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__floattidf}} 824*9880d681SAndroid Build Coastguard Worker %conv = sitofp i128 %in to double 825*9880d681SAndroid Build Coastguard Worker ret double %conv 826*9880d681SAndroid Build Coastguard Worker} 827*9880d681SAndroid Build Coastguard Worker 828*9880d681SAndroid Build Coastguard Workerdefine fp128 @fp128_from_i128(i128 %in) { 829*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fp128_from_i128: 830*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__floatuntitf}} 831*9880d681SAndroid Build Coastguard Worker %conv = uitofp i128 %in to fp128 832*9880d681SAndroid Build Coastguard Worker ret fp128 %conv 833*9880d681SAndroid Build Coastguard Worker} 834*9880d681SAndroid Build Coastguard Worker 835*9880d681SAndroid Build Coastguard Workerdefine i128 @i128_from_float(float %in) { 836*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i128_from_float 837*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__fixsfti}} 838*9880d681SAndroid Build Coastguard Worker %conv = fptosi float %in to i128 839*9880d681SAndroid Build Coastguard Worker ret i128 %conv 840*9880d681SAndroid Build Coastguard Worker} 841*9880d681SAndroid Build Coastguard Worker 842*9880d681SAndroid Build Coastguard Workerdefine i128 @i128_from_double(double %in) { 843*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i128_from_double 844*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__fixunsdfti}} 845*9880d681SAndroid Build Coastguard Worker %conv = fptoui double %in to i128 846*9880d681SAndroid Build Coastguard Worker ret i128 %conv 847*9880d681SAndroid Build Coastguard Worker} 848*9880d681SAndroid Build Coastguard Worker 849*9880d681SAndroid Build Coastguard Workerdefine i128 @i128_from_fp128(fp128 %in) { 850*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: i128_from_fp128 851*9880d681SAndroid Build Coastguard Worker; CHECK: bl {{_?__fixtfti}} 852*9880d681SAndroid Build Coastguard Worker %conv = fptosi fp128 %in to i128 853*9880d681SAndroid Build Coastguard Worker ret i128 %conv 854*9880d681SAndroid Build Coastguard Worker} 855*9880d681SAndroid Build Coastguard Worker 856