1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@var32_0 = global i32 0 4*9880d681SAndroid Build Coastguard Worker@var32_1 = global i32 0 5*9880d681SAndroid Build Coastguard Worker@var64_0 = global i64 0 6*9880d681SAndroid Build Coastguard Worker@var64_1 = global i64 0 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine void @rorv_i64() { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rorv_i64: 10*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64_0 11*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i64, i64* @var64_1 12*9880d681SAndroid Build Coastguard Worker %val2_tmp = sub i64 64, %val1_tmp 13*9880d681SAndroid Build Coastguard Worker %val3_tmp = shl i64 %val0_tmp, %val2_tmp 14*9880d681SAndroid Build Coastguard Worker %val4_tmp = lshr i64 %val0_tmp, %val1_tmp 15*9880d681SAndroid Build Coastguard Worker %val5_tmp = or i64 %val3_tmp, %val4_tmp 16*9880d681SAndroid Build Coastguard Worker; CHECK: {{ror|rorv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 17*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5_tmp, i64* @var64_0 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine void @asrv_i64() { 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: asrv_i64: 23*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64_0 24*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i64, i64* @var64_1 25*9880d681SAndroid Build Coastguard Worker %val4_tmp = ashr i64 %val0_tmp, %val1_tmp 26*9880d681SAndroid Build Coastguard Worker; CHECK: {{asr|asrv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 27*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64_1 28*9880d681SAndroid Build Coastguard Worker ret void 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine void @lsrv_i64() { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lsrv_i64: 33*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64_0 34*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i64, i64* @var64_1 35*9880d681SAndroid Build Coastguard Worker %val4_tmp = lshr i64 %val0_tmp, %val1_tmp 36*9880d681SAndroid Build Coastguard Worker; CHECK: {{lsr|lsrv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 37*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64_0 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine void @lslv_i64() { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lslv_i64: 43*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64_0 44*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i64, i64* @var64_1 45*9880d681SAndroid Build Coastguard Worker %val4_tmp = shl i64 %val0_tmp, %val1_tmp 46*9880d681SAndroid Build Coastguard Worker; CHECK: {{lsl|lslv}} {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 47*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64_1 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine void @udiv_i64() { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: udiv_i64: 53*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64_0 54*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i64, i64* @var64_1 55*9880d681SAndroid Build Coastguard Worker %val4_tmp = udiv i64 %val0_tmp, %val1_tmp 56*9880d681SAndroid Build Coastguard Worker; CHECK: udiv {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 57*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64_0 58*9880d681SAndroid Build Coastguard Worker ret void 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine void @sdiv_i64() { 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sdiv_i64: 63*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64_0 64*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i64, i64* @var64_1 65*9880d681SAndroid Build Coastguard Worker %val4_tmp = sdiv i64 %val0_tmp, %val1_tmp 66*9880d681SAndroid Build Coastguard Worker; CHECK: sdiv {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}} 67*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64_1 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine void @lsrv_i32() { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lsrv_i32: 74*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32_0 75*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i32, i32* @var32_1 76*9880d681SAndroid Build Coastguard Worker %val2_tmp = add i32 1, %val1_tmp 77*9880d681SAndroid Build Coastguard Worker %val4_tmp = lshr i32 %val0_tmp, %val2_tmp 78*9880d681SAndroid Build Coastguard Worker; CHECK: {{lsr|lsrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 79*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32_0 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine void @lslv_i32() { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: lslv_i32: 85*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32_0 86*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i32, i32* @var32_1 87*9880d681SAndroid Build Coastguard Worker %val2_tmp = add i32 1, %val1_tmp 88*9880d681SAndroid Build Coastguard Worker %val4_tmp = shl i32 %val0_tmp, %val2_tmp 89*9880d681SAndroid Build Coastguard Worker; CHECK: {{lsl|lslv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 90*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32_1 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine void @rorv_i32() { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rorv_i32: 96*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32_0 97*9880d681SAndroid Build Coastguard Worker %val6_tmp = load i32, i32* @var32_1 98*9880d681SAndroid Build Coastguard Worker %val1_tmp = add i32 1, %val6_tmp 99*9880d681SAndroid Build Coastguard Worker %val2_tmp = sub i32 32, %val1_tmp 100*9880d681SAndroid Build Coastguard Worker %val3_tmp = shl i32 %val0_tmp, %val2_tmp 101*9880d681SAndroid Build Coastguard Worker %val4_tmp = lshr i32 %val0_tmp, %val1_tmp 102*9880d681SAndroid Build Coastguard Worker %val5_tmp = or i32 %val3_tmp, %val4_tmp 103*9880d681SAndroid Build Coastguard Worker; CHECK: {{ror|rorv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 104*9880d681SAndroid Build Coastguard Worker store volatile i32 %val5_tmp, i32* @var32_0 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine void @asrv_i32() { 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: asrv_i32: 110*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32_0 111*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i32, i32* @var32_1 112*9880d681SAndroid Build Coastguard Worker %val2_tmp = add i32 1, %val1_tmp 113*9880d681SAndroid Build Coastguard Worker %val4_tmp = ashr i32 %val0_tmp, %val2_tmp 114*9880d681SAndroid Build Coastguard Worker; CHECK: {{asr|asrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 115*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32_1 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine void @sdiv_i32() { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sdiv_i32: 121*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32_0 122*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i32, i32* @var32_1 123*9880d681SAndroid Build Coastguard Worker %val4_tmp = sdiv i32 %val0_tmp, %val1_tmp 124*9880d681SAndroid Build Coastguard Worker; CHECK: sdiv {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 125*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32_1 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerdefine void @udiv_i32() { 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: udiv_i32: 131*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32_0 132*9880d681SAndroid Build Coastguard Worker %val1_tmp = load i32, i32* @var32_1 133*9880d681SAndroid Build Coastguard Worker %val4_tmp = udiv i32 %val0_tmp, %val1_tmp 134*9880d681SAndroid Build Coastguard Worker; CHECK: udiv {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 135*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32_0 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; The point of this test is that we may not actually see (shl GPR32:$Val, (zext GPR32:$Val2)) 140*9880d681SAndroid Build Coastguard Worker; in the DAG (the RHS may be natively 64-bit), but we should still use the lsl instructions. 141*9880d681SAndroid Build Coastguard Workerdefine i32 @test_lsl32() { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lsl32: 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @var32_0 145*9880d681SAndroid Build Coastguard Worker %ret = shl i32 1, %val 146*9880d681SAndroid Build Coastguard Worker; CHECK: {{lsl|lslv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker ret i32 %ret 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i32 @test_lsr32() { 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lsr32: 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @var32_0 155*9880d681SAndroid Build Coastguard Worker %ret = lshr i32 1, %val 156*9880d681SAndroid Build Coastguard Worker; CHECK: {{lsr|lsrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker ret i32 %ret 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdefine i32 @test_asr32(i32 %in) { 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_asr32: 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @var32_0 165*9880d681SAndroid Build Coastguard Worker %ret = ashr i32 %in, %val 166*9880d681SAndroid Build Coastguard Worker; CHECK: {{asr|asrv}} {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker ret i32 %ret 169*9880d681SAndroid Build Coastguard Worker} 170