[MLIR] Prevent invalid IR from being passed outside of RemoveDeadValues (#121079)
[llvm-project.git] / llvm / test / CodeGen / RISCV / GlobalISel / bitmanip.ll
blobbce6dfacf8e82cf0049767ad1e7caec7d423f6e2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mtriple=riscv32 -global-isel -global-isel-abort=1 < %s 2>&1 | FileCheck %s --check-prefixes=RV32
3 ; RUN: llc -mtriple=riscv64 -global-isel -global-isel-abort=1 < %s 2>&1 | FileCheck %s --check-prefixes=RV64
5 define i2 @bitreverse_i2(i2 %x) {
6 ; RV32-LABEL: bitreverse_i2:
7 ; RV32:       # %bb.0:
8 ; RV32-NEXT:    slli a1, a0, 1
9 ; RV32-NEXT:    andi a0, a0, 3
10 ; RV32-NEXT:    andi a1, a1, 2
11 ; RV32-NEXT:    srli a0, a0, 1
12 ; RV32-NEXT:    or a0, a1, a0
13 ; RV32-NEXT:    ret
15 ; RV64-LABEL: bitreverse_i2:
16 ; RV64:       # %bb.0:
17 ; RV64-NEXT:    slli a1, a0, 1
18 ; RV64-NEXT:    andi a0, a0, 3
19 ; RV64-NEXT:    andi a1, a1, 2
20 ; RV64-NEXT:    srli a0, a0, 1
21 ; RV64-NEXT:    or a0, a1, a0
22 ; RV64-NEXT:    ret
23   %rev = call i2 @llvm.bitreverse.i2(i2 %x)
24   ret i2 %rev
27 define i3 @bitreverse_i3(i3 %x) {
28 ; RV32-LABEL: bitreverse_i3:
29 ; RV32:       # %bb.0:
30 ; RV32-NEXT:    slli a1, a0, 2
31 ; RV32-NEXT:    andi a0, a0, 7
32 ; RV32-NEXT:    andi a1, a1, 4
33 ; RV32-NEXT:    andi a2, a0, 2
34 ; RV32-NEXT:    or a1, a1, a2
35 ; RV32-NEXT:    srli a0, a0, 2
36 ; RV32-NEXT:    or a0, a1, a0
37 ; RV32-NEXT:    ret
39 ; RV64-LABEL: bitreverse_i3:
40 ; RV64:       # %bb.0:
41 ; RV64-NEXT:    slli a1, a0, 2
42 ; RV64-NEXT:    andi a0, a0, 7
43 ; RV64-NEXT:    andi a1, a1, 4
44 ; RV64-NEXT:    andi a2, a0, 2
45 ; RV64-NEXT:    or a1, a1, a2
46 ; RV64-NEXT:    srli a0, a0, 2
47 ; RV64-NEXT:    or a0, a1, a0
48 ; RV64-NEXT:    ret
49   %rev = call i3 @llvm.bitreverse.i3(i3 %x)
50   ret i3 %rev
53 define i4 @bitreverse_i4(i4 %x) {
54 ; RV32-LABEL: bitreverse_i4:
55 ; RV32:       # %bb.0:
56 ; RV32-NEXT:    slli a1, a0, 3
57 ; RV32-NEXT:    slli a2, a0, 1
58 ; RV32-NEXT:    andi a0, a0, 15
59 ; RV32-NEXT:    andi a1, a1, 8
60 ; RV32-NEXT:    andi a2, a2, 4
61 ; RV32-NEXT:    or a1, a1, a2
62 ; RV32-NEXT:    srli a2, a0, 1
63 ; RV32-NEXT:    andi a2, a2, 2
64 ; RV32-NEXT:    or a1, a1, a2
65 ; RV32-NEXT:    srli a0, a0, 3
66 ; RV32-NEXT:    or a0, a1, a0
67 ; RV32-NEXT:    ret
69 ; RV64-LABEL: bitreverse_i4:
70 ; RV64:       # %bb.0:
71 ; RV64-NEXT:    slli a1, a0, 3
72 ; RV64-NEXT:    slli a2, a0, 1
73 ; RV64-NEXT:    andi a0, a0, 15
74 ; RV64-NEXT:    andi a1, a1, 8
75 ; RV64-NEXT:    andi a2, a2, 4
76 ; RV64-NEXT:    or a1, a1, a2
77 ; RV64-NEXT:    srli a2, a0, 1
78 ; RV64-NEXT:    andi a2, a2, 2
79 ; RV64-NEXT:    or a1, a1, a2
80 ; RV64-NEXT:    srli a0, a0, 3
81 ; RV64-NEXT:    or a0, a1, a0
82 ; RV64-NEXT:    ret
83   %rev = call i4 @llvm.bitreverse.i4(i4 %x)
84   ret i4 %rev
87 define i7 @bitreverse_i7(i7 %x) {
88 ; RV32-LABEL: bitreverse_i7:
89 ; RV32:       # %bb.0:
90 ; RV32-NEXT:    slli a1, a0, 6
91 ; RV32-NEXT:    slli a2, a0, 4
92 ; RV32-NEXT:    slli a3, a0, 2
93 ; RV32-NEXT:    andi a0, a0, 127
94 ; RV32-NEXT:    andi a1, a1, 64
95 ; RV32-NEXT:    andi a2, a2, 32
96 ; RV32-NEXT:    andi a3, a3, 16
97 ; RV32-NEXT:    or a1, a1, a2
98 ; RV32-NEXT:    andi a2, a0, 8
99 ; RV32-NEXT:    or a2, a3, a2
100 ; RV32-NEXT:    srli a3, a0, 2
101 ; RV32-NEXT:    or a1, a1, a2
102 ; RV32-NEXT:    srli a2, a0, 4
103 ; RV32-NEXT:    andi a3, a3, 4
104 ; RV32-NEXT:    andi a2, a2, 2
105 ; RV32-NEXT:    or a2, a3, a2
106 ; RV32-NEXT:    or a1, a1, a2
107 ; RV32-NEXT:    srli a0, a0, 6
108 ; RV32-NEXT:    or a0, a1, a0
109 ; RV32-NEXT:    ret
111 ; RV64-LABEL: bitreverse_i7:
112 ; RV64:       # %bb.0:
113 ; RV64-NEXT:    slli a1, a0, 6
114 ; RV64-NEXT:    slli a2, a0, 4
115 ; RV64-NEXT:    slli a3, a0, 2
116 ; RV64-NEXT:    andi a0, a0, 127
117 ; RV64-NEXT:    andi a1, a1, 64
118 ; RV64-NEXT:    andi a2, a2, 32
119 ; RV64-NEXT:    andi a3, a3, 16
120 ; RV64-NEXT:    or a1, a1, a2
121 ; RV64-NEXT:    andi a2, a0, 8
122 ; RV64-NEXT:    or a2, a3, a2
123 ; RV64-NEXT:    srli a3, a0, 2
124 ; RV64-NEXT:    or a1, a1, a2
125 ; RV64-NEXT:    srli a2, a0, 4
126 ; RV64-NEXT:    andi a3, a3, 4
127 ; RV64-NEXT:    andi a2, a2, 2
128 ; RV64-NEXT:    or a2, a3, a2
129 ; RV64-NEXT:    or a1, a1, a2
130 ; RV64-NEXT:    srli a0, a0, 6
131 ; RV64-NEXT:    or a0, a1, a0
132 ; RV64-NEXT:    ret
133   %rev = call i7 @llvm.bitreverse.i7(i7 %x)
134   ret i7 %rev
137 define i24 @bitreverse_i24(i24 %x) {
138 ; RV32-LABEL: bitreverse_i24:
139 ; RV32:       # %bb.0:
140 ; RV32-NEXT:    slli a1, a0, 16
141 ; RV32-NEXT:    lui a2, 4096
142 ; RV32-NEXT:    lui a3, 1048335
143 ; RV32-NEXT:    addi a2, a2, -1
144 ; RV32-NEXT:    addi a3, a3, 240
145 ; RV32-NEXT:    and a0, a0, a2
146 ; RV32-NEXT:    srli a0, a0, 16
147 ; RV32-NEXT:    or a0, a0, a1
148 ; RV32-NEXT:    and a1, a3, a2
149 ; RV32-NEXT:    and a1, a0, a1
150 ; RV32-NEXT:    slli a0, a0, 4
151 ; RV32-NEXT:    and a0, a0, a3
152 ; RV32-NEXT:    lui a3, 1047757
153 ; RV32-NEXT:    addi a3, a3, -820
154 ; RV32-NEXT:    srli a1, a1, 4
155 ; RV32-NEXT:    or a0, a1, a0
156 ; RV32-NEXT:    and a1, a3, a2
157 ; RV32-NEXT:    and a1, a0, a1
158 ; RV32-NEXT:    slli a0, a0, 2
159 ; RV32-NEXT:    and a0, a0, a3
160 ; RV32-NEXT:    lui a3, 1047211
161 ; RV32-NEXT:    addi a3, a3, -1366
162 ; RV32-NEXT:    and a2, a3, a2
163 ; RV32-NEXT:    srli a1, a1, 2
164 ; RV32-NEXT:    or a0, a1, a0
165 ; RV32-NEXT:    and a2, a0, a2
166 ; RV32-NEXT:    slli a0, a0, 1
167 ; RV32-NEXT:    srli a2, a2, 1
168 ; RV32-NEXT:    and a0, a0, a3
169 ; RV32-NEXT:    or a0, a2, a0
170 ; RV32-NEXT:    ret
172 ; RV64-LABEL: bitreverse_i24:
173 ; RV64:       # %bb.0:
174 ; RV64-NEXT:    slli a1, a0, 16
175 ; RV64-NEXT:    lui a2, 4096
176 ; RV64-NEXT:    lui a3, 1048335
177 ; RV64-NEXT:    addiw a2, a2, -1
178 ; RV64-NEXT:    addiw a3, a3, 240
179 ; RV64-NEXT:    and a0, a0, a2
180 ; RV64-NEXT:    srli a0, a0, 16
181 ; RV64-NEXT:    or a0, a0, a1
182 ; RV64-NEXT:    and a1, a3, a2
183 ; RV64-NEXT:    and a1, a0, a1
184 ; RV64-NEXT:    slli a0, a0, 4
185 ; RV64-NEXT:    and a0, a0, a3
186 ; RV64-NEXT:    lui a3, 1047757
187 ; RV64-NEXT:    addiw a3, a3, -820
188 ; RV64-NEXT:    srli a1, a1, 4
189 ; RV64-NEXT:    or a0, a1, a0
190 ; RV64-NEXT:    and a1, a3, a2
191 ; RV64-NEXT:    and a1, a0, a1
192 ; RV64-NEXT:    slli a0, a0, 2
193 ; RV64-NEXT:    and a0, a0, a3
194 ; RV64-NEXT:    lui a3, 1047211
195 ; RV64-NEXT:    addiw a3, a3, -1366
196 ; RV64-NEXT:    and a2, a3, a2
197 ; RV64-NEXT:    srli a1, a1, 2
198 ; RV64-NEXT:    or a0, a1, a0
199 ; RV64-NEXT:    and a2, a0, a2
200 ; RV64-NEXT:    slli a0, a0, 1
201 ; RV64-NEXT:    srli a2, a2, 1
202 ; RV64-NEXT:    and a0, a0, a3
203 ; RV64-NEXT:    or a0, a2, a0
204 ; RV64-NEXT:    ret
205   %rev = call i24 @llvm.bitreverse.i24(i24 %x)
206   ret i24 %rev