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