Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-bitreverse.ll
blob7f211d0f8f9bade79ec6dc8c9a94f6ab27729a60
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
4 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=ZVBB
5 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=ZVBB
7 define void @bitreverse_v8i16(ptr %x, ptr %y) {
8 ; CHECK-LABEL: bitreverse_v8i16:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
11 ; CHECK-NEXT:    vle16.v v8, (a0)
12 ; CHECK-NEXT:    vsrl.vi v9, v8, 8
13 ; CHECK-NEXT:    vsll.vi v8, v8, 8
14 ; CHECK-NEXT:    vor.vv v8, v8, v9
15 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
16 ; CHECK-NEXT:    lui a1, 1
17 ; CHECK-NEXT:    addi a1, a1, -241
18 ; CHECK-NEXT:    vand.vx v9, v9, a1
19 ; CHECK-NEXT:    vand.vx v8, v8, a1
20 ; CHECK-NEXT:    vsll.vi v8, v8, 4
21 ; CHECK-NEXT:    vor.vv v8, v9, v8
22 ; CHECK-NEXT:    vsrl.vi v9, v8, 2
23 ; CHECK-NEXT:    lui a1, 3
24 ; CHECK-NEXT:    addi a1, a1, 819
25 ; CHECK-NEXT:    vand.vx v9, v9, a1
26 ; CHECK-NEXT:    vand.vx v8, v8, a1
27 ; CHECK-NEXT:    vsll.vi v8, v8, 2
28 ; CHECK-NEXT:    vor.vv v8, v9, v8
29 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
30 ; CHECK-NEXT:    lui a1, 5
31 ; CHECK-NEXT:    addi a1, a1, 1365
32 ; CHECK-NEXT:    vand.vx v9, v9, a1
33 ; CHECK-NEXT:    vand.vx v8, v8, a1
34 ; CHECK-NEXT:    vadd.vv v8, v8, v8
35 ; CHECK-NEXT:    vor.vv v8, v9, v8
36 ; CHECK-NEXT:    vse16.v v8, (a0)
37 ; CHECK-NEXT:    ret
39 ; ZVBB-LABEL: bitreverse_v8i16:
40 ; ZVBB:       # %bb.0:
41 ; ZVBB-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
42 ; ZVBB-NEXT:    vle16.v v8, (a0)
43 ; ZVBB-NEXT:    vbrev.v v8, v8
44 ; ZVBB-NEXT:    vse16.v v8, (a0)
45 ; ZVBB-NEXT:    ret
46   %a = load <8 x i16>, ptr %x
47   %b = load <8 x i16>, ptr %y
48   %c = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
49   store <8 x i16> %c, ptr %x
50   ret void
52 declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>)
54 define void @bitreverse_v4i32(ptr %x, ptr %y) {
55 ; CHECK-LABEL: bitreverse_v4i32:
56 ; CHECK:       # %bb.0:
57 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
58 ; CHECK-NEXT:    vle32.v v8, (a0)
59 ; CHECK-NEXT:    vsrl.vi v9, v8, 8
60 ; CHECK-NEXT:    lui a1, 16
61 ; CHECK-NEXT:    addi a1, a1, -256
62 ; CHECK-NEXT:    vand.vx v9, v9, a1
63 ; CHECK-NEXT:    vsrl.vi v10, v8, 24
64 ; CHECK-NEXT:    vor.vv v9, v9, v10
65 ; CHECK-NEXT:    vand.vx v10, v8, a1
66 ; CHECK-NEXT:    vsll.vi v10, v10, 8
67 ; CHECK-NEXT:    vsll.vi v8, v8, 24
68 ; CHECK-NEXT:    vor.vv v8, v8, v10
69 ; CHECK-NEXT:    vor.vv v8, v8, v9
70 ; CHECK-NEXT:    vsrl.vi v9, v8, 4
71 ; CHECK-NEXT:    lui a1, 61681
72 ; CHECK-NEXT:    addi a1, a1, -241
73 ; CHECK-NEXT:    vand.vx v9, v9, a1
74 ; CHECK-NEXT:    vand.vx v8, v8, a1
75 ; CHECK-NEXT:    vsll.vi v8, v8, 4
76 ; CHECK-NEXT:    vor.vv v8, v9, v8
77 ; CHECK-NEXT:    vsrl.vi v9, v8, 2
78 ; CHECK-NEXT:    lui a1, 209715
79 ; CHECK-NEXT:    addi a1, a1, 819
80 ; CHECK-NEXT:    vand.vx v9, v9, a1
81 ; CHECK-NEXT:    vand.vx v8, v8, a1
82 ; CHECK-NEXT:    vsll.vi v8, v8, 2
83 ; CHECK-NEXT:    vor.vv v8, v9, v8
84 ; CHECK-NEXT:    vsrl.vi v9, v8, 1
85 ; CHECK-NEXT:    lui a1, 349525
86 ; CHECK-NEXT:    addi a1, a1, 1365
87 ; CHECK-NEXT:    vand.vx v9, v9, a1
88 ; CHECK-NEXT:    vand.vx v8, v8, a1
89 ; CHECK-NEXT:    vadd.vv v8, v8, v8
90 ; CHECK-NEXT:    vor.vv v8, v9, v8
91 ; CHECK-NEXT:    vse32.v v8, (a0)
92 ; CHECK-NEXT:    ret
94 ; ZVBB-LABEL: bitreverse_v4i32:
95 ; ZVBB:       # %bb.0:
96 ; ZVBB-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
97 ; ZVBB-NEXT:    vle32.v v8, (a0)
98 ; ZVBB-NEXT:    vbrev.v v8, v8
99 ; ZVBB-NEXT:    vse32.v v8, (a0)
100 ; ZVBB-NEXT:    ret
101   %a = load <4 x i32>, ptr %x
102   %b = load <4 x i32>, ptr %y
103   %c = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
104   store <4 x i32> %c, ptr %x
105   ret void
107 declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)
109 define void @bitreverse_v2i64(ptr %x, ptr %y) {
110 ; RV32-LABEL: bitreverse_v2i64:
111 ; RV32:       # %bb.0:
112 ; RV32-NEXT:    addi sp, sp, -16
113 ; RV32-NEXT:    .cfi_def_cfa_offset 16
114 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
115 ; RV32-NEXT:    vle64.v v8, (a0)
116 ; RV32-NEXT:    sw zero, 12(sp)
117 ; RV32-NEXT:    lui a1, 1044480
118 ; RV32-NEXT:    sw a1, 8(sp)
119 ; RV32-NEXT:    li a1, 56
120 ; RV32-NEXT:    vsrl.vx v9, v8, a1
121 ; RV32-NEXT:    li a2, 40
122 ; RV32-NEXT:    vsrl.vx v10, v8, a2
123 ; RV32-NEXT:    lui a3, 16
124 ; RV32-NEXT:    addi a3, a3, -256
125 ; RV32-NEXT:    vand.vx v10, v10, a3
126 ; RV32-NEXT:    vor.vv v9, v10, v9
127 ; RV32-NEXT:    vsrl.vi v10, v8, 24
128 ; RV32-NEXT:    addi a4, sp, 8
129 ; RV32-NEXT:    vlse64.v v11, (a4), zero
130 ; RV32-NEXT:    lui a4, 4080
131 ; RV32-NEXT:    vand.vx v10, v10, a4
132 ; RV32-NEXT:    vsrl.vi v12, v8, 8
133 ; RV32-NEXT:    vand.vv v12, v12, v11
134 ; RV32-NEXT:    vor.vv v10, v12, v10
135 ; RV32-NEXT:    vor.vv v9, v10, v9
136 ; RV32-NEXT:    vsll.vx v10, v8, a1
137 ; RV32-NEXT:    vand.vx v12, v8, a3
138 ; RV32-NEXT:    vsll.vx v12, v12, a2
139 ; RV32-NEXT:    vor.vv v10, v10, v12
140 ; RV32-NEXT:    vand.vx v12, v8, a4
141 ; RV32-NEXT:    vsll.vi v12, v12, 24
142 ; RV32-NEXT:    vand.vv v8, v8, v11
143 ; RV32-NEXT:    vsll.vi v8, v8, 8
144 ; RV32-NEXT:    vor.vv v8, v12, v8
145 ; RV32-NEXT:    vor.vv v8, v10, v8
146 ; RV32-NEXT:    vor.vv v8, v8, v9
147 ; RV32-NEXT:    vsrl.vi v9, v8, 4
148 ; RV32-NEXT:    lui a1, 61681
149 ; RV32-NEXT:    addi a1, a1, -241
150 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
151 ; RV32-NEXT:    vmv.v.x v10, a1
152 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
153 ; RV32-NEXT:    vand.vv v9, v9, v10
154 ; RV32-NEXT:    vand.vv v8, v8, v10
155 ; RV32-NEXT:    vsll.vi v8, v8, 4
156 ; RV32-NEXT:    vor.vv v8, v9, v8
157 ; RV32-NEXT:    vsrl.vi v9, v8, 2
158 ; RV32-NEXT:    lui a1, 209715
159 ; RV32-NEXT:    addi a1, a1, 819
160 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
161 ; RV32-NEXT:    vmv.v.x v10, a1
162 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
163 ; RV32-NEXT:    vand.vv v9, v9, v10
164 ; RV32-NEXT:    vand.vv v8, v8, v10
165 ; RV32-NEXT:    vsll.vi v8, v8, 2
166 ; RV32-NEXT:    vor.vv v8, v9, v8
167 ; RV32-NEXT:    vsrl.vi v9, v8, 1
168 ; RV32-NEXT:    lui a1, 349525
169 ; RV32-NEXT:    addi a1, a1, 1365
170 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
171 ; RV32-NEXT:    vmv.v.x v10, a1
172 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
173 ; RV32-NEXT:    vand.vv v9, v9, v10
174 ; RV32-NEXT:    vand.vv v8, v8, v10
175 ; RV32-NEXT:    vadd.vv v8, v8, v8
176 ; RV32-NEXT:    vor.vv v8, v9, v8
177 ; RV32-NEXT:    vse64.v v8, (a0)
178 ; RV32-NEXT:    addi sp, sp, 16
179 ; RV32-NEXT:    ret
181 ; RV64-LABEL: bitreverse_v2i64:
182 ; RV64:       # %bb.0:
183 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
184 ; RV64-NEXT:    vle64.v v8, (a0)
185 ; RV64-NEXT:    li a1, 56
186 ; RV64-NEXT:    vsrl.vx v9, v8, a1
187 ; RV64-NEXT:    li a2, 40
188 ; RV64-NEXT:    vsrl.vx v10, v8, a2
189 ; RV64-NEXT:    lui a3, 16
190 ; RV64-NEXT:    addiw a3, a3, -256
191 ; RV64-NEXT:    vand.vx v10, v10, a3
192 ; RV64-NEXT:    vor.vv v9, v10, v9
193 ; RV64-NEXT:    vsrl.vi v10, v8, 24
194 ; RV64-NEXT:    lui a4, 4080
195 ; RV64-NEXT:    vand.vx v10, v10, a4
196 ; RV64-NEXT:    vsrl.vi v11, v8, 8
197 ; RV64-NEXT:    li a5, 255
198 ; RV64-NEXT:    slli a5, a5, 24
199 ; RV64-NEXT:    vand.vx v11, v11, a5
200 ; RV64-NEXT:    vor.vv v10, v11, v10
201 ; RV64-NEXT:    vor.vv v9, v10, v9
202 ; RV64-NEXT:    vand.vx v10, v8, a5
203 ; RV64-NEXT:    vsll.vi v10, v10, 8
204 ; RV64-NEXT:    vand.vx v11, v8, a4
205 ; RV64-NEXT:    vsll.vi v11, v11, 24
206 ; RV64-NEXT:    vor.vv v10, v11, v10
207 ; RV64-NEXT:    vsll.vx v11, v8, a1
208 ; RV64-NEXT:    vand.vx v8, v8, a3
209 ; RV64-NEXT:    vsll.vx v8, v8, a2
210 ; RV64-NEXT:    vor.vv v8, v11, v8
211 ; RV64-NEXT:    vor.vv v8, v8, v10
212 ; RV64-NEXT:    vor.vv v8, v8, v9
213 ; RV64-NEXT:    vsrl.vi v9, v8, 4
214 ; RV64-NEXT:    lui a1, 61681
215 ; RV64-NEXT:    addiw a1, a1, -241
216 ; RV64-NEXT:    slli a2, a1, 32
217 ; RV64-NEXT:    add a1, a1, a2
218 ; RV64-NEXT:    vand.vx v9, v9, a1
219 ; RV64-NEXT:    vand.vx v8, v8, a1
220 ; RV64-NEXT:    vsll.vi v8, v8, 4
221 ; RV64-NEXT:    vor.vv v8, v9, v8
222 ; RV64-NEXT:    vsrl.vi v9, v8, 2
223 ; RV64-NEXT:    lui a1, 209715
224 ; RV64-NEXT:    addiw a1, a1, 819
225 ; RV64-NEXT:    slli a2, a1, 32
226 ; RV64-NEXT:    add a1, a1, a2
227 ; RV64-NEXT:    vand.vx v9, v9, a1
228 ; RV64-NEXT:    vand.vx v8, v8, a1
229 ; RV64-NEXT:    vsll.vi v8, v8, 2
230 ; RV64-NEXT:    vor.vv v8, v9, v8
231 ; RV64-NEXT:    vsrl.vi v9, v8, 1
232 ; RV64-NEXT:    lui a1, 349525
233 ; RV64-NEXT:    addiw a1, a1, 1365
234 ; RV64-NEXT:    slli a2, a1, 32
235 ; RV64-NEXT:    add a1, a1, a2
236 ; RV64-NEXT:    vand.vx v9, v9, a1
237 ; RV64-NEXT:    vand.vx v8, v8, a1
238 ; RV64-NEXT:    vadd.vv v8, v8, v8
239 ; RV64-NEXT:    vor.vv v8, v9, v8
240 ; RV64-NEXT:    vse64.v v8, (a0)
241 ; RV64-NEXT:    ret
243 ; ZVBB-LABEL: bitreverse_v2i64:
244 ; ZVBB:       # %bb.0:
245 ; ZVBB-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
246 ; ZVBB-NEXT:    vle64.v v8, (a0)
247 ; ZVBB-NEXT:    vbrev.v v8, v8
248 ; ZVBB-NEXT:    vse64.v v8, (a0)
249 ; ZVBB-NEXT:    ret
250   %a = load <2 x i64>, ptr %x
251   %b = load <2 x i64>, ptr %y
252   %c = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
253   store <2 x i64> %c, ptr %x
254   ret void
256 declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>)
258 define void @bitreverse_v16i16(ptr %x, ptr %y) {
259 ; CHECK-LABEL: bitreverse_v16i16:
260 ; CHECK:       # %bb.0:
261 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
262 ; CHECK-NEXT:    vle16.v v8, (a0)
263 ; CHECK-NEXT:    vsrl.vi v10, v8, 8
264 ; CHECK-NEXT:    vsll.vi v8, v8, 8
265 ; CHECK-NEXT:    vor.vv v8, v8, v10
266 ; CHECK-NEXT:    vsrl.vi v10, v8, 4
267 ; CHECK-NEXT:    lui a1, 1
268 ; CHECK-NEXT:    addi a1, a1, -241
269 ; CHECK-NEXT:    vand.vx v10, v10, a1
270 ; CHECK-NEXT:    vand.vx v8, v8, a1
271 ; CHECK-NEXT:    vsll.vi v8, v8, 4
272 ; CHECK-NEXT:    vor.vv v8, v10, v8
273 ; CHECK-NEXT:    vsrl.vi v10, v8, 2
274 ; CHECK-NEXT:    lui a1, 3
275 ; CHECK-NEXT:    addi a1, a1, 819
276 ; CHECK-NEXT:    vand.vx v10, v10, a1
277 ; CHECK-NEXT:    vand.vx v8, v8, a1
278 ; CHECK-NEXT:    vsll.vi v8, v8, 2
279 ; CHECK-NEXT:    vor.vv v8, v10, v8
280 ; CHECK-NEXT:    vsrl.vi v10, v8, 1
281 ; CHECK-NEXT:    lui a1, 5
282 ; CHECK-NEXT:    addi a1, a1, 1365
283 ; CHECK-NEXT:    vand.vx v10, v10, a1
284 ; CHECK-NEXT:    vand.vx v8, v8, a1
285 ; CHECK-NEXT:    vadd.vv v8, v8, v8
286 ; CHECK-NEXT:    vor.vv v8, v10, v8
287 ; CHECK-NEXT:    vse16.v v8, (a0)
288 ; CHECK-NEXT:    ret
290 ; ZVBB-LABEL: bitreverse_v16i16:
291 ; ZVBB:       # %bb.0:
292 ; ZVBB-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
293 ; ZVBB-NEXT:    vle16.v v8, (a0)
294 ; ZVBB-NEXT:    vbrev.v v8, v8
295 ; ZVBB-NEXT:    vse16.v v8, (a0)
296 ; ZVBB-NEXT:    ret
297   %a = load <16 x i16>, ptr %x
298   %b = load <16 x i16>, ptr %y
299   %c = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
300   store <16 x i16> %c, ptr %x
301   ret void
303 declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>)
305 define void @bitreverse_v8i32(ptr %x, ptr %y) {
306 ; CHECK-LABEL: bitreverse_v8i32:
307 ; CHECK:       # %bb.0:
308 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
309 ; CHECK-NEXT:    vle32.v v8, (a0)
310 ; CHECK-NEXT:    vsrl.vi v10, v8, 8
311 ; CHECK-NEXT:    lui a1, 16
312 ; CHECK-NEXT:    addi a1, a1, -256
313 ; CHECK-NEXT:    vand.vx v10, v10, a1
314 ; CHECK-NEXT:    vsrl.vi v12, v8, 24
315 ; CHECK-NEXT:    vor.vv v10, v10, v12
316 ; CHECK-NEXT:    vand.vx v12, v8, a1
317 ; CHECK-NEXT:    vsll.vi v12, v12, 8
318 ; CHECK-NEXT:    vsll.vi v8, v8, 24
319 ; CHECK-NEXT:    vor.vv v8, v8, v12
320 ; CHECK-NEXT:    vor.vv v8, v8, v10
321 ; CHECK-NEXT:    vsrl.vi v10, v8, 4
322 ; CHECK-NEXT:    lui a1, 61681
323 ; CHECK-NEXT:    addi a1, a1, -241
324 ; CHECK-NEXT:    vand.vx v10, v10, a1
325 ; CHECK-NEXT:    vand.vx v8, v8, a1
326 ; CHECK-NEXT:    vsll.vi v8, v8, 4
327 ; CHECK-NEXT:    vor.vv v8, v10, v8
328 ; CHECK-NEXT:    vsrl.vi v10, v8, 2
329 ; CHECK-NEXT:    lui a1, 209715
330 ; CHECK-NEXT:    addi a1, a1, 819
331 ; CHECK-NEXT:    vand.vx v10, v10, a1
332 ; CHECK-NEXT:    vand.vx v8, v8, a1
333 ; CHECK-NEXT:    vsll.vi v8, v8, 2
334 ; CHECK-NEXT:    vor.vv v8, v10, v8
335 ; CHECK-NEXT:    vsrl.vi v10, v8, 1
336 ; CHECK-NEXT:    lui a1, 349525
337 ; CHECK-NEXT:    addi a1, a1, 1365
338 ; CHECK-NEXT:    vand.vx v10, v10, a1
339 ; CHECK-NEXT:    vand.vx v8, v8, a1
340 ; CHECK-NEXT:    vadd.vv v8, v8, v8
341 ; CHECK-NEXT:    vor.vv v8, v10, v8
342 ; CHECK-NEXT:    vse32.v v8, (a0)
343 ; CHECK-NEXT:    ret
345 ; ZVBB-LABEL: bitreverse_v8i32:
346 ; ZVBB:       # %bb.0:
347 ; ZVBB-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
348 ; ZVBB-NEXT:    vle32.v v8, (a0)
349 ; ZVBB-NEXT:    vbrev.v v8, v8
350 ; ZVBB-NEXT:    vse32.v v8, (a0)
351 ; ZVBB-NEXT:    ret
352   %a = load <8 x i32>, ptr %x
353   %b = load <8 x i32>, ptr %y
354   %c = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
355   store <8 x i32> %c, ptr %x
356   ret void
358 declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>)
360 define void @bitreverse_v4i64(ptr %x, ptr %y) {
361 ; RV32-LABEL: bitreverse_v4i64:
362 ; RV32:       # %bb.0:
363 ; RV32-NEXT:    addi sp, sp, -16
364 ; RV32-NEXT:    .cfi_def_cfa_offset 16
365 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
366 ; RV32-NEXT:    vle64.v v8, (a0)
367 ; RV32-NEXT:    sw zero, 12(sp)
368 ; RV32-NEXT:    lui a1, 1044480
369 ; RV32-NEXT:    sw a1, 8(sp)
370 ; RV32-NEXT:    li a1, 56
371 ; RV32-NEXT:    vsrl.vx v10, v8, a1
372 ; RV32-NEXT:    li a2, 40
373 ; RV32-NEXT:    vsrl.vx v12, v8, a2
374 ; RV32-NEXT:    lui a3, 16
375 ; RV32-NEXT:    addi a3, a3, -256
376 ; RV32-NEXT:    vand.vx v12, v12, a3
377 ; RV32-NEXT:    vor.vv v10, v12, v10
378 ; RV32-NEXT:    vsrl.vi v12, v8, 24
379 ; RV32-NEXT:    addi a4, sp, 8
380 ; RV32-NEXT:    vlse64.v v14, (a4), zero
381 ; RV32-NEXT:    lui a4, 4080
382 ; RV32-NEXT:    vand.vx v12, v12, a4
383 ; RV32-NEXT:    vsrl.vi v16, v8, 8
384 ; RV32-NEXT:    vand.vv v16, v16, v14
385 ; RV32-NEXT:    vor.vv v12, v16, v12
386 ; RV32-NEXT:    vor.vv v10, v12, v10
387 ; RV32-NEXT:    vsll.vx v12, v8, a1
388 ; RV32-NEXT:    vand.vx v16, v8, a3
389 ; RV32-NEXT:    vsll.vx v16, v16, a2
390 ; RV32-NEXT:    vor.vv v12, v12, v16
391 ; RV32-NEXT:    vand.vx v16, v8, a4
392 ; RV32-NEXT:    vsll.vi v16, v16, 24
393 ; RV32-NEXT:    vand.vv v8, v8, v14
394 ; RV32-NEXT:    vsll.vi v8, v8, 8
395 ; RV32-NEXT:    vor.vv v8, v16, v8
396 ; RV32-NEXT:    vor.vv v8, v12, v8
397 ; RV32-NEXT:    vor.vv v8, v8, v10
398 ; RV32-NEXT:    vsrl.vi v10, v8, 4
399 ; RV32-NEXT:    lui a1, 61681
400 ; RV32-NEXT:    addi a1, a1, -241
401 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
402 ; RV32-NEXT:    vmv.v.x v12, a1
403 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
404 ; RV32-NEXT:    vand.vv v10, v10, v12
405 ; RV32-NEXT:    vand.vv v8, v8, v12
406 ; RV32-NEXT:    vsll.vi v8, v8, 4
407 ; RV32-NEXT:    vor.vv v8, v10, v8
408 ; RV32-NEXT:    vsrl.vi v10, v8, 2
409 ; RV32-NEXT:    lui a1, 209715
410 ; RV32-NEXT:    addi a1, a1, 819
411 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
412 ; RV32-NEXT:    vmv.v.x v12, a1
413 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
414 ; RV32-NEXT:    vand.vv v10, v10, v12
415 ; RV32-NEXT:    vand.vv v8, v8, v12
416 ; RV32-NEXT:    vsll.vi v8, v8, 2
417 ; RV32-NEXT:    vor.vv v8, v10, v8
418 ; RV32-NEXT:    vsrl.vi v10, v8, 1
419 ; RV32-NEXT:    lui a1, 349525
420 ; RV32-NEXT:    addi a1, a1, 1365
421 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
422 ; RV32-NEXT:    vmv.v.x v12, a1
423 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
424 ; RV32-NEXT:    vand.vv v10, v10, v12
425 ; RV32-NEXT:    vand.vv v8, v8, v12
426 ; RV32-NEXT:    vadd.vv v8, v8, v8
427 ; RV32-NEXT:    vor.vv v8, v10, v8
428 ; RV32-NEXT:    vse64.v v8, (a0)
429 ; RV32-NEXT:    addi sp, sp, 16
430 ; RV32-NEXT:    ret
432 ; RV64-LABEL: bitreverse_v4i64:
433 ; RV64:       # %bb.0:
434 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
435 ; RV64-NEXT:    vle64.v v8, (a0)
436 ; RV64-NEXT:    li a1, 56
437 ; RV64-NEXT:    vsrl.vx v10, v8, a1
438 ; RV64-NEXT:    li a2, 40
439 ; RV64-NEXT:    vsrl.vx v12, v8, a2
440 ; RV64-NEXT:    lui a3, 16
441 ; RV64-NEXT:    addiw a3, a3, -256
442 ; RV64-NEXT:    vand.vx v12, v12, a3
443 ; RV64-NEXT:    vor.vv v10, v12, v10
444 ; RV64-NEXT:    vsrl.vi v12, v8, 24
445 ; RV64-NEXT:    lui a4, 4080
446 ; RV64-NEXT:    vand.vx v12, v12, a4
447 ; RV64-NEXT:    vsrl.vi v14, v8, 8
448 ; RV64-NEXT:    li a5, 255
449 ; RV64-NEXT:    slli a5, a5, 24
450 ; RV64-NEXT:    vand.vx v14, v14, a5
451 ; RV64-NEXT:    vor.vv v12, v14, v12
452 ; RV64-NEXT:    vor.vv v10, v12, v10
453 ; RV64-NEXT:    vand.vx v12, v8, a5
454 ; RV64-NEXT:    vsll.vi v12, v12, 8
455 ; RV64-NEXT:    vand.vx v14, v8, a4
456 ; RV64-NEXT:    vsll.vi v14, v14, 24
457 ; RV64-NEXT:    vor.vv v12, v14, v12
458 ; RV64-NEXT:    vsll.vx v14, v8, a1
459 ; RV64-NEXT:    vand.vx v8, v8, a3
460 ; RV64-NEXT:    vsll.vx v8, v8, a2
461 ; RV64-NEXT:    vor.vv v8, v14, v8
462 ; RV64-NEXT:    vor.vv v8, v8, v12
463 ; RV64-NEXT:    vor.vv v8, v8, v10
464 ; RV64-NEXT:    vsrl.vi v10, v8, 4
465 ; RV64-NEXT:    lui a1, 61681
466 ; RV64-NEXT:    addiw a1, a1, -241
467 ; RV64-NEXT:    slli a2, a1, 32
468 ; RV64-NEXT:    add a1, a1, a2
469 ; RV64-NEXT:    vand.vx v10, v10, a1
470 ; RV64-NEXT:    vand.vx v8, v8, a1
471 ; RV64-NEXT:    vsll.vi v8, v8, 4
472 ; RV64-NEXT:    vor.vv v8, v10, v8
473 ; RV64-NEXT:    vsrl.vi v10, v8, 2
474 ; RV64-NEXT:    lui a1, 209715
475 ; RV64-NEXT:    addiw a1, a1, 819
476 ; RV64-NEXT:    slli a2, a1, 32
477 ; RV64-NEXT:    add a1, a1, a2
478 ; RV64-NEXT:    vand.vx v10, v10, a1
479 ; RV64-NEXT:    vand.vx v8, v8, a1
480 ; RV64-NEXT:    vsll.vi v8, v8, 2
481 ; RV64-NEXT:    vor.vv v8, v10, v8
482 ; RV64-NEXT:    vsrl.vi v10, v8, 1
483 ; RV64-NEXT:    lui a1, 349525
484 ; RV64-NEXT:    addiw a1, a1, 1365
485 ; RV64-NEXT:    slli a2, a1, 32
486 ; RV64-NEXT:    add a1, a1, a2
487 ; RV64-NEXT:    vand.vx v10, v10, a1
488 ; RV64-NEXT:    vand.vx v8, v8, a1
489 ; RV64-NEXT:    vadd.vv v8, v8, v8
490 ; RV64-NEXT:    vor.vv v8, v10, v8
491 ; RV64-NEXT:    vse64.v v8, (a0)
492 ; RV64-NEXT:    ret
494 ; ZVBB-LABEL: bitreverse_v4i64:
495 ; ZVBB:       # %bb.0:
496 ; ZVBB-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
497 ; ZVBB-NEXT:    vle64.v v8, (a0)
498 ; ZVBB-NEXT:    vbrev.v v8, v8
499 ; ZVBB-NEXT:    vse64.v v8, (a0)
500 ; ZVBB-NEXT:    ret
501   %a = load <4 x i64>, ptr %x
502   %b = load <4 x i64>, ptr %y
503   %c = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
504   store <4 x i64> %c, ptr %x
505   ret void
507 declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>)