1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV32,LMULMAX2-RV32
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV64,LMULMAX2-RV64
4 ; RUN: llc -mtriple=riscv32 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV32,LMULMAX1-RV32
5 ; RUN: llc -mtriple=riscv64 -mattr=+v -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV64,LMULMAX1-RV64
6 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=ZVBB
7 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=ZVBB
9 define void @bitreverse_v8i16(ptr %x, ptr %y) {
10 ; RV32-LABEL: bitreverse_v8i16:
12 ; RV32-NEXT: vsetivli zero, 8, e16, m1, ta, ma
13 ; RV32-NEXT: vle16.v v8, (a0)
14 ; RV32-NEXT: vsrl.vi v9, v8, 8
15 ; RV32-NEXT: vsll.vi v8, v8, 8
16 ; RV32-NEXT: vor.vv v8, v8, v9
17 ; RV32-NEXT: vsrl.vi v9, v8, 4
18 ; RV32-NEXT: lui a1, 1
19 ; RV32-NEXT: addi a1, a1, -241
20 ; RV32-NEXT: vand.vx v9, v9, a1
21 ; RV32-NEXT: vand.vx v8, v8, a1
22 ; RV32-NEXT: vsll.vi v8, v8, 4
23 ; RV32-NEXT: vor.vv v8, v9, v8
24 ; RV32-NEXT: vsrl.vi v9, v8, 2
25 ; RV32-NEXT: lui a1, 3
26 ; RV32-NEXT: addi a1, a1, 819
27 ; RV32-NEXT: vand.vx v9, v9, a1
28 ; RV32-NEXT: vand.vx v8, v8, a1
29 ; RV32-NEXT: vsll.vi v8, v8, 2
30 ; RV32-NEXT: vor.vv v8, v9, v8
31 ; RV32-NEXT: vsrl.vi v9, v8, 1
32 ; RV32-NEXT: lui a1, 5
33 ; RV32-NEXT: addi a1, a1, 1365
34 ; RV32-NEXT: vand.vx v9, v9, a1
35 ; RV32-NEXT: vand.vx v8, v8, a1
36 ; RV32-NEXT: vadd.vv v8, v8, v8
37 ; RV32-NEXT: vor.vv v8, v9, v8
38 ; RV32-NEXT: vse16.v v8, (a0)
41 ; RV64-LABEL: bitreverse_v8i16:
43 ; RV64-NEXT: vsetivli zero, 8, e16, m1, ta, ma
44 ; RV64-NEXT: vle16.v v8, (a0)
45 ; RV64-NEXT: vsrl.vi v9, v8, 8
46 ; RV64-NEXT: vsll.vi v8, v8, 8
47 ; RV64-NEXT: vor.vv v8, v8, v9
48 ; RV64-NEXT: vsrl.vi v9, v8, 4
49 ; RV64-NEXT: lui a1, 1
50 ; RV64-NEXT: addi a1, a1, -241
51 ; RV64-NEXT: vand.vx v9, v9, a1
52 ; RV64-NEXT: vand.vx v8, v8, a1
53 ; RV64-NEXT: vsll.vi v8, v8, 4
54 ; RV64-NEXT: vor.vv v8, v9, v8
55 ; RV64-NEXT: vsrl.vi v9, v8, 2
56 ; RV64-NEXT: lui a1, 3
57 ; RV64-NEXT: addi a1, a1, 819
58 ; RV64-NEXT: vand.vx v9, v9, a1
59 ; RV64-NEXT: vand.vx v8, v8, a1
60 ; RV64-NEXT: vsll.vi v8, v8, 2
61 ; RV64-NEXT: vor.vv v8, v9, v8
62 ; RV64-NEXT: vsrl.vi v9, v8, 1
63 ; RV64-NEXT: lui a1, 5
64 ; RV64-NEXT: addi a1, a1, 1365
65 ; RV64-NEXT: vand.vx v9, v9, a1
66 ; RV64-NEXT: vand.vx v8, v8, a1
67 ; RV64-NEXT: vadd.vv v8, v8, v8
68 ; RV64-NEXT: vor.vv v8, v9, v8
69 ; RV64-NEXT: vse16.v v8, (a0)
72 ; ZVBB-LABEL: bitreverse_v8i16:
74 ; ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma
75 ; ZVBB-NEXT: vle16.v v8, (a0)
76 ; ZVBB-NEXT: vbrev.v v8, v8
77 ; ZVBB-NEXT: vse16.v v8, (a0)
79 %a = load <8 x i16>, ptr %x
80 %b = load <8 x i16>, ptr %y
81 %c = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
82 store <8 x i16> %c, ptr %x
85 declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>)
87 define void @bitreverse_v4i32(ptr %x, ptr %y) {
88 ; RV32-LABEL: bitreverse_v4i32:
90 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
91 ; RV32-NEXT: vle32.v v8, (a0)
92 ; RV32-NEXT: vsrl.vi v9, v8, 8
93 ; RV32-NEXT: lui a1, 16
94 ; RV32-NEXT: addi a1, a1, -256
95 ; RV32-NEXT: vand.vx v9, v9, a1
96 ; RV32-NEXT: vsrl.vi v10, v8, 24
97 ; RV32-NEXT: vor.vv v9, v9, v10
98 ; RV32-NEXT: vand.vx v10, v8, a1
99 ; RV32-NEXT: vsll.vi v10, v10, 8
100 ; RV32-NEXT: vsll.vi v8, v8, 24
101 ; RV32-NEXT: vor.vv v8, v8, v10
102 ; RV32-NEXT: vor.vv v8, v8, v9
103 ; RV32-NEXT: vsrl.vi v9, v8, 4
104 ; RV32-NEXT: lui a1, 61681
105 ; RV32-NEXT: addi a1, a1, -241
106 ; RV32-NEXT: vand.vx v9, v9, a1
107 ; RV32-NEXT: vand.vx v8, v8, a1
108 ; RV32-NEXT: vsll.vi v8, v8, 4
109 ; RV32-NEXT: vor.vv v8, v9, v8
110 ; RV32-NEXT: vsrl.vi v9, v8, 2
111 ; RV32-NEXT: lui a1, 209715
112 ; RV32-NEXT: addi a1, a1, 819
113 ; RV32-NEXT: vand.vx v9, v9, a1
114 ; RV32-NEXT: vand.vx v8, v8, a1
115 ; RV32-NEXT: vsll.vi v8, v8, 2
116 ; RV32-NEXT: vor.vv v8, v9, v8
117 ; RV32-NEXT: vsrl.vi v9, v8, 1
118 ; RV32-NEXT: lui a1, 349525
119 ; RV32-NEXT: addi a1, a1, 1365
120 ; RV32-NEXT: vand.vx v9, v9, a1
121 ; RV32-NEXT: vand.vx v8, v8, a1
122 ; RV32-NEXT: vadd.vv v8, v8, v8
123 ; RV32-NEXT: vor.vv v8, v9, v8
124 ; RV32-NEXT: vse32.v v8, (a0)
127 ; RV64-LABEL: bitreverse_v4i32:
129 ; RV64-NEXT: vsetivli zero, 4, e32, m1, ta, ma
130 ; RV64-NEXT: vle32.v v8, (a0)
131 ; RV64-NEXT: vsrl.vi v9, v8, 8
132 ; RV64-NEXT: lui a1, 16
133 ; RV64-NEXT: addi a1, a1, -256
134 ; RV64-NEXT: vand.vx v9, v9, a1
135 ; RV64-NEXT: vsrl.vi v10, v8, 24
136 ; RV64-NEXT: vor.vv v9, v9, v10
137 ; RV64-NEXT: vand.vx v10, v8, a1
138 ; RV64-NEXT: vsll.vi v10, v10, 8
139 ; RV64-NEXT: vsll.vi v8, v8, 24
140 ; RV64-NEXT: vor.vv v8, v8, v10
141 ; RV64-NEXT: vor.vv v8, v8, v9
142 ; RV64-NEXT: vsrl.vi v9, v8, 4
143 ; RV64-NEXT: lui a1, 61681
144 ; RV64-NEXT: addi a1, a1, -241
145 ; RV64-NEXT: vand.vx v9, v9, a1
146 ; RV64-NEXT: vand.vx v8, v8, a1
147 ; RV64-NEXT: vsll.vi v8, v8, 4
148 ; RV64-NEXT: vor.vv v8, v9, v8
149 ; RV64-NEXT: vsrl.vi v9, v8, 2
150 ; RV64-NEXT: lui a1, 209715
151 ; RV64-NEXT: addi a1, a1, 819
152 ; RV64-NEXT: vand.vx v9, v9, a1
153 ; RV64-NEXT: vand.vx v8, v8, a1
154 ; RV64-NEXT: vsll.vi v8, v8, 2
155 ; RV64-NEXT: vor.vv v8, v9, v8
156 ; RV64-NEXT: vsrl.vi v9, v8, 1
157 ; RV64-NEXT: lui a1, 349525
158 ; RV64-NEXT: addi a1, a1, 1365
159 ; RV64-NEXT: vand.vx v9, v9, a1
160 ; RV64-NEXT: vand.vx v8, v8, a1
161 ; RV64-NEXT: vadd.vv v8, v8, v8
162 ; RV64-NEXT: vor.vv v8, v9, v8
163 ; RV64-NEXT: vse32.v v8, (a0)
166 ; ZVBB-LABEL: bitreverse_v4i32:
168 ; ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
169 ; ZVBB-NEXT: vle32.v v8, (a0)
170 ; ZVBB-NEXT: vbrev.v v8, v8
171 ; ZVBB-NEXT: vse32.v v8, (a0)
173 %a = load <4 x i32>, ptr %x
174 %b = load <4 x i32>, ptr %y
175 %c = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
176 store <4 x i32> %c, ptr %x
179 declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)
181 define void @bitreverse_v2i64(ptr %x, ptr %y) {
182 ; RV32-LABEL: bitreverse_v2i64:
184 ; RV32-NEXT: addi sp, sp, -16
185 ; RV32-NEXT: .cfi_def_cfa_offset 16
186 ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
187 ; RV32-NEXT: vle64.v v8, (a0)
188 ; RV32-NEXT: sw zero, 12(sp)
189 ; RV32-NEXT: lui a1, 1044480
190 ; RV32-NEXT: sw a1, 8(sp)
191 ; RV32-NEXT: li a1, 56
192 ; RV32-NEXT: vsrl.vx v9, v8, a1
193 ; RV32-NEXT: li a2, 40
194 ; RV32-NEXT: vsrl.vx v10, v8, a2
195 ; RV32-NEXT: lui a3, 16
196 ; RV32-NEXT: addi a3, a3, -256
197 ; RV32-NEXT: vand.vx v10, v10, a3
198 ; RV32-NEXT: vor.vv v9, v10, v9
199 ; RV32-NEXT: vsrl.vi v10, v8, 24
200 ; RV32-NEXT: addi a4, sp, 8
201 ; RV32-NEXT: vlse64.v v11, (a4), zero
202 ; RV32-NEXT: lui a4, 4080
203 ; RV32-NEXT: vand.vx v10, v10, a4
204 ; RV32-NEXT: vsrl.vi v12, v8, 8
205 ; RV32-NEXT: vand.vv v12, v12, v11
206 ; RV32-NEXT: vor.vv v10, v12, v10
207 ; RV32-NEXT: vor.vv v9, v10, v9
208 ; RV32-NEXT: vsll.vx v10, v8, a1
209 ; RV32-NEXT: vand.vx v12, v8, a3
210 ; RV32-NEXT: vsll.vx v12, v12, a2
211 ; RV32-NEXT: vor.vv v10, v10, v12
212 ; RV32-NEXT: vand.vx v12, v8, a4
213 ; RV32-NEXT: vsll.vi v12, v12, 24
214 ; RV32-NEXT: vand.vv v8, v8, v11
215 ; RV32-NEXT: vsll.vi v8, v8, 8
216 ; RV32-NEXT: vor.vv v8, v12, v8
217 ; RV32-NEXT: vor.vv v8, v10, v8
218 ; RV32-NEXT: vor.vv v8, v8, v9
219 ; RV32-NEXT: vsrl.vi v9, v8, 4
220 ; RV32-NEXT: lui a1, 61681
221 ; RV32-NEXT: addi a1, a1, -241
222 ; RV32-NEXT: vsetvli a2, zero, e32, m1, ta, ma
223 ; RV32-NEXT: vmv.v.x v10, a1
224 ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
225 ; RV32-NEXT: vand.vv v9, v9, v10
226 ; RV32-NEXT: vand.vv v8, v8, v10
227 ; RV32-NEXT: vsll.vi v8, v8, 4
228 ; RV32-NEXT: vor.vv v8, v9, v8
229 ; RV32-NEXT: vsrl.vi v9, v8, 2
230 ; RV32-NEXT: lui a1, 209715
231 ; RV32-NEXT: addi a1, a1, 819
232 ; RV32-NEXT: vsetvli a2, zero, e32, m1, ta, ma
233 ; RV32-NEXT: vmv.v.x v10, a1
234 ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
235 ; RV32-NEXT: vand.vv v9, v9, v10
236 ; RV32-NEXT: vand.vv v8, v8, v10
237 ; RV32-NEXT: vsll.vi v8, v8, 2
238 ; RV32-NEXT: vor.vv v8, v9, v8
239 ; RV32-NEXT: vsrl.vi v9, v8, 1
240 ; RV32-NEXT: lui a1, 349525
241 ; RV32-NEXT: addi a1, a1, 1365
242 ; RV32-NEXT: vsetvli a2, zero, e32, m1, ta, ma
243 ; RV32-NEXT: vmv.v.x v10, a1
244 ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
245 ; RV32-NEXT: vand.vv v9, v9, v10
246 ; RV32-NEXT: vand.vv v8, v8, v10
247 ; RV32-NEXT: vadd.vv v8, v8, v8
248 ; RV32-NEXT: vor.vv v8, v9, v8
249 ; RV32-NEXT: vse64.v v8, (a0)
250 ; RV32-NEXT: addi sp, sp, 16
253 ; RV64-LABEL: bitreverse_v2i64:
255 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
256 ; RV64-NEXT: vle64.v v8, (a0)
257 ; RV64-NEXT: li a1, 56
258 ; RV64-NEXT: vsrl.vx v9, v8, a1
259 ; RV64-NEXT: li a2, 40
260 ; RV64-NEXT: vsrl.vx v10, v8, a2
261 ; RV64-NEXT: lui a3, 16
262 ; RV64-NEXT: addiw a3, a3, -256
263 ; RV64-NEXT: vand.vx v10, v10, a3
264 ; RV64-NEXT: vor.vv v9, v10, v9
265 ; RV64-NEXT: vsrl.vi v10, v8, 24
266 ; RV64-NEXT: lui a4, 4080
267 ; RV64-NEXT: vand.vx v10, v10, a4
268 ; RV64-NEXT: vsrl.vi v11, v8, 8
269 ; RV64-NEXT: li a5, 255
270 ; RV64-NEXT: slli a5, a5, 24
271 ; RV64-NEXT: vand.vx v11, v11, a5
272 ; RV64-NEXT: vor.vv v10, v11, v10
273 ; RV64-NEXT: vor.vv v9, v10, v9
274 ; RV64-NEXT: vand.vx v10, v8, a5
275 ; RV64-NEXT: vsll.vi v10, v10, 8
276 ; RV64-NEXT: vand.vx v11, v8, a4
277 ; RV64-NEXT: vsll.vi v11, v11, 24
278 ; RV64-NEXT: vor.vv v10, v11, v10
279 ; RV64-NEXT: vsll.vx v11, v8, a1
280 ; RV64-NEXT: vand.vx v8, v8, a3
281 ; RV64-NEXT: vsll.vx v8, v8, a2
282 ; RV64-NEXT: vor.vv v8, v11, v8
283 ; RV64-NEXT: vor.vv v8, v8, v10
284 ; RV64-NEXT: vor.vv v8, v8, v9
285 ; RV64-NEXT: vsrl.vi v9, v8, 4
286 ; RV64-NEXT: lui a1, 61681
287 ; RV64-NEXT: addiw a1, a1, -241
288 ; RV64-NEXT: slli a2, a1, 32
289 ; RV64-NEXT: add a1, a1, a2
290 ; RV64-NEXT: vand.vx v9, v9, a1
291 ; RV64-NEXT: vand.vx v8, v8, a1
292 ; RV64-NEXT: vsll.vi v8, v8, 4
293 ; RV64-NEXT: vor.vv v8, v9, v8
294 ; RV64-NEXT: vsrl.vi v9, v8, 2
295 ; RV64-NEXT: lui a1, 209715
296 ; RV64-NEXT: addiw a1, a1, 819
297 ; RV64-NEXT: slli a2, a1, 32
298 ; RV64-NEXT: add a1, a1, a2
299 ; RV64-NEXT: vand.vx v9, v9, a1
300 ; RV64-NEXT: vand.vx v8, v8, a1
301 ; RV64-NEXT: vsll.vi v8, v8, 2
302 ; RV64-NEXT: vor.vv v8, v9, v8
303 ; RV64-NEXT: vsrl.vi v9, v8, 1
304 ; RV64-NEXT: lui a1, 349525
305 ; RV64-NEXT: addiw a1, a1, 1365
306 ; RV64-NEXT: slli a2, a1, 32
307 ; RV64-NEXT: add a1, a1, a2
308 ; RV64-NEXT: vand.vx v9, v9, a1
309 ; RV64-NEXT: vand.vx v8, v8, a1
310 ; RV64-NEXT: vadd.vv v8, v8, v8
311 ; RV64-NEXT: vor.vv v8, v9, v8
312 ; RV64-NEXT: vse64.v v8, (a0)
315 ; ZVBB-LABEL: bitreverse_v2i64:
317 ; ZVBB-NEXT: vsetivli zero, 2, e64, m1, ta, ma
318 ; ZVBB-NEXT: vle64.v v8, (a0)
319 ; ZVBB-NEXT: vbrev.v v8, v8
320 ; ZVBB-NEXT: vse64.v v8, (a0)
322 %a = load <2 x i64>, ptr %x
323 %b = load <2 x i64>, ptr %y
324 %c = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
325 store <2 x i64> %c, ptr %x
328 declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>)
330 define void @bitreverse_v16i16(ptr %x, ptr %y) {
331 ; LMULMAX2-RV32-LABEL: bitreverse_v16i16:
332 ; LMULMAX2-RV32: # %bb.0:
333 ; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, ma
334 ; LMULMAX2-RV32-NEXT: vle16.v v8, (a0)
335 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 8
336 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 8
337 ; LMULMAX2-RV32-NEXT: vor.vv v8, v8, v10
338 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 4
339 ; LMULMAX2-RV32-NEXT: lui a1, 1
340 ; LMULMAX2-RV32-NEXT: addi a1, a1, -241
341 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
342 ; LMULMAX2-RV32-NEXT: vand.vx v8, v8, a1
343 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 4
344 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
345 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 2
346 ; LMULMAX2-RV32-NEXT: lui a1, 3
347 ; LMULMAX2-RV32-NEXT: addi a1, a1, 819
348 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
349 ; LMULMAX2-RV32-NEXT: vand.vx v8, v8, a1
350 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 2
351 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
352 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 1
353 ; LMULMAX2-RV32-NEXT: lui a1, 5
354 ; LMULMAX2-RV32-NEXT: addi a1, a1, 1365
355 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
356 ; LMULMAX2-RV32-NEXT: vand.vx v8, v8, a1
357 ; LMULMAX2-RV32-NEXT: vadd.vv v8, v8, v8
358 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
359 ; LMULMAX2-RV32-NEXT: vse16.v v8, (a0)
360 ; LMULMAX2-RV32-NEXT: ret
362 ; LMULMAX2-RV64-LABEL: bitreverse_v16i16:
363 ; LMULMAX2-RV64: # %bb.0:
364 ; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, ma
365 ; LMULMAX2-RV64-NEXT: vle16.v v8, (a0)
366 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 8
367 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 8
368 ; LMULMAX2-RV64-NEXT: vor.vv v8, v8, v10
369 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 4
370 ; LMULMAX2-RV64-NEXT: lui a1, 1
371 ; LMULMAX2-RV64-NEXT: addi a1, a1, -241
372 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
373 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
374 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 4
375 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
376 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 2
377 ; LMULMAX2-RV64-NEXT: lui a1, 3
378 ; LMULMAX2-RV64-NEXT: addi a1, a1, 819
379 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
380 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
381 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 2
382 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
383 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 1
384 ; LMULMAX2-RV64-NEXT: lui a1, 5
385 ; LMULMAX2-RV64-NEXT: addi a1, a1, 1365
386 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
387 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
388 ; LMULMAX2-RV64-NEXT: vadd.vv v8, v8, v8
389 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
390 ; LMULMAX2-RV64-NEXT: vse16.v v8, (a0)
391 ; LMULMAX2-RV64-NEXT: ret
393 ; LMULMAX1-RV32-LABEL: bitreverse_v16i16:
394 ; LMULMAX1-RV32: # %bb.0:
395 ; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, ma
396 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
397 ; LMULMAX1-RV32-NEXT: vle16.v v8, (a1)
398 ; LMULMAX1-RV32-NEXT: vle16.v v9, (a0)
399 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 8
400 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 8
401 ; LMULMAX1-RV32-NEXT: vor.vv v8, v8, v10
402 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 4
403 ; LMULMAX1-RV32-NEXT: lui a2, 1
404 ; LMULMAX1-RV32-NEXT: addi a2, a2, -241
405 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a2
406 ; LMULMAX1-RV32-NEXT: vand.vx v8, v8, a2
407 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 4
408 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
409 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 2
410 ; LMULMAX1-RV32-NEXT: lui a3, 3
411 ; LMULMAX1-RV32-NEXT: addi a3, a3, 819
412 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a3
413 ; LMULMAX1-RV32-NEXT: vand.vx v8, v8, a3
414 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 2
415 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
416 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 1
417 ; LMULMAX1-RV32-NEXT: lui a4, 5
418 ; LMULMAX1-RV32-NEXT: addi a4, a4, 1365
419 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a4
420 ; LMULMAX1-RV32-NEXT: vand.vx v8, v8, a4
421 ; LMULMAX1-RV32-NEXT: vadd.vv v8, v8, v8
422 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
423 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 8
424 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 8
425 ; LMULMAX1-RV32-NEXT: vor.vv v9, v9, v10
426 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 4
427 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a2
428 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a2
429 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 4
430 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
431 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 2
432 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a3
433 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a3
434 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 2
435 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
436 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 1
437 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a4
438 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a4
439 ; LMULMAX1-RV32-NEXT: vadd.vv v9, v9, v9
440 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
441 ; LMULMAX1-RV32-NEXT: vse16.v v9, (a0)
442 ; LMULMAX1-RV32-NEXT: vse16.v v8, (a1)
443 ; LMULMAX1-RV32-NEXT: ret
445 ; LMULMAX1-RV64-LABEL: bitreverse_v16i16:
446 ; LMULMAX1-RV64: # %bb.0:
447 ; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, ma
448 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
449 ; LMULMAX1-RV64-NEXT: vle16.v v8, (a1)
450 ; LMULMAX1-RV64-NEXT: vle16.v v9, (a0)
451 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 8
452 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 8
453 ; LMULMAX1-RV64-NEXT: vor.vv v8, v8, v10
454 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 4
455 ; LMULMAX1-RV64-NEXT: lui a2, 1
456 ; LMULMAX1-RV64-NEXT: addi a2, a2, -241
457 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a2
458 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a2
459 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 4
460 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
461 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 2
462 ; LMULMAX1-RV64-NEXT: lui a3, 3
463 ; LMULMAX1-RV64-NEXT: addi a3, a3, 819
464 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a3
465 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a3
466 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 2
467 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
468 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 1
469 ; LMULMAX1-RV64-NEXT: lui a4, 5
470 ; LMULMAX1-RV64-NEXT: addi a4, a4, 1365
471 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a4
472 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a4
473 ; LMULMAX1-RV64-NEXT: vadd.vv v8, v8, v8
474 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
475 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 8
476 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 8
477 ; LMULMAX1-RV64-NEXT: vor.vv v9, v9, v10
478 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 4
479 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a2
480 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a2
481 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 4
482 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
483 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 2
484 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a3
485 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a3
486 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 2
487 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
488 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 1
489 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a4
490 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a4
491 ; LMULMAX1-RV64-NEXT: vadd.vv v9, v9, v9
492 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
493 ; LMULMAX1-RV64-NEXT: vse16.v v9, (a0)
494 ; LMULMAX1-RV64-NEXT: vse16.v v8, (a1)
495 ; LMULMAX1-RV64-NEXT: ret
497 ; ZVBB-LABEL: bitreverse_v16i16:
499 ; ZVBB-NEXT: vsetivli zero, 16, e16, m2, ta, ma
500 ; ZVBB-NEXT: vle16.v v8, (a0)
501 ; ZVBB-NEXT: vbrev.v v8, v8
502 ; ZVBB-NEXT: vse16.v v8, (a0)
504 %a = load <16 x i16>, ptr %x
505 %b = load <16 x i16>, ptr %y
506 %c = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
507 store <16 x i16> %c, ptr %x
510 declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>)
512 define void @bitreverse_v8i32(ptr %x, ptr %y) {
513 ; LMULMAX2-RV32-LABEL: bitreverse_v8i32:
514 ; LMULMAX2-RV32: # %bb.0:
515 ; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma
516 ; LMULMAX2-RV32-NEXT: vle32.v v8, (a0)
517 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 8
518 ; LMULMAX2-RV32-NEXT: lui a1, 16
519 ; LMULMAX2-RV32-NEXT: addi a1, a1, -256
520 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
521 ; LMULMAX2-RV32-NEXT: vsrl.vi v12, v8, 24
522 ; LMULMAX2-RV32-NEXT: vor.vv v10, v10, v12
523 ; LMULMAX2-RV32-NEXT: vand.vx v12, v8, a1
524 ; LMULMAX2-RV32-NEXT: vsll.vi v12, v12, 8
525 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 24
526 ; LMULMAX2-RV32-NEXT: vor.vv v8, v8, v12
527 ; LMULMAX2-RV32-NEXT: vor.vv v8, v8, v10
528 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 4
529 ; LMULMAX2-RV32-NEXT: lui a1, 61681
530 ; LMULMAX2-RV32-NEXT: addi a1, a1, -241
531 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
532 ; LMULMAX2-RV32-NEXT: vand.vx v8, v8, a1
533 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 4
534 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
535 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 2
536 ; LMULMAX2-RV32-NEXT: lui a1, 209715
537 ; LMULMAX2-RV32-NEXT: addi a1, a1, 819
538 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
539 ; LMULMAX2-RV32-NEXT: vand.vx v8, v8, a1
540 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 2
541 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
542 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 1
543 ; LMULMAX2-RV32-NEXT: lui a1, 349525
544 ; LMULMAX2-RV32-NEXT: addi a1, a1, 1365
545 ; LMULMAX2-RV32-NEXT: vand.vx v10, v10, a1
546 ; LMULMAX2-RV32-NEXT: vand.vx v8, v8, a1
547 ; LMULMAX2-RV32-NEXT: vadd.vv v8, v8, v8
548 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
549 ; LMULMAX2-RV32-NEXT: vse32.v v8, (a0)
550 ; LMULMAX2-RV32-NEXT: ret
552 ; LMULMAX2-RV64-LABEL: bitreverse_v8i32:
553 ; LMULMAX2-RV64: # %bb.0:
554 ; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, ma
555 ; LMULMAX2-RV64-NEXT: vle32.v v8, (a0)
556 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 8
557 ; LMULMAX2-RV64-NEXT: lui a1, 16
558 ; LMULMAX2-RV64-NEXT: addi a1, a1, -256
559 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
560 ; LMULMAX2-RV64-NEXT: vsrl.vi v12, v8, 24
561 ; LMULMAX2-RV64-NEXT: vor.vv v10, v10, v12
562 ; LMULMAX2-RV64-NEXT: vand.vx v12, v8, a1
563 ; LMULMAX2-RV64-NEXT: vsll.vi v12, v12, 8
564 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 24
565 ; LMULMAX2-RV64-NEXT: vor.vv v8, v8, v12
566 ; LMULMAX2-RV64-NEXT: vor.vv v8, v8, v10
567 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 4
568 ; LMULMAX2-RV64-NEXT: lui a1, 61681
569 ; LMULMAX2-RV64-NEXT: addi a1, a1, -241
570 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
571 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
572 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 4
573 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
574 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 2
575 ; LMULMAX2-RV64-NEXT: lui a1, 209715
576 ; LMULMAX2-RV64-NEXT: addi a1, a1, 819
577 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
578 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
579 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 2
580 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
581 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 1
582 ; LMULMAX2-RV64-NEXT: lui a1, 349525
583 ; LMULMAX2-RV64-NEXT: addi a1, a1, 1365
584 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
585 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
586 ; LMULMAX2-RV64-NEXT: vadd.vv v8, v8, v8
587 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
588 ; LMULMAX2-RV64-NEXT: vse32.v v8, (a0)
589 ; LMULMAX2-RV64-NEXT: ret
591 ; LMULMAX1-RV32-LABEL: bitreverse_v8i32:
592 ; LMULMAX1-RV32: # %bb.0:
593 ; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
594 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
595 ; LMULMAX1-RV32-NEXT: vle32.v v8, (a1)
596 ; LMULMAX1-RV32-NEXT: vle32.v v9, (a0)
597 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 8
598 ; LMULMAX1-RV32-NEXT: lui a2, 16
599 ; LMULMAX1-RV32-NEXT: addi a2, a2, -256
600 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a2
601 ; LMULMAX1-RV32-NEXT: vsrl.vi v11, v8, 24
602 ; LMULMAX1-RV32-NEXT: vor.vv v10, v10, v11
603 ; LMULMAX1-RV32-NEXT: vand.vx v11, v8, a2
604 ; LMULMAX1-RV32-NEXT: vsll.vi v11, v11, 8
605 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 24
606 ; LMULMAX1-RV32-NEXT: vor.vv v8, v8, v11
607 ; LMULMAX1-RV32-NEXT: vor.vv v8, v8, v10
608 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 4
609 ; LMULMAX1-RV32-NEXT: lui a3, 61681
610 ; LMULMAX1-RV32-NEXT: addi a3, a3, -241
611 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a3
612 ; LMULMAX1-RV32-NEXT: vand.vx v8, v8, a3
613 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 4
614 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
615 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 2
616 ; LMULMAX1-RV32-NEXT: lui a4, 209715
617 ; LMULMAX1-RV32-NEXT: addi a4, a4, 819
618 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a4
619 ; LMULMAX1-RV32-NEXT: vand.vx v8, v8, a4
620 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 2
621 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
622 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 1
623 ; LMULMAX1-RV32-NEXT: lui a5, 349525
624 ; LMULMAX1-RV32-NEXT: addi a5, a5, 1365
625 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a5
626 ; LMULMAX1-RV32-NEXT: vand.vx v8, v8, a5
627 ; LMULMAX1-RV32-NEXT: vadd.vv v8, v8, v8
628 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
629 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 8
630 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a2
631 ; LMULMAX1-RV32-NEXT: vsrl.vi v11, v9, 24
632 ; LMULMAX1-RV32-NEXT: vor.vv v10, v10, v11
633 ; LMULMAX1-RV32-NEXT: vand.vx v11, v9, a2
634 ; LMULMAX1-RV32-NEXT: vsll.vi v11, v11, 8
635 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 24
636 ; LMULMAX1-RV32-NEXT: vor.vv v9, v9, v11
637 ; LMULMAX1-RV32-NEXT: vor.vv v9, v9, v10
638 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 4
639 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a3
640 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a3
641 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 4
642 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
643 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 2
644 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a4
645 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a4
646 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 2
647 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
648 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 1
649 ; LMULMAX1-RV32-NEXT: vand.vx v10, v10, a5
650 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a5
651 ; LMULMAX1-RV32-NEXT: vadd.vv v9, v9, v9
652 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
653 ; LMULMAX1-RV32-NEXT: vse32.v v9, (a0)
654 ; LMULMAX1-RV32-NEXT: vse32.v v8, (a1)
655 ; LMULMAX1-RV32-NEXT: ret
657 ; LMULMAX1-RV64-LABEL: bitreverse_v8i32:
658 ; LMULMAX1-RV64: # %bb.0:
659 ; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, ma
660 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
661 ; LMULMAX1-RV64-NEXT: vle32.v v8, (a1)
662 ; LMULMAX1-RV64-NEXT: vle32.v v9, (a0)
663 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 8
664 ; LMULMAX1-RV64-NEXT: lui a2, 16
665 ; LMULMAX1-RV64-NEXT: addi a2, a2, -256
666 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a2
667 ; LMULMAX1-RV64-NEXT: vsrl.vi v11, v8, 24
668 ; LMULMAX1-RV64-NEXT: vor.vv v10, v10, v11
669 ; LMULMAX1-RV64-NEXT: vand.vx v11, v8, a2
670 ; LMULMAX1-RV64-NEXT: vsll.vi v11, v11, 8
671 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 24
672 ; LMULMAX1-RV64-NEXT: vor.vv v8, v8, v11
673 ; LMULMAX1-RV64-NEXT: vor.vv v8, v8, v10
674 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 4
675 ; LMULMAX1-RV64-NEXT: lui a3, 61681
676 ; LMULMAX1-RV64-NEXT: addi a3, a3, -241
677 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a3
678 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a3
679 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 4
680 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
681 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 2
682 ; LMULMAX1-RV64-NEXT: lui a4, 209715
683 ; LMULMAX1-RV64-NEXT: addi a4, a4, 819
684 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a4
685 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a4
686 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 2
687 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
688 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 1
689 ; LMULMAX1-RV64-NEXT: lui a5, 349525
690 ; LMULMAX1-RV64-NEXT: addi a5, a5, 1365
691 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a5
692 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a5
693 ; LMULMAX1-RV64-NEXT: vadd.vv v8, v8, v8
694 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
695 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 8
696 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a2
697 ; LMULMAX1-RV64-NEXT: vsrl.vi v11, v9, 24
698 ; LMULMAX1-RV64-NEXT: vor.vv v10, v10, v11
699 ; LMULMAX1-RV64-NEXT: vand.vx v11, v9, a2
700 ; LMULMAX1-RV64-NEXT: vsll.vi v11, v11, 8
701 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 24
702 ; LMULMAX1-RV64-NEXT: vor.vv v9, v9, v11
703 ; LMULMAX1-RV64-NEXT: vor.vv v9, v9, v10
704 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 4
705 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a3
706 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a3
707 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 4
708 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
709 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 2
710 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a4
711 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a4
712 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 2
713 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
714 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 1
715 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a5
716 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a5
717 ; LMULMAX1-RV64-NEXT: vadd.vv v9, v9, v9
718 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
719 ; LMULMAX1-RV64-NEXT: vse32.v v9, (a0)
720 ; LMULMAX1-RV64-NEXT: vse32.v v8, (a1)
721 ; LMULMAX1-RV64-NEXT: ret
723 ; ZVBB-LABEL: bitreverse_v8i32:
725 ; ZVBB-NEXT: vsetivli zero, 8, e32, m2, ta, ma
726 ; ZVBB-NEXT: vle32.v v8, (a0)
727 ; ZVBB-NEXT: vbrev.v v8, v8
728 ; ZVBB-NEXT: vse32.v v8, (a0)
730 %a = load <8 x i32>, ptr %x
731 %b = load <8 x i32>, ptr %y
732 %c = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
733 store <8 x i32> %c, ptr %x
736 declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>)
738 define void @bitreverse_v4i64(ptr %x, ptr %y) {
739 ; LMULMAX2-RV32-LABEL: bitreverse_v4i64:
740 ; LMULMAX2-RV32: # %bb.0:
741 ; LMULMAX2-RV32-NEXT: addi sp, sp, -16
742 ; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 16
743 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
744 ; LMULMAX2-RV32-NEXT: vle64.v v8, (a0)
745 ; LMULMAX2-RV32-NEXT: sw zero, 12(sp)
746 ; LMULMAX2-RV32-NEXT: lui a1, 1044480
747 ; LMULMAX2-RV32-NEXT: sw a1, 8(sp)
748 ; LMULMAX2-RV32-NEXT: li a1, 56
749 ; LMULMAX2-RV32-NEXT: vsrl.vx v10, v8, a1
750 ; LMULMAX2-RV32-NEXT: li a2, 40
751 ; LMULMAX2-RV32-NEXT: vsrl.vx v12, v8, a2
752 ; LMULMAX2-RV32-NEXT: lui a3, 16
753 ; LMULMAX2-RV32-NEXT: addi a3, a3, -256
754 ; LMULMAX2-RV32-NEXT: vand.vx v12, v12, a3
755 ; LMULMAX2-RV32-NEXT: vor.vv v10, v12, v10
756 ; LMULMAX2-RV32-NEXT: vsrl.vi v12, v8, 24
757 ; LMULMAX2-RV32-NEXT: addi a4, sp, 8
758 ; LMULMAX2-RV32-NEXT: vlse64.v v14, (a4), zero
759 ; LMULMAX2-RV32-NEXT: lui a4, 4080
760 ; LMULMAX2-RV32-NEXT: vand.vx v12, v12, a4
761 ; LMULMAX2-RV32-NEXT: vsrl.vi v16, v8, 8
762 ; LMULMAX2-RV32-NEXT: vand.vv v16, v16, v14
763 ; LMULMAX2-RV32-NEXT: vor.vv v12, v16, v12
764 ; LMULMAX2-RV32-NEXT: vor.vv v10, v12, v10
765 ; LMULMAX2-RV32-NEXT: vsll.vx v12, v8, a1
766 ; LMULMAX2-RV32-NEXT: vand.vx v16, v8, a3
767 ; LMULMAX2-RV32-NEXT: vsll.vx v16, v16, a2
768 ; LMULMAX2-RV32-NEXT: vor.vv v12, v12, v16
769 ; LMULMAX2-RV32-NEXT: vand.vx v16, v8, a4
770 ; LMULMAX2-RV32-NEXT: vsll.vi v16, v16, 24
771 ; LMULMAX2-RV32-NEXT: vand.vv v8, v8, v14
772 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 8
773 ; LMULMAX2-RV32-NEXT: vor.vv v8, v16, v8
774 ; LMULMAX2-RV32-NEXT: vor.vv v8, v12, v8
775 ; LMULMAX2-RV32-NEXT: vor.vv v8, v8, v10
776 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 4
777 ; LMULMAX2-RV32-NEXT: lui a1, 61681
778 ; LMULMAX2-RV32-NEXT: addi a1, a1, -241
779 ; LMULMAX2-RV32-NEXT: vsetvli a2, zero, e32, m2, ta, ma
780 ; LMULMAX2-RV32-NEXT: vmv.v.x v12, a1
781 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
782 ; LMULMAX2-RV32-NEXT: vand.vv v10, v10, v12
783 ; LMULMAX2-RV32-NEXT: vand.vv v8, v8, v12
784 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 4
785 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
786 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 2
787 ; LMULMAX2-RV32-NEXT: lui a1, 209715
788 ; LMULMAX2-RV32-NEXT: addi a1, a1, 819
789 ; LMULMAX2-RV32-NEXT: vsetvli a2, zero, e32, m2, ta, ma
790 ; LMULMAX2-RV32-NEXT: vmv.v.x v12, a1
791 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
792 ; LMULMAX2-RV32-NEXT: vand.vv v10, v10, v12
793 ; LMULMAX2-RV32-NEXT: vand.vv v8, v8, v12
794 ; LMULMAX2-RV32-NEXT: vsll.vi v8, v8, 2
795 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
796 ; LMULMAX2-RV32-NEXT: vsrl.vi v10, v8, 1
797 ; LMULMAX2-RV32-NEXT: lui a1, 349525
798 ; LMULMAX2-RV32-NEXT: addi a1, a1, 1365
799 ; LMULMAX2-RV32-NEXT: vsetvli a2, zero, e32, m2, ta, ma
800 ; LMULMAX2-RV32-NEXT: vmv.v.x v12, a1
801 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
802 ; LMULMAX2-RV32-NEXT: vand.vv v10, v10, v12
803 ; LMULMAX2-RV32-NEXT: vand.vv v8, v8, v12
804 ; LMULMAX2-RV32-NEXT: vadd.vv v8, v8, v8
805 ; LMULMAX2-RV32-NEXT: vor.vv v8, v10, v8
806 ; LMULMAX2-RV32-NEXT: vse64.v v8, (a0)
807 ; LMULMAX2-RV32-NEXT: addi sp, sp, 16
808 ; LMULMAX2-RV32-NEXT: ret
810 ; LMULMAX2-RV64-LABEL: bitreverse_v4i64:
811 ; LMULMAX2-RV64: # %bb.0:
812 ; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma
813 ; LMULMAX2-RV64-NEXT: vle64.v v8, (a0)
814 ; LMULMAX2-RV64-NEXT: li a1, 56
815 ; LMULMAX2-RV64-NEXT: vsrl.vx v10, v8, a1
816 ; LMULMAX2-RV64-NEXT: li a2, 40
817 ; LMULMAX2-RV64-NEXT: vsrl.vx v12, v8, a2
818 ; LMULMAX2-RV64-NEXT: lui a3, 16
819 ; LMULMAX2-RV64-NEXT: addiw a3, a3, -256
820 ; LMULMAX2-RV64-NEXT: vand.vx v12, v12, a3
821 ; LMULMAX2-RV64-NEXT: vor.vv v10, v12, v10
822 ; LMULMAX2-RV64-NEXT: vsrl.vi v12, v8, 24
823 ; LMULMAX2-RV64-NEXT: lui a4, 4080
824 ; LMULMAX2-RV64-NEXT: vand.vx v12, v12, a4
825 ; LMULMAX2-RV64-NEXT: vsrl.vi v14, v8, 8
826 ; LMULMAX2-RV64-NEXT: li a5, 255
827 ; LMULMAX2-RV64-NEXT: slli a5, a5, 24
828 ; LMULMAX2-RV64-NEXT: vand.vx v14, v14, a5
829 ; LMULMAX2-RV64-NEXT: vor.vv v12, v14, v12
830 ; LMULMAX2-RV64-NEXT: vor.vv v10, v12, v10
831 ; LMULMAX2-RV64-NEXT: vand.vx v12, v8, a5
832 ; LMULMAX2-RV64-NEXT: vsll.vi v12, v12, 8
833 ; LMULMAX2-RV64-NEXT: vand.vx v14, v8, a4
834 ; LMULMAX2-RV64-NEXT: vsll.vi v14, v14, 24
835 ; LMULMAX2-RV64-NEXT: vor.vv v12, v14, v12
836 ; LMULMAX2-RV64-NEXT: vsll.vx v14, v8, a1
837 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a3
838 ; LMULMAX2-RV64-NEXT: vsll.vx v8, v8, a2
839 ; LMULMAX2-RV64-NEXT: vor.vv v8, v14, v8
840 ; LMULMAX2-RV64-NEXT: vor.vv v8, v8, v12
841 ; LMULMAX2-RV64-NEXT: vor.vv v8, v8, v10
842 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 4
843 ; LMULMAX2-RV64-NEXT: lui a1, 61681
844 ; LMULMAX2-RV64-NEXT: addiw a1, a1, -241
845 ; LMULMAX2-RV64-NEXT: slli a2, a1, 32
846 ; LMULMAX2-RV64-NEXT: add a1, a1, a2
847 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
848 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
849 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 4
850 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
851 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 2
852 ; LMULMAX2-RV64-NEXT: lui a1, 209715
853 ; LMULMAX2-RV64-NEXT: addiw a1, a1, 819
854 ; LMULMAX2-RV64-NEXT: slli a2, a1, 32
855 ; LMULMAX2-RV64-NEXT: add a1, a1, a2
856 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
857 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
858 ; LMULMAX2-RV64-NEXT: vsll.vi v8, v8, 2
859 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
860 ; LMULMAX2-RV64-NEXT: vsrl.vi v10, v8, 1
861 ; LMULMAX2-RV64-NEXT: lui a1, 349525
862 ; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365
863 ; LMULMAX2-RV64-NEXT: slli a2, a1, 32
864 ; LMULMAX2-RV64-NEXT: add a1, a1, a2
865 ; LMULMAX2-RV64-NEXT: vand.vx v10, v10, a1
866 ; LMULMAX2-RV64-NEXT: vand.vx v8, v8, a1
867 ; LMULMAX2-RV64-NEXT: vadd.vv v8, v8, v8
868 ; LMULMAX2-RV64-NEXT: vor.vv v8, v10, v8
869 ; LMULMAX2-RV64-NEXT: vse64.v v8, (a0)
870 ; LMULMAX2-RV64-NEXT: ret
872 ; LMULMAX1-RV32-LABEL: bitreverse_v4i64:
873 ; LMULMAX1-RV32: # %bb.0:
874 ; LMULMAX1-RV32-NEXT: addi sp, sp, -16
875 ; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 16
876 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
877 ; LMULMAX1-RV32-NEXT: vle64.v v8, (a0)
878 ; LMULMAX1-RV32-NEXT: addi a1, a0, 16
879 ; LMULMAX1-RV32-NEXT: vle64.v v9, (a1)
880 ; LMULMAX1-RV32-NEXT: sw zero, 12(sp)
881 ; LMULMAX1-RV32-NEXT: lui a2, 1044480
882 ; LMULMAX1-RV32-NEXT: sw a2, 8(sp)
883 ; LMULMAX1-RV32-NEXT: li a2, 56
884 ; LMULMAX1-RV32-NEXT: vsrl.vx v10, v9, a2
885 ; LMULMAX1-RV32-NEXT: li a3, 40
886 ; LMULMAX1-RV32-NEXT: vsrl.vx v11, v9, a3
887 ; LMULMAX1-RV32-NEXT: lui a4, 16
888 ; LMULMAX1-RV32-NEXT: addi a4, a4, -256
889 ; LMULMAX1-RV32-NEXT: vand.vx v11, v11, a4
890 ; LMULMAX1-RV32-NEXT: vor.vv v10, v11, v10
891 ; LMULMAX1-RV32-NEXT: vsrl.vi v11, v9, 24
892 ; LMULMAX1-RV32-NEXT: addi a5, sp, 8
893 ; LMULMAX1-RV32-NEXT: vlse64.v v12, (a5), zero
894 ; LMULMAX1-RV32-NEXT: lui a5, 4080
895 ; LMULMAX1-RV32-NEXT: vand.vx v11, v11, a5
896 ; LMULMAX1-RV32-NEXT: vsrl.vi v13, v9, 8
897 ; LMULMAX1-RV32-NEXT: vand.vv v13, v13, v12
898 ; LMULMAX1-RV32-NEXT: vor.vv v11, v13, v11
899 ; LMULMAX1-RV32-NEXT: vor.vv v10, v11, v10
900 ; LMULMAX1-RV32-NEXT: vand.vv v11, v9, v12
901 ; LMULMAX1-RV32-NEXT: vsll.vi v11, v11, 8
902 ; LMULMAX1-RV32-NEXT: vand.vx v13, v9, a5
903 ; LMULMAX1-RV32-NEXT: vsll.vi v13, v13, 24
904 ; LMULMAX1-RV32-NEXT: vor.vv v11, v13, v11
905 ; LMULMAX1-RV32-NEXT: vsll.vx v13, v9, a2
906 ; LMULMAX1-RV32-NEXT: vand.vx v9, v9, a4
907 ; LMULMAX1-RV32-NEXT: vsll.vx v9, v9, a3
908 ; LMULMAX1-RV32-NEXT: vor.vv v9, v13, v9
909 ; LMULMAX1-RV32-NEXT: vor.vv v9, v9, v11
910 ; LMULMAX1-RV32-NEXT: vor.vv v9, v9, v10
911 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 4
912 ; LMULMAX1-RV32-NEXT: lui a6, 61681
913 ; LMULMAX1-RV32-NEXT: addi a6, a6, -241
914 ; LMULMAX1-RV32-NEXT: vsetvli a7, zero, e32, m1, ta, ma
915 ; LMULMAX1-RV32-NEXT: vmv.v.x v11, a6
916 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
917 ; LMULMAX1-RV32-NEXT: vand.vv v10, v10, v11
918 ; LMULMAX1-RV32-NEXT: vand.vv v9, v9, v11
919 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 4
920 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
921 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 2
922 ; LMULMAX1-RV32-NEXT: lui a6, 209715
923 ; LMULMAX1-RV32-NEXT: addi a6, a6, 819
924 ; LMULMAX1-RV32-NEXT: vsetvli a7, zero, e32, m1, ta, ma
925 ; LMULMAX1-RV32-NEXT: vmv.v.x v13, a6
926 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
927 ; LMULMAX1-RV32-NEXT: vand.vv v10, v10, v13
928 ; LMULMAX1-RV32-NEXT: vand.vv v9, v9, v13
929 ; LMULMAX1-RV32-NEXT: vsll.vi v9, v9, 2
930 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
931 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v9, 1
932 ; LMULMAX1-RV32-NEXT: lui a6, 349525
933 ; LMULMAX1-RV32-NEXT: addi a6, a6, 1365
934 ; LMULMAX1-RV32-NEXT: vsetvli a7, zero, e32, m1, ta, ma
935 ; LMULMAX1-RV32-NEXT: vmv.v.x v14, a6
936 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
937 ; LMULMAX1-RV32-NEXT: vand.vv v10, v10, v14
938 ; LMULMAX1-RV32-NEXT: vand.vv v9, v9, v14
939 ; LMULMAX1-RV32-NEXT: vadd.vv v9, v9, v9
940 ; LMULMAX1-RV32-NEXT: vor.vv v9, v10, v9
941 ; LMULMAX1-RV32-NEXT: vsrl.vx v10, v8, a2
942 ; LMULMAX1-RV32-NEXT: vsrl.vx v15, v8, a3
943 ; LMULMAX1-RV32-NEXT: vand.vx v15, v15, a4
944 ; LMULMAX1-RV32-NEXT: vor.vv v10, v15, v10
945 ; LMULMAX1-RV32-NEXT: vsrl.vi v15, v8, 24
946 ; LMULMAX1-RV32-NEXT: vand.vx v15, v15, a5
947 ; LMULMAX1-RV32-NEXT: vsrl.vi v16, v8, 8
948 ; LMULMAX1-RV32-NEXT: vand.vv v16, v16, v12
949 ; LMULMAX1-RV32-NEXT: vor.vv v15, v16, v15
950 ; LMULMAX1-RV32-NEXT: vor.vv v10, v15, v10
951 ; LMULMAX1-RV32-NEXT: vsll.vx v15, v8, a2
952 ; LMULMAX1-RV32-NEXT: vand.vx v16, v8, a4
953 ; LMULMAX1-RV32-NEXT: vsll.vx v16, v16, a3
954 ; LMULMAX1-RV32-NEXT: vor.vv v15, v15, v16
955 ; LMULMAX1-RV32-NEXT: vand.vx v16, v8, a5
956 ; LMULMAX1-RV32-NEXT: vsll.vi v16, v16, 24
957 ; LMULMAX1-RV32-NEXT: vand.vv v8, v8, v12
958 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 8
959 ; LMULMAX1-RV32-NEXT: vor.vv v8, v16, v8
960 ; LMULMAX1-RV32-NEXT: vor.vv v8, v15, v8
961 ; LMULMAX1-RV32-NEXT: vor.vv v8, v8, v10
962 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 4
963 ; LMULMAX1-RV32-NEXT: vand.vv v10, v10, v11
964 ; LMULMAX1-RV32-NEXT: vand.vv v8, v8, v11
965 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 4
966 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
967 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 2
968 ; LMULMAX1-RV32-NEXT: vand.vv v10, v10, v13
969 ; LMULMAX1-RV32-NEXT: vand.vv v8, v8, v13
970 ; LMULMAX1-RV32-NEXT: vsll.vi v8, v8, 2
971 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
972 ; LMULMAX1-RV32-NEXT: vsrl.vi v10, v8, 1
973 ; LMULMAX1-RV32-NEXT: vand.vv v10, v10, v14
974 ; LMULMAX1-RV32-NEXT: vand.vv v8, v8, v14
975 ; LMULMAX1-RV32-NEXT: vadd.vv v8, v8, v8
976 ; LMULMAX1-RV32-NEXT: vor.vv v8, v10, v8
977 ; LMULMAX1-RV32-NEXT: vse64.v v8, (a0)
978 ; LMULMAX1-RV32-NEXT: vse64.v v9, (a1)
979 ; LMULMAX1-RV32-NEXT: addi sp, sp, 16
980 ; LMULMAX1-RV32-NEXT: ret
982 ; LMULMAX1-RV64-LABEL: bitreverse_v4i64:
983 ; LMULMAX1-RV64: # %bb.0:
984 ; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
985 ; LMULMAX1-RV64-NEXT: addi a1, a0, 16
986 ; LMULMAX1-RV64-NEXT: vle64.v v9, (a1)
987 ; LMULMAX1-RV64-NEXT: vle64.v v8, (a0)
988 ; LMULMAX1-RV64-NEXT: li a2, 56
989 ; LMULMAX1-RV64-NEXT: vsrl.vx v10, v9, a2
990 ; LMULMAX1-RV64-NEXT: li a3, 40
991 ; LMULMAX1-RV64-NEXT: vsrl.vx v11, v9, a3
992 ; LMULMAX1-RV64-NEXT: lui a4, 16
993 ; LMULMAX1-RV64-NEXT: addiw a4, a4, -256
994 ; LMULMAX1-RV64-NEXT: vand.vx v11, v11, a4
995 ; LMULMAX1-RV64-NEXT: vor.vv v10, v11, v10
996 ; LMULMAX1-RV64-NEXT: vsrl.vi v11, v9, 24
997 ; LMULMAX1-RV64-NEXT: lui a5, 4080
998 ; LMULMAX1-RV64-NEXT: vand.vx v11, v11, a5
999 ; LMULMAX1-RV64-NEXT: vsrl.vi v12, v9, 8
1000 ; LMULMAX1-RV64-NEXT: li a6, 255
1001 ; LMULMAX1-RV64-NEXT: slli a6, a6, 24
1002 ; LMULMAX1-RV64-NEXT: vand.vx v12, v12, a6
1003 ; LMULMAX1-RV64-NEXT: vor.vv v11, v12, v11
1004 ; LMULMAX1-RV64-NEXT: vor.vv v10, v11, v10
1005 ; LMULMAX1-RV64-NEXT: vand.vx v11, v9, a6
1006 ; LMULMAX1-RV64-NEXT: vsll.vi v11, v11, 8
1007 ; LMULMAX1-RV64-NEXT: vand.vx v12, v9, a5
1008 ; LMULMAX1-RV64-NEXT: vsll.vi v12, v12, 24
1009 ; LMULMAX1-RV64-NEXT: vor.vv v11, v12, v11
1010 ; LMULMAX1-RV64-NEXT: vsll.vx v12, v9, a2
1011 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a4
1012 ; LMULMAX1-RV64-NEXT: vsll.vx v9, v9, a3
1013 ; LMULMAX1-RV64-NEXT: vor.vv v9, v12, v9
1014 ; LMULMAX1-RV64-NEXT: vor.vv v9, v9, v11
1015 ; LMULMAX1-RV64-NEXT: vor.vv v9, v9, v10
1016 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 4
1017 ; LMULMAX1-RV64-NEXT: lui a7, 61681
1018 ; LMULMAX1-RV64-NEXT: addiw a7, a7, -241
1019 ; LMULMAX1-RV64-NEXT: slli t0, a7, 32
1020 ; LMULMAX1-RV64-NEXT: add a7, a7, t0
1021 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a7
1022 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, a7
1023 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 4
1024 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
1025 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 2
1026 ; LMULMAX1-RV64-NEXT: lui t0, 209715
1027 ; LMULMAX1-RV64-NEXT: addiw t0, t0, 819
1028 ; LMULMAX1-RV64-NEXT: slli t1, t0, 32
1029 ; LMULMAX1-RV64-NEXT: add t0, t0, t1
1030 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, t0
1031 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, t0
1032 ; LMULMAX1-RV64-NEXT: vsll.vi v9, v9, 2
1033 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
1034 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v9, 1
1035 ; LMULMAX1-RV64-NEXT: lui t1, 349525
1036 ; LMULMAX1-RV64-NEXT: addiw t1, t1, 1365
1037 ; LMULMAX1-RV64-NEXT: slli t2, t1, 32
1038 ; LMULMAX1-RV64-NEXT: add t1, t1, t2
1039 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, t1
1040 ; LMULMAX1-RV64-NEXT: vand.vx v9, v9, t1
1041 ; LMULMAX1-RV64-NEXT: vadd.vv v9, v9, v9
1042 ; LMULMAX1-RV64-NEXT: vor.vv v9, v10, v9
1043 ; LMULMAX1-RV64-NEXT: vsrl.vx v10, v8, a2
1044 ; LMULMAX1-RV64-NEXT: vsrl.vx v11, v8, a3
1045 ; LMULMAX1-RV64-NEXT: vand.vx v11, v11, a4
1046 ; LMULMAX1-RV64-NEXT: vor.vv v10, v11, v10
1047 ; LMULMAX1-RV64-NEXT: vsrl.vi v11, v8, 24
1048 ; LMULMAX1-RV64-NEXT: vand.vx v11, v11, a5
1049 ; LMULMAX1-RV64-NEXT: vsrl.vi v12, v8, 8
1050 ; LMULMAX1-RV64-NEXT: vand.vx v12, v12, a6
1051 ; LMULMAX1-RV64-NEXT: vor.vv v11, v12, v11
1052 ; LMULMAX1-RV64-NEXT: vor.vv v10, v11, v10
1053 ; LMULMAX1-RV64-NEXT: vand.vx v11, v8, a6
1054 ; LMULMAX1-RV64-NEXT: vsll.vi v11, v11, 8
1055 ; LMULMAX1-RV64-NEXT: vand.vx v12, v8, a5
1056 ; LMULMAX1-RV64-NEXT: vsll.vi v12, v12, 24
1057 ; LMULMAX1-RV64-NEXT: vor.vv v11, v12, v11
1058 ; LMULMAX1-RV64-NEXT: vsll.vx v12, v8, a2
1059 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a4
1060 ; LMULMAX1-RV64-NEXT: vsll.vx v8, v8, a3
1061 ; LMULMAX1-RV64-NEXT: vor.vv v8, v12, v8
1062 ; LMULMAX1-RV64-NEXT: vor.vv v8, v8, v11
1063 ; LMULMAX1-RV64-NEXT: vor.vv v8, v8, v10
1064 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 4
1065 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, a7
1066 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, a7
1067 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 4
1068 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
1069 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 2
1070 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, t0
1071 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, t0
1072 ; LMULMAX1-RV64-NEXT: vsll.vi v8, v8, 2
1073 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
1074 ; LMULMAX1-RV64-NEXT: vsrl.vi v10, v8, 1
1075 ; LMULMAX1-RV64-NEXT: vand.vx v10, v10, t1
1076 ; LMULMAX1-RV64-NEXT: vand.vx v8, v8, t1
1077 ; LMULMAX1-RV64-NEXT: vadd.vv v8, v8, v8
1078 ; LMULMAX1-RV64-NEXT: vor.vv v8, v10, v8
1079 ; LMULMAX1-RV64-NEXT: vse64.v v8, (a0)
1080 ; LMULMAX1-RV64-NEXT: vse64.v v9, (a1)
1081 ; LMULMAX1-RV64-NEXT: ret
1083 ; ZVBB-LABEL: bitreverse_v4i64:
1085 ; ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1086 ; ZVBB-NEXT: vle64.v v8, (a0)
1087 ; ZVBB-NEXT: vbrev.v v8, v8
1088 ; ZVBB-NEXT: vse64.v v8, (a0)
1090 %a = load <4 x i64>, ptr %x
1091 %b = load <4 x i64>, ptr %y
1092 %c = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
1093 store <4 x i64> %c, ptr %x
1096 declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>)