1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs %s -o - -mtriple=arm64-apple-ios7.0 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@var32 = global i32 0 4*9880d681SAndroid Build Coastguard Worker@var64 = global i64 0 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @test_lsl_arith(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lsl_arith: 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker %rhs1 = load volatile i32, i32* @var32 10*9880d681SAndroid Build Coastguard Worker %shift1 = shl i32 %rhs1, 18 11*9880d681SAndroid Build Coastguard Worker %val1 = add i32 %lhs32, %shift1 12*9880d681SAndroid Build Coastguard Worker store volatile i32 %val1, i32* @var32 13*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #18 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker %rhs2 = load volatile i32, i32* @var32 16*9880d681SAndroid Build Coastguard Worker %shift2 = shl i32 %rhs2, 31 17*9880d681SAndroid Build Coastguard Worker %val2 = add i32 %shift2, %lhs32 18*9880d681SAndroid Build Coastguard Worker store volatile i32 %val2, i32* @var32 19*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #31 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker %rhs3 = load volatile i32, i32* @var32 22*9880d681SAndroid Build Coastguard Worker %shift3 = shl i32 %rhs3, 5 23*9880d681SAndroid Build Coastguard Worker %val3 = sub i32 %lhs32, %shift3 24*9880d681SAndroid Build Coastguard Worker store volatile i32 %val3, i32* @var32 25*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #5 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; Subtraction is not commutative! 28*9880d681SAndroid Build Coastguard Worker %rhs4 = load volatile i32, i32* @var32 29*9880d681SAndroid Build Coastguard Worker %shift4 = shl i32 %rhs4, 19 30*9880d681SAndroid Build Coastguard Worker %val4 = sub i32 %shift4, %lhs32 31*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4, i32* @var32 32*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsl #19 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker %lhs4a = load volatile i32, i32* @var32 35*9880d681SAndroid Build Coastguard Worker %shift4a = shl i32 %lhs4a, 15 36*9880d681SAndroid Build Coastguard Worker %val4a = sub i32 0, %shift4a 37*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4a, i32* @var32 38*9880d681SAndroid Build Coastguard Worker; CHECK: neg {{w[0-9]+}}, {{w[0-9]+}}, lsl #15 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker %rhs5 = load volatile i64, i64* @var64 41*9880d681SAndroid Build Coastguard Worker %shift5 = shl i64 %rhs5, 18 42*9880d681SAndroid Build Coastguard Worker %val5 = add i64 %lhs64, %shift5 43*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64* @var64 44*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #18 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker %rhs6 = load volatile i64, i64* @var64 47*9880d681SAndroid Build Coastguard Worker %shift6 = shl i64 %rhs6, 31 48*9880d681SAndroid Build Coastguard Worker %val6 = add i64 %shift6, %lhs64 49*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64* @var64 50*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #31 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker %rhs7 = load volatile i64, i64* @var64 53*9880d681SAndroid Build Coastguard Worker %shift7 = shl i64 %rhs7, 5 54*9880d681SAndroid Build Coastguard Worker %val7 = sub i64 %lhs64, %shift7 55*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64* @var64 56*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #5 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; Subtraction is not commutative! 59*9880d681SAndroid Build Coastguard Worker %rhs8 = load volatile i64, i64* @var64 60*9880d681SAndroid Build Coastguard Worker %shift8 = shl i64 %rhs8, 19 61*9880d681SAndroid Build Coastguard Worker %val8 = sub i64 %shift8, %lhs64 62*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8, i64* @var64 63*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsl #19 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker %lhs8a = load volatile i64, i64* @var64 66*9880d681SAndroid Build Coastguard Worker %shift8a = shl i64 %lhs8a, 60 67*9880d681SAndroid Build Coastguard Worker %val8a = sub i64 0, %shift8a 68*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8a, i64* @var64 69*9880d681SAndroid Build Coastguard Worker; CHECK: neg {{x[0-9]+}}, {{x[0-9]+}}, lsl #60 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker; CHECK: ret 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine void @test_lsr_arith(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lsr_arith: 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker %shift1 = lshr i32 %rhs32, 18 79*9880d681SAndroid Build Coastguard Worker %val1 = add i32 %lhs32, %shift1 80*9880d681SAndroid Build Coastguard Worker store volatile i32 %val1, i32* @var32 81*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #18 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker %shift2 = lshr i32 %rhs32, 31 84*9880d681SAndroid Build Coastguard Worker %val2 = add i32 %shift2, %lhs32 85*9880d681SAndroid Build Coastguard Worker store volatile i32 %val2, i32* @var32 86*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #31 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker %shift3 = lshr i32 %rhs32, 5 89*9880d681SAndroid Build Coastguard Worker %val3 = sub i32 %lhs32, %shift3 90*9880d681SAndroid Build Coastguard Worker store volatile i32 %val3, i32* @var32 91*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #5 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker; Subtraction is not commutative! 94*9880d681SAndroid Build Coastguard Worker %shift4 = lshr i32 %rhs32, 19 95*9880d681SAndroid Build Coastguard Worker %val4 = sub i32 %shift4, %lhs32 96*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4, i32* @var32 97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, lsr #19 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker %shift4a = lshr i32 %lhs32, 15 100*9880d681SAndroid Build Coastguard Worker %val4a = sub i32 0, %shift4a 101*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4a, i32* @var32 102*9880d681SAndroid Build Coastguard Worker; CHECK: neg {{w[0-9]+}}, {{w[0-9]+}}, lsr #15 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker %shift5 = lshr i64 %rhs64, 18 105*9880d681SAndroid Build Coastguard Worker %val5 = add i64 %lhs64, %shift5 106*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64* @var64 107*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #18 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker %shift6 = lshr i64 %rhs64, 31 110*9880d681SAndroid Build Coastguard Worker %val6 = add i64 %shift6, %lhs64 111*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64* @var64 112*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #31 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker %shift7 = lshr i64 %rhs64, 5 115*9880d681SAndroid Build Coastguard Worker %val7 = sub i64 %lhs64, %shift7 116*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64* @var64 117*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #5 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; Subtraction is not commutative! 120*9880d681SAndroid Build Coastguard Worker %shift8 = lshr i64 %rhs64, 19 121*9880d681SAndroid Build Coastguard Worker %val8 = sub i64 %shift8, %lhs64 122*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8, i64* @var64 123*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, lsr #19 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker %shift8a = lshr i64 %lhs64, 45 126*9880d681SAndroid Build Coastguard Worker %val8a = sub i64 0, %shift8a 127*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8a, i64* @var64 128*9880d681SAndroid Build Coastguard Worker; CHECK: neg {{x[0-9]+}}, {{x[0-9]+}}, lsr #45 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker ret void 131*9880d681SAndroid Build Coastguard Worker; CHECK: ret 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine void @test_asr_arith(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_asr_arith: 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker %shift1 = ashr i32 %rhs32, 18 138*9880d681SAndroid Build Coastguard Worker %val1 = add i32 %lhs32, %shift1 139*9880d681SAndroid Build Coastguard Worker store volatile i32 %val1, i32* @var32 140*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #18 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker %shift2 = ashr i32 %rhs32, 31 143*9880d681SAndroid Build Coastguard Worker %val2 = add i32 %shift2, %lhs32 144*9880d681SAndroid Build Coastguard Worker store volatile i32 %val2, i32* @var32 145*9880d681SAndroid Build Coastguard Worker; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #31 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker %shift3 = ashr i32 %rhs32, 5 148*9880d681SAndroid Build Coastguard Worker %val3 = sub i32 %lhs32, %shift3 149*9880d681SAndroid Build Coastguard Worker store volatile i32 %val3, i32* @var32 150*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #5 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; Subtraction is not commutative! 153*9880d681SAndroid Build Coastguard Worker %shift4 = ashr i32 %rhs32, 19 154*9880d681SAndroid Build Coastguard Worker %val4 = sub i32 %shift4, %lhs32 155*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4, i32* @var32 156*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sub {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, asr #19 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker %shift4a = ashr i32 %lhs32, 15 159*9880d681SAndroid Build Coastguard Worker %val4a = sub i32 0, %shift4a 160*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4a, i32* @var32 161*9880d681SAndroid Build Coastguard Worker; CHECK: neg {{w[0-9]+}}, {{w[0-9]+}}, asr #15 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker %shift5 = ashr i64 %rhs64, 18 164*9880d681SAndroid Build Coastguard Worker %val5 = add i64 %lhs64, %shift5 165*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64* @var64 166*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #18 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker %shift6 = ashr i64 %rhs64, 31 169*9880d681SAndroid Build Coastguard Worker %val6 = add i64 %shift6, %lhs64 170*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64* @var64 171*9880d681SAndroid Build Coastguard Worker; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #31 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker %shift7 = ashr i64 %rhs64, 5 174*9880d681SAndroid Build Coastguard Worker %val7 = sub i64 %lhs64, %shift7 175*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64* @var64 176*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #5 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; Subtraction is not commutative! 179*9880d681SAndroid Build Coastguard Worker %shift8 = ashr i64 %rhs64, 19 180*9880d681SAndroid Build Coastguard Worker %val8 = sub i64 %shift8, %lhs64 181*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8, i64* @var64 182*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sub {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}, asr #19 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker %shift8a = ashr i64 %lhs64, 45 185*9880d681SAndroid Build Coastguard Worker %val8a = sub i64 0, %shift8a 186*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8a, i64* @var64 187*9880d681SAndroid Build Coastguard Worker; CHECK: neg {{x[0-9]+}}, {{x[0-9]+}}, asr #45 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker ret void 190*9880d681SAndroid Build Coastguard Worker; CHECK: ret 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerdefine void @test_cmp(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64, i32 %v) { 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmp: 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker %shift1 = shl i32 %rhs32, 13 197*9880d681SAndroid Build Coastguard Worker %tst1 = icmp uge i32 %lhs32, %shift1 198*9880d681SAndroid Build Coastguard Worker br i1 %tst1, label %t2, label %end 199*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, lsl #13 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workert2: 202*9880d681SAndroid Build Coastguard Worker store volatile i32 %v, i32* @var32 203*9880d681SAndroid Build Coastguard Worker %shift2 = lshr i32 %rhs32, 20 204*9880d681SAndroid Build Coastguard Worker %tst2 = icmp ne i32 %lhs32, %shift2 205*9880d681SAndroid Build Coastguard Worker br i1 %tst2, label %t3, label %end 206*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, lsr #20 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workert3: 209*9880d681SAndroid Build Coastguard Worker store volatile i32 %v, i32* @var32 210*9880d681SAndroid Build Coastguard Worker %shift3 = ashr i32 %rhs32, 9 211*9880d681SAndroid Build Coastguard Worker %tst3 = icmp ne i32 %lhs32, %shift3 212*9880d681SAndroid Build Coastguard Worker br i1 %tst3, label %t4, label %end 213*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}, asr #9 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workert4: 216*9880d681SAndroid Build Coastguard Worker store volatile i32 %v, i32* @var32 217*9880d681SAndroid Build Coastguard Worker %shift4 = shl i64 %rhs64, 43 218*9880d681SAndroid Build Coastguard Worker %tst4 = icmp uge i64 %lhs64, %shift4 219*9880d681SAndroid Build Coastguard Worker br i1 %tst4, label %t5, label %end 220*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}}, lsl #43 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workert5: 223*9880d681SAndroid Build Coastguard Worker store volatile i32 %v, i32* @var32 224*9880d681SAndroid Build Coastguard Worker %shift5 = lshr i64 %rhs64, 20 225*9880d681SAndroid Build Coastguard Worker %tst5 = icmp ne i64 %lhs64, %shift5 226*9880d681SAndroid Build Coastguard Worker br i1 %tst5, label %t6, label %end 227*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}}, lsr #20 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workert6: 230*9880d681SAndroid Build Coastguard Worker store volatile i32 %v, i32* @var32 231*9880d681SAndroid Build Coastguard Worker %shift6 = ashr i64 %rhs64, 59 232*9880d681SAndroid Build Coastguard Worker %tst6 = icmp ne i64 %lhs64, %shift6 233*9880d681SAndroid Build Coastguard Worker br i1 %tst6, label %t7, label %end 234*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}}, asr #59 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workert7: 237*9880d681SAndroid Build Coastguard Worker store volatile i32 %v, i32* @var32 238*9880d681SAndroid Build Coastguard Worker br label %end 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerend: 241*9880d681SAndroid Build Coastguard Worker ret void 242*9880d681SAndroid Build Coastguard Worker; CHECK: ret 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cmn(i32 %lhs32, i32 %rhs32, i64 %lhs64, i64 %rhs64) { 246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmn: 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker %shift1 = shl i32 %rhs32, 13 249*9880d681SAndroid Build Coastguard Worker %val1 = sub i32 0, %shift1 250*9880d681SAndroid Build Coastguard Worker %tst1 = icmp uge i32 %lhs32, %val1 251*9880d681SAndroid Build Coastguard Worker br i1 %tst1, label %t2, label %end 252*9880d681SAndroid Build Coastguard Worker ; Important that this isn't lowered to a cmn instruction because if %rhs32 == 253*9880d681SAndroid Build Coastguard Worker ; 0 then the results will differ. 254*9880d681SAndroid Build Coastguard Worker; CHECK: neg [[RHS:w[0-9]+]], {{w[0-9]+}}, lsl #13 255*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{w[0-9]+}}, [[RHS]] 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workert2: 258*9880d681SAndroid Build Coastguard Worker %shift2 = lshr i32 %rhs32, 20 259*9880d681SAndroid Build Coastguard Worker %val2 = sub i32 0, %shift2 260*9880d681SAndroid Build Coastguard Worker %tst2 = icmp ne i32 %lhs32, %val2 261*9880d681SAndroid Build Coastguard Worker br i1 %tst2, label %t3, label %end 262*9880d681SAndroid Build Coastguard Worker; CHECK: cmn {{w[0-9]+}}, {{w[0-9]+}}, lsr #20 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workert3: 265*9880d681SAndroid Build Coastguard Worker %shift3 = ashr i32 %rhs32, 9 266*9880d681SAndroid Build Coastguard Worker %val3 = sub i32 0, %shift3 267*9880d681SAndroid Build Coastguard Worker %tst3 = icmp eq i32 %lhs32, %val3 268*9880d681SAndroid Build Coastguard Worker br i1 %tst3, label %t4, label %end 269*9880d681SAndroid Build Coastguard Worker; CHECK: cmn {{w[0-9]+}}, {{w[0-9]+}}, asr #9 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workert4: 272*9880d681SAndroid Build Coastguard Worker %shift4 = shl i64 %rhs64, 43 273*9880d681SAndroid Build Coastguard Worker %val4 = sub i64 0, %shift4 274*9880d681SAndroid Build Coastguard Worker %tst4 = icmp slt i64 %lhs64, %val4 275*9880d681SAndroid Build Coastguard Worker br i1 %tst4, label %t5, label %end 276*9880d681SAndroid Build Coastguard Worker ; Again, it's important that cmn isn't used here in case %rhs64 == 0. 277*9880d681SAndroid Build Coastguard Worker; CHECK: neg [[RHS:x[0-9]+]], {{x[0-9]+}}, lsl #43 278*9880d681SAndroid Build Coastguard Worker; CHECK: cmp {{x[0-9]+}}, [[RHS]] 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workert5: 281*9880d681SAndroid Build Coastguard Worker %shift5 = lshr i64 %rhs64, 20 282*9880d681SAndroid Build Coastguard Worker %val5 = sub i64 0, %shift5 283*9880d681SAndroid Build Coastguard Worker %tst5 = icmp ne i64 %lhs64, %val5 284*9880d681SAndroid Build Coastguard Worker br i1 %tst5, label %t6, label %end 285*9880d681SAndroid Build Coastguard Worker; CHECK: cmn {{x[0-9]+}}, {{x[0-9]+}}, lsr #20 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Workert6: 288*9880d681SAndroid Build Coastguard Worker %shift6 = ashr i64 %rhs64, 59 289*9880d681SAndroid Build Coastguard Worker %val6 = sub i64 0, %shift6 290*9880d681SAndroid Build Coastguard Worker %tst6 = icmp ne i64 %lhs64, %val6 291*9880d681SAndroid Build Coastguard Worker br i1 %tst6, label %t7, label %end 292*9880d681SAndroid Build Coastguard Worker; CHECK: cmn {{x[0-9]+}}, {{x[0-9]+}}, asr #59 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workert7: 295*9880d681SAndroid Build Coastguard Worker ret i32 1 296*9880d681SAndroid Build Coastguard Workerend: 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker ret i32 0 299*9880d681SAndroid Build Coastguard Worker; CHECK: ret 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302