1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mattr=-fp-armv8 | FileCheck --check-prefix=CHECK-NOFP %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker@var_8bit = global i8 0 5*9880d681SAndroid Build Coastguard Worker@var_16bit = global i16 0 6*9880d681SAndroid Build Coastguard Worker@var_32bit = global i32 0 7*9880d681SAndroid Build Coastguard Worker@var_64bit = global i64 0 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker@var_float = global float 0.0 10*9880d681SAndroid Build Coastguard Worker@var_double = global double 0.0 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @ldst_8bit(i8* %base, i32 %off32, i64 %off64) minsize { 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_8bit: 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker %addr8_sxtw = getelementptr i8, i8* %base, i32 %off32 16*9880d681SAndroid Build Coastguard Worker %val8_sxtw = load volatile i8, i8* %addr8_sxtw 17*9880d681SAndroid Build Coastguard Worker %val32_signed = sext i8 %val8_sxtw to i32 18*9880d681SAndroid Build Coastguard Worker store volatile i32 %val32_signed, i32* @var_32bit 19*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb {{w[0-9]+}}, [{{x[0-9]+}}, {{[wx][0-9]+}}, sxtw] 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker %addr_lsl = getelementptr i8, i8* %base, i64 %off64 22*9880d681SAndroid Build Coastguard Worker %val8_lsl = load volatile i8, i8* %addr_lsl 23*9880d681SAndroid Build Coastguard Worker %val32_unsigned = zext i8 %val8_lsl to i32 24*9880d681SAndroid Build Coastguard Worker store volatile i32 %val32_unsigned, i32* @var_32bit 25*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint i8* %base to i64 28*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 29*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 30*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to i8* 31*9880d681SAndroid Build Coastguard Worker %val8_uxtw = load volatile i8, i8* %addr_uxtw 32*9880d681SAndroid Build Coastguard Worker %newval8 = add i8 %val8_uxtw, 1 33*9880d681SAndroid Build Coastguard Worker store volatile i8 %newval8, i8* @var_8bit 34*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine void @ldst_16bit(i16* %base, i32 %off32, i64 %off64) minsize { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_16bit: 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker %addr8_sxtwN = getelementptr i16, i16* %base, i32 %off32 44*9880d681SAndroid Build Coastguard Worker %val8_sxtwN = load volatile i16, i16* %addr8_sxtwN 45*9880d681SAndroid Build Coastguard Worker %val32_signed = sext i16 %val8_sxtwN to i32 46*9880d681SAndroid Build Coastguard Worker store volatile i32 %val32_signed, i32* @var_32bit 47*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsh {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #1] 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker %addr_lslN = getelementptr i16, i16* %base, i64 %off64 50*9880d681SAndroid Build Coastguard Worker %val8_lslN = load volatile i16, i16* %addr_lslN 51*9880d681SAndroid Build Coastguard Worker %val32_unsigned = zext i16 %val8_lslN to i32 52*9880d681SAndroid Build Coastguard Worker store volatile i32 %val32_unsigned, i32* @var_32bit 53*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #1] 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint i16* %base to i64 56*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 57*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 58*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to i16* 59*9880d681SAndroid Build Coastguard Worker %val8_uxtw = load volatile i16, i16* %addr_uxtw 60*9880d681SAndroid Build Coastguard Worker %newval8 = add i16 %val8_uxtw, 1 61*9880d681SAndroid Build Coastguard Worker store volatile i16 %newval8, i16* @var_16bit 62*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker %base_sxtw = ptrtoint i16* %base to i64 65*9880d681SAndroid Build Coastguard Worker %offset_sxtw = sext i32 %off32 to i64 66*9880d681SAndroid Build Coastguard Worker %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw 67*9880d681SAndroid Build Coastguard Worker %addr_sxtw = inttoptr i64 %addrint_sxtw to i16* 68*9880d681SAndroid Build Coastguard Worker %val16_sxtw = load volatile i16, i16* %addr_sxtw 69*9880d681SAndroid Build Coastguard Worker %val64_signed = sext i16 %val16_sxtw to i64 70*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64_signed, i64* @var_64bit 71*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsh {{x[0-9]+}}, [{{x[0-9]+}}, {{[wx][0-9]+}}, sxtw] 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker %base_lsl = ptrtoint i16* %base to i64 75*9880d681SAndroid Build Coastguard Worker %addrint_lsl = add i64 %base_lsl, %off64 76*9880d681SAndroid Build Coastguard Worker %addr_lsl = inttoptr i64 %addrint_lsl to i16* 77*9880d681SAndroid Build Coastguard Worker %val16_lsl = load volatile i16, i16* %addr_lsl 78*9880d681SAndroid Build Coastguard Worker %val64_unsigned = zext i16 %val16_lsl to i64 79*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64_unsigned, i64* @var_64bit 80*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker %base_uxtwN = ptrtoint i16* %base to i64 83*9880d681SAndroid Build Coastguard Worker %offset_uxtwN = zext i32 %off32 to i64 84*9880d681SAndroid Build Coastguard Worker %offset2_uxtwN = shl i64 %offset_uxtwN, 1 85*9880d681SAndroid Build Coastguard Worker %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN 86*9880d681SAndroid Build Coastguard Worker %addr_uxtwN = inttoptr i64 %addrint_uxtwN to i16* 87*9880d681SAndroid Build Coastguard Worker %val32 = load volatile i32, i32* @var_32bit 88*9880d681SAndroid Build Coastguard Worker %val16_trunc32 = trunc i32 %val32 to i16 89*9880d681SAndroid Build Coastguard Worker store volatile i16 %val16_trunc32, i16* %addr_uxtwN 90*9880d681SAndroid Build Coastguard Worker; CHECK: strh {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw #1] 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine void @ldst_32bit(i32* %base, i32 %off32, i64 %off64) minsize { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_32bit: 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker %addr_sxtwN = getelementptr i32, i32* %base, i32 %off32 98*9880d681SAndroid Build Coastguard Worker %val_sxtwN = load volatile i32, i32* %addr_sxtwN 99*9880d681SAndroid Build Coastguard Worker store volatile i32 %val_sxtwN, i32* @var_32bit 100*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #2] 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker %addr_lslN = getelementptr i32, i32* %base, i64 %off64 103*9880d681SAndroid Build Coastguard Worker %val_lslN = load volatile i32, i32* %addr_lslN 104*9880d681SAndroid Build Coastguard Worker store volatile i32 %val_lslN, i32* @var_32bit 105*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #2] 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint i32* %base to i64 108*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 109*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 110*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to i32* 111*9880d681SAndroid Build Coastguard Worker %val_uxtw = load volatile i32, i32* %addr_uxtw 112*9880d681SAndroid Build Coastguard Worker %newval8 = add i32 %val_uxtw, 1 113*9880d681SAndroid Build Coastguard Worker store volatile i32 %newval8, i32* @var_32bit 114*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker %base_sxtw = ptrtoint i32* %base to i64 118*9880d681SAndroid Build Coastguard Worker %offset_sxtw = sext i32 %off32 to i64 119*9880d681SAndroid Build Coastguard Worker %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw 120*9880d681SAndroid Build Coastguard Worker %addr_sxtw = inttoptr i64 %addrint_sxtw to i32* 121*9880d681SAndroid Build Coastguard Worker %val16_sxtw = load volatile i32, i32* %addr_sxtw 122*9880d681SAndroid Build Coastguard Worker %val64_signed = sext i32 %val16_sxtw to i64 123*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64_signed, i64* @var_64bit 124*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsw {{x[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw] 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker %base_lsl = ptrtoint i32* %base to i64 128*9880d681SAndroid Build Coastguard Worker %addrint_lsl = add i64 %base_lsl, %off64 129*9880d681SAndroid Build Coastguard Worker %addr_lsl = inttoptr i64 %addrint_lsl to i32* 130*9880d681SAndroid Build Coastguard Worker %val16_lsl = load volatile i32, i32* %addr_lsl 131*9880d681SAndroid Build Coastguard Worker %val64_unsigned = zext i32 %val16_lsl to i64 132*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64_unsigned, i64* @var_64bit 133*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker %base_uxtwN = ptrtoint i32* %base to i64 136*9880d681SAndroid Build Coastguard Worker %offset_uxtwN = zext i32 %off32 to i64 137*9880d681SAndroid Build Coastguard Worker %offset2_uxtwN = shl i64 %offset_uxtwN, 2 138*9880d681SAndroid Build Coastguard Worker %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN 139*9880d681SAndroid Build Coastguard Worker %addr_uxtwN = inttoptr i64 %addrint_uxtwN to i32* 140*9880d681SAndroid Build Coastguard Worker %val32 = load volatile i32, i32* @var_32bit 141*9880d681SAndroid Build Coastguard Worker store volatile i32 %val32, i32* %addr_uxtwN 142*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw #2] 143*9880d681SAndroid Build Coastguard Worker ret void 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine void @ldst_64bit(i64* %base, i32 %off32, i64 %off64) minsize { 147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_64bit: 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker %addr_sxtwN = getelementptr i64, i64* %base, i32 %off32 150*9880d681SAndroid Build Coastguard Worker %val_sxtwN = load volatile i64, i64* %addr_sxtwN 151*9880d681SAndroid Build Coastguard Worker store volatile i64 %val_sxtwN, i64* @var_64bit 152*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #3] 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker %addr_lslN = getelementptr i64, i64* %base, i64 %off64 155*9880d681SAndroid Build Coastguard Worker %val_lslN = load volatile i64, i64* %addr_lslN 156*9880d681SAndroid Build Coastguard Worker store volatile i64 %val_lslN, i64* @var_64bit 157*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #3] 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint i64* %base to i64 160*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 161*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 162*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to i64* 163*9880d681SAndroid Build Coastguard Worker %val8_uxtw = load volatile i64, i64* %addr_uxtw 164*9880d681SAndroid Build Coastguard Worker %newval8 = add i64 %val8_uxtw, 1 165*9880d681SAndroid Build Coastguard Worker store volatile i64 %newval8, i64* @var_64bit 166*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker %base_sxtw = ptrtoint i64* %base to i64 169*9880d681SAndroid Build Coastguard Worker %offset_sxtw = sext i32 %off32 to i64 170*9880d681SAndroid Build Coastguard Worker %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw 171*9880d681SAndroid Build Coastguard Worker %addr_sxtw = inttoptr i64 %addrint_sxtw to i64* 172*9880d681SAndroid Build Coastguard Worker %val64_sxtw = load volatile i64, i64* %addr_sxtw 173*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64_sxtw, i64* @var_64bit 174*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw] 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Worker %base_lsl = ptrtoint i64* %base to i64 177*9880d681SAndroid Build Coastguard Worker %addrint_lsl = add i64 %base_lsl, %off64 178*9880d681SAndroid Build Coastguard Worker %addr_lsl = inttoptr i64 %addrint_lsl to i64* 179*9880d681SAndroid Build Coastguard Worker %val64_lsl = load volatile i64, i64* %addr_lsl 180*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64_lsl, i64* @var_64bit 181*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker %base_uxtwN = ptrtoint i64* %base to i64 184*9880d681SAndroid Build Coastguard Worker %offset_uxtwN = zext i32 %off32 to i64 185*9880d681SAndroid Build Coastguard Worker %offset2_uxtwN = shl i64 %offset_uxtwN, 3 186*9880d681SAndroid Build Coastguard Worker %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN 187*9880d681SAndroid Build Coastguard Worker %addr_uxtwN = inttoptr i64 %addrint_uxtwN to i64* 188*9880d681SAndroid Build Coastguard Worker %val64 = load volatile i64, i64* @var_64bit 189*9880d681SAndroid Build Coastguard Worker store volatile i64 %val64, i64* %addr_uxtwN 190*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw #3] 191*9880d681SAndroid Build Coastguard Worker ret void 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine void @ldst_float(float* %base, i32 %off32, i64 %off64) minsize { 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_float: 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker %addr_sxtwN = getelementptr float, float* %base, i32 %off32 198*9880d681SAndroid Build Coastguard Worker %val_sxtwN = load volatile float, float* %addr_sxtwN 199*9880d681SAndroid Build Coastguard Worker store volatile float %val_sxtwN, float* @var_float 200*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #2] 201*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{s[0-9]+}}, 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker %addr_lslN = getelementptr float, float* %base, i64 %off64 204*9880d681SAndroid Build Coastguard Worker %val_lslN = load volatile float, float* %addr_lslN 205*9880d681SAndroid Build Coastguard Worker store volatile float %val_lslN, float* @var_float 206*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #2] 207*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{s[0-9]+}}, 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint float* %base to i64 210*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 211*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 212*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to float* 213*9880d681SAndroid Build Coastguard Worker %val_uxtw = load volatile float, float* %addr_uxtw 214*9880d681SAndroid Build Coastguard Worker store volatile float %val_uxtw, float* @var_float 215*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 216*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{s[0-9]+}}, 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker %base_sxtw = ptrtoint float* %base to i64 219*9880d681SAndroid Build Coastguard Worker %offset_sxtw = sext i32 %off32 to i64 220*9880d681SAndroid Build Coastguard Worker %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw 221*9880d681SAndroid Build Coastguard Worker %addr_sxtw = inttoptr i64 %addrint_sxtw to float* 222*9880d681SAndroid Build Coastguard Worker %val64_sxtw = load volatile float, float* %addr_sxtw 223*9880d681SAndroid Build Coastguard Worker store volatile float %val64_sxtw, float* @var_float 224*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw] 225*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{s[0-9]+}}, 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker %base_lsl = ptrtoint float* %base to i64 228*9880d681SAndroid Build Coastguard Worker %addrint_lsl = add i64 %base_lsl, %off64 229*9880d681SAndroid Build Coastguard Worker %addr_lsl = inttoptr i64 %addrint_lsl to float* 230*9880d681SAndroid Build Coastguard Worker %val64_lsl = load volatile float, float* %addr_lsl 231*9880d681SAndroid Build Coastguard Worker store volatile float %val64_lsl, float* @var_float 232*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{s[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 233*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{s[0-9]+}}, 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker %base_uxtwN = ptrtoint float* %base to i64 236*9880d681SAndroid Build Coastguard Worker %offset_uxtwN = zext i32 %off32 to i64 237*9880d681SAndroid Build Coastguard Worker %offset2_uxtwN = shl i64 %offset_uxtwN, 2 238*9880d681SAndroid Build Coastguard Worker %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN 239*9880d681SAndroid Build Coastguard Worker %addr_uxtwN = inttoptr i64 %addrint_uxtwN to float* 240*9880d681SAndroid Build Coastguard Worker %val64 = load volatile float, float* @var_float 241*9880d681SAndroid Build Coastguard Worker store volatile float %val64, float* %addr_uxtwN 242*9880d681SAndroid Build Coastguard Worker; CHECK: str {{s[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw #2] 243*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{s[0-9]+}}, 244*9880d681SAndroid Build Coastguard Worker ret void 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine void @ldst_double(double* %base, i32 %off32, i64 %off64) minsize { 248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_double: 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker %addr_sxtwN = getelementptr double, double* %base, i32 %off32 251*9880d681SAndroid Build Coastguard Worker %val_sxtwN = load volatile double, double* %addr_sxtwN 252*9880d681SAndroid Build Coastguard Worker store volatile double %val_sxtwN, double* @var_double 253*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #3] 254*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{d[0-9]+}}, 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker %addr_lslN = getelementptr double, double* %base, i64 %off64 257*9880d681SAndroid Build Coastguard Worker %val_lslN = load volatile double, double* %addr_lslN 258*9880d681SAndroid Build Coastguard Worker store volatile double %val_lslN, double* @var_double 259*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #3] 260*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{d[0-9]+}}, 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint double* %base to i64 263*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 264*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 265*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to double* 266*9880d681SAndroid Build Coastguard Worker %val_uxtw = load volatile double, double* %addr_uxtw 267*9880d681SAndroid Build Coastguard Worker store volatile double %val_uxtw, double* @var_double 268*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 269*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{d[0-9]+}}, 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker %base_sxtw = ptrtoint double* %base to i64 272*9880d681SAndroid Build Coastguard Worker %offset_sxtw = sext i32 %off32 to i64 273*9880d681SAndroid Build Coastguard Worker %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw 274*9880d681SAndroid Build Coastguard Worker %addr_sxtw = inttoptr i64 %addrint_sxtw to double* 275*9880d681SAndroid Build Coastguard Worker %val64_sxtw = load volatile double, double* %addr_sxtw 276*9880d681SAndroid Build Coastguard Worker store volatile double %val64_sxtw, double* @var_double 277*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw] 278*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{d[0-9]+}}, 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker %base_lsl = ptrtoint double* %base to i64 281*9880d681SAndroid Build Coastguard Worker %addrint_lsl = add i64 %base_lsl, %off64 282*9880d681SAndroid Build Coastguard Worker %addr_lsl = inttoptr i64 %addrint_lsl to double* 283*9880d681SAndroid Build Coastguard Worker %val64_lsl = load volatile double, double* %addr_lsl 284*9880d681SAndroid Build Coastguard Worker store volatile double %val64_lsl, double* @var_double 285*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 286*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{d[0-9]+}}, 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker %base_uxtwN = ptrtoint double* %base to i64 289*9880d681SAndroid Build Coastguard Worker %offset_uxtwN = zext i32 %off32 to i64 290*9880d681SAndroid Build Coastguard Worker %offset2_uxtwN = shl i64 %offset_uxtwN, 3 291*9880d681SAndroid Build Coastguard Worker %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN 292*9880d681SAndroid Build Coastguard Worker %addr_uxtwN = inttoptr i64 %addrint_uxtwN to double* 293*9880d681SAndroid Build Coastguard Worker %val64 = load volatile double, double* @var_double 294*9880d681SAndroid Build Coastguard Worker store volatile double %val64, double* %addr_uxtwN 295*9880d681SAndroid Build Coastguard Worker; CHECK: str {{d[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw #3] 296*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{d[0-9]+}}, 297*9880d681SAndroid Build Coastguard Worker ret void 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerdefine void @ldst_128bit(fp128* %base, i32 %off32, i64 %off64) minsize { 302*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldst_128bit: 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker %addr_sxtwN = getelementptr fp128, fp128* %base, i32 %off32 305*9880d681SAndroid Build Coastguard Worker %val_sxtwN = load volatile fp128, fp128* %addr_sxtwN 306*9880d681SAndroid Build Coastguard Worker store volatile fp128 %val_sxtwN, fp128* %base 307*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 308*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Worker %addr_lslN = getelementptr fp128, fp128* %base, i64 %off64 311*9880d681SAndroid Build Coastguard Worker %val_lslN = load volatile fp128, fp128* %addr_lslN 312*9880d681SAndroid Build Coastguard Worker store volatile fp128 %val_lslN, fp128* %base 313*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}, lsl #4] 314*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker %addrint_uxtw = ptrtoint fp128* %base to i64 317*9880d681SAndroid Build Coastguard Worker %offset_uxtw = zext i32 %off32 to i64 318*9880d681SAndroid Build Coastguard Worker %addrint1_uxtw = add i64 %addrint_uxtw, %offset_uxtw 319*9880d681SAndroid Build Coastguard Worker %addr_uxtw = inttoptr i64 %addrint1_uxtw to fp128* 320*9880d681SAndroid Build Coastguard Worker %val_uxtw = load volatile fp128, fp128* %addr_uxtw 321*9880d681SAndroid Build Coastguard Worker store volatile fp128 %val_uxtw, fp128* %base 322*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw] 323*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker %base_sxtw = ptrtoint fp128* %base to i64 326*9880d681SAndroid Build Coastguard Worker %offset_sxtw = sext i32 %off32 to i64 327*9880d681SAndroid Build Coastguard Worker %addrint_sxtw = add i64 %base_sxtw, %offset_sxtw 328*9880d681SAndroid Build Coastguard Worker %addr_sxtw = inttoptr i64 %addrint_sxtw to fp128* 329*9880d681SAndroid Build Coastguard Worker %val64_sxtw = load volatile fp128, fp128* %addr_sxtw 330*9880d681SAndroid Build Coastguard Worker store volatile fp128 %val64_sxtw, fp128* %base 331*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw] 332*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker %base_lsl = ptrtoint fp128* %base to i64 335*9880d681SAndroid Build Coastguard Worker %addrint_lsl = add i64 %base_lsl, %off64 336*9880d681SAndroid Build Coastguard Worker %addr_lsl = inttoptr i64 %addrint_lsl to fp128* 337*9880d681SAndroid Build Coastguard Worker %val64_lsl = load volatile fp128, fp128* %addr_lsl 338*9880d681SAndroid Build Coastguard Worker store volatile fp128 %val64_lsl, fp128* %base 339*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{x[0-9]+}}] 340*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker %base_uxtwN = ptrtoint fp128* %base to i64 343*9880d681SAndroid Build Coastguard Worker %offset_uxtwN = zext i32 %off32 to i64 344*9880d681SAndroid Build Coastguard Worker %offset2_uxtwN = shl i64 %offset_uxtwN, 4 345*9880d681SAndroid Build Coastguard Worker %addrint_uxtwN = add i64 %base_uxtwN, %offset2_uxtwN 346*9880d681SAndroid Build Coastguard Worker %addr_uxtwN = inttoptr i64 %addrint_uxtwN to fp128* 347*9880d681SAndroid Build Coastguard Worker %val64 = load volatile fp128, fp128* %base 348*9880d681SAndroid Build Coastguard Worker store volatile fp128 %val64, fp128* %addr_uxtwN 349*9880d681SAndroid Build Coastguard Worker; CHECK: str {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, uxtw #4] 350*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-NOT: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{[xw][0-9]+}}, sxtw #4] 351*9880d681SAndroid Build Coastguard Worker ret void 352*9880d681SAndroid Build Coastguard Worker} 353