1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-redzone | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine void @store64(i64** nocapture %out, i64 %index, i64 %spacing) nounwind noinline ssp { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store64: 5*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9+]}}, [x{{[0-9+]}}], #8 6*9880d681SAndroid Build Coastguard Worker; CHECK: ret 7*9880d681SAndroid Build Coastguard Worker %tmp = load i64*, i64** %out, align 8 8*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i64, i64* %tmp, i64 1 9*9880d681SAndroid Build Coastguard Worker store i64 %spacing, i64* %tmp, align 4 10*9880d681SAndroid Build Coastguard Worker store i64* %incdec.ptr, i64** %out, align 8 11*9880d681SAndroid Build Coastguard Worker ret void 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine void @store32(i32** nocapture %out, i32 %index, i32 %spacing) nounwind noinline ssp { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store32: 16*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9+]}}, [x{{[0-9+]}}], #4 17*9880d681SAndroid Build Coastguard Worker; CHECK: ret 18*9880d681SAndroid Build Coastguard Worker %tmp = load i32*, i32** %out, align 8 19*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %tmp, i64 1 20*9880d681SAndroid Build Coastguard Worker store i32 %spacing, i32* %tmp, align 4 21*9880d681SAndroid Build Coastguard Worker store i32* %incdec.ptr, i32** %out, align 8 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine void @store16(i16** nocapture %out, i16 %index, i16 %spacing) nounwind noinline ssp { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store16: 27*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9+]}}, [x{{[0-9+]}}], #2 28*9880d681SAndroid Build Coastguard Worker; CHECK: ret 29*9880d681SAndroid Build Coastguard Worker %tmp = load i16*, i16** %out, align 8 30*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i16, i16* %tmp, i64 1 31*9880d681SAndroid Build Coastguard Worker store i16 %spacing, i16* %tmp, align 4 32*9880d681SAndroid Build Coastguard Worker store i16* %incdec.ptr, i16** %out, align 8 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine void @store8(i8** nocapture %out, i8 %index, i8 %spacing) nounwind noinline ssp { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store8: 38*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9+]}}, [x{{[0-9+]}}], #1 39*9880d681SAndroid Build Coastguard Worker; CHECK: ret 40*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %out, align 8 41*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i8, i8* %tmp, i64 1 42*9880d681SAndroid Build Coastguard Worker store i8 %spacing, i8* %tmp, align 4 43*9880d681SAndroid Build Coastguard Worker store i8* %incdec.ptr, i8** %out, align 8 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine void @truncst64to32(i32** nocapture %out, i32 %index, i64 %spacing) nounwind noinline ssp { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: truncst64to32: 49*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9+]}}, [x{{[0-9+]}}], #4 50*9880d681SAndroid Build Coastguard Worker; CHECK: ret 51*9880d681SAndroid Build Coastguard Worker %tmp = load i32*, i32** %out, align 8 52*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i32, i32* %tmp, i64 1 53*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %spacing to i32 54*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32* %tmp, align 4 55*9880d681SAndroid Build Coastguard Worker store i32* %incdec.ptr, i32** %out, align 8 56*9880d681SAndroid Build Coastguard Worker ret void 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @truncst64to16(i16** nocapture %out, i16 %index, i64 %spacing) nounwind noinline ssp { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: truncst64to16: 61*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9+]}}, [x{{[0-9+]}}], #2 62*9880d681SAndroid Build Coastguard Worker; CHECK: ret 63*9880d681SAndroid Build Coastguard Worker %tmp = load i16*, i16** %out, align 8 64*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i16, i16* %tmp, i64 1 65*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %spacing to i16 66*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16* %tmp, align 4 67*9880d681SAndroid Build Coastguard Worker store i16* %incdec.ptr, i16** %out, align 8 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine void @truncst64to8(i8** nocapture %out, i8 %index, i64 %spacing) nounwind noinline ssp { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: truncst64to8: 73*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9+]}}, [x{{[0-9+]}}], #1 74*9880d681SAndroid Build Coastguard Worker; CHECK: ret 75*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %out, align 8 76*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i8, i8* %tmp, i64 1 77*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %spacing to i8 78*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8* %tmp, align 4 79*9880d681SAndroid Build Coastguard Worker store i8* %incdec.ptr, i8** %out, align 8 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine void @storef16(half** %out, half %index, half %spacing) nounwind { 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: storef16: 86*9880d681SAndroid Build Coastguard Worker; CHECK: str h{{[0-9+]}}, [x{{[0-9+]}}], #2 87*9880d681SAndroid Build Coastguard Worker; CHECK: ret 88*9880d681SAndroid Build Coastguard Worker %tmp = load half*, half** %out, align 2 89*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds half, half* %tmp, i64 1 90*9880d681SAndroid Build Coastguard Worker store half %spacing, half* %tmp, align 2 91*9880d681SAndroid Build Coastguard Worker store half* %incdec.ptr, half** %out, align 2 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine void @storef32(float** nocapture %out, float %index, float %spacing) nounwind noinline ssp { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: storef32: 97*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9+]}}, [x{{[0-9+]}}], #4 98*9880d681SAndroid Build Coastguard Worker; CHECK: ret 99*9880d681SAndroid Build Coastguard Worker %tmp = load float*, float** %out, align 8 100*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds float, float* %tmp, i64 1 101*9880d681SAndroid Build Coastguard Worker store float %spacing, float* %tmp, align 4 102*9880d681SAndroid Build Coastguard Worker store float* %incdec.ptr, float** %out, align 8 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine void @storef64(double** nocapture %out, double %index, double %spacing) nounwind noinline ssp { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: storef64: 108*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9+]}}, [x{{[0-9+]}}], #8 109*9880d681SAndroid Build Coastguard Worker; CHECK: ret 110*9880d681SAndroid Build Coastguard Worker %tmp = load double*, double** %out, align 8 111*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds double, double* %tmp, i64 1 112*9880d681SAndroid Build Coastguard Worker store double %spacing, double* %tmp, align 4 113*9880d681SAndroid Build Coastguard Worker store double* %incdec.ptr, double** %out, align 8 114*9880d681SAndroid Build Coastguard Worker ret void 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine double * @pref64(double** nocapture %out, double %spacing) nounwind noinline ssp { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pref64: 119*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str d0, [x0, #32]! 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 122*9880d681SAndroid Build Coastguard Worker %tmp = load double*, double** %out, align 8 123*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds double, double* %tmp, i64 4 124*9880d681SAndroid Build Coastguard Worker store double %spacing, double* %ptr, align 4 125*9880d681SAndroid Build Coastguard Worker ret double *%ptr 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine float * @pref32(float** nocapture %out, float %spacing) nounwind noinline ssp { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pref32: 130*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str s0, [x0, #12]! 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 133*9880d681SAndroid Build Coastguard Worker %tmp = load float*, float** %out, align 8 134*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds float, float* %tmp, i64 3 135*9880d681SAndroid Build Coastguard Worker store float %spacing, float* %ptr, align 4 136*9880d681SAndroid Build Coastguard Worker ret float *%ptr 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine half* @pref16(half** %out, half %spacing) nounwind { 140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pref16: 141*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, #6]! 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 144*9880d681SAndroid Build Coastguard Worker %tmp = load half*, half** %out, align 2 145*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds half, half* %tmp, i64 3 146*9880d681SAndroid Build Coastguard Worker store half %spacing, half* %ptr, align 2 147*9880d681SAndroid Build Coastguard Worker ret half *%ptr 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerdefine i64 * @pre64(i64** nocapture %out, i64 %spacing) nounwind noinline ssp { 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre64: 152*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str x1, [x0, #16]! 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 155*9880d681SAndroid Build Coastguard Worker %tmp = load i64*, i64** %out, align 8 156*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i64, i64* %tmp, i64 2 157*9880d681SAndroid Build Coastguard Worker store i64 %spacing, i64* %ptr, align 4 158*9880d681SAndroid Build Coastguard Worker ret i64 *%ptr 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine i32 * @pre32(i32** nocapture %out, i32 %spacing) nounwind noinline ssp { 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre32: 163*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w1, [x0, #8]! 165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 166*9880d681SAndroid Build Coastguard Worker %tmp = load i32*, i32** %out, align 8 167*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i32, i32* %tmp, i64 2 168*9880d681SAndroid Build Coastguard Worker store i32 %spacing, i32* %ptr, align 4 169*9880d681SAndroid Build Coastguard Worker ret i32 *%ptr 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine i16 * @pre16(i16** nocapture %out, i16 %spacing) nounwind noinline ssp { 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre16: 174*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh w1, [x0, #4]! 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 177*9880d681SAndroid Build Coastguard Worker %tmp = load i16*, i16** %out, align 8 178*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i16, i16* %tmp, i64 2 179*9880d681SAndroid Build Coastguard Worker store i16 %spacing, i16* %ptr, align 4 180*9880d681SAndroid Build Coastguard Worker ret i16 *%ptr 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Workerdefine i8 * @pre8(i8** nocapture %out, i8 %spacing) nounwind noinline ssp { 184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre8: 185*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb w1, [x0, #2]! 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 188*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %out, align 8 189*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i8, i8* %tmp, i64 2 190*9880d681SAndroid Build Coastguard Worker store i8 %spacing, i8* %ptr, align 4 191*9880d681SAndroid Build Coastguard Worker ret i8 *%ptr 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine i32 * @pretrunc64to32(i32** nocapture %out, i64 %spacing) nounwind noinline ssp { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pretrunc64to32: 196*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w1, [x0, #8]! 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 199*9880d681SAndroid Build Coastguard Worker %tmp = load i32*, i32** %out, align 8 200*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i32, i32* %tmp, i64 2 201*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %spacing to i32 202*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32* %ptr, align 4 203*9880d681SAndroid Build Coastguard Worker ret i32 *%ptr 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdefine i16 * @pretrunc64to16(i16** nocapture %out, i64 %spacing) nounwind noinline ssp { 207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pretrunc64to16: 208*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh w1, [x0, #4]! 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 211*9880d681SAndroid Build Coastguard Worker %tmp = load i16*, i16** %out, align 8 212*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i16, i16* %tmp, i64 2 213*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %spacing to i16 214*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16* %ptr, align 4 215*9880d681SAndroid Build Coastguard Worker ret i16 *%ptr 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Workerdefine i8 * @pretrunc64to8(i8** nocapture %out, i64 %spacing) nounwind noinline ssp { 219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pretrunc64to8: 220*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0] 221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb w1, [x0, #2]! 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 223*9880d681SAndroid Build Coastguard Worker %tmp = load i8*, i8** %out, align 8 224*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i8, i8* %tmp, i64 2 225*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %spacing to i8 226*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8* %ptr, align 4 227*9880d681SAndroid Build Coastguard Worker ret i8 *%ptr 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker;----- 231*9880d681SAndroid Build Coastguard Worker; Pre-indexed loads 232*9880d681SAndroid Build Coastguard Worker;----- 233*9880d681SAndroid Build Coastguard Workerdefine double* @preidxf64(double* %src, double* %out) { 234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidxf64: 235*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d0, [x0, #8]! 236*9880d681SAndroid Build Coastguard Worker; CHECK: str d0, [x1] 237*9880d681SAndroid Build Coastguard Worker; CHECK: ret 238*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds double, double* %src, i64 1 239*9880d681SAndroid Build Coastguard Worker %tmp = load double, double* %ptr, align 4 240*9880d681SAndroid Build Coastguard Worker store double %tmp, double* %out, align 4 241*9880d681SAndroid Build Coastguard Worker ret double* %ptr 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Workerdefine float* @preidxf32(float* %src, float* %out) { 245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidxf32: 246*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s0, [x0, #4]! 247*9880d681SAndroid Build Coastguard Worker; CHECK: str s0, [x1] 248*9880d681SAndroid Build Coastguard Worker; CHECK: ret 249*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds float, float* %src, i64 1 250*9880d681SAndroid Build Coastguard Worker %tmp = load float, float* %ptr, align 4 251*9880d681SAndroid Build Coastguard Worker store float %tmp, float* %out, align 4 252*9880d681SAndroid Build Coastguard Worker ret float* %ptr 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerdefine half* @preidxf16(half* %src, half* %out) { 256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidxf16: 257*9880d681SAndroid Build Coastguard Worker; CHECK: ldr h0, [x0, #2]! 258*9880d681SAndroid Build Coastguard Worker; CHECK: str h0, [x1] 259*9880d681SAndroid Build Coastguard Worker; CHECK: ret 260*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds half, half* %src, i64 1 261*9880d681SAndroid Build Coastguard Worker %tmp = load half, half* %ptr, align 2 262*9880d681SAndroid Build Coastguard Worker store half %tmp, half* %out, align 2 263*9880d681SAndroid Build Coastguard Worker ret half* %ptr 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Workerdefine i64* @preidx64(i64* %src, i64* %out) { 267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidx64: 268*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x[[REG:[0-9]+]], [x0, #8]! 269*9880d681SAndroid Build Coastguard Worker; CHECK: str x[[REG]], [x1] 270*9880d681SAndroid Build Coastguard Worker; CHECK: ret 271*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i64, i64* %src, i64 1 272*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* %ptr, align 4 273*9880d681SAndroid Build Coastguard Worker store i64 %tmp, i64* %out, align 4 274*9880d681SAndroid Build Coastguard Worker ret i64* %ptr 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdefine i32* @preidx32(i32* %src, i32* %out) { 278*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w[[REG:[0-9]+]], [x0, #4]! 279*9880d681SAndroid Build Coastguard Worker; CHECK: str w[[REG]], [x1] 280*9880d681SAndroid Build Coastguard Worker; CHECK: ret 281*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i32, i32* %src, i64 1 282*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %ptr, align 4 283*9880d681SAndroid Build Coastguard Worker store i32 %tmp, i32* %out, align 4 284*9880d681SAndroid Build Coastguard Worker ret i32* %ptr 285*9880d681SAndroid Build Coastguard Worker} 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16zext32(i16* %src, i32* %out) { 288*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh w[[REG:[0-9]+]], [x0, #2]! 289*9880d681SAndroid Build Coastguard Worker; CHECK: str w[[REG]], [x1] 290*9880d681SAndroid Build Coastguard Worker; CHECK: ret 291*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i16, i16* %src, i64 1 292*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %ptr, align 4 293*9880d681SAndroid Build Coastguard Worker %ext = zext i16 %tmp to i32 294*9880d681SAndroid Build Coastguard Worker store i32 %ext, i32* %out, align 4 295*9880d681SAndroid Build Coastguard Worker ret i16* %ptr 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16zext64(i16* %src, i64* %out) { 299*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh w[[REG:[0-9]+]], [x0, #2]! 300*9880d681SAndroid Build Coastguard Worker; CHECK: str x[[REG]], [x1] 301*9880d681SAndroid Build Coastguard Worker; CHECK: ret 302*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i16, i16* %src, i64 1 303*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %ptr, align 4 304*9880d681SAndroid Build Coastguard Worker %ext = zext i16 %tmp to i64 305*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64* %out, align 4 306*9880d681SAndroid Build Coastguard Worker ret i16* %ptr 307*9880d681SAndroid Build Coastguard Worker} 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8zext32(i8* %src, i32* %out) { 310*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w[[REG:[0-9]+]], [x0, #1]! 311*9880d681SAndroid Build Coastguard Worker; CHECK: str w[[REG]], [x1] 312*9880d681SAndroid Build Coastguard Worker; CHECK: ret 313*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i8, i8* %src, i64 1 314*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* %ptr, align 4 315*9880d681SAndroid Build Coastguard Worker %ext = zext i8 %tmp to i32 316*9880d681SAndroid Build Coastguard Worker store i32 %ext, i32* %out, align 4 317*9880d681SAndroid Build Coastguard Worker ret i8* %ptr 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8zext64(i8* %src, i64* %out) { 321*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w[[REG:[0-9]+]], [x0, #1]! 322*9880d681SAndroid Build Coastguard Worker; CHECK: str x[[REG]], [x1] 323*9880d681SAndroid Build Coastguard Worker; CHECK: ret 324*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i8, i8* %src, i64 1 325*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* %ptr, align 4 326*9880d681SAndroid Build Coastguard Worker %ext = zext i8 %tmp to i64 327*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64* %out, align 4 328*9880d681SAndroid Build Coastguard Worker ret i8* %ptr 329*9880d681SAndroid Build Coastguard Worker} 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Workerdefine i32* @preidx32sext64(i32* %src, i64* %out) { 332*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsw x[[REG:[0-9]+]], [x0, #4]! 333*9880d681SAndroid Build Coastguard Worker; CHECK: str x[[REG]], [x1] 334*9880d681SAndroid Build Coastguard Worker; CHECK: ret 335*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i32, i32* %src, i64 1 336*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %ptr, align 4 337*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %tmp to i64 338*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64* %out, align 8 339*9880d681SAndroid Build Coastguard Worker ret i32* %ptr 340*9880d681SAndroid Build Coastguard Worker} 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16sext32(i16* %src, i32* %out) { 343*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsh w[[REG:[0-9]+]], [x0, #2]! 344*9880d681SAndroid Build Coastguard Worker; CHECK: str w[[REG]], [x1] 345*9880d681SAndroid Build Coastguard Worker; CHECK: ret 346*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i16, i16* %src, i64 1 347*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %ptr, align 4 348*9880d681SAndroid Build Coastguard Worker %ext = sext i16 %tmp to i32 349*9880d681SAndroid Build Coastguard Worker store i32 %ext, i32* %out, align 4 350*9880d681SAndroid Build Coastguard Worker ret i16* %ptr 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16sext64(i16* %src, i64* %out) { 354*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsh x[[REG:[0-9]+]], [x0, #2]! 355*9880d681SAndroid Build Coastguard Worker; CHECK: str x[[REG]], [x1] 356*9880d681SAndroid Build Coastguard Worker; CHECK: ret 357*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i16, i16* %src, i64 1 358*9880d681SAndroid Build Coastguard Worker %tmp = load i16, i16* %ptr, align 4 359*9880d681SAndroid Build Coastguard Worker %ext = sext i16 %tmp to i64 360*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64* %out, align 4 361*9880d681SAndroid Build Coastguard Worker ret i16* %ptr 362*9880d681SAndroid Build Coastguard Worker} 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8sext32(i8* %src, i32* %out) { 365*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb w[[REG:[0-9]+]], [x0, #1]! 366*9880d681SAndroid Build Coastguard Worker; CHECK: str w[[REG]], [x1] 367*9880d681SAndroid Build Coastguard Worker; CHECK: ret 368*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i8, i8* %src, i64 1 369*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* %ptr, align 4 370*9880d681SAndroid Build Coastguard Worker %ext = sext i8 %tmp to i32 371*9880d681SAndroid Build Coastguard Worker store i32 %ext, i32* %out, align 4 372*9880d681SAndroid Build Coastguard Worker ret i8* %ptr 373*9880d681SAndroid Build Coastguard Worker} 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8sext64(i8* %src, i64* %out) { 376*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb x[[REG:[0-9]+]], [x0, #1]! 377*9880d681SAndroid Build Coastguard Worker; CHECK: str x[[REG]], [x1] 378*9880d681SAndroid Build Coastguard Worker; CHECK: ret 379*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i8, i8* %src, i64 1 380*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* %ptr, align 4 381*9880d681SAndroid Build Coastguard Worker %ext = sext i8 %tmp to i64 382*9880d681SAndroid Build Coastguard Worker store i64 %ext, i64* %out, align 4 383*9880d681SAndroid Build Coastguard Worker ret i8* %ptr 384*9880d681SAndroid Build Coastguard Worker} 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker; This test checks if illegal post-index is generated 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Workerdefine i64* @postidx_clobber(i64* %addr) nounwind noinline ssp { 389*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: postidx_clobber: 390*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: str x0, [x0], #8 391*9880d681SAndroid Build Coastguard Worker; ret 392*9880d681SAndroid Build Coastguard Worker %paddr = bitcast i64* %addr to i64** 393*9880d681SAndroid Build Coastguard Worker store i64* %addr, i64** %paddr 394*9880d681SAndroid Build Coastguard Worker %newaddr = getelementptr i64, i64* %addr, i32 1 395*9880d681SAndroid Build Coastguard Worker ret i64* %newaddr 396*9880d681SAndroid Build Coastguard Worker} 397