1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+experimental-v -verify-machineinstrs -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV32
3; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV64
4; RUN: llc -mtriple=riscv32 -mattr=+experimental-v -verify-machineinstrs -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV32
5; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV64
6
7define void @bitreverse_v8i16(<8 x i16>* %x, <8 x i16>* %y) {
8; LMULMAX2-RV32-LABEL: bitreverse_v8i16:
9; LMULMAX2-RV32:       # %bb.0:
10; LMULMAX2-RV32-NEXT:    vsetivli a1, 8, e16,m1,ta,mu
11; LMULMAX2-RV32-NEXT:    vle16.v v25, (a0)
12; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 8
13; LMULMAX2-RV32-NEXT:    vsll.vi v25, v25, 8
14; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
15; LMULMAX2-RV32-NEXT:    lui a1, 1
16; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
17; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
18; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 4
19; LMULMAX2-RV32-NEXT:    lui a1, 15
20; LMULMAX2-RV32-NEXT:    addi a1, a1, 240
21; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
22; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 4
23; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
24; LMULMAX2-RV32-NEXT:    lui a1, 3
25; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
26; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
27; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 2
28; LMULMAX2-RV32-NEXT:    lui a1, 13
29; LMULMAX2-RV32-NEXT:    addi a1, a1, -820
30; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
31; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 2
32; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
33; LMULMAX2-RV32-NEXT:    lui a1, 5
34; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
35; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
36; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 1
37; LMULMAX2-RV32-NEXT:    lui a1, 11
38; LMULMAX2-RV32-NEXT:    addi a1, a1, -1366
39; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
40; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 1
41; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
42; LMULMAX2-RV32-NEXT:    vse16.v v25, (a0)
43; LMULMAX2-RV32-NEXT:    ret
44;
45; LMULMAX2-RV64-LABEL: bitreverse_v8i16:
46; LMULMAX2-RV64:       # %bb.0:
47; LMULMAX2-RV64-NEXT:    vsetivli a1, 8, e16,m1,ta,mu
48; LMULMAX2-RV64-NEXT:    vle16.v v25, (a0)
49; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 8
50; LMULMAX2-RV64-NEXT:    vsll.vi v25, v25, 8
51; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
52; LMULMAX2-RV64-NEXT:    lui a1, 1
53; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
54; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
55; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 4
56; LMULMAX2-RV64-NEXT:    lui a1, 15
57; LMULMAX2-RV64-NEXT:    addiw a1, a1, 240
58; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
59; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 4
60; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
61; LMULMAX2-RV64-NEXT:    lui a1, 3
62; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
63; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
64; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 2
65; LMULMAX2-RV64-NEXT:    lui a1, 13
66; LMULMAX2-RV64-NEXT:    addiw a1, a1, -820
67; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
68; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 2
69; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
70; LMULMAX2-RV64-NEXT:    lui a1, 5
71; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
72; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
73; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 1
74; LMULMAX2-RV64-NEXT:    lui a1, 11
75; LMULMAX2-RV64-NEXT:    addiw a1, a1, -1366
76; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
77; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 1
78; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
79; LMULMAX2-RV64-NEXT:    vse16.v v25, (a0)
80; LMULMAX2-RV64-NEXT:    ret
81;
82; LMULMAX1-RV32-LABEL: bitreverse_v8i16:
83; LMULMAX1-RV32:       # %bb.0:
84; LMULMAX1-RV32-NEXT:    vsetivli a1, 8, e16,m1,ta,mu
85; LMULMAX1-RV32-NEXT:    vle16.v v25, (a0)
86; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 8
87; LMULMAX1-RV32-NEXT:    vsll.vi v25, v25, 8
88; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
89; LMULMAX1-RV32-NEXT:    lui a1, 1
90; LMULMAX1-RV32-NEXT:    addi a1, a1, -241
91; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
92; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 4
93; LMULMAX1-RV32-NEXT:    lui a1, 15
94; LMULMAX1-RV32-NEXT:    addi a1, a1, 240
95; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
96; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 4
97; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
98; LMULMAX1-RV32-NEXT:    lui a1, 3
99; LMULMAX1-RV32-NEXT:    addi a1, a1, 819
100; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
101; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 2
102; LMULMAX1-RV32-NEXT:    lui a1, 13
103; LMULMAX1-RV32-NEXT:    addi a1, a1, -820
104; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
105; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
106; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
107; LMULMAX1-RV32-NEXT:    lui a1, 5
108; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
109; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
110; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 1
111; LMULMAX1-RV32-NEXT:    lui a1, 11
112; LMULMAX1-RV32-NEXT:    addi a1, a1, -1366
113; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
114; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 1
115; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
116; LMULMAX1-RV32-NEXT:    vse16.v v25, (a0)
117; LMULMAX1-RV32-NEXT:    ret
118;
119; LMULMAX1-RV64-LABEL: bitreverse_v8i16:
120; LMULMAX1-RV64:       # %bb.0:
121; LMULMAX1-RV64-NEXT:    vsetivli a1, 8, e16,m1,ta,mu
122; LMULMAX1-RV64-NEXT:    vle16.v v25, (a0)
123; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 8
124; LMULMAX1-RV64-NEXT:    vsll.vi v25, v25, 8
125; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
126; LMULMAX1-RV64-NEXT:    lui a1, 1
127; LMULMAX1-RV64-NEXT:    addiw a1, a1, -241
128; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
129; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 4
130; LMULMAX1-RV64-NEXT:    lui a1, 15
131; LMULMAX1-RV64-NEXT:    addiw a1, a1, 240
132; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
133; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 4
134; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
135; LMULMAX1-RV64-NEXT:    lui a1, 3
136; LMULMAX1-RV64-NEXT:    addiw a1, a1, 819
137; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
138; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 2
139; LMULMAX1-RV64-NEXT:    lui a1, 13
140; LMULMAX1-RV64-NEXT:    addiw a1, a1, -820
141; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
142; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
143; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
144; LMULMAX1-RV64-NEXT:    lui a1, 5
145; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
146; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
147; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 1
148; LMULMAX1-RV64-NEXT:    lui a1, 11
149; LMULMAX1-RV64-NEXT:    addiw a1, a1, -1366
150; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
151; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 1
152; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
153; LMULMAX1-RV64-NEXT:    vse16.v v25, (a0)
154; LMULMAX1-RV64-NEXT:    ret
155  %a = load <8 x i16>, <8 x i16>* %x
156  %b = load <8 x i16>, <8 x i16>* %y
157  %c = call <8 x i16> @llvm.bitreverse.v8i16(<8 x i16> %a)
158  store <8 x i16> %c, <8 x i16>* %x
159  ret void
160}
161declare <8 x i16> @llvm.bitreverse.v8i16(<8 x i16>)
162
163define void @bitreverse_v4i32(<4 x i32>* %x, <4 x i32>* %y) {
164; LMULMAX2-RV32-LABEL: bitreverse_v4i32:
165; LMULMAX2-RV32:       # %bb.0:
166; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
167; LMULMAX2-RV32-NEXT:    vle32.v v25, (a0)
168; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v25, 8
169; LMULMAX2-RV32-NEXT:    lui a1, 16
170; LMULMAX2-RV32-NEXT:    addi a1, a1, -256
171; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
172; LMULMAX2-RV32-NEXT:    vsrl.vi v27, v25, 24
173; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v27
174; LMULMAX2-RV32-NEXT:    vsll.vi v27, v25, 8
175; LMULMAX2-RV32-NEXT:    lui a1, 4080
176; LMULMAX2-RV32-NEXT:    vand.vx v27, v27, a1
177; LMULMAX2-RV32-NEXT:    vsll.vi v25, v25, 24
178; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v27
179; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
180; LMULMAX2-RV32-NEXT:    lui a1, 61681
181; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
182; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
183; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 4
184; LMULMAX2-RV32-NEXT:    lui a1, 986895
185; LMULMAX2-RV32-NEXT:    addi a1, a1, 240
186; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
187; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 4
188; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
189; LMULMAX2-RV32-NEXT:    lui a1, 209715
190; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
191; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
192; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 2
193; LMULMAX2-RV32-NEXT:    lui a1, 838861
194; LMULMAX2-RV32-NEXT:    addi a1, a1, -820
195; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
196; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 2
197; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
198; LMULMAX2-RV32-NEXT:    lui a1, 349525
199; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
200; LMULMAX2-RV32-NEXT:    vand.vx v26, v25, a1
201; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 1
202; LMULMAX2-RV32-NEXT:    lui a1, 699051
203; LMULMAX2-RV32-NEXT:    addi a1, a1, -1366
204; LMULMAX2-RV32-NEXT:    vand.vx v25, v25, a1
205; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 1
206; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
207; LMULMAX2-RV32-NEXT:    vse32.v v25, (a0)
208; LMULMAX2-RV32-NEXT:    ret
209;
210; LMULMAX2-RV64-LABEL: bitreverse_v4i32:
211; LMULMAX2-RV64:       # %bb.0:
212; LMULMAX2-RV64-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
213; LMULMAX2-RV64-NEXT:    vle32.v v25, (a0)
214; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v25, 8
215; LMULMAX2-RV64-NEXT:    lui a1, 16
216; LMULMAX2-RV64-NEXT:    addiw a1, a1, -256
217; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
218; LMULMAX2-RV64-NEXT:    vsrl.vi v27, v25, 24
219; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v27
220; LMULMAX2-RV64-NEXT:    vsll.vi v27, v25, 8
221; LMULMAX2-RV64-NEXT:    lui a1, 4080
222; LMULMAX2-RV64-NEXT:    vand.vx v27, v27, a1
223; LMULMAX2-RV64-NEXT:    vsll.vi v25, v25, 24
224; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v27
225; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
226; LMULMAX2-RV64-NEXT:    lui a1, 61681
227; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
228; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
229; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 4
230; LMULMAX2-RV64-NEXT:    lui a1, 241
231; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
232; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
233; LMULMAX2-RV64-NEXT:    addi a1, a1, 240
234; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
235; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 4
236; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
237; LMULMAX2-RV64-NEXT:    lui a1, 209715
238; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
239; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
240; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 2
241; LMULMAX2-RV64-NEXT:    lui a1, 205
242; LMULMAX2-RV64-NEXT:    addiw a1, a1, -819
243; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
244; LMULMAX2-RV64-NEXT:    addi a1, a1, -820
245; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
246; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 2
247; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
248; LMULMAX2-RV64-NEXT:    lui a1, 349525
249; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
250; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
251; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 1
252; LMULMAX2-RV64-NEXT:    lui a1, 171
253; LMULMAX2-RV64-NEXT:    addiw a1, a1, -1365
254; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
255; LMULMAX2-RV64-NEXT:    addi a1, a1, -1366
256; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
257; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 1
258; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
259; LMULMAX2-RV64-NEXT:    vse32.v v25, (a0)
260; LMULMAX2-RV64-NEXT:    ret
261;
262; LMULMAX1-RV32-LABEL: bitreverse_v4i32:
263; LMULMAX1-RV32:       # %bb.0:
264; LMULMAX1-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
265; LMULMAX1-RV32-NEXT:    vle32.v v25, (a0)
266; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v25, 8
267; LMULMAX1-RV32-NEXT:    lui a1, 16
268; LMULMAX1-RV32-NEXT:    addi a1, a1, -256
269; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a1
270; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 24
271; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
272; LMULMAX1-RV32-NEXT:    vsll.vi v27, v25, 8
273; LMULMAX1-RV32-NEXT:    lui a1, 4080
274; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a1
275; LMULMAX1-RV32-NEXT:    vsll.vi v25, v25, 24
276; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
277; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
278; LMULMAX1-RV32-NEXT:    lui a1, 61681
279; LMULMAX1-RV32-NEXT:    addi a1, a1, -241
280; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
281; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 4
282; LMULMAX1-RV32-NEXT:    lui a1, 986895
283; LMULMAX1-RV32-NEXT:    addi a1, a1, 240
284; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
285; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 4
286; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
287; LMULMAX1-RV32-NEXT:    lui a1, 209715
288; LMULMAX1-RV32-NEXT:    addi a1, a1, 819
289; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
290; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 2
291; LMULMAX1-RV32-NEXT:    lui a1, 838861
292; LMULMAX1-RV32-NEXT:    addi a1, a1, -820
293; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
294; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
295; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
296; LMULMAX1-RV32-NEXT:    lui a1, 349525
297; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
298; LMULMAX1-RV32-NEXT:    vand.vx v26, v25, a1
299; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 1
300; LMULMAX1-RV32-NEXT:    lui a1, 699051
301; LMULMAX1-RV32-NEXT:    addi a1, a1, -1366
302; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
303; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 1
304; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
305; LMULMAX1-RV32-NEXT:    vse32.v v25, (a0)
306; LMULMAX1-RV32-NEXT:    ret
307;
308; LMULMAX1-RV64-LABEL: bitreverse_v4i32:
309; LMULMAX1-RV64:       # %bb.0:
310; LMULMAX1-RV64-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
311; LMULMAX1-RV64-NEXT:    vle32.v v25, (a0)
312; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v25, 8
313; LMULMAX1-RV64-NEXT:    lui a1, 16
314; LMULMAX1-RV64-NEXT:    addiw a1, a1, -256
315; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a1
316; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 24
317; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
318; LMULMAX1-RV64-NEXT:    vsll.vi v27, v25, 8
319; LMULMAX1-RV64-NEXT:    lui a1, 4080
320; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a1
321; LMULMAX1-RV64-NEXT:    vsll.vi v25, v25, 24
322; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
323; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
324; LMULMAX1-RV64-NEXT:    lui a1, 61681
325; LMULMAX1-RV64-NEXT:    addiw a1, a1, -241
326; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
327; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 4
328; LMULMAX1-RV64-NEXT:    lui a1, 241
329; LMULMAX1-RV64-NEXT:    addiw a1, a1, -241
330; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
331; LMULMAX1-RV64-NEXT:    addi a1, a1, 240
332; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
333; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 4
334; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
335; LMULMAX1-RV64-NEXT:    lui a1, 209715
336; LMULMAX1-RV64-NEXT:    addiw a1, a1, 819
337; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
338; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 2
339; LMULMAX1-RV64-NEXT:    lui a1, 205
340; LMULMAX1-RV64-NEXT:    addiw a1, a1, -819
341; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
342; LMULMAX1-RV64-NEXT:    addi a1, a1, -820
343; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
344; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
345; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
346; LMULMAX1-RV64-NEXT:    lui a1, 349525
347; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
348; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
349; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 1
350; LMULMAX1-RV64-NEXT:    lui a1, 171
351; LMULMAX1-RV64-NEXT:    addiw a1, a1, -1365
352; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
353; LMULMAX1-RV64-NEXT:    addi a1, a1, -1366
354; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
355; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 1
356; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
357; LMULMAX1-RV64-NEXT:    vse32.v v25, (a0)
358; LMULMAX1-RV64-NEXT:    ret
359  %a = load <4 x i32>, <4 x i32>* %x
360  %b = load <4 x i32>, <4 x i32>* %y
361  %c = call <4 x i32> @llvm.bitreverse.v4i32(<4 x i32> %a)
362  store <4 x i32> %c, <4 x i32>* %x
363  ret void
364}
365declare <4 x i32> @llvm.bitreverse.v4i32(<4 x i32>)
366
367define void @bitreverse_v2i64(<2 x i64>* %x, <2 x i64>* %y) {
368; LMULMAX2-RV32-LABEL: bitreverse_v2i64:
369; LMULMAX2-RV32:       # %bb.0:
370; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
371; LMULMAX2-RV32-NEXT:    vle64.v v25, (a0)
372; LMULMAX2-RV32-NEXT:    addi a6, zero, 56
373; LMULMAX2-RV32-NEXT:    vsrl.vx v26, v25, a6
374; LMULMAX2-RV32-NEXT:    addi a2, zero, 40
375; LMULMAX2-RV32-NEXT:    vsrl.vx v27, v25, a2
376; LMULMAX2-RV32-NEXT:    lui a3, 16
377; LMULMAX2-RV32-NEXT:    addi a3, a3, -256
378; LMULMAX2-RV32-NEXT:    vand.vx v27, v27, a3
379; LMULMAX2-RV32-NEXT:    vor.vv v26, v27, v26
380; LMULMAX2-RV32-NEXT:    vsrl.vi v27, v25, 24
381; LMULMAX2-RV32-NEXT:    lui a4, 4080
382; LMULMAX2-RV32-NEXT:    vand.vx v27, v27, a4
383; LMULMAX2-RV32-NEXT:    addi a5, zero, 5
384; LMULMAX2-RV32-NEXT:    vsetivli a1, 1, e8,m1,ta,mu
385; LMULMAX2-RV32-NEXT:    vmv.s.x v0, a5
386; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
387; LMULMAX2-RV32-NEXT:    vmv.v.i v28, 0
388; LMULMAX2-RV32-NEXT:    lui a1, 1044480
389; LMULMAX2-RV32-NEXT:    vmerge.vxm v28, v28, a1, v0
390; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
391; LMULMAX2-RV32-NEXT:    vsrl.vi v29, v25, 8
392; LMULMAX2-RV32-NEXT:    vand.vv v28, v29, v28
393; LMULMAX2-RV32-NEXT:    vor.vv v27, v28, v27
394; LMULMAX2-RV32-NEXT:    vor.vv v26, v27, v26
395; LMULMAX2-RV32-NEXT:    addi a1, zero, 255
396; LMULMAX2-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
397; LMULMAX2-RV32-NEXT:    vmv.v.x v27, a1
398; LMULMAX2-RV32-NEXT:    vmerge.vim v27, v27, 0, v0
399; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
400; LMULMAX2-RV32-NEXT:    vsll.vi v28, v25, 8
401; LMULMAX2-RV32-NEXT:    vand.vv v27, v28, v27
402; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
403; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a3
404; LMULMAX2-RV32-NEXT:    vmerge.vim v28, v28, 0, v0
405; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
406; LMULMAX2-RV32-NEXT:    vsll.vi v29, v25, 24
407; LMULMAX2-RV32-NEXT:    vand.vv v28, v29, v28
408; LMULMAX2-RV32-NEXT:    vor.vv v27, v28, v27
409; LMULMAX2-RV32-NEXT:    vsll.vx v28, v25, a2
410; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
411; LMULMAX2-RV32-NEXT:    vmv.v.x v29, a4
412; LMULMAX2-RV32-NEXT:    vmerge.vim v29, v29, 0, v0
413; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
414; LMULMAX2-RV32-NEXT:    vand.vv v28, v28, v29
415; LMULMAX2-RV32-NEXT:    vsll.vx v25, v25, a6
416; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v28
417; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v27
418; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
419; LMULMAX2-RV32-NEXT:    lui a1, 61681
420; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
421; LMULMAX2-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
422; LMULMAX2-RV32-NEXT:    vmv.v.x v26, a1
423; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
424; LMULMAX2-RV32-NEXT:    vand.vv v26, v25, v26
425; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 4
426; LMULMAX2-RV32-NEXT:    lui a1, 986895
427; LMULMAX2-RV32-NEXT:    addi a1, a1, 240
428; LMULMAX2-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
429; LMULMAX2-RV32-NEXT:    vmv.v.x v27, a1
430; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
431; LMULMAX2-RV32-NEXT:    vand.vv v25, v25, v27
432; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 4
433; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
434; LMULMAX2-RV32-NEXT:    lui a1, 209715
435; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
436; LMULMAX2-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
437; LMULMAX2-RV32-NEXT:    vmv.v.x v26, a1
438; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
439; LMULMAX2-RV32-NEXT:    vand.vv v26, v25, v26
440; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 2
441; LMULMAX2-RV32-NEXT:    lui a1, 838861
442; LMULMAX2-RV32-NEXT:    addi a1, a1, -820
443; LMULMAX2-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
444; LMULMAX2-RV32-NEXT:    vmv.v.x v27, a1
445; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
446; LMULMAX2-RV32-NEXT:    vand.vv v25, v25, v27
447; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 2
448; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
449; LMULMAX2-RV32-NEXT:    lui a1, 349525
450; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
451; LMULMAX2-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
452; LMULMAX2-RV32-NEXT:    vmv.v.x v26, a1
453; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
454; LMULMAX2-RV32-NEXT:    vand.vv v26, v25, v26
455; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 1
456; LMULMAX2-RV32-NEXT:    lui a1, 699051
457; LMULMAX2-RV32-NEXT:    addi a1, a1, -1366
458; LMULMAX2-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
459; LMULMAX2-RV32-NEXT:    vmv.v.x v27, a1
460; LMULMAX2-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
461; LMULMAX2-RV32-NEXT:    vand.vv v25, v25, v27
462; LMULMAX2-RV32-NEXT:    vsrl.vi v25, v25, 1
463; LMULMAX2-RV32-NEXT:    vor.vv v25, v25, v26
464; LMULMAX2-RV32-NEXT:    vse64.v v25, (a0)
465; LMULMAX2-RV32-NEXT:    ret
466;
467; LMULMAX2-RV64-LABEL: bitreverse_v2i64:
468; LMULMAX2-RV64:       # %bb.0:
469; LMULMAX2-RV64-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
470; LMULMAX2-RV64-NEXT:    vle64.v v25, (a0)
471; LMULMAX2-RV64-NEXT:    addi a1, zero, 56
472; LMULMAX2-RV64-NEXT:    vsrl.vx v26, v25, a1
473; LMULMAX2-RV64-NEXT:    addi a2, zero, 40
474; LMULMAX2-RV64-NEXT:    vsrl.vx v27, v25, a2
475; LMULMAX2-RV64-NEXT:    lui a3, 16
476; LMULMAX2-RV64-NEXT:    addiw a3, a3, -256
477; LMULMAX2-RV64-NEXT:    vand.vx v27, v27, a3
478; LMULMAX2-RV64-NEXT:    vor.vv v26, v27, v26
479; LMULMAX2-RV64-NEXT:    vsrl.vi v27, v25, 24
480; LMULMAX2-RV64-NEXT:    lui a3, 4080
481; LMULMAX2-RV64-NEXT:    vand.vx v27, v27, a3
482; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v25, 8
483; LMULMAX2-RV64-NEXT:    addi a3, zero, 255
484; LMULMAX2-RV64-NEXT:    slli a4, a3, 24
485; LMULMAX2-RV64-NEXT:    vand.vx v28, v28, a4
486; LMULMAX2-RV64-NEXT:    vor.vv v27, v28, v27
487; LMULMAX2-RV64-NEXT:    vor.vv v26, v27, v26
488; LMULMAX2-RV64-NEXT:    vsll.vi v27, v25, 8
489; LMULMAX2-RV64-NEXT:    slli a4, a3, 32
490; LMULMAX2-RV64-NEXT:    vand.vx v27, v27, a4
491; LMULMAX2-RV64-NEXT:    vsll.vi v28, v25, 24
492; LMULMAX2-RV64-NEXT:    slli a4, a3, 40
493; LMULMAX2-RV64-NEXT:    vand.vx v28, v28, a4
494; LMULMAX2-RV64-NEXT:    vor.vv v27, v28, v27
495; LMULMAX2-RV64-NEXT:    vsll.vx v28, v25, a1
496; LMULMAX2-RV64-NEXT:    vsll.vx v25, v25, a2
497; LMULMAX2-RV64-NEXT:    slli a1, a3, 48
498; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
499; LMULMAX2-RV64-NEXT:    vor.vv v25, v28, v25
500; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v27
501; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
502; LMULMAX2-RV64-NEXT:    lui a1, 3855
503; LMULMAX2-RV64-NEXT:    addiw a1, a1, 241
504; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
505; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
506; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
507; LMULMAX2-RV64-NEXT:    addi a1, a1, 241
508; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
509; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
510; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
511; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 4
512; LMULMAX2-RV64-NEXT:    lui a1, 1044721
513; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
514; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
515; LMULMAX2-RV64-NEXT:    addi a1, a1, 241
516; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
517; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
518; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
519; LMULMAX2-RV64-NEXT:    addi a1, a1, 240
520; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
521; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 4
522; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
523; LMULMAX2-RV64-NEXT:    lui a1, 13107
524; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
525; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
526; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
527; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
528; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
529; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
530; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
531; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
532; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 2
533; LMULMAX2-RV64-NEXT:    lui a1, 1035469
534; LMULMAX2-RV64-NEXT:    addiw a1, a1, -819
535; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
536; LMULMAX2-RV64-NEXT:    addi a1, a1, -819
537; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
538; LMULMAX2-RV64-NEXT:    addi a1, a1, -819
539; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
540; LMULMAX2-RV64-NEXT:    addi a1, a1, -820
541; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
542; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 2
543; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
544; LMULMAX2-RV64-NEXT:    lui a1, 21845
545; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
546; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
547; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
548; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
549; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
550; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
551; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
552; LMULMAX2-RV64-NEXT:    vand.vx v26, v25, a1
553; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 1
554; LMULMAX2-RV64-NEXT:    lui a1, 1026731
555; LMULMAX2-RV64-NEXT:    addiw a1, a1, -1365
556; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
557; LMULMAX2-RV64-NEXT:    addi a1, a1, -1365
558; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
559; LMULMAX2-RV64-NEXT:    addi a1, a1, -1365
560; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
561; LMULMAX2-RV64-NEXT:    addi a1, a1, -1366
562; LMULMAX2-RV64-NEXT:    vand.vx v25, v25, a1
563; LMULMAX2-RV64-NEXT:    vsrl.vi v25, v25, 1
564; LMULMAX2-RV64-NEXT:    vor.vv v25, v25, v26
565; LMULMAX2-RV64-NEXT:    vse64.v v25, (a0)
566; LMULMAX2-RV64-NEXT:    ret
567;
568; LMULMAX1-RV32-LABEL: bitreverse_v2i64:
569; LMULMAX1-RV32:       # %bb.0:
570; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
571; LMULMAX1-RV32-NEXT:    vle64.v v25, (a0)
572; LMULMAX1-RV32-NEXT:    addi a6, zero, 56
573; LMULMAX1-RV32-NEXT:    vsrl.vx v26, v25, a6
574; LMULMAX1-RV32-NEXT:    addi a2, zero, 40
575; LMULMAX1-RV32-NEXT:    vsrl.vx v27, v25, a2
576; LMULMAX1-RV32-NEXT:    lui a3, 16
577; LMULMAX1-RV32-NEXT:    addi a3, a3, -256
578; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a3
579; LMULMAX1-RV32-NEXT:    vor.vv v26, v27, v26
580; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 24
581; LMULMAX1-RV32-NEXT:    lui a4, 4080
582; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a4
583; LMULMAX1-RV32-NEXT:    addi a5, zero, 5
584; LMULMAX1-RV32-NEXT:    vsetivli a1, 1, e8,m1,ta,mu
585; LMULMAX1-RV32-NEXT:    vmv.s.x v0, a5
586; LMULMAX1-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
587; LMULMAX1-RV32-NEXT:    vmv.v.i v28, 0
588; LMULMAX1-RV32-NEXT:    lui a1, 1044480
589; LMULMAX1-RV32-NEXT:    vmerge.vxm v28, v28, a1, v0
590; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
591; LMULMAX1-RV32-NEXT:    vsrl.vi v29, v25, 8
592; LMULMAX1-RV32-NEXT:    vand.vv v28, v29, v28
593; LMULMAX1-RV32-NEXT:    vor.vv v27, v28, v27
594; LMULMAX1-RV32-NEXT:    vor.vv v26, v27, v26
595; LMULMAX1-RV32-NEXT:    addi a1, zero, 255
596; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
597; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a1
598; LMULMAX1-RV32-NEXT:    vmerge.vim v27, v27, 0, v0
599; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
600; LMULMAX1-RV32-NEXT:    vsll.vi v28, v25, 8
601; LMULMAX1-RV32-NEXT:    vand.vv v27, v28, v27
602; LMULMAX1-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
603; LMULMAX1-RV32-NEXT:    vmv.v.x v28, a3
604; LMULMAX1-RV32-NEXT:    vmerge.vim v28, v28, 0, v0
605; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
606; LMULMAX1-RV32-NEXT:    vsll.vi v29, v25, 24
607; LMULMAX1-RV32-NEXT:    vand.vv v28, v29, v28
608; LMULMAX1-RV32-NEXT:    vor.vv v27, v28, v27
609; LMULMAX1-RV32-NEXT:    vsll.vx v28, v25, a2
610; LMULMAX1-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
611; LMULMAX1-RV32-NEXT:    vmv.v.x v29, a4
612; LMULMAX1-RV32-NEXT:    vmerge.vim v29, v29, 0, v0
613; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
614; LMULMAX1-RV32-NEXT:    vand.vv v28, v28, v29
615; LMULMAX1-RV32-NEXT:    vsll.vx v25, v25, a6
616; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v28
617; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
618; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
619; LMULMAX1-RV32-NEXT:    lui a1, 61681
620; LMULMAX1-RV32-NEXT:    addi a1, a1, -241
621; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
622; LMULMAX1-RV32-NEXT:    vmv.v.x v26, a1
623; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
624; LMULMAX1-RV32-NEXT:    vand.vv v26, v25, v26
625; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 4
626; LMULMAX1-RV32-NEXT:    lui a1, 986895
627; LMULMAX1-RV32-NEXT:    addi a1, a1, 240
628; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
629; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a1
630; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
631; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v27
632; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 4
633; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
634; LMULMAX1-RV32-NEXT:    lui a1, 209715
635; LMULMAX1-RV32-NEXT:    addi a1, a1, 819
636; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
637; LMULMAX1-RV32-NEXT:    vmv.v.x v26, a1
638; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
639; LMULMAX1-RV32-NEXT:    vand.vv v26, v25, v26
640; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 2
641; LMULMAX1-RV32-NEXT:    lui a1, 838861
642; LMULMAX1-RV32-NEXT:    addi a1, a1, -820
643; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
644; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a1
645; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
646; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v27
647; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
648; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
649; LMULMAX1-RV32-NEXT:    lui a1, 349525
650; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
651; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
652; LMULMAX1-RV32-NEXT:    vmv.v.x v26, a1
653; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
654; LMULMAX1-RV32-NEXT:    vand.vv v26, v25, v26
655; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 1
656; LMULMAX1-RV32-NEXT:    lui a1, 699051
657; LMULMAX1-RV32-NEXT:    addi a1, a1, -1366
658; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
659; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a1
660; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
661; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v27
662; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 1
663; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
664; LMULMAX1-RV32-NEXT:    vse64.v v25, (a0)
665; LMULMAX1-RV32-NEXT:    ret
666;
667; LMULMAX1-RV64-LABEL: bitreverse_v2i64:
668; LMULMAX1-RV64:       # %bb.0:
669; LMULMAX1-RV64-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
670; LMULMAX1-RV64-NEXT:    vle64.v v25, (a0)
671; LMULMAX1-RV64-NEXT:    addi a1, zero, 56
672; LMULMAX1-RV64-NEXT:    vsrl.vx v26, v25, a1
673; LMULMAX1-RV64-NEXT:    addi a2, zero, 40
674; LMULMAX1-RV64-NEXT:    vsrl.vx v27, v25, a2
675; LMULMAX1-RV64-NEXT:    lui a3, 16
676; LMULMAX1-RV64-NEXT:    addiw a3, a3, -256
677; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a3
678; LMULMAX1-RV64-NEXT:    vor.vv v26, v27, v26
679; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 24
680; LMULMAX1-RV64-NEXT:    lui a3, 4080
681; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a3
682; LMULMAX1-RV64-NEXT:    vsrl.vi v28, v25, 8
683; LMULMAX1-RV64-NEXT:    addi a3, zero, 255
684; LMULMAX1-RV64-NEXT:    slli a4, a3, 24
685; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, a4
686; LMULMAX1-RV64-NEXT:    vor.vv v27, v28, v27
687; LMULMAX1-RV64-NEXT:    vor.vv v26, v27, v26
688; LMULMAX1-RV64-NEXT:    vsll.vi v27, v25, 8
689; LMULMAX1-RV64-NEXT:    slli a4, a3, 32
690; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, a4
691; LMULMAX1-RV64-NEXT:    vsll.vi v28, v25, 24
692; LMULMAX1-RV64-NEXT:    slli a4, a3, 40
693; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, a4
694; LMULMAX1-RV64-NEXT:    vor.vv v27, v28, v27
695; LMULMAX1-RV64-NEXT:    vsll.vx v28, v25, a1
696; LMULMAX1-RV64-NEXT:    vsll.vx v25, v25, a2
697; LMULMAX1-RV64-NEXT:    slli a1, a3, 48
698; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
699; LMULMAX1-RV64-NEXT:    vor.vv v25, v28, v25
700; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
701; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
702; LMULMAX1-RV64-NEXT:    lui a1, 3855
703; LMULMAX1-RV64-NEXT:    addiw a1, a1, 241
704; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
705; LMULMAX1-RV64-NEXT:    addi a1, a1, -241
706; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
707; LMULMAX1-RV64-NEXT:    addi a1, a1, 241
708; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
709; LMULMAX1-RV64-NEXT:    addi a1, a1, -241
710; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
711; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 4
712; LMULMAX1-RV64-NEXT:    lui a1, 1044721
713; LMULMAX1-RV64-NEXT:    addiw a1, a1, -241
714; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
715; LMULMAX1-RV64-NEXT:    addi a1, a1, 241
716; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
717; LMULMAX1-RV64-NEXT:    addi a1, a1, -241
718; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
719; LMULMAX1-RV64-NEXT:    addi a1, a1, 240
720; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
721; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 4
722; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
723; LMULMAX1-RV64-NEXT:    lui a1, 13107
724; LMULMAX1-RV64-NEXT:    addiw a1, a1, 819
725; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
726; LMULMAX1-RV64-NEXT:    addi a1, a1, 819
727; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
728; LMULMAX1-RV64-NEXT:    addi a1, a1, 819
729; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
730; LMULMAX1-RV64-NEXT:    addi a1, a1, 819
731; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
732; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 2
733; LMULMAX1-RV64-NEXT:    lui a1, 1035469
734; LMULMAX1-RV64-NEXT:    addiw a1, a1, -819
735; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
736; LMULMAX1-RV64-NEXT:    addi a1, a1, -819
737; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
738; LMULMAX1-RV64-NEXT:    addi a1, a1, -819
739; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
740; LMULMAX1-RV64-NEXT:    addi a1, a1, -820
741; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
742; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
743; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
744; LMULMAX1-RV64-NEXT:    lui a1, 21845
745; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
746; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
747; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
748; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
749; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
750; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
751; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
752; LMULMAX1-RV64-NEXT:    vand.vx v26, v25, a1
753; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 1
754; LMULMAX1-RV64-NEXT:    lui a1, 1026731
755; LMULMAX1-RV64-NEXT:    addiw a1, a1, -1365
756; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
757; LMULMAX1-RV64-NEXT:    addi a1, a1, -1365
758; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
759; LMULMAX1-RV64-NEXT:    addi a1, a1, -1365
760; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
761; LMULMAX1-RV64-NEXT:    addi a1, a1, -1366
762; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
763; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 1
764; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v26
765; LMULMAX1-RV64-NEXT:    vse64.v v25, (a0)
766; LMULMAX1-RV64-NEXT:    ret
767  %a = load <2 x i64>, <2 x i64>* %x
768  %b = load <2 x i64>, <2 x i64>* %y
769  %c = call <2 x i64> @llvm.bitreverse.v2i64(<2 x i64> %a)
770  store <2 x i64> %c, <2 x i64>* %x
771  ret void
772}
773declare <2 x i64> @llvm.bitreverse.v2i64(<2 x i64>)
774
775define void @bitreverse_v16i16(<16 x i16>* %x, <16 x i16>* %y) {
776; LMULMAX2-RV32-LABEL: bitreverse_v16i16:
777; LMULMAX2-RV32:       # %bb.0:
778; LMULMAX2-RV32-NEXT:    vsetivli a1, 16, e16,m2,ta,mu
779; LMULMAX2-RV32-NEXT:    vle16.v v26, (a0)
780; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 8
781; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 8
782; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
783; LMULMAX2-RV32-NEXT:    lui a1, 1
784; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
785; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
786; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 4
787; LMULMAX2-RV32-NEXT:    lui a1, 15
788; LMULMAX2-RV32-NEXT:    addi a1, a1, 240
789; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
790; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 4
791; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
792; LMULMAX2-RV32-NEXT:    lui a1, 3
793; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
794; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
795; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 2
796; LMULMAX2-RV32-NEXT:    lui a1, 13
797; LMULMAX2-RV32-NEXT:    addi a1, a1, -820
798; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
799; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 2
800; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
801; LMULMAX2-RV32-NEXT:    lui a1, 5
802; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
803; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
804; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 1
805; LMULMAX2-RV32-NEXT:    lui a1, 11
806; LMULMAX2-RV32-NEXT:    addi a1, a1, -1366
807; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
808; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 1
809; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
810; LMULMAX2-RV32-NEXT:    vse16.v v26, (a0)
811; LMULMAX2-RV32-NEXT:    ret
812;
813; LMULMAX2-RV64-LABEL: bitreverse_v16i16:
814; LMULMAX2-RV64:       # %bb.0:
815; LMULMAX2-RV64-NEXT:    vsetivli a1, 16, e16,m2,ta,mu
816; LMULMAX2-RV64-NEXT:    vle16.v v26, (a0)
817; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 8
818; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 8
819; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
820; LMULMAX2-RV64-NEXT:    lui a1, 1
821; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
822; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
823; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 4
824; LMULMAX2-RV64-NEXT:    lui a1, 15
825; LMULMAX2-RV64-NEXT:    addiw a1, a1, 240
826; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
827; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 4
828; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
829; LMULMAX2-RV64-NEXT:    lui a1, 3
830; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
831; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
832; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 2
833; LMULMAX2-RV64-NEXT:    lui a1, 13
834; LMULMAX2-RV64-NEXT:    addiw a1, a1, -820
835; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
836; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 2
837; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
838; LMULMAX2-RV64-NEXT:    lui a1, 5
839; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
840; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
841; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 1
842; LMULMAX2-RV64-NEXT:    lui a1, 11
843; LMULMAX2-RV64-NEXT:    addiw a1, a1, -1366
844; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
845; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 1
846; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
847; LMULMAX2-RV64-NEXT:    vse16.v v26, (a0)
848; LMULMAX2-RV64-NEXT:    ret
849;
850; LMULMAX1-RV32-LABEL: bitreverse_v16i16:
851; LMULMAX1-RV32:       # %bb.0:
852; LMULMAX1-RV32-NEXT:    vsetivli a1, 8, e16,m1,ta,mu
853; LMULMAX1-RV32-NEXT:    addi a6, a0, 16
854; LMULMAX1-RV32-NEXT:    vle16.v v25, (a6)
855; LMULMAX1-RV32-NEXT:    vle16.v v26, (a0)
856; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 8
857; LMULMAX1-RV32-NEXT:    vsll.vi v25, v25, 8
858; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
859; LMULMAX1-RV32-NEXT:    lui a2, 1
860; LMULMAX1-RV32-NEXT:    addi a7, a2, -241
861; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a7
862; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 4
863; LMULMAX1-RV32-NEXT:    lui a3, 15
864; LMULMAX1-RV32-NEXT:    addi a3, a3, 240
865; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a3
866; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 4
867; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
868; LMULMAX1-RV32-NEXT:    lui a4, 3
869; LMULMAX1-RV32-NEXT:    addi a4, a4, 819
870; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a4
871; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 2
872; LMULMAX1-RV32-NEXT:    lui a5, 13
873; LMULMAX1-RV32-NEXT:    addi a5, a5, -820
874; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a5
875; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
876; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
877; LMULMAX1-RV32-NEXT:    lui a1, 5
878; LMULMAX1-RV32-NEXT:    addi a1, a1, 1365
879; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a1
880; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 1
881; LMULMAX1-RV32-NEXT:    lui a2, 11
882; LMULMAX1-RV32-NEXT:    addi a2, a2, -1366
883; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a2
884; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 1
885; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
886; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 8
887; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 8
888; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
889; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a7
890; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 4
891; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a3
892; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 4
893; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
894; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a4
895; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 2
896; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a5
897; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 2
898; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
899; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a1
900; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 1
901; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a2
902; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 1
903; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
904; LMULMAX1-RV32-NEXT:    vse16.v v26, (a0)
905; LMULMAX1-RV32-NEXT:    vse16.v v25, (a6)
906; LMULMAX1-RV32-NEXT:    ret
907;
908; LMULMAX1-RV64-LABEL: bitreverse_v16i16:
909; LMULMAX1-RV64:       # %bb.0:
910; LMULMAX1-RV64-NEXT:    vsetivli a1, 8, e16,m1,ta,mu
911; LMULMAX1-RV64-NEXT:    addi a6, a0, 16
912; LMULMAX1-RV64-NEXT:    vle16.v v25, (a6)
913; LMULMAX1-RV64-NEXT:    vle16.v v26, (a0)
914; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 8
915; LMULMAX1-RV64-NEXT:    vsll.vi v25, v25, 8
916; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
917; LMULMAX1-RV64-NEXT:    lui a2, 1
918; LMULMAX1-RV64-NEXT:    addiw a7, a2, -241
919; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a7
920; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 4
921; LMULMAX1-RV64-NEXT:    lui a3, 15
922; LMULMAX1-RV64-NEXT:    addiw a3, a3, 240
923; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a3
924; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 4
925; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
926; LMULMAX1-RV64-NEXT:    lui a4, 3
927; LMULMAX1-RV64-NEXT:    addiw a4, a4, 819
928; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a4
929; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 2
930; LMULMAX1-RV64-NEXT:    lui a5, 13
931; LMULMAX1-RV64-NEXT:    addiw a5, a5, -820
932; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a5
933; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
934; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
935; LMULMAX1-RV64-NEXT:    lui a1, 5
936; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
937; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a1
938; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 1
939; LMULMAX1-RV64-NEXT:    lui a2, 11
940; LMULMAX1-RV64-NEXT:    addiw a2, a2, -1366
941; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a2
942; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 1
943; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
944; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 8
945; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 8
946; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
947; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a7
948; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 4
949; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a3
950; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 4
951; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
952; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a4
953; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 2
954; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a5
955; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 2
956; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
957; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a1
958; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 1
959; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a2
960; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 1
961; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
962; LMULMAX1-RV64-NEXT:    vse16.v v26, (a0)
963; LMULMAX1-RV64-NEXT:    vse16.v v25, (a6)
964; LMULMAX1-RV64-NEXT:    ret
965  %a = load <16 x i16>, <16 x i16>* %x
966  %b = load <16 x i16>, <16 x i16>* %y
967  %c = call <16 x i16> @llvm.bitreverse.v16i16(<16 x i16> %a)
968  store <16 x i16> %c, <16 x i16>* %x
969  ret void
970}
971declare <16 x i16> @llvm.bitreverse.v16i16(<16 x i16>)
972
973define void @bitreverse_v8i32(<8 x i32>* %x, <8 x i32>* %y) {
974; LMULMAX2-RV32-LABEL: bitreverse_v8i32:
975; LMULMAX2-RV32:       # %bb.0:
976; LMULMAX2-RV32-NEXT:    vsetivli a1, 8, e32,m2,ta,mu
977; LMULMAX2-RV32-NEXT:    vle32.v v26, (a0)
978; LMULMAX2-RV32-NEXT:    vsrl.vi v28, v26, 8
979; LMULMAX2-RV32-NEXT:    lui a1, 16
980; LMULMAX2-RV32-NEXT:    addi a1, a1, -256
981; LMULMAX2-RV32-NEXT:    vand.vx v28, v28, a1
982; LMULMAX2-RV32-NEXT:    vsrl.vi v30, v26, 24
983; LMULMAX2-RV32-NEXT:    vor.vv v28, v28, v30
984; LMULMAX2-RV32-NEXT:    vsll.vi v30, v26, 8
985; LMULMAX2-RV32-NEXT:    lui a1, 4080
986; LMULMAX2-RV32-NEXT:    vand.vx v30, v30, a1
987; LMULMAX2-RV32-NEXT:    vsll.vi v26, v26, 24
988; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v30
989; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
990; LMULMAX2-RV32-NEXT:    lui a1, 61681
991; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
992; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
993; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 4
994; LMULMAX2-RV32-NEXT:    lui a1, 986895
995; LMULMAX2-RV32-NEXT:    addi a1, a1, 240
996; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
997; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 4
998; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
999; LMULMAX2-RV32-NEXT:    lui a1, 209715
1000; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
1001; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
1002; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 2
1003; LMULMAX2-RV32-NEXT:    lui a1, 838861
1004; LMULMAX2-RV32-NEXT:    addi a1, a1, -820
1005; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
1006; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 2
1007; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
1008; LMULMAX2-RV32-NEXT:    lui a1, 349525
1009; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
1010; LMULMAX2-RV32-NEXT:    vand.vx v28, v26, a1
1011; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 1
1012; LMULMAX2-RV32-NEXT:    lui a1, 699051
1013; LMULMAX2-RV32-NEXT:    addi a1, a1, -1366
1014; LMULMAX2-RV32-NEXT:    vand.vx v26, v26, a1
1015; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 1
1016; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
1017; LMULMAX2-RV32-NEXT:    vse32.v v26, (a0)
1018; LMULMAX2-RV32-NEXT:    ret
1019;
1020; LMULMAX2-RV64-LABEL: bitreverse_v8i32:
1021; LMULMAX2-RV64:       # %bb.0:
1022; LMULMAX2-RV64-NEXT:    vsetivli a1, 8, e32,m2,ta,mu
1023; LMULMAX2-RV64-NEXT:    vle32.v v26, (a0)
1024; LMULMAX2-RV64-NEXT:    vsrl.vi v28, v26, 8
1025; LMULMAX2-RV64-NEXT:    lui a1, 16
1026; LMULMAX2-RV64-NEXT:    addiw a1, a1, -256
1027; LMULMAX2-RV64-NEXT:    vand.vx v28, v28, a1
1028; LMULMAX2-RV64-NEXT:    vsrl.vi v30, v26, 24
1029; LMULMAX2-RV64-NEXT:    vor.vv v28, v28, v30
1030; LMULMAX2-RV64-NEXT:    vsll.vi v30, v26, 8
1031; LMULMAX2-RV64-NEXT:    lui a1, 4080
1032; LMULMAX2-RV64-NEXT:    vand.vx v30, v30, a1
1033; LMULMAX2-RV64-NEXT:    vsll.vi v26, v26, 24
1034; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v30
1035; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1036; LMULMAX2-RV64-NEXT:    lui a1, 61681
1037; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
1038; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
1039; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 4
1040; LMULMAX2-RV64-NEXT:    lui a1, 241
1041; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
1042; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1043; LMULMAX2-RV64-NEXT:    addi a1, a1, 240
1044; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1045; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 4
1046; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1047; LMULMAX2-RV64-NEXT:    lui a1, 209715
1048; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
1049; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
1050; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 2
1051; LMULMAX2-RV64-NEXT:    lui a1, 205
1052; LMULMAX2-RV64-NEXT:    addiw a1, a1, -819
1053; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1054; LMULMAX2-RV64-NEXT:    addi a1, a1, -820
1055; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1056; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 2
1057; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1058; LMULMAX2-RV64-NEXT:    lui a1, 349525
1059; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
1060; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
1061; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 1
1062; LMULMAX2-RV64-NEXT:    lui a1, 171
1063; LMULMAX2-RV64-NEXT:    addiw a1, a1, -1365
1064; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1065; LMULMAX2-RV64-NEXT:    addi a1, a1, -1366
1066; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1067; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 1
1068; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1069; LMULMAX2-RV64-NEXT:    vse32.v v26, (a0)
1070; LMULMAX2-RV64-NEXT:    ret
1071;
1072; LMULMAX1-RV32-LABEL: bitreverse_v8i32:
1073; LMULMAX1-RV32:       # %bb.0:
1074; LMULMAX1-RV32-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
1075; LMULMAX1-RV32-NEXT:    addi a7, a0, 16
1076; LMULMAX1-RV32-NEXT:    vle32.v v25, (a7)
1077; LMULMAX1-RV32-NEXT:    vle32.v v26, (a0)
1078; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v25, 8
1079; LMULMAX1-RV32-NEXT:    lui a2, 16
1080; LMULMAX1-RV32-NEXT:    addi t0, a2, -256
1081; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, t0
1082; LMULMAX1-RV32-NEXT:    vsrl.vi v28, v25, 24
1083; LMULMAX1-RV32-NEXT:    vor.vv v27, v27, v28
1084; LMULMAX1-RV32-NEXT:    vsll.vi v28, v25, 8
1085; LMULMAX1-RV32-NEXT:    lui a6, 4080
1086; LMULMAX1-RV32-NEXT:    vand.vx v28, v28, a6
1087; LMULMAX1-RV32-NEXT:    vsll.vi v25, v25, 24
1088; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v28
1089; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
1090; LMULMAX1-RV32-NEXT:    lui a4, 61681
1091; LMULMAX1-RV32-NEXT:    addi t1, a4, -241
1092; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, t1
1093; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 4
1094; LMULMAX1-RV32-NEXT:    lui a5, 986895
1095; LMULMAX1-RV32-NEXT:    addi a5, a5, 240
1096; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a5
1097; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 4
1098; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
1099; LMULMAX1-RV32-NEXT:    lui a3, 209715
1100; LMULMAX1-RV32-NEXT:    addi a3, a3, 819
1101; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a3
1102; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 2
1103; LMULMAX1-RV32-NEXT:    lui a1, 838861
1104; LMULMAX1-RV32-NEXT:    addi a1, a1, -820
1105; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a1
1106; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
1107; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
1108; LMULMAX1-RV32-NEXT:    lui a2, 349525
1109; LMULMAX1-RV32-NEXT:    addi a2, a2, 1365
1110; LMULMAX1-RV32-NEXT:    vand.vx v27, v25, a2
1111; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 1
1112; LMULMAX1-RV32-NEXT:    lui a4, 699051
1113; LMULMAX1-RV32-NEXT:    addi a4, a4, -1366
1114; LMULMAX1-RV32-NEXT:    vand.vx v25, v25, a4
1115; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 1
1116; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
1117; LMULMAX1-RV32-NEXT:    vsrl.vi v27, v26, 8
1118; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, t0
1119; LMULMAX1-RV32-NEXT:    vsrl.vi v28, v26, 24
1120; LMULMAX1-RV32-NEXT:    vor.vv v27, v27, v28
1121; LMULMAX1-RV32-NEXT:    vsll.vi v28, v26, 8
1122; LMULMAX1-RV32-NEXT:    vand.vx v28, v28, a6
1123; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 24
1124; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v28
1125; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
1126; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, t1
1127; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 4
1128; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a5
1129; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 4
1130; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
1131; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a3
1132; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 2
1133; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a1
1134; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 2
1135; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
1136; LMULMAX1-RV32-NEXT:    vand.vx v27, v26, a2
1137; LMULMAX1-RV32-NEXT:    vsll.vi v27, v27, 1
1138; LMULMAX1-RV32-NEXT:    vand.vx v26, v26, a4
1139; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v26, 1
1140; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v27
1141; LMULMAX1-RV32-NEXT:    vse32.v v26, (a0)
1142; LMULMAX1-RV32-NEXT:    vse32.v v25, (a7)
1143; LMULMAX1-RV32-NEXT:    ret
1144;
1145; LMULMAX1-RV64-LABEL: bitreverse_v8i32:
1146; LMULMAX1-RV64:       # %bb.0:
1147; LMULMAX1-RV64-NEXT:    vsetivli a1, 4, e32,m1,ta,mu
1148; LMULMAX1-RV64-NEXT:    addi a7, a0, 16
1149; LMULMAX1-RV64-NEXT:    vle32.v v25, (a7)
1150; LMULMAX1-RV64-NEXT:    vle32.v v26, (a0)
1151; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v25, 8
1152; LMULMAX1-RV64-NEXT:    lui a2, 16
1153; LMULMAX1-RV64-NEXT:    addiw t0, a2, -256
1154; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, t0
1155; LMULMAX1-RV64-NEXT:    vsrl.vi v28, v25, 24
1156; LMULMAX1-RV64-NEXT:    vor.vv v27, v27, v28
1157; LMULMAX1-RV64-NEXT:    vsll.vi v28, v25, 8
1158; LMULMAX1-RV64-NEXT:    lui a6, 4080
1159; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, a6
1160; LMULMAX1-RV64-NEXT:    vsll.vi v25, v25, 24
1161; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v28
1162; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1163; LMULMAX1-RV64-NEXT:    lui a4, 61681
1164; LMULMAX1-RV64-NEXT:    addiw t1, a4, -241
1165; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, t1
1166; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 4
1167; LMULMAX1-RV64-NEXT:    lui a5, 241
1168; LMULMAX1-RV64-NEXT:    addiw a5, a5, -241
1169; LMULMAX1-RV64-NEXT:    slli a5, a5, 12
1170; LMULMAX1-RV64-NEXT:    addi a5, a5, 240
1171; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a5
1172; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 4
1173; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1174; LMULMAX1-RV64-NEXT:    lui a3, 209715
1175; LMULMAX1-RV64-NEXT:    addiw a3, a3, 819
1176; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a3
1177; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 2
1178; LMULMAX1-RV64-NEXT:    lui a1, 205
1179; LMULMAX1-RV64-NEXT:    addiw a1, a1, -819
1180; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
1181; LMULMAX1-RV64-NEXT:    addi a1, a1, -820
1182; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a1
1183; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
1184; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1185; LMULMAX1-RV64-NEXT:    lui a2, 349525
1186; LMULMAX1-RV64-NEXT:    addiw a2, a2, 1365
1187; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a2
1188; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 1
1189; LMULMAX1-RV64-NEXT:    lui a4, 171
1190; LMULMAX1-RV64-NEXT:    addiw a4, a4, -1365
1191; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
1192; LMULMAX1-RV64-NEXT:    addi a4, a4, -1366
1193; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a4
1194; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 1
1195; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1196; LMULMAX1-RV64-NEXT:    vsrl.vi v27, v26, 8
1197; LMULMAX1-RV64-NEXT:    vand.vx v27, v27, t0
1198; LMULMAX1-RV64-NEXT:    vsrl.vi v28, v26, 24
1199; LMULMAX1-RV64-NEXT:    vor.vv v27, v27, v28
1200; LMULMAX1-RV64-NEXT:    vsll.vi v28, v26, 8
1201; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, a6
1202; LMULMAX1-RV64-NEXT:    vsll.vi v26, v26, 24
1203; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v28
1204; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1205; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, t1
1206; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 4
1207; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a5
1208; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 4
1209; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1210; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a3
1211; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 2
1212; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a1
1213; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 2
1214; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1215; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a2
1216; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 1
1217; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a4
1218; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 1
1219; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1220; LMULMAX1-RV64-NEXT:    vse32.v v26, (a0)
1221; LMULMAX1-RV64-NEXT:    vse32.v v25, (a7)
1222; LMULMAX1-RV64-NEXT:    ret
1223  %a = load <8 x i32>, <8 x i32>* %x
1224  %b = load <8 x i32>, <8 x i32>* %y
1225  %c = call <8 x i32> @llvm.bitreverse.v8i32(<8 x i32> %a)
1226  store <8 x i32> %c, <8 x i32>* %x
1227  ret void
1228}
1229declare <8 x i32> @llvm.bitreverse.v8i32(<8 x i32>)
1230
1231define void @bitreverse_v4i64(<4 x i64>* %x, <4 x i64>* %y) {
1232; LMULMAX2-RV32-LABEL: bitreverse_v4i64:
1233; LMULMAX2-RV32:       # %bb.0:
1234; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1235; LMULMAX2-RV32-NEXT:    vle64.v v26, (a0)
1236; LMULMAX2-RV32-NEXT:    addi a6, zero, 56
1237; LMULMAX2-RV32-NEXT:    vsrl.vx v28, v26, a6
1238; LMULMAX2-RV32-NEXT:    addi a2, zero, 40
1239; LMULMAX2-RV32-NEXT:    vsrl.vx v30, v26, a2
1240; LMULMAX2-RV32-NEXT:    lui a3, 16
1241; LMULMAX2-RV32-NEXT:    addi a3, a3, -256
1242; LMULMAX2-RV32-NEXT:    vand.vx v30, v30, a3
1243; LMULMAX2-RV32-NEXT:    vor.vv v28, v30, v28
1244; LMULMAX2-RV32-NEXT:    vsrl.vi v30, v26, 24
1245; LMULMAX2-RV32-NEXT:    lui a4, 4080
1246; LMULMAX2-RV32-NEXT:    vand.vx v30, v30, a4
1247; LMULMAX2-RV32-NEXT:    addi a5, zero, 85
1248; LMULMAX2-RV32-NEXT:    vsetivli a1, 1, e8,m1,ta,mu
1249; LMULMAX2-RV32-NEXT:    vmv.s.x v0, a5
1250; LMULMAX2-RV32-NEXT:    vsetivli a1, 8, e32,m2,ta,mu
1251; LMULMAX2-RV32-NEXT:    vmv.v.i v8, 0
1252; LMULMAX2-RV32-NEXT:    lui a1, 1044480
1253; LMULMAX2-RV32-NEXT:    vmerge.vxm v8, v8, a1, v0
1254; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1255; LMULMAX2-RV32-NEXT:    vsrl.vi v10, v26, 8
1256; LMULMAX2-RV32-NEXT:    vand.vv v8, v10, v8
1257; LMULMAX2-RV32-NEXT:    vor.vv v30, v8, v30
1258; LMULMAX2-RV32-NEXT:    vor.vv v28, v30, v28
1259; LMULMAX2-RV32-NEXT:    addi a1, zero, 255
1260; LMULMAX2-RV32-NEXT:    vsetivli a5, 8, e32,m2,ta,mu
1261; LMULMAX2-RV32-NEXT:    vmv.v.x v30, a1
1262; LMULMAX2-RV32-NEXT:    vmerge.vim v30, v30, 0, v0
1263; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1264; LMULMAX2-RV32-NEXT:    vsll.vi v8, v26, 8
1265; LMULMAX2-RV32-NEXT:    vand.vv v30, v8, v30
1266; LMULMAX2-RV32-NEXT:    vsetivli a1, 8, e32,m2,ta,mu
1267; LMULMAX2-RV32-NEXT:    vmv.v.x v8, a3
1268; LMULMAX2-RV32-NEXT:    vmerge.vim v8, v8, 0, v0
1269; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1270; LMULMAX2-RV32-NEXT:    vsll.vi v10, v26, 24
1271; LMULMAX2-RV32-NEXT:    vand.vv v8, v10, v8
1272; LMULMAX2-RV32-NEXT:    vor.vv v30, v8, v30
1273; LMULMAX2-RV32-NEXT:    vsll.vx v8, v26, a2
1274; LMULMAX2-RV32-NEXT:    vsetivli a1, 8, e32,m2,ta,mu
1275; LMULMAX2-RV32-NEXT:    vmv.v.x v10, a4
1276; LMULMAX2-RV32-NEXT:    vmerge.vim v10, v10, 0, v0
1277; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1278; LMULMAX2-RV32-NEXT:    vand.vv v8, v8, v10
1279; LMULMAX2-RV32-NEXT:    vsll.vx v26, v26, a6
1280; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v8
1281; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v30
1282; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
1283; LMULMAX2-RV32-NEXT:    lui a1, 61681
1284; LMULMAX2-RV32-NEXT:    addi a1, a1, -241
1285; LMULMAX2-RV32-NEXT:    vsetivli a2, 8, e32,m2,ta,mu
1286; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a1
1287; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1288; LMULMAX2-RV32-NEXT:    vand.vv v28, v26, v28
1289; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 4
1290; LMULMAX2-RV32-NEXT:    lui a1, 986895
1291; LMULMAX2-RV32-NEXT:    addi a1, a1, 240
1292; LMULMAX2-RV32-NEXT:    vsetivli a2, 8, e32,m2,ta,mu
1293; LMULMAX2-RV32-NEXT:    vmv.v.x v30, a1
1294; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1295; LMULMAX2-RV32-NEXT:    vand.vv v26, v26, v30
1296; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 4
1297; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
1298; LMULMAX2-RV32-NEXT:    lui a1, 209715
1299; LMULMAX2-RV32-NEXT:    addi a1, a1, 819
1300; LMULMAX2-RV32-NEXT:    vsetivli a2, 8, e32,m2,ta,mu
1301; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a1
1302; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1303; LMULMAX2-RV32-NEXT:    vand.vv v28, v26, v28
1304; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 2
1305; LMULMAX2-RV32-NEXT:    lui a1, 838861
1306; LMULMAX2-RV32-NEXT:    addi a1, a1, -820
1307; LMULMAX2-RV32-NEXT:    vsetivli a2, 8, e32,m2,ta,mu
1308; LMULMAX2-RV32-NEXT:    vmv.v.x v30, a1
1309; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1310; LMULMAX2-RV32-NEXT:    vand.vv v26, v26, v30
1311; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 2
1312; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
1313; LMULMAX2-RV32-NEXT:    lui a1, 349525
1314; LMULMAX2-RV32-NEXT:    addi a1, a1, 1365
1315; LMULMAX2-RV32-NEXT:    vsetivli a2, 8, e32,m2,ta,mu
1316; LMULMAX2-RV32-NEXT:    vmv.v.x v28, a1
1317; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1318; LMULMAX2-RV32-NEXT:    vand.vv v28, v26, v28
1319; LMULMAX2-RV32-NEXT:    vsll.vi v28, v28, 1
1320; LMULMAX2-RV32-NEXT:    lui a1, 699051
1321; LMULMAX2-RV32-NEXT:    addi a1, a1, -1366
1322; LMULMAX2-RV32-NEXT:    vsetivli a2, 8, e32,m2,ta,mu
1323; LMULMAX2-RV32-NEXT:    vmv.v.x v30, a1
1324; LMULMAX2-RV32-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1325; LMULMAX2-RV32-NEXT:    vand.vv v26, v26, v30
1326; LMULMAX2-RV32-NEXT:    vsrl.vi v26, v26, 1
1327; LMULMAX2-RV32-NEXT:    vor.vv v26, v26, v28
1328; LMULMAX2-RV32-NEXT:    vse64.v v26, (a0)
1329; LMULMAX2-RV32-NEXT:    ret
1330;
1331; LMULMAX2-RV64-LABEL: bitreverse_v4i64:
1332; LMULMAX2-RV64:       # %bb.0:
1333; LMULMAX2-RV64-NEXT:    vsetivli a1, 4, e64,m2,ta,mu
1334; LMULMAX2-RV64-NEXT:    vle64.v v26, (a0)
1335; LMULMAX2-RV64-NEXT:    addi a1, zero, 56
1336; LMULMAX2-RV64-NEXT:    vsrl.vx v28, v26, a1
1337; LMULMAX2-RV64-NEXT:    addi a2, zero, 40
1338; LMULMAX2-RV64-NEXT:    vsrl.vx v30, v26, a2
1339; LMULMAX2-RV64-NEXT:    lui a3, 16
1340; LMULMAX2-RV64-NEXT:    addiw a3, a3, -256
1341; LMULMAX2-RV64-NEXT:    vand.vx v30, v30, a3
1342; LMULMAX2-RV64-NEXT:    vor.vv v28, v30, v28
1343; LMULMAX2-RV64-NEXT:    vsrl.vi v30, v26, 24
1344; LMULMAX2-RV64-NEXT:    lui a3, 4080
1345; LMULMAX2-RV64-NEXT:    vand.vx v30, v30, a3
1346; LMULMAX2-RV64-NEXT:    vsrl.vi v8, v26, 8
1347; LMULMAX2-RV64-NEXT:    addi a3, zero, 255
1348; LMULMAX2-RV64-NEXT:    slli a4, a3, 24
1349; LMULMAX2-RV64-NEXT:    vand.vx v8, v8, a4
1350; LMULMAX2-RV64-NEXT:    vor.vv v30, v8, v30
1351; LMULMAX2-RV64-NEXT:    vor.vv v28, v30, v28
1352; LMULMAX2-RV64-NEXT:    vsll.vi v30, v26, 8
1353; LMULMAX2-RV64-NEXT:    slli a4, a3, 32
1354; LMULMAX2-RV64-NEXT:    vand.vx v30, v30, a4
1355; LMULMAX2-RV64-NEXT:    vsll.vi v8, v26, 24
1356; LMULMAX2-RV64-NEXT:    slli a4, a3, 40
1357; LMULMAX2-RV64-NEXT:    vand.vx v8, v8, a4
1358; LMULMAX2-RV64-NEXT:    vor.vv v30, v8, v30
1359; LMULMAX2-RV64-NEXT:    vsll.vx v8, v26, a1
1360; LMULMAX2-RV64-NEXT:    vsll.vx v26, v26, a2
1361; LMULMAX2-RV64-NEXT:    slli a1, a3, 48
1362; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1363; LMULMAX2-RV64-NEXT:    vor.vv v26, v8, v26
1364; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v30
1365; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1366; LMULMAX2-RV64-NEXT:    lui a1, 3855
1367; LMULMAX2-RV64-NEXT:    addiw a1, a1, 241
1368; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1369; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
1370; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1371; LMULMAX2-RV64-NEXT:    addi a1, a1, 241
1372; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1373; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
1374; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
1375; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 4
1376; LMULMAX2-RV64-NEXT:    lui a1, 1044721
1377; LMULMAX2-RV64-NEXT:    addiw a1, a1, -241
1378; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1379; LMULMAX2-RV64-NEXT:    addi a1, a1, 241
1380; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1381; LMULMAX2-RV64-NEXT:    addi a1, a1, -241
1382; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1383; LMULMAX2-RV64-NEXT:    addi a1, a1, 240
1384; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1385; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 4
1386; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1387; LMULMAX2-RV64-NEXT:    lui a1, 13107
1388; LMULMAX2-RV64-NEXT:    addiw a1, a1, 819
1389; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1390; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
1391; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1392; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
1393; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1394; LMULMAX2-RV64-NEXT:    addi a1, a1, 819
1395; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
1396; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 2
1397; LMULMAX2-RV64-NEXT:    lui a1, 1035469
1398; LMULMAX2-RV64-NEXT:    addiw a1, a1, -819
1399; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1400; LMULMAX2-RV64-NEXT:    addi a1, a1, -819
1401; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1402; LMULMAX2-RV64-NEXT:    addi a1, a1, -819
1403; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1404; LMULMAX2-RV64-NEXT:    addi a1, a1, -820
1405; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1406; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 2
1407; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1408; LMULMAX2-RV64-NEXT:    lui a1, 21845
1409; LMULMAX2-RV64-NEXT:    addiw a1, a1, 1365
1410; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1411; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
1412; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1413; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
1414; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1415; LMULMAX2-RV64-NEXT:    addi a1, a1, 1365
1416; LMULMAX2-RV64-NEXT:    vand.vx v28, v26, a1
1417; LMULMAX2-RV64-NEXT:    vsll.vi v28, v28, 1
1418; LMULMAX2-RV64-NEXT:    lui a1, 1026731
1419; LMULMAX2-RV64-NEXT:    addiw a1, a1, -1365
1420; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1421; LMULMAX2-RV64-NEXT:    addi a1, a1, -1365
1422; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1423; LMULMAX2-RV64-NEXT:    addi a1, a1, -1365
1424; LMULMAX2-RV64-NEXT:    slli a1, a1, 12
1425; LMULMAX2-RV64-NEXT:    addi a1, a1, -1366
1426; LMULMAX2-RV64-NEXT:    vand.vx v26, v26, a1
1427; LMULMAX2-RV64-NEXT:    vsrl.vi v26, v26, 1
1428; LMULMAX2-RV64-NEXT:    vor.vv v26, v26, v28
1429; LMULMAX2-RV64-NEXT:    vse64.v v26, (a0)
1430; LMULMAX2-RV64-NEXT:    ret
1431;
1432; LMULMAX1-RV32-LABEL: bitreverse_v4i64:
1433; LMULMAX1-RV32:       # %bb.0:
1434; LMULMAX1-RV32-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
1435; LMULMAX1-RV32-NEXT:    addi a1, a0, 16
1436; LMULMAX1-RV32-NEXT:    vle64.v v30, (a1)
1437; LMULMAX1-RV32-NEXT:    vle64.v v25, (a0)
1438; LMULMAX1-RV32-NEXT:    addi a7, zero, 56
1439; LMULMAX1-RV32-NEXT:    vsrl.vx v26, v30, a7
1440; LMULMAX1-RV32-NEXT:    addi a3, zero, 40
1441; LMULMAX1-RV32-NEXT:    vsrl.vx v27, v30, a3
1442; LMULMAX1-RV32-NEXT:    lui a4, 16
1443; LMULMAX1-RV32-NEXT:    addi a4, a4, -256
1444; LMULMAX1-RV32-NEXT:    vand.vx v27, v27, a4
1445; LMULMAX1-RV32-NEXT:    vor.vv v27, v27, v26
1446; LMULMAX1-RV32-NEXT:    vsrl.vi v26, v30, 24
1447; LMULMAX1-RV32-NEXT:    lui a6, 4080
1448; LMULMAX1-RV32-NEXT:    vand.vx v28, v26, a6
1449; LMULMAX1-RV32-NEXT:    addi a5, zero, 5
1450; LMULMAX1-RV32-NEXT:    vsetivli a2, 1, e8,m1,ta,mu
1451; LMULMAX1-RV32-NEXT:    vmv.s.x v0, a5
1452; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
1453; LMULMAX1-RV32-NEXT:    vmv.v.i v26, 0
1454; LMULMAX1-RV32-NEXT:    lui a2, 1044480
1455; LMULMAX1-RV32-NEXT:    vmerge.vxm v26, v26, a2, v0
1456; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1457; LMULMAX1-RV32-NEXT:    vsrl.vi v29, v30, 8
1458; LMULMAX1-RV32-NEXT:    vand.vv v29, v29, v26
1459; LMULMAX1-RV32-NEXT:    vor.vv v28, v29, v28
1460; LMULMAX1-RV32-NEXT:    vor.vv v31, v28, v27
1461; LMULMAX1-RV32-NEXT:    addi a2, zero, 255
1462; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1463; LMULMAX1-RV32-NEXT:    vmv.v.x v27, a2
1464; LMULMAX1-RV32-NEXT:    vmerge.vim v27, v27, 0, v0
1465; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1466; LMULMAX1-RV32-NEXT:    vsll.vi v28, v30, 8
1467; LMULMAX1-RV32-NEXT:    vand.vv v29, v28, v27
1468; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
1469; LMULMAX1-RV32-NEXT:    vmv.v.x v28, a4
1470; LMULMAX1-RV32-NEXT:    vmerge.vim v28, v28, 0, v0
1471; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1472; LMULMAX1-RV32-NEXT:    vsll.vi v8, v30, 24
1473; LMULMAX1-RV32-NEXT:    vand.vv v8, v8, v28
1474; LMULMAX1-RV32-NEXT:    vor.vv v8, v8, v29
1475; LMULMAX1-RV32-NEXT:    vsll.vx v9, v30, a3
1476; LMULMAX1-RV32-NEXT:    vsetivli a2, 4, e32,m1,ta,mu
1477; LMULMAX1-RV32-NEXT:    vmv.v.x v29, a6
1478; LMULMAX1-RV32-NEXT:    vmerge.vim v29, v29, 0, v0
1479; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1480; LMULMAX1-RV32-NEXT:    vand.vv v9, v9, v29
1481; LMULMAX1-RV32-NEXT:    vsll.vx v30, v30, a7
1482; LMULMAX1-RV32-NEXT:    vor.vv v30, v30, v9
1483; LMULMAX1-RV32-NEXT:    vor.vv v30, v30, v8
1484; LMULMAX1-RV32-NEXT:    vor.vv v31, v30, v31
1485; LMULMAX1-RV32-NEXT:    lui a2, 61681
1486; LMULMAX1-RV32-NEXT:    addi a2, a2, -241
1487; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1488; LMULMAX1-RV32-NEXT:    vmv.v.x v30, a2
1489; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1490; LMULMAX1-RV32-NEXT:    vand.vv v8, v31, v30
1491; LMULMAX1-RV32-NEXT:    vsll.vi v8, v8, 4
1492; LMULMAX1-RV32-NEXT:    lui a2, 986895
1493; LMULMAX1-RV32-NEXT:    addi a2, a2, 240
1494; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1495; LMULMAX1-RV32-NEXT:    vmv.v.x v9, a2
1496; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1497; LMULMAX1-RV32-NEXT:    vand.vv v31, v31, v9
1498; LMULMAX1-RV32-NEXT:    vsrl.vi v31, v31, 4
1499; LMULMAX1-RV32-NEXT:    vor.vv v31, v31, v8
1500; LMULMAX1-RV32-NEXT:    lui a2, 209715
1501; LMULMAX1-RV32-NEXT:    addi a2, a2, 819
1502; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1503; LMULMAX1-RV32-NEXT:    vmv.v.x v8, a2
1504; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1505; LMULMAX1-RV32-NEXT:    vand.vv v10, v31, v8
1506; LMULMAX1-RV32-NEXT:    vsll.vi v10, v10, 2
1507; LMULMAX1-RV32-NEXT:    lui a2, 838861
1508; LMULMAX1-RV32-NEXT:    addi a2, a2, -820
1509; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1510; LMULMAX1-RV32-NEXT:    vmv.v.x v11, a2
1511; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1512; LMULMAX1-RV32-NEXT:    vand.vv v31, v31, v11
1513; LMULMAX1-RV32-NEXT:    vsrl.vi v31, v31, 2
1514; LMULMAX1-RV32-NEXT:    vor.vv v31, v31, v10
1515; LMULMAX1-RV32-NEXT:    lui a2, 349525
1516; LMULMAX1-RV32-NEXT:    addi a2, a2, 1365
1517; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1518; LMULMAX1-RV32-NEXT:    vmv.v.x v10, a2
1519; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1520; LMULMAX1-RV32-NEXT:    vand.vv v12, v31, v10
1521; LMULMAX1-RV32-NEXT:    vsll.vi v12, v12, 1
1522; LMULMAX1-RV32-NEXT:    lui a2, 699051
1523; LMULMAX1-RV32-NEXT:    addi a2, a2, -1366
1524; LMULMAX1-RV32-NEXT:    vsetivli a5, 4, e32,m1,ta,mu
1525; LMULMAX1-RV32-NEXT:    vmv.v.x v13, a2
1526; LMULMAX1-RV32-NEXT:    vsetivli a2, 2, e64,m1,ta,mu
1527; LMULMAX1-RV32-NEXT:    vand.vv v31, v31, v13
1528; LMULMAX1-RV32-NEXT:    vsrl.vi v31, v31, 1
1529; LMULMAX1-RV32-NEXT:    vor.vv v31, v31, v12
1530; LMULMAX1-RV32-NEXT:    vsrl.vx v12, v25, a7
1531; LMULMAX1-RV32-NEXT:    vsrl.vx v14, v25, a3
1532; LMULMAX1-RV32-NEXT:    vand.vx v14, v14, a4
1533; LMULMAX1-RV32-NEXT:    vor.vv v12, v14, v12
1534; LMULMAX1-RV32-NEXT:    vsrl.vi v14, v25, 24
1535; LMULMAX1-RV32-NEXT:    vand.vx v14, v14, a6
1536; LMULMAX1-RV32-NEXT:    vsrl.vi v15, v25, 8
1537; LMULMAX1-RV32-NEXT:    vand.vv v26, v15, v26
1538; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v14
1539; LMULMAX1-RV32-NEXT:    vor.vv v26, v26, v12
1540; LMULMAX1-RV32-NEXT:    vsll.vi v12, v25, 8
1541; LMULMAX1-RV32-NEXT:    vand.vv v27, v12, v27
1542; LMULMAX1-RV32-NEXT:    vsll.vi v12, v25, 24
1543; LMULMAX1-RV32-NEXT:    vand.vv v28, v12, v28
1544; LMULMAX1-RV32-NEXT:    vor.vv v27, v28, v27
1545; LMULMAX1-RV32-NEXT:    vsll.vx v28, v25, a3
1546; LMULMAX1-RV32-NEXT:    vand.vv v28, v28, v29
1547; LMULMAX1-RV32-NEXT:    vsll.vx v25, v25, a7
1548; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v28
1549; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v27
1550; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
1551; LMULMAX1-RV32-NEXT:    vand.vv v26, v25, v30
1552; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 4
1553; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v9
1554; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 4
1555; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
1556; LMULMAX1-RV32-NEXT:    vand.vv v26, v25, v8
1557; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 2
1558; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v11
1559; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 2
1560; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
1561; LMULMAX1-RV32-NEXT:    vand.vv v26, v25, v10
1562; LMULMAX1-RV32-NEXT:    vsll.vi v26, v26, 1
1563; LMULMAX1-RV32-NEXT:    vand.vv v25, v25, v13
1564; LMULMAX1-RV32-NEXT:    vsrl.vi v25, v25, 1
1565; LMULMAX1-RV32-NEXT:    vor.vv v25, v25, v26
1566; LMULMAX1-RV32-NEXT:    vse64.v v25, (a0)
1567; LMULMAX1-RV32-NEXT:    vse64.v v31, (a1)
1568; LMULMAX1-RV32-NEXT:    ret
1569;
1570; LMULMAX1-RV64-LABEL: bitreverse_v4i64:
1571; LMULMAX1-RV64:       # %bb.0:
1572; LMULMAX1-RV64-NEXT:    addi sp, sp, -16
1573; LMULMAX1-RV64-NEXT:    .cfi_def_cfa_offset 16
1574; LMULMAX1-RV64-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
1575; LMULMAX1-RV64-NEXT:    .cfi_offset s0, -8
1576; LMULMAX1-RV64-NEXT:    vsetivli a1, 2, e64,m1,ta,mu
1577; LMULMAX1-RV64-NEXT:    addi t1, a0, 16
1578; LMULMAX1-RV64-NEXT:    vle64.v v26, (t1)
1579; LMULMAX1-RV64-NEXT:    vle64.v v25, (a0)
1580; LMULMAX1-RV64-NEXT:    addi a7, zero, 56
1581; LMULMAX1-RV64-NEXT:    vsrl.vx v27, v26, a7
1582; LMULMAX1-RV64-NEXT:    addi t0, zero, 40
1583; LMULMAX1-RV64-NEXT:    vsrl.vx v28, v26, t0
1584; LMULMAX1-RV64-NEXT:    lui a1, 16
1585; LMULMAX1-RV64-NEXT:    addiw t2, a1, -256
1586; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, t2
1587; LMULMAX1-RV64-NEXT:    vor.vv v27, v28, v27
1588; LMULMAX1-RV64-NEXT:    vsrl.vi v28, v26, 24
1589; LMULMAX1-RV64-NEXT:    lui a6, 4080
1590; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, a6
1591; LMULMAX1-RV64-NEXT:    vsrl.vi v29, v26, 8
1592; LMULMAX1-RV64-NEXT:    addi a1, zero, 255
1593; LMULMAX1-RV64-NEXT:    slli t3, a1, 24
1594; LMULMAX1-RV64-NEXT:    vand.vx v29, v29, t3
1595; LMULMAX1-RV64-NEXT:    vor.vv v28, v29, v28
1596; LMULMAX1-RV64-NEXT:    vor.vv v27, v28, v27
1597; LMULMAX1-RV64-NEXT:    vsll.vi v28, v26, 8
1598; LMULMAX1-RV64-NEXT:    slli t4, a1, 32
1599; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, t4
1600; LMULMAX1-RV64-NEXT:    vsll.vi v29, v26, 24
1601; LMULMAX1-RV64-NEXT:    slli t5, a1, 40
1602; LMULMAX1-RV64-NEXT:    vand.vx v29, v29, t5
1603; LMULMAX1-RV64-NEXT:    vor.vv v28, v29, v28
1604; LMULMAX1-RV64-NEXT:    vsll.vx v29, v26, a7
1605; LMULMAX1-RV64-NEXT:    vsll.vx v26, v26, t0
1606; LMULMAX1-RV64-NEXT:    slli t6, a1, 48
1607; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, t6
1608; LMULMAX1-RV64-NEXT:    vor.vv v26, v29, v26
1609; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v28
1610; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1611; LMULMAX1-RV64-NEXT:    lui a4, 3855
1612; LMULMAX1-RV64-NEXT:    addiw a4, a4, 241
1613; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
1614; LMULMAX1-RV64-NEXT:    addi a4, a4, -241
1615; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
1616; LMULMAX1-RV64-NEXT:    addi a4, a4, 241
1617; LMULMAX1-RV64-NEXT:    slli a4, a4, 12
1618; LMULMAX1-RV64-NEXT:    addi a4, a4, -241
1619; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a4
1620; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 4
1621; LMULMAX1-RV64-NEXT:    lui a5, 1044721
1622; LMULMAX1-RV64-NEXT:    addiw a5, a5, -241
1623; LMULMAX1-RV64-NEXT:    slli a5, a5, 12
1624; LMULMAX1-RV64-NEXT:    addi a5, a5, 241
1625; LMULMAX1-RV64-NEXT:    slli a5, a5, 12
1626; LMULMAX1-RV64-NEXT:    addi a5, a5, -241
1627; LMULMAX1-RV64-NEXT:    slli a5, a5, 12
1628; LMULMAX1-RV64-NEXT:    addi a5, a5, 240
1629; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a5
1630; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 4
1631; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1632; LMULMAX1-RV64-NEXT:    lui a2, 13107
1633; LMULMAX1-RV64-NEXT:    addiw a2, a2, 819
1634; LMULMAX1-RV64-NEXT:    slli a2, a2, 12
1635; LMULMAX1-RV64-NEXT:    addi a2, a2, 819
1636; LMULMAX1-RV64-NEXT:    slli a2, a2, 12
1637; LMULMAX1-RV64-NEXT:    addi a2, a2, 819
1638; LMULMAX1-RV64-NEXT:    slli a2, a2, 12
1639; LMULMAX1-RV64-NEXT:    addi a2, a2, 819
1640; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a2
1641; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 2
1642; LMULMAX1-RV64-NEXT:    lui a3, 1035469
1643; LMULMAX1-RV64-NEXT:    addiw a3, a3, -819
1644; LMULMAX1-RV64-NEXT:    slli a3, a3, 12
1645; LMULMAX1-RV64-NEXT:    addi a3, a3, -819
1646; LMULMAX1-RV64-NEXT:    slli a3, a3, 12
1647; LMULMAX1-RV64-NEXT:    addi a3, a3, -819
1648; LMULMAX1-RV64-NEXT:    slli a3, a3, 12
1649; LMULMAX1-RV64-NEXT:    addi a3, a3, -820
1650; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, a3
1651; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 2
1652; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1653; LMULMAX1-RV64-NEXT:    lui a1, 21845
1654; LMULMAX1-RV64-NEXT:    addiw a1, a1, 1365
1655; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
1656; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
1657; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
1658; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
1659; LMULMAX1-RV64-NEXT:    slli a1, a1, 12
1660; LMULMAX1-RV64-NEXT:    addi a1, a1, 1365
1661; LMULMAX1-RV64-NEXT:    vand.vx v27, v26, a1
1662; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 1
1663; LMULMAX1-RV64-NEXT:    lui s0, 1026731
1664; LMULMAX1-RV64-NEXT:    addiw s0, s0, -1365
1665; LMULMAX1-RV64-NEXT:    slli s0, s0, 12
1666; LMULMAX1-RV64-NEXT:    addi s0, s0, -1365
1667; LMULMAX1-RV64-NEXT:    slli s0, s0, 12
1668; LMULMAX1-RV64-NEXT:    addi s0, s0, -1365
1669; LMULMAX1-RV64-NEXT:    slli s0, s0, 12
1670; LMULMAX1-RV64-NEXT:    addi s0, s0, -1366
1671; LMULMAX1-RV64-NEXT:    vand.vx v26, v26, s0
1672; LMULMAX1-RV64-NEXT:    vsrl.vi v26, v26, 1
1673; LMULMAX1-RV64-NEXT:    vor.vv v26, v26, v27
1674; LMULMAX1-RV64-NEXT:    vsrl.vx v27, v25, a7
1675; LMULMAX1-RV64-NEXT:    vsrl.vx v28, v25, t0
1676; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, t2
1677; LMULMAX1-RV64-NEXT:    vor.vv v27, v28, v27
1678; LMULMAX1-RV64-NEXT:    vsrl.vi v28, v25, 24
1679; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, a6
1680; LMULMAX1-RV64-NEXT:    vsrl.vi v29, v25, 8
1681; LMULMAX1-RV64-NEXT:    vand.vx v29, v29, t3
1682; LMULMAX1-RV64-NEXT:    vor.vv v28, v29, v28
1683; LMULMAX1-RV64-NEXT:    vor.vv v27, v28, v27
1684; LMULMAX1-RV64-NEXT:    vsll.vi v28, v25, 8
1685; LMULMAX1-RV64-NEXT:    vand.vx v28, v28, t4
1686; LMULMAX1-RV64-NEXT:    vsll.vi v29, v25, 24
1687; LMULMAX1-RV64-NEXT:    vand.vx v29, v29, t5
1688; LMULMAX1-RV64-NEXT:    vor.vv v28, v29, v28
1689; LMULMAX1-RV64-NEXT:    vsll.vx v29, v25, a7
1690; LMULMAX1-RV64-NEXT:    vsll.vx v25, v25, t0
1691; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, t6
1692; LMULMAX1-RV64-NEXT:    vor.vv v25, v29, v25
1693; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v28
1694; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1695; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a4
1696; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 4
1697; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a5
1698; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 4
1699; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1700; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a2
1701; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 2
1702; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, a3
1703; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 2
1704; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1705; LMULMAX1-RV64-NEXT:    vand.vx v27, v25, a1
1706; LMULMAX1-RV64-NEXT:    vsll.vi v27, v27, 1
1707; LMULMAX1-RV64-NEXT:    vand.vx v25, v25, s0
1708; LMULMAX1-RV64-NEXT:    vsrl.vi v25, v25, 1
1709; LMULMAX1-RV64-NEXT:    vor.vv v25, v25, v27
1710; LMULMAX1-RV64-NEXT:    vse64.v v25, (a0)
1711; LMULMAX1-RV64-NEXT:    vse64.v v26, (t1)
1712; LMULMAX1-RV64-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
1713; LMULMAX1-RV64-NEXT:    addi sp, sp, 16
1714; LMULMAX1-RV64-NEXT:    ret
1715  %a = load <4 x i64>, <4 x i64>* %x
1716  %b = load <4 x i64>, <4 x i64>* %y
1717  %c = call <4 x i64> @llvm.bitreverse.v4i64(<4 x i64> %a)
1718  store <4 x i64> %c, <4 x i64>* %x
1719  ret void
1720}
1721declare <4 x i64> @llvm.bitreverse.v4i64(<4 x i64>)
1722