1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm64-apple-ios -asm-verbose=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine float @load0(i16* nocapture readonly %a) nounwind { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load0: 5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0] 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]] 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %a, align 2 10*9880d681SAndroid Build Coastguard Worker %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp) 11*9880d681SAndroid Build Coastguard Worker ret float %tmp1 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine double @load1(i16* nocapture readonly %a) nounwind { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load1: 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0] 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]] 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %a, align 2 21*9880d681SAndroid Build Coastguard Worker %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp) 22*9880d681SAndroid Build Coastguard Worker ret double %conv 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine float @load2(i16* nocapture readonly %a, i32 %i) nounwind { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load2: 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1] 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]] 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i to i64 32*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom 33*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 34*9880d681SAndroid Build Coastguard Worker %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp) 35*9880d681SAndroid Build Coastguard Worker ret float %tmp1 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine double @load3(i16* nocapture readonly %a, i32 %i) nounwind { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load3: 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1] 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]] 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i to i64 45*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom 46*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 47*9880d681SAndroid Build Coastguard Worker %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp) 48*9880d681SAndroid Build Coastguard Worker ret double %conv 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine float @load4(i16* nocapture readonly %a, i64 %i) nounwind { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load4: 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1] 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]] 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i 58*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 59*9880d681SAndroid Build Coastguard Worker %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp) 60*9880d681SAndroid Build Coastguard Worker ret float %tmp1 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine double @load5(i16* nocapture readonly %a, i64 %i) nounwind { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load5: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1] 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]] 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i 70*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 71*9880d681SAndroid Build Coastguard Worker %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp) 72*9880d681SAndroid Build Coastguard Worker ret double %conv 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine float @load6(i16* nocapture readonly %a) nounwind { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load6: 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20] 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]] 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 10 82*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 83*9880d681SAndroid Build Coastguard Worker %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp) 84*9880d681SAndroid Build Coastguard Worker ret float %tmp1 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine double @load7(i16* nocapture readonly %a) nounwind { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load7: 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20] 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]] 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 10 94*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 95*9880d681SAndroid Build Coastguard Worker %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp) 96*9880d681SAndroid Build Coastguard Worker ret double %conv 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine float @load8(i16* nocapture readonly %a) nounwind { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load8: 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20] 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, [[HREG]] 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10 106*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 107*9880d681SAndroid Build Coastguard Worker %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp) 108*9880d681SAndroid Build Coastguard Worker ret float %tmp1 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine double @load9(i16* nocapture readonly %a) nounwind { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load9: 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20] 114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt d0, [[HREG]] 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10 118*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %arrayidx, align 2 119*9880d681SAndroid Build Coastguard Worker %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp) 120*9880d681SAndroid Build Coastguard Worker ret double %conv 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine void @store0(i16* nocapture %a, float %val) nounwind { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store0: 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0] 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val) 130*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %a, align 2 131*9880d681SAndroid Build Coastguard Worker ret void 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine void @store1(i16* nocapture %a, double %val) nounwind { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store1: 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0] 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %val to float 142*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv) 143*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %a, align 2 144*9880d681SAndroid Build Coastguard Worker ret void 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdefine void @store2(i16* nocapture %a, i32 %i, float %val) nounwind { 148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store2: 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, w1, sxtw #1] 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val) 154*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i to i64 155*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom 156*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 157*9880d681SAndroid Build Coastguard Worker ret void 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine void @store3(i16* nocapture %a, i32 %i, double %val) nounwind { 161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store3: 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0 163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, w1, sxtw #1] 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %val to float 168*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv) 169*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i to i64 170*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %idxprom 171*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine void @store4(i16* nocapture %a, i64 %i, float %val) nounwind { 176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store4: 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, x1, lsl #1] 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val) 182*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i 183*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 184*9880d681SAndroid Build Coastguard Worker ret void 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine void @store5(i16* nocapture %a, i64 %i, double %val) nounwind { 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store5: 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, x1, lsl #1] 192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %val to float 195*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv) 196*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 %i 197*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 198*9880d681SAndroid Build Coastguard Worker ret void 199*9880d681SAndroid Build Coastguard Worker} 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerdefine void @store6(i16* nocapture %a, float %val) nounwind { 202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store6: 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, #20] 205*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val) 208*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 10 209*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 210*9880d681SAndroid Build Coastguard Worker ret void 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine void @store7(i16* nocapture %a, double %val) nounwind { 214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store7: 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, #20] 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %val to float 221*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv) 222*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 10 223*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 224*9880d681SAndroid Build Coastguard Worker ret void 225*9880d681SAndroid Build Coastguard Worker} 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Workerdefine void @store8(i16* nocapture %a, float %val) nounwind { 228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store8: 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stur h0, [x0, #-20] 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val) 234*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10 235*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 236*9880d681SAndroid Build Coastguard Worker ret void 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine void @store9(i16* nocapture %a, double %val) nounwind { 240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store9: 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt s0, d0 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcvt h0, s0 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stur h0, [x0, #-20] 244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker %conv = fptrunc double %val to float 247*9880d681SAndroid Build Coastguard Worker %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv) 248*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %a, i64 -10 249*9880d681SAndroid Build Coastguard Worker store i16 %tmp, i16* %arrayidx, align 2 250*9880d681SAndroid Build Coastguard Worker ret void 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f32(float) nounwind readnone 254*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.convert.from.fp16.f32(i16) nounwind readnone 255*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.convert.to.fp16.f64(double) nounwind readnone 256*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.convert.from.fp16.f64(i16) nounwind readnone 257