1 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
2 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-linux-gnu | FileCheck %s
7 define void @rev_i32() {
8 ; CHECK-LABEL: rev_i32:
9 %val0_tmp = load i32* @var32
10 %val1_tmp = call i32 @llvm.bswap.i32(i32 %val0_tmp)
11 ; CHECK: rev {{w[0-9]+}}, {{w[0-9]+}}
12 store volatile i32 %val1_tmp, i32* @var32
16 define void @rev_i64() {
17 ; CHECK-LABEL: rev_i64:
18 %val0_tmp = load i64* @var64
19 %val1_tmp = call i64 @llvm.bswap.i64(i64 %val0_tmp)
20 ; CHECK: rev {{x[0-9]+}}, {{x[0-9]+}}
21 store volatile i64 %val1_tmp, i64* @var64
25 define void @rev32_i64() {
26 ; CHECK-LABEL: rev32_i64:
27 %val0_tmp = load i64* @var64
28 %val1_tmp = shl i64 %val0_tmp, 32
29 %val5_tmp = sub i64 64, 32
30 %val2_tmp = lshr i64 %val0_tmp, %val5_tmp
31 %val3_tmp = or i64 %val1_tmp, %val2_tmp
32 %val4_tmp = call i64 @llvm.bswap.i64(i64 %val3_tmp)
33 ; CHECK: rev32 {{x[0-9]+}}, {{x[0-9]+}}
34 store volatile i64 %val4_tmp, i64* @var64
38 define void @rev16_i32() {
39 ; CHECK-LABEL: rev16_i32:
40 %val0_tmp = load i32* @var32
41 %val1_tmp = shl i32 %val0_tmp, 16
42 %val2_tmp = lshr i32 %val0_tmp, 16
43 %val3_tmp = or i32 %val1_tmp, %val2_tmp
44 %val4_tmp = call i32 @llvm.bswap.i32(i32 %val3_tmp)
45 ; CHECK: rev16 {{w[0-9]+}}, {{w[0-9]+}}
46 store volatile i32 %val4_tmp, i32* @var32
50 define void @clz_zerodef_i32() {
51 ; CHECK-LABEL: clz_zerodef_i32:
52 %val0_tmp = load i32* @var32
53 %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 0)
54 ; CHECK: clz {{w[0-9]+}}, {{w[0-9]+}}
55 store volatile i32 %val4_tmp, i32* @var32
59 define void @clz_zerodef_i64() {
60 ; CHECK-LABEL: clz_zerodef_i64:
61 %val0_tmp = load i64* @var64
62 %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 0)
63 ; CHECK: clz {{x[0-9]+}}, {{x[0-9]+}}
64 store volatile i64 %val4_tmp, i64* @var64
68 define void @clz_zeroundef_i32() {
69 ; CHECK-LABEL: clz_zeroundef_i32:
70 %val0_tmp = load i32* @var32
71 %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 1)
72 ; CHECK: clz {{w[0-9]+}}, {{w[0-9]+}}
73 store volatile i32 %val4_tmp, i32* @var32
77 define void @clz_zeroundef_i64() {
78 ; CHECK-LABEL: clz_zeroundef_i64:
79 %val0_tmp = load i64* @var64
80 %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 1)
81 ; CHECK: clz {{x[0-9]+}}, {{x[0-9]+}}
82 store volatile i64 %val4_tmp, i64* @var64
86 define void @cttz_zerodef_i32() {
87 ; CHECK-LABEL: cttz_zerodef_i32:
88 %val0_tmp = load i32* @var32
89 %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 0)
90 ; CHECK: rbit [[REVERSED:w[0-9]+]], {{w[0-9]+}}
91 ; CHECK: clz {{w[0-9]+}}, [[REVERSED]]
92 store volatile i32 %val4_tmp, i32* @var32
96 define void @cttz_zerodef_i64() {
97 ; CHECK-LABEL: cttz_zerodef_i64:
98 %val0_tmp = load i64* @var64
99 %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 0)
100 ; CHECK: rbit [[REVERSED:x[0-9]+]], {{x[0-9]+}}
101 ; CHECK: clz {{x[0-9]+}}, [[REVERSED]]
102 store volatile i64 %val4_tmp, i64* @var64
106 define void @cttz_zeroundef_i32() {
107 ; CHECK-LABEL: cttz_zeroundef_i32:
108 %val0_tmp = load i32* @var32
109 %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 1)
110 ; CHECK: rbit [[REVERSED:w[0-9]+]], {{w[0-9]+}}
111 ; CHECK: clz {{w[0-9]+}}, [[REVERSED]]
112 store volatile i32 %val4_tmp, i32* @var32
116 define void @cttz_zeroundef_i64() {
117 ; CHECK-LABEL: cttz_zeroundef_i64:
118 %val0_tmp = load i64* @var64
119 %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 1)
120 ; CHECK: rbit [[REVERSED:x[0-9]+]], {{x[0-9]+}}
121 ; CHECK: clz {{x[0-9]+}}, [[REVERSED]]
122 store volatile i64 %val4_tmp, i64* @var64
126 ; These two are just compilation tests really: the operation's set to Expand in
128 define void @ctpop_i32() {
129 ; CHECK-LABEL: ctpop_i32:
130 %val0_tmp = load i32* @var32
131 %val4_tmp = call i32 @llvm.ctpop.i32(i32 %val0_tmp)
132 store volatile i32 %val4_tmp, i32* @var32
136 define void @ctpop_i64() {
137 ; CHECK-LABEL: ctpop_i64:
138 %val0_tmp = load i64* @var64
139 %val4_tmp = call i64 @llvm.ctpop.i64(i64 %val0_tmp)
140 store volatile i64 %val4_tmp, i64* @var64
145 declare i32 @llvm.bswap.i32(i32)
146 declare i64 @llvm.bswap.i64(i64)
147 declare i32 @llvm.ctlz.i32 (i32, i1)
148 declare i64 @llvm.ctlz.i64 (i64, i1)
149 declare i32 @llvm.cttz.i32 (i32, i1)
150 declare i64 @llvm.cttz.i64 (i64, i1)
151 declare i32 @llvm.ctpop.i32 (i32)
152 declare i64 @llvm.ctpop.i64 (i64)