1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs %s -o - -mtriple=aarch64-linux-gnu -aarch64-atomic-cfg-tidy=0 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@var8 = global i8 0 4*9880d681SAndroid Build Coastguard Worker@var16 = global i16 0 5*9880d681SAndroid Build Coastguard Worker@var32 = global i32 0 6*9880d681SAndroid Build Coastguard Worker@var64 = global i64 0 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine void @addsub_i8rhs() minsize { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: addsub_i8rhs: 10*9880d681SAndroid Build Coastguard Worker %val8_tmp = load i8, i8* @var8 11*9880d681SAndroid Build Coastguard Worker %lhs32 = load i32, i32* @var32 12*9880d681SAndroid Build Coastguard Worker %lhs64 = load i64, i64* @var64 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker ; Need this to prevent extension upon load and give a vanilla i8 operand. 15*9880d681SAndroid Build Coastguard Worker %val8 = add i8 %val8_tmp, 123 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Zero-extending to 32-bits 19*9880d681SAndroid Build Coastguard Worker %rhs32_zext = zext i8 %val8 to i32 20*9880d681SAndroid Build Coastguard Worker %res32_zext = add i32 %lhs32, %rhs32_zext 21*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext, i32* @var32 22*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxtb 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker %rhs32_zext_shift = shl i32 %rhs32_zext, 3 25*9880d681SAndroid Build Coastguard Worker %res32_zext_shift = add i32 %lhs32, %rhs32_zext_shift 26*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext_shift, i32* @var32 27*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxtb #3 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; Zero-extending to 64-bits 31*9880d681SAndroid Build Coastguard Worker %rhs64_zext = zext i8 %val8 to i64 32*9880d681SAndroid Build Coastguard Worker %res64_zext = add i64 %lhs64, %rhs64_zext 33*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext, i64* @var64 34*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtb 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker %rhs64_zext_shift = shl i64 %rhs64_zext, 1 37*9880d681SAndroid Build Coastguard Worker %res64_zext_shift = add i64 %lhs64, %rhs64_zext_shift 38*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext_shift, i64* @var64 39*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtb #1 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; Sign-extending to 32-bits 42*9880d681SAndroid Build Coastguard Worker %rhs32_sext = sext i8 %val8 to i32 43*9880d681SAndroid Build Coastguard Worker %res32_sext = add i32 %lhs32, %rhs32_sext 44*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext, i32* @var32 45*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxtb 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker %rhs32_sext_shift = shl i32 %rhs32_sext, 1 48*9880d681SAndroid Build Coastguard Worker %res32_sext_shift = add i32 %lhs32, %rhs32_sext_shift 49*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext_shift, i32* @var32 50*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxtb #1 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; Sign-extending to 64-bits 53*9880d681SAndroid Build Coastguard Worker %rhs64_sext = sext i8 %val8 to i64 54*9880d681SAndroid Build Coastguard Worker %res64_sext = add i64 %lhs64, %rhs64_sext 55*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext, i64* @var64 56*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtb 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker %rhs64_sext_shift = shl i64 %rhs64_sext, 4 59*9880d681SAndroid Build Coastguard Worker %res64_sext_shift = add i64 %lhs64, %rhs64_sext_shift 60*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext_shift, i64* @var64 61*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtb #4 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CMP variants 65*9880d681SAndroid Build Coastguard Worker %tst = icmp slt i32 %lhs32, %rhs32_zext 66*9880d681SAndroid Build Coastguard Worker br i1 %tst, label %end, label %test2 67*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, uxtb 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workertest2: 70*9880d681SAndroid Build Coastguard Worker %cmp_sext = sext i8 %val8 to i64 71*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i64 %lhs64, %cmp_sext 72*9880d681SAndroid Build Coastguard Worker br i1 %tst2, label %other, label %end 73*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{x[0-9]+}}, {{w[0-9]+}}, sxtb 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerother: 76*9880d681SAndroid Build Coastguard Worker store volatile i32 %lhs32, i32* @var32 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerend: 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine void @sub_i8rhs() minsize { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub_i8rhs: 85*9880d681SAndroid Build Coastguard Worker %val8_tmp = load i8, i8* @var8 86*9880d681SAndroid Build Coastguard Worker %lhs32 = load i32, i32* @var32 87*9880d681SAndroid Build Coastguard Worker %lhs64 = load i64, i64* @var64 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker ; Need this to prevent extension upon load and give a vanilla i8 operand. 90*9880d681SAndroid Build Coastguard Worker %val8 = add i8 %val8_tmp, 123 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; Zero-extending to 32-bits 94*9880d681SAndroid Build Coastguard Worker %rhs32_zext = zext i8 %val8 to i32 95*9880d681SAndroid Build Coastguard Worker %res32_zext = sub i32 %lhs32, %rhs32_zext 96*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext, i32* @var32 97*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxtb 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker %rhs32_zext_shift = shl i32 %rhs32_zext, 3 100*9880d681SAndroid Build Coastguard Worker %res32_zext_shift = sub i32 %lhs32, %rhs32_zext_shift 101*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext_shift, i32* @var32 102*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxtb #3 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Zero-extending to 64-bits 106*9880d681SAndroid Build Coastguard Worker %rhs64_zext = zext i8 %val8 to i64 107*9880d681SAndroid Build Coastguard Worker %res64_zext = sub i64 %lhs64, %rhs64_zext 108*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext, i64* @var64 109*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtb 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker %rhs64_zext_shift = shl i64 %rhs64_zext, 1 112*9880d681SAndroid Build Coastguard Worker %res64_zext_shift = sub i64 %lhs64, %rhs64_zext_shift 113*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext_shift, i64* @var64 114*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtb #1 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; Sign-extending to 32-bits 117*9880d681SAndroid Build Coastguard Worker %rhs32_sext = sext i8 %val8 to i32 118*9880d681SAndroid Build Coastguard Worker %res32_sext = sub i32 %lhs32, %rhs32_sext 119*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext, i32* @var32 120*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxtb 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker %rhs32_sext_shift = shl i32 %rhs32_sext, 1 123*9880d681SAndroid Build Coastguard Worker %res32_sext_shift = sub i32 %lhs32, %rhs32_sext_shift 124*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext_shift, i32* @var32 125*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxtb #1 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; Sign-extending to 64-bits 128*9880d681SAndroid Build Coastguard Worker %rhs64_sext = sext i8 %val8 to i64 129*9880d681SAndroid Build Coastguard Worker %res64_sext = sub i64 %lhs64, %rhs64_sext 130*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext, i64* @var64 131*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtb 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker %rhs64_sext_shift = shl i64 %rhs64_sext, 4 134*9880d681SAndroid Build Coastguard Worker %res64_sext_shift = sub i64 %lhs64, %rhs64_sext_shift 135*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext_shift, i64* @var64 136*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtb #4 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine void @addsub_i16rhs() minsize { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: addsub_i16rhs: 143*9880d681SAndroid Build Coastguard Worker %val16_tmp = load i16, i16* @var16 144*9880d681SAndroid Build Coastguard Worker %lhs32 = load i32, i32* @var32 145*9880d681SAndroid Build Coastguard Worker %lhs64 = load i64, i64* @var64 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker ; Need this to prevent extension upon load and give a vanilla i16 operand. 148*9880d681SAndroid Build Coastguard Worker %val16 = add i16 %val16_tmp, 123 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; Zero-extending to 32-bits 152*9880d681SAndroid Build Coastguard Worker %rhs32_zext = zext i16 %val16 to i32 153*9880d681SAndroid Build Coastguard Worker %res32_zext = add i32 %lhs32, %rhs32_zext 154*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext, i32* @var32 155*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxth 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker %rhs32_zext_shift = shl i32 %rhs32_zext, 3 158*9880d681SAndroid Build Coastguard Worker %res32_zext_shift = add i32 %lhs32, %rhs32_zext_shift 159*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext_shift, i32* @var32 160*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxth #3 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker; Zero-extending to 64-bits 164*9880d681SAndroid Build Coastguard Worker %rhs64_zext = zext i16 %val16 to i64 165*9880d681SAndroid Build Coastguard Worker %res64_zext = add i64 %lhs64, %rhs64_zext 166*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext, i64* @var64 167*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxth 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker %rhs64_zext_shift = shl i64 %rhs64_zext, 1 170*9880d681SAndroid Build Coastguard Worker %res64_zext_shift = add i64 %lhs64, %rhs64_zext_shift 171*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext_shift, i64* @var64 172*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxth #1 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker; Sign-extending to 32-bits 175*9880d681SAndroid Build Coastguard Worker %rhs32_sext = sext i16 %val16 to i32 176*9880d681SAndroid Build Coastguard Worker %res32_sext = add i32 %lhs32, %rhs32_sext 177*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext, i32* @var32 178*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker %rhs32_sext_shift = shl i32 %rhs32_sext, 1 181*9880d681SAndroid Build Coastguard Worker %res32_sext_shift = add i32 %lhs32, %rhs32_sext_shift 182*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext_shift, i32* @var32 183*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth #1 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; Sign-extending to 64-bits 186*9880d681SAndroid Build Coastguard Worker %rhs64_sext = sext i16 %val16 to i64 187*9880d681SAndroid Build Coastguard Worker %res64_sext = add i64 %lhs64, %rhs64_sext 188*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext, i64* @var64 189*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxth 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker %rhs64_sext_shift = shl i64 %rhs64_sext, 4 192*9880d681SAndroid Build Coastguard Worker %res64_sext_shift = add i64 %lhs64, %rhs64_sext_shift 193*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext_shift, i64* @var64 194*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxth #4 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker; CMP variants 198*9880d681SAndroid Build Coastguard Worker %tst = icmp slt i32 %lhs32, %rhs32_zext 199*9880d681SAndroid Build Coastguard Worker br i1 %tst, label %end, label %test2 200*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, uxth 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workertest2: 203*9880d681SAndroid Build Coastguard Worker %cmp_sext = sext i16 %val16 to i64 204*9880d681SAndroid Build Coastguard Worker %tst2 = icmp eq i64 %lhs64, %cmp_sext 205*9880d681SAndroid Build Coastguard Worker br i1 %tst2, label %other, label %end 206*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{x[0-9]+}}, {{w[0-9]+}}, sxth 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerother: 209*9880d681SAndroid Build Coastguard Worker store volatile i32 %lhs32, i32* @var32 210*9880d681SAndroid Build Coastguard Worker ret void 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerend: 213*9880d681SAndroid Build Coastguard Worker ret void 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine void @sub_i16rhs() minsize { 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub_i16rhs: 218*9880d681SAndroid Build Coastguard Worker %val16_tmp = load i16, i16* @var16 219*9880d681SAndroid Build Coastguard Worker %lhs32 = load i32, i32* @var32 220*9880d681SAndroid Build Coastguard Worker %lhs64 = load i64, i64* @var64 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker ; Need this to prevent extension upon load and give a vanilla i16 operand. 223*9880d681SAndroid Build Coastguard Worker %val16 = add i16 %val16_tmp, 123 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker; Zero-extending to 32-bits 227*9880d681SAndroid Build Coastguard Worker %rhs32_zext = zext i16 %val16 to i32 228*9880d681SAndroid Build Coastguard Worker %res32_zext = sub i32 %lhs32, %rhs32_zext 229*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext, i32* @var32 230*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxth 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker %rhs32_zext_shift = shl i32 %rhs32_zext, 3 233*9880d681SAndroid Build Coastguard Worker %res32_zext_shift = sub i32 %lhs32, %rhs32_zext_shift 234*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_zext_shift, i32* @var32 235*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, uxth #3 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker; Zero-extending to 64-bits 239*9880d681SAndroid Build Coastguard Worker %rhs64_zext = zext i16 %val16 to i64 240*9880d681SAndroid Build Coastguard Worker %res64_zext = sub i64 %lhs64, %rhs64_zext 241*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext, i64* @var64 242*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxth 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker %rhs64_zext_shift = shl i64 %rhs64_zext, 1 245*9880d681SAndroid Build Coastguard Worker %res64_zext_shift = sub i64 %lhs64, %rhs64_zext_shift 246*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext_shift, i64* @var64 247*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxth #1 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker; Sign-extending to 32-bits 250*9880d681SAndroid Build Coastguard Worker %rhs32_sext = sext i16 %val16 to i32 251*9880d681SAndroid Build Coastguard Worker %res32_sext = sub i32 %lhs32, %rhs32_sext 252*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext, i32* @var32 253*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker %rhs32_sext_shift = shl i32 %rhs32_sext, 1 256*9880d681SAndroid Build Coastguard Worker %res32_sext_shift = sub i32 %lhs32, %rhs32_sext_shift 257*9880d681SAndroid Build Coastguard Worker store volatile i32 %res32_sext_shift, i32* @var32 258*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, sxth #1 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker; Sign-extending to 64-bits 261*9880d681SAndroid Build Coastguard Worker %rhs64_sext = sext i16 %val16 to i64 262*9880d681SAndroid Build Coastguard Worker %res64_sext = sub i64 %lhs64, %rhs64_sext 263*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext, i64* @var64 264*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxth 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker %rhs64_sext_shift = shl i64 %rhs64_sext, 4 267*9880d681SAndroid Build Coastguard Worker %res64_sext_shift = sub i64 %lhs64, %rhs64_sext_shift 268*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext_shift, i64* @var64 269*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxth #4 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker ret void 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker; N.b. we could probably check more here ("add w2, w3, w1, uxtw" for 275*9880d681SAndroid Build Coastguard Worker; example), but the remaining instructions are probably not idiomatic 276*9880d681SAndroid Build Coastguard Worker; in the face of "add/sub (shifted register)" so I don't intend to. 277*9880d681SAndroid Build Coastguard Workerdefine void @addsub_i32rhs() minsize { 278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: addsub_i32rhs: 279*9880d681SAndroid Build Coastguard Worker %val32_tmp = load i32, i32* @var32 280*9880d681SAndroid Build Coastguard Worker %lhs64 = load i64, i64* @var64 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker %val32 = add i32 %val32_tmp, 123 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker %rhs64_zext = zext i32 %val32 to i64 285*9880d681SAndroid Build Coastguard Worker %res64_zext = add i64 %lhs64, %rhs64_zext 286*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext, i64* @var64 287*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtw 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Worker %rhs64_zext_shift = shl i64 %rhs64_zext, 2 290*9880d681SAndroid Build Coastguard Worker %res64_zext_shift = add i64 %lhs64, %rhs64_zext_shift 291*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext_shift, i64* @var64 292*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtw #2 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker %rhs64_sext = sext i32 %val32 to i64 295*9880d681SAndroid Build Coastguard Worker %res64_sext = add i64 %lhs64, %rhs64_sext 296*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext, i64* @var64 297*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker %rhs64_sext_shift = shl i64 %rhs64_sext, 2 300*9880d681SAndroid Build Coastguard Worker %res64_sext_shift = add i64 %lhs64, %rhs64_sext_shift 301*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext_shift, i64* @var64 302*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw #2 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker ret void 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerdefine void @sub_i32rhs() minsize { 308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sub_i32rhs: 309*9880d681SAndroid Build Coastguard Worker %val32_tmp = load i32, i32* @var32 310*9880d681SAndroid Build Coastguard Worker %lhs64 = load i64, i64* @var64 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker %val32 = add i32 %val32_tmp, 123 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker %rhs64_zext = zext i32 %val32 to i64 315*9880d681SAndroid Build Coastguard Worker %res64_zext = sub i64 %lhs64, %rhs64_zext 316*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext, i64* @var64 317*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtw 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker %rhs64_zext_shift = shl i64 %rhs64_zext, 2 320*9880d681SAndroid Build Coastguard Worker %res64_zext_shift = sub i64 %lhs64, %rhs64_zext_shift 321*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_zext_shift, i64* @var64 322*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, uxtw #2 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker %rhs64_sext = sext i32 %val32 to i64 325*9880d681SAndroid Build Coastguard Worker %res64_sext = sub i64 %lhs64, %rhs64_sext 326*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext, i64* @var64 327*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker %rhs64_sext_shift = shl i64 %rhs64_sext, 2 330*9880d681SAndroid Build Coastguard Worker %res64_sext_shift = sub i64 %lhs64, %rhs64_sext_shift 331*9880d681SAndroid Build Coastguard Worker store volatile i64 %res64_sext_shift, i64* @var64 332*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{w[0-9]+}}, sxtw #2 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker ret void 335*9880d681SAndroid Build Coastguard Worker} 336