1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-linux-gnu | 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 @rev_i32() { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rev_i32: 8*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 9*9880d681SAndroid Build Coastguard Worker %val1_tmp = call i32 @llvm.bswap.i32(i32 %val0_tmp) 10*9880d681SAndroid Build Coastguard Worker; CHECK: rev {{w[0-9]+}}, {{w[0-9]+}} 11*9880d681SAndroid Build Coastguard Worker store volatile i32 %val1_tmp, i32* @var32 12*9880d681SAndroid Build Coastguard Worker ret void 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine void @rev_i64() { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rev_i64: 17*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 18*9880d681SAndroid Build Coastguard Worker %val1_tmp = call i64 @llvm.bswap.i64(i64 %val0_tmp) 19*9880d681SAndroid Build Coastguard Worker; CHECK: rev {{x[0-9]+}}, {{x[0-9]+}} 20*9880d681SAndroid Build Coastguard Worker store volatile i64 %val1_tmp, i64* @var64 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine void @rev32_i64() { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rev32_i64: 26*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 27*9880d681SAndroid Build Coastguard Worker %val1_tmp = shl i64 %val0_tmp, 32 28*9880d681SAndroid Build Coastguard Worker %val5_tmp = sub i64 64, 32 29*9880d681SAndroid Build Coastguard Worker %val2_tmp = lshr i64 %val0_tmp, %val5_tmp 30*9880d681SAndroid Build Coastguard Worker %val3_tmp = or i64 %val1_tmp, %val2_tmp 31*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i64 @llvm.bswap.i64(i64 %val3_tmp) 32*9880d681SAndroid Build Coastguard Worker; CHECK: rev32 {{x[0-9]+}}, {{x[0-9]+}} 33*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine void @rev16_i32() { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rev16_i32: 39*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 40*9880d681SAndroid Build Coastguard Worker %val1_tmp = shl i32 %val0_tmp, 16 41*9880d681SAndroid Build Coastguard Worker %val2_tmp = lshr i32 %val0_tmp, 16 42*9880d681SAndroid Build Coastguard Worker %val3_tmp = or i32 %val1_tmp, %val2_tmp 43*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i32 @llvm.bswap.i32(i32 %val3_tmp) 44*9880d681SAndroid Build Coastguard Worker; CHECK: rev16 {{w[0-9]+}}, {{w[0-9]+}} 45*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine void @clz_zerodef_i32() { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz_zerodef_i32: 51*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 52*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 0) 53*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{w[0-9]+}}, {{w[0-9]+}} 54*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine void @clz_zerodef_i64() { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz_zerodef_i64: 60*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 61*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 0) 62*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{x[0-9]+}}, {{x[0-9]+}} 63*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine void @clz_zeroundef_i32() { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz_zeroundef_i32: 69*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 70*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 1) 71*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{w[0-9]+}}, {{w[0-9]+}} 72*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine void @clz_zeroundef_i64() { 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: clz_zeroundef_i64: 78*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 79*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 1) 80*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{x[0-9]+}}, {{x[0-9]+}} 81*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine void @cttz_zerodef_i32() { 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cttz_zerodef_i32: 87*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 88*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 0) 89*9880d681SAndroid Build Coastguard Worker; CHECK: rbit [[REVERSED:w[0-9]+]], {{w[0-9]+}} 90*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{w[0-9]+}}, [[REVERSED]] 91*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine void @cttz_zerodef_i64() { 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cttz_zerodef_i64: 97*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 98*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 0) 99*9880d681SAndroid Build Coastguard Worker; CHECK: rbit [[REVERSED:x[0-9]+]], {{x[0-9]+}} 100*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{x[0-9]+}}, [[REVERSED]] 101*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine void @cttz_zeroundef_i32() { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cttz_zeroundef_i32: 107*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 108*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 1) 109*9880d681SAndroid Build Coastguard Worker; CHECK: rbit [[REVERSED:w[0-9]+]], {{w[0-9]+}} 110*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{w[0-9]+}}, [[REVERSED]] 111*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine void @cttz_zeroundef_i64() { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cttz_zeroundef_i64: 117*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 118*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 1) 119*9880d681SAndroid Build Coastguard Worker; CHECK: rbit [[REVERSED:x[0-9]+]], {{x[0-9]+}} 120*9880d681SAndroid Build Coastguard Worker; CHECK: clz {{x[0-9]+}}, [[REVERSED]] 121*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; These two are just compilation tests really: the operation's set to Expand in 126*9880d681SAndroid Build Coastguard Worker; ISelLowering. 127*9880d681SAndroid Build Coastguard Workerdefine void @ctpop_i32() { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctpop_i32: 129*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i32, i32* @var32 130*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i32 @llvm.ctpop.i32(i32 %val0_tmp) 131*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4_tmp, i32* @var32 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine void @ctpop_i64() { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ctpop_i64: 137*9880d681SAndroid Build Coastguard Worker %val0_tmp = load i64, i64* @var64 138*9880d681SAndroid Build Coastguard Worker %val4_tmp = call i64 @llvm.ctpop.i64(i64 %val0_tmp) 139*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4_tmp, i64* @var64 140*9880d681SAndroid Build Coastguard Worker ret void 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.bswap.i32(i32) 145*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.bswap.i64(i64) 146*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctlz.i32 (i32, i1) 147*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64 (i64, i1) 148*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32 (i32, i1) 149*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64 (i64, i1) 150*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.ctpop.i32 (i32) 151*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctpop.i64 (i64) 152*9880d681SAndroid Build Coastguard Worker 153