1; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-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* @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* @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* @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* @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* @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* @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* @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* @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* @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* @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* @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* @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* @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* @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