xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vror.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV32
3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-RV64
4; RUN: llc -mtriple=riscv32 -mattr=+v,+zvkb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVKB
5; RUN: llc -mtriple=riscv64 -mattr=+v,+zvkb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVKB
6
7declare <1 x i8> @llvm.fshr.v1i8(<1 x i8>, <1 x i8>, <1 x i8>)
8declare <1 x i8> @llvm.fshl.v1i8(<1 x i8>, <1 x i8>, <1 x i8>)
9
10define <1 x i8> @vror_vv_v1i8(<1 x i8> %a, <1 x i8> %b) {
11; CHECK-LABEL: vror_vv_v1i8:
12; CHECK:       # %bb.0:
13; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
14; CHECK-NEXT:    vand.vi v10, v9, 7
15; CHECK-NEXT:    vrsub.vi v9, v9, 0
16; CHECK-NEXT:    vsrl.vv v10, v8, v10
17; CHECK-NEXT:    vand.vi v9, v9, 7
18; CHECK-NEXT:    vsll.vv v8, v8, v9
19; CHECK-NEXT:    vor.vv v8, v10, v8
20; CHECK-NEXT:    ret
21;
22; CHECK-ZVKB-LABEL: vror_vv_v1i8:
23; CHECK-ZVKB:       # %bb.0:
24; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
25; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
26; CHECK-ZVKB-NEXT:    ret
27  %x = call <1 x i8> @llvm.fshr.v1i8(<1 x i8> %a, <1 x i8> %a, <1 x i8> %b)
28  ret <1 x i8> %x
29}
30
31define <1 x i8> @vror_vx_v1i8(<1 x i8> %a, i8 %b) {
32; CHECK-LABEL: vror_vx_v1i8:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
35; CHECK-NEXT:    vmv.s.x v9, a0
36; CHECK-NEXT:    vand.vi v10, v9, 7
37; CHECK-NEXT:    vrsub.vi v9, v9, 0
38; CHECK-NEXT:    vsrl.vv v10, v8, v10
39; CHECK-NEXT:    vand.vi v9, v9, 7
40; CHECK-NEXT:    vsll.vv v8, v8, v9
41; CHECK-NEXT:    vor.vv v8, v10, v8
42; CHECK-NEXT:    ret
43;
44; CHECK-ZVKB-LABEL: vror_vx_v1i8:
45; CHECK-ZVKB:       # %bb.0:
46; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
47; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
48; CHECK-ZVKB-NEXT:    ret
49  %b.head = insertelement <1 x i8> poison, i8 %b, i32 0
50  %b.splat = shufflevector <1 x i8> %b.head, <1 x i8> poison, <1 x i32> zeroinitializer
51  %x = call <1 x i8> @llvm.fshr.v1i8(<1 x i8> %a, <1 x i8> %a, <1 x i8> %b.splat)
52  ret <1 x i8> %x
53}
54
55define <1 x i8> @vror_vi_v1i8(<1 x i8> %a) {
56; CHECK-LABEL: vror_vi_v1i8:
57; CHECK:       # %bb.0:
58; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
59; CHECK-NEXT:    vsll.vi v9, v8, 7
60; CHECK-NEXT:    vsrl.vi v8, v8, 1
61; CHECK-NEXT:    vor.vv v8, v8, v9
62; CHECK-NEXT:    ret
63;
64; CHECK-ZVKB-LABEL: vror_vi_v1i8:
65; CHECK-ZVKB:       # %bb.0:
66; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
67; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
68; CHECK-ZVKB-NEXT:    ret
69  %x = call <1 x i8> @llvm.fshr.v1i8(<1 x i8> %a, <1 x i8> %a, <1 x i8> splat (i8 1))
70  ret <1 x i8> %x
71}
72
73define <1 x i8> @vror_vi_rotl_v1i8(<1 x i8> %a) {
74; CHECK-LABEL: vror_vi_rotl_v1i8:
75; CHECK:       # %bb.0:
76; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
77; CHECK-NEXT:    vsrl.vi v9, v8, 7
78; CHECK-NEXT:    vadd.vv v8, v8, v8
79; CHECK-NEXT:    vor.vv v8, v8, v9
80; CHECK-NEXT:    ret
81;
82; CHECK-ZVKB-LABEL: vror_vi_rotl_v1i8:
83; CHECK-ZVKB:       # %bb.0:
84; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
85; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
86; CHECK-ZVKB-NEXT:    ret
87  %x = call <1 x i8> @llvm.fshl.v1i8(<1 x i8> %a, <1 x i8> %a, <1 x i8> splat (i8 1))
88  ret <1 x i8> %x
89}
90
91declare <2 x i8> @llvm.fshr.v2i8(<2 x i8>, <2 x i8>, <2 x i8>)
92declare <2 x i8> @llvm.fshl.v2i8(<2 x i8>, <2 x i8>, <2 x i8>)
93
94define <2 x i8> @vror_vv_v2i8(<2 x i8> %a, <2 x i8> %b) {
95; CHECK-LABEL: vror_vv_v2i8:
96; CHECK:       # %bb.0:
97; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
98; CHECK-NEXT:    vand.vi v10, v9, 7
99; CHECK-NEXT:    vrsub.vi v9, v9, 0
100; CHECK-NEXT:    vsrl.vv v10, v8, v10
101; CHECK-NEXT:    vand.vi v9, v9, 7
102; CHECK-NEXT:    vsll.vv v8, v8, v9
103; CHECK-NEXT:    vor.vv v8, v10, v8
104; CHECK-NEXT:    ret
105;
106; CHECK-ZVKB-LABEL: vror_vv_v2i8:
107; CHECK-ZVKB:       # %bb.0:
108; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
109; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
110; CHECK-ZVKB-NEXT:    ret
111  %x = call <2 x i8> @llvm.fshr.v2i8(<2 x i8> %a, <2 x i8> %a, <2 x i8> %b)
112  ret <2 x i8> %x
113}
114
115define <2 x i8> @vror_vx_v2i8(<2 x i8> %a, i8 %b) {
116; CHECK-LABEL: vror_vx_v2i8:
117; CHECK:       # %bb.0:
118; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
119; CHECK-NEXT:    vmv.v.x v9, a0
120; CHECK-NEXT:    vand.vi v10, v9, 7
121; CHECK-NEXT:    vrsub.vi v9, v9, 0
122; CHECK-NEXT:    vsrl.vv v10, v8, v10
123; CHECK-NEXT:    vand.vi v9, v9, 7
124; CHECK-NEXT:    vsll.vv v8, v8, v9
125; CHECK-NEXT:    vor.vv v8, v10, v8
126; CHECK-NEXT:    ret
127;
128; CHECK-ZVKB-LABEL: vror_vx_v2i8:
129; CHECK-ZVKB:       # %bb.0:
130; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
131; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
132; CHECK-ZVKB-NEXT:    ret
133  %b.head = insertelement <2 x i8> poison, i8 %b, i32 0
134  %b.splat = shufflevector <2 x i8> %b.head, <2 x i8> poison, <2 x i32> zeroinitializer
135  %x = call <2 x i8> @llvm.fshr.v2i8(<2 x i8> %a, <2 x i8> %a, <2 x i8> %b.splat)
136  ret <2 x i8> %x
137}
138
139define <2 x i8> @vror_vi_v2i8(<2 x i8> %a) {
140; CHECK-LABEL: vror_vi_v2i8:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
143; CHECK-NEXT:    vsll.vi v9, v8, 7
144; CHECK-NEXT:    vsrl.vi v8, v8, 1
145; CHECK-NEXT:    vor.vv v8, v8, v9
146; CHECK-NEXT:    ret
147;
148; CHECK-ZVKB-LABEL: vror_vi_v2i8:
149; CHECK-ZVKB:       # %bb.0:
150; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
151; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
152; CHECK-ZVKB-NEXT:    ret
153  %x = call <2 x i8> @llvm.fshr.v2i8(<2 x i8> %a, <2 x i8> %a, <2 x i8> splat (i8 1))
154  ret <2 x i8> %x
155}
156
157define <2 x i8> @vror_vi_rotl_v2i8(<2 x i8> %a) {
158; CHECK-LABEL: vror_vi_rotl_v2i8:
159; CHECK:       # %bb.0:
160; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
161; CHECK-NEXT:    vsrl.vi v9, v8, 7
162; CHECK-NEXT:    vadd.vv v8, v8, v8
163; CHECK-NEXT:    vor.vv v8, v8, v9
164; CHECK-NEXT:    ret
165;
166; CHECK-ZVKB-LABEL: vror_vi_rotl_v2i8:
167; CHECK-ZVKB:       # %bb.0:
168; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
169; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
170; CHECK-ZVKB-NEXT:    ret
171  %x = call <2 x i8> @llvm.fshl.v2i8(<2 x i8> %a, <2 x i8> %a, <2 x i8> splat (i8 1))
172  ret <2 x i8> %x
173}
174
175declare <4 x i8> @llvm.fshr.v4i8(<4 x i8>, <4 x i8>, <4 x i8>)
176declare <4 x i8> @llvm.fshl.v4i8(<4 x i8>, <4 x i8>, <4 x i8>)
177
178define <4 x i8> @vror_vv_v4i8(<4 x i8> %a, <4 x i8> %b) {
179; CHECK-LABEL: vror_vv_v4i8:
180; CHECK:       # %bb.0:
181; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
182; CHECK-NEXT:    vand.vi v10, v9, 7
183; CHECK-NEXT:    vrsub.vi v9, v9, 0
184; CHECK-NEXT:    vsrl.vv v10, v8, v10
185; CHECK-NEXT:    vand.vi v9, v9, 7
186; CHECK-NEXT:    vsll.vv v8, v8, v9
187; CHECK-NEXT:    vor.vv v8, v10, v8
188; CHECK-NEXT:    ret
189;
190; CHECK-ZVKB-LABEL: vror_vv_v4i8:
191; CHECK-ZVKB:       # %bb.0:
192; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
193; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
194; CHECK-ZVKB-NEXT:    ret
195  %x = call <4 x i8> @llvm.fshr.v4i8(<4 x i8> %a, <4 x i8> %a, <4 x i8> %b)
196  ret <4 x i8> %x
197}
198
199define <4 x i8> @vror_vx_v4i8(<4 x i8> %a, i8 %b) {
200; CHECK-LABEL: vror_vx_v4i8:
201; CHECK:       # %bb.0:
202; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
203; CHECK-NEXT:    vmv.v.x v9, a0
204; CHECK-NEXT:    vand.vi v10, v9, 7
205; CHECK-NEXT:    vrsub.vi v9, v9, 0
206; CHECK-NEXT:    vsrl.vv v10, v8, v10
207; CHECK-NEXT:    vand.vi v9, v9, 7
208; CHECK-NEXT:    vsll.vv v8, v8, v9
209; CHECK-NEXT:    vor.vv v8, v10, v8
210; CHECK-NEXT:    ret
211;
212; CHECK-ZVKB-LABEL: vror_vx_v4i8:
213; CHECK-ZVKB:       # %bb.0:
214; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
215; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
216; CHECK-ZVKB-NEXT:    ret
217  %b.head = insertelement <4 x i8> poison, i8 %b, i32 0
218  %b.splat = shufflevector <4 x i8> %b.head, <4 x i8> poison, <4 x i32> zeroinitializer
219  %x = call <4 x i8> @llvm.fshr.v4i8(<4 x i8> %a, <4 x i8> %a, <4 x i8> %b.splat)
220  ret <4 x i8> %x
221}
222
223define <4 x i8> @vror_vi_v4i8(<4 x i8> %a) {
224; CHECK-LABEL: vror_vi_v4i8:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
227; CHECK-NEXT:    vsll.vi v9, v8, 7
228; CHECK-NEXT:    vsrl.vi v8, v8, 1
229; CHECK-NEXT:    vor.vv v8, v8, v9
230; CHECK-NEXT:    ret
231;
232; CHECK-ZVKB-LABEL: vror_vi_v4i8:
233; CHECK-ZVKB:       # %bb.0:
234; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
235; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
236; CHECK-ZVKB-NEXT:    ret
237  %x = call <4 x i8> @llvm.fshr.v4i8(<4 x i8> %a, <4 x i8> %a, <4 x i8> splat (i8 1))
238  ret <4 x i8> %x
239}
240
241define <4 x i8> @vror_vi_rotl_v4i8(<4 x i8> %a) {
242; CHECK-LABEL: vror_vi_rotl_v4i8:
243; CHECK:       # %bb.0:
244; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
245; CHECK-NEXT:    vsrl.vi v9, v8, 7
246; CHECK-NEXT:    vadd.vv v8, v8, v8
247; CHECK-NEXT:    vor.vv v8, v8, v9
248; CHECK-NEXT:    ret
249;
250; CHECK-ZVKB-LABEL: vror_vi_rotl_v4i8:
251; CHECK-ZVKB:       # %bb.0:
252; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
253; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
254; CHECK-ZVKB-NEXT:    ret
255  %x = call <4 x i8> @llvm.fshl.v4i8(<4 x i8> %a, <4 x i8> %a, <4 x i8> splat (i8 1))
256  ret <4 x i8> %x
257}
258
259declare <8 x i8> @llvm.fshr.v8i8(<8 x i8>, <8 x i8>, <8 x i8>)
260declare <8 x i8> @llvm.fshl.v8i8(<8 x i8>, <8 x i8>, <8 x i8>)
261
262define <8 x i8> @vror_vv_v8i8(<8 x i8> %a, <8 x i8> %b) {
263; CHECK-LABEL: vror_vv_v8i8:
264; CHECK:       # %bb.0:
265; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
266; CHECK-NEXT:    vand.vi v10, v9, 7
267; CHECK-NEXT:    vrsub.vi v9, v9, 0
268; CHECK-NEXT:    vsrl.vv v10, v8, v10
269; CHECK-NEXT:    vand.vi v9, v9, 7
270; CHECK-NEXT:    vsll.vv v8, v8, v9
271; CHECK-NEXT:    vor.vv v8, v10, v8
272; CHECK-NEXT:    ret
273;
274; CHECK-ZVKB-LABEL: vror_vv_v8i8:
275; CHECK-ZVKB:       # %bb.0:
276; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
277; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
278; CHECK-ZVKB-NEXT:    ret
279  %x = call <8 x i8> @llvm.fshr.v8i8(<8 x i8> %a, <8 x i8> %a, <8 x i8> %b)
280  ret <8 x i8> %x
281}
282
283define <8 x i8> @vror_vx_v8i8(<8 x i8> %a, i8 %b) {
284; CHECK-LABEL: vror_vx_v8i8:
285; CHECK:       # %bb.0:
286; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
287; CHECK-NEXT:    vmv.v.x v9, a0
288; CHECK-NEXT:    vand.vi v10, v9, 7
289; CHECK-NEXT:    vrsub.vi v9, v9, 0
290; CHECK-NEXT:    vsrl.vv v10, v8, v10
291; CHECK-NEXT:    vand.vi v9, v9, 7
292; CHECK-NEXT:    vsll.vv v8, v8, v9
293; CHECK-NEXT:    vor.vv v8, v10, v8
294; CHECK-NEXT:    ret
295;
296; CHECK-ZVKB-LABEL: vror_vx_v8i8:
297; CHECK-ZVKB:       # %bb.0:
298; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
299; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
300; CHECK-ZVKB-NEXT:    ret
301  %b.head = insertelement <8 x i8> poison, i8 %b, i32 0
302  %b.splat = shufflevector <8 x i8> %b.head, <8 x i8> poison, <8 x i32> zeroinitializer
303  %x = call <8 x i8> @llvm.fshr.v8i8(<8 x i8> %a, <8 x i8> %a, <8 x i8> %b.splat)
304  ret <8 x i8> %x
305}
306
307define <8 x i8> @vror_vi_v8i8(<8 x i8> %a) {
308; CHECK-LABEL: vror_vi_v8i8:
309; CHECK:       # %bb.0:
310; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
311; CHECK-NEXT:    vsll.vi v9, v8, 7
312; CHECK-NEXT:    vsrl.vi v8, v8, 1
313; CHECK-NEXT:    vor.vv v8, v8, v9
314; CHECK-NEXT:    ret
315;
316; CHECK-ZVKB-LABEL: vror_vi_v8i8:
317; CHECK-ZVKB:       # %bb.0:
318; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
319; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
320; CHECK-ZVKB-NEXT:    ret
321  %x = call <8 x i8> @llvm.fshr.v8i8(<8 x i8> %a, <8 x i8> %a, <8 x i8> splat (i8 1))
322  ret <8 x i8> %x
323}
324
325define <8 x i8> @vror_vi_rotl_v8i8(<8 x i8> %a) {
326; CHECK-LABEL: vror_vi_rotl_v8i8:
327; CHECK:       # %bb.0:
328; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
329; CHECK-NEXT:    vsrl.vi v9, v8, 7
330; CHECK-NEXT:    vadd.vv v8, v8, v8
331; CHECK-NEXT:    vor.vv v8, v8, v9
332; CHECK-NEXT:    ret
333;
334; CHECK-ZVKB-LABEL: vror_vi_rotl_v8i8:
335; CHECK-ZVKB:       # %bb.0:
336; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
337; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
338; CHECK-ZVKB-NEXT:    ret
339  %x = call <8 x i8> @llvm.fshl.v8i8(<8 x i8> %a, <8 x i8> %a, <8 x i8> splat (i8 1))
340  ret <8 x i8> %x
341}
342
343declare <16 x i8> @llvm.fshr.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
344declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
345
346define <16 x i8> @vror_vv_v16i8(<16 x i8> %a, <16 x i8> %b) {
347; CHECK-LABEL: vror_vv_v16i8:
348; CHECK:       # %bb.0:
349; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
350; CHECK-NEXT:    vand.vi v10, v9, 7
351; CHECK-NEXT:    vrsub.vi v9, v9, 0
352; CHECK-NEXT:    vsrl.vv v10, v8, v10
353; CHECK-NEXT:    vand.vi v9, v9, 7
354; CHECK-NEXT:    vsll.vv v8, v8, v9
355; CHECK-NEXT:    vor.vv v8, v10, v8
356; CHECK-NEXT:    ret
357;
358; CHECK-ZVKB-LABEL: vror_vv_v16i8:
359; CHECK-ZVKB:       # %bb.0:
360; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
361; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
362; CHECK-ZVKB-NEXT:    ret
363  %x = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> %b)
364  ret <16 x i8> %x
365}
366
367define <16 x i8> @vror_vx_v16i8(<16 x i8> %a, i8 %b) {
368; CHECK-LABEL: vror_vx_v16i8:
369; CHECK:       # %bb.0:
370; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
371; CHECK-NEXT:    vmv.v.x v9, a0
372; CHECK-NEXT:    vand.vi v10, v9, 7
373; CHECK-NEXT:    vrsub.vi v9, v9, 0
374; CHECK-NEXT:    vsrl.vv v10, v8, v10
375; CHECK-NEXT:    vand.vi v9, v9, 7
376; CHECK-NEXT:    vsll.vv v8, v8, v9
377; CHECK-NEXT:    vor.vv v8, v10, v8
378; CHECK-NEXT:    ret
379;
380; CHECK-ZVKB-LABEL: vror_vx_v16i8:
381; CHECK-ZVKB:       # %bb.0:
382; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
383; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
384; CHECK-ZVKB-NEXT:    ret
385  %b.head = insertelement <16 x i8> poison, i8 %b, i32 0
386  %b.splat = shufflevector <16 x i8> %b.head, <16 x i8> poison, <16 x i32> zeroinitializer
387  %x = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> %b.splat)
388  ret <16 x i8> %x
389}
390
391define <16 x i8> @vror_vi_v16i8(<16 x i8> %a) {
392; CHECK-LABEL: vror_vi_v16i8:
393; CHECK:       # %bb.0:
394; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
395; CHECK-NEXT:    vsll.vi v9, v8, 7
396; CHECK-NEXT:    vsrl.vi v8, v8, 1
397; CHECK-NEXT:    vor.vv v8, v8, v9
398; CHECK-NEXT:    ret
399;
400; CHECK-ZVKB-LABEL: vror_vi_v16i8:
401; CHECK-ZVKB:       # %bb.0:
402; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
403; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
404; CHECK-ZVKB-NEXT:    ret
405  %x = call <16 x i8> @llvm.fshr.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> splat (i8 1))
406  ret <16 x i8> %x
407}
408
409define <16 x i8> @vror_vi_rotl_v16i8(<16 x i8> %a) {
410; CHECK-LABEL: vror_vi_rotl_v16i8:
411; CHECK:       # %bb.0:
412; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
413; CHECK-NEXT:    vsrl.vi v9, v8, 7
414; CHECK-NEXT:    vadd.vv v8, v8, v8
415; CHECK-NEXT:    vor.vv v8, v8, v9
416; CHECK-NEXT:    ret
417;
418; CHECK-ZVKB-LABEL: vror_vi_rotl_v16i8:
419; CHECK-ZVKB:       # %bb.0:
420; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
421; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
422; CHECK-ZVKB-NEXT:    ret
423  %x = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %a, <16 x i8> %a, <16 x i8> splat (i8 1))
424  ret <16 x i8> %x
425}
426
427declare <32 x i8> @llvm.fshr.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
428declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
429
430define <32 x i8> @vror_vv_v32i8(<32 x i8> %a, <32 x i8> %b) {
431; CHECK-LABEL: vror_vv_v32i8:
432; CHECK:       # %bb.0:
433; CHECK-NEXT:    li a0, 32
434; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
435; CHECK-NEXT:    vand.vi v12, v10, 7
436; CHECK-NEXT:    vrsub.vi v10, v10, 0
437; CHECK-NEXT:    vsrl.vv v12, v8, v12
438; CHECK-NEXT:    vand.vi v10, v10, 7
439; CHECK-NEXT:    vsll.vv v8, v8, v10
440; CHECK-NEXT:    vor.vv v8, v12, v8
441; CHECK-NEXT:    ret
442;
443; CHECK-ZVKB-LABEL: vror_vv_v32i8:
444; CHECK-ZVKB:       # %bb.0:
445; CHECK-ZVKB-NEXT:    li a0, 32
446; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
447; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v10
448; CHECK-ZVKB-NEXT:    ret
449  %x = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> %b)
450  ret <32 x i8> %x
451}
452
453define <32 x i8> @vror_vx_v32i8(<32 x i8> %a, i8 %b) {
454; CHECK-LABEL: vror_vx_v32i8:
455; CHECK:       # %bb.0:
456; CHECK-NEXT:    li a1, 32
457; CHECK-NEXT:    vsetvli zero, a1, e8, m2, ta, ma
458; CHECK-NEXT:    vmv.v.x v10, a0
459; CHECK-NEXT:    vand.vi v12, v10, 7
460; CHECK-NEXT:    vrsub.vi v10, v10, 0
461; CHECK-NEXT:    vsrl.vv v12, v8, v12
462; CHECK-NEXT:    vand.vi v10, v10, 7
463; CHECK-NEXT:    vsll.vv v8, v8, v10
464; CHECK-NEXT:    vor.vv v8, v12, v8
465; CHECK-NEXT:    ret
466;
467; CHECK-ZVKB-LABEL: vror_vx_v32i8:
468; CHECK-ZVKB:       # %bb.0:
469; CHECK-ZVKB-NEXT:    li a1, 32
470; CHECK-ZVKB-NEXT:    vsetvli zero, a1, e8, m2, ta, ma
471; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
472; CHECK-ZVKB-NEXT:    ret
473  %b.head = insertelement <32 x i8> poison, i8 %b, i32 0
474  %b.splat = shufflevector <32 x i8> %b.head, <32 x i8> poison, <32 x i32> zeroinitializer
475  %x = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> %b.splat)
476  ret <32 x i8> %x
477}
478
479define <32 x i8> @vror_vi_v32i8(<32 x i8> %a) {
480; CHECK-LABEL: vror_vi_v32i8:
481; CHECK:       # %bb.0:
482; CHECK-NEXT:    li a0, 32
483; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
484; CHECK-NEXT:    vsll.vi v10, v8, 7
485; CHECK-NEXT:    vsrl.vi v8, v8, 1
486; CHECK-NEXT:    vor.vv v8, v8, v10
487; CHECK-NEXT:    ret
488;
489; CHECK-ZVKB-LABEL: vror_vi_v32i8:
490; CHECK-ZVKB:       # %bb.0:
491; CHECK-ZVKB-NEXT:    li a0, 32
492; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
493; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
494; CHECK-ZVKB-NEXT:    ret
495  %x = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> splat (i8 1))
496  ret <32 x i8> %x
497}
498
499define <32 x i8> @vror_vi_rotl_v32i8(<32 x i8> %a) {
500; CHECK-LABEL: vror_vi_rotl_v32i8:
501; CHECK:       # %bb.0:
502; CHECK-NEXT:    li a0, 32
503; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
504; CHECK-NEXT:    vsrl.vi v10, v8, 7
505; CHECK-NEXT:    vadd.vv v8, v8, v8
506; CHECK-NEXT:    vor.vv v8, v8, v10
507; CHECK-NEXT:    ret
508;
509; CHECK-ZVKB-LABEL: vror_vi_rotl_v32i8:
510; CHECK-ZVKB:       # %bb.0:
511; CHECK-ZVKB-NEXT:    li a0, 32
512; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
513; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
514; CHECK-ZVKB-NEXT:    ret
515  %x = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %a, <32 x i8> %a, <32 x i8> splat (i8 1))
516  ret <32 x i8> %x
517}
518
519declare <64 x i8> @llvm.fshr.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
520declare <64 x i8> @llvm.fshl.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
521
522define <64 x i8> @vror_vv_v64i8(<64 x i8> %a, <64 x i8> %b) {
523; CHECK-LABEL: vror_vv_v64i8:
524; CHECK:       # %bb.0:
525; CHECK-NEXT:    li a0, 64
526; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
527; CHECK-NEXT:    vand.vi v16, v12, 7
528; CHECK-NEXT:    vrsub.vi v12, v12, 0
529; CHECK-NEXT:    vsrl.vv v16, v8, v16
530; CHECK-NEXT:    vand.vi v12, v12, 7
531; CHECK-NEXT:    vsll.vv v8, v8, v12
532; CHECK-NEXT:    vor.vv v8, v16, v8
533; CHECK-NEXT:    ret
534;
535; CHECK-ZVKB-LABEL: vror_vv_v64i8:
536; CHECK-ZVKB:       # %bb.0:
537; CHECK-ZVKB-NEXT:    li a0, 64
538; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
539; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v12
540; CHECK-ZVKB-NEXT:    ret
541  %x = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> %b)
542  ret <64 x i8> %x
543}
544
545define <64 x i8> @vror_vx_v64i8(<64 x i8> %a, i8 %b) {
546; CHECK-LABEL: vror_vx_v64i8:
547; CHECK:       # %bb.0:
548; CHECK-NEXT:    li a1, 64
549; CHECK-NEXT:    vsetvli zero, a1, e8, m4, ta, ma
550; CHECK-NEXT:    vmv.v.x v12, a0
551; CHECK-NEXT:    vand.vi v16, v12, 7
552; CHECK-NEXT:    vrsub.vi v12, v12, 0
553; CHECK-NEXT:    vsrl.vv v16, v8, v16
554; CHECK-NEXT:    vand.vi v12, v12, 7
555; CHECK-NEXT:    vsll.vv v8, v8, v12
556; CHECK-NEXT:    vor.vv v8, v16, v8
557; CHECK-NEXT:    ret
558;
559; CHECK-ZVKB-LABEL: vror_vx_v64i8:
560; CHECK-ZVKB:       # %bb.0:
561; CHECK-ZVKB-NEXT:    li a1, 64
562; CHECK-ZVKB-NEXT:    vsetvli zero, a1, e8, m4, ta, ma
563; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
564; CHECK-ZVKB-NEXT:    ret
565  %b.head = insertelement <64 x i8> poison, i8 %b, i32 0
566  %b.splat = shufflevector <64 x i8> %b.head, <64 x i8> poison, <64 x i32> zeroinitializer
567  %x = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> %b.splat)
568  ret <64 x i8> %x
569}
570
571define <64 x i8> @vror_vi_v64i8(<64 x i8> %a) {
572; CHECK-LABEL: vror_vi_v64i8:
573; CHECK:       # %bb.0:
574; CHECK-NEXT:    li a0, 64
575; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
576; CHECK-NEXT:    vsll.vi v12, v8, 7
577; CHECK-NEXT:    vsrl.vi v8, v8, 1
578; CHECK-NEXT:    vor.vv v8, v8, v12
579; CHECK-NEXT:    ret
580;
581; CHECK-ZVKB-LABEL: vror_vi_v64i8:
582; CHECK-ZVKB:       # %bb.0:
583; CHECK-ZVKB-NEXT:    li a0, 64
584; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
585; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
586; CHECK-ZVKB-NEXT:    ret
587  %x = call <64 x i8> @llvm.fshr.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> splat (i8 1))
588  ret <64 x i8> %x
589}
590
591define <64 x i8> @vror_vi_rotl_v64i8(<64 x i8> %a) {
592; CHECK-LABEL: vror_vi_rotl_v64i8:
593; CHECK:       # %bb.0:
594; CHECK-NEXT:    li a0, 64
595; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
596; CHECK-NEXT:    vsrl.vi v12, v8, 7
597; CHECK-NEXT:    vadd.vv v8, v8, v8
598; CHECK-NEXT:    vor.vv v8, v8, v12
599; CHECK-NEXT:    ret
600;
601; CHECK-ZVKB-LABEL: vror_vi_rotl_v64i8:
602; CHECK-ZVKB:       # %bb.0:
603; CHECK-ZVKB-NEXT:    li a0, 64
604; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
605; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 7
606; CHECK-ZVKB-NEXT:    ret
607  %x = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %a, <64 x i8> %a, <64 x i8> splat (i8 1))
608  ret <64 x i8> %x
609}
610
611declare <1 x i16> @llvm.fshr.v1i16(<1 x i16>, <1 x i16>, <1 x i16>)
612declare <1 x i16> @llvm.fshl.v1i16(<1 x i16>, <1 x i16>, <1 x i16>)
613
614define <1 x i16> @vror_vv_v1i16(<1 x i16> %a, <1 x i16> %b) {
615; CHECK-LABEL: vror_vv_v1i16:
616; CHECK:       # %bb.0:
617; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
618; CHECK-NEXT:    vand.vi v10, v9, 15
619; CHECK-NEXT:    vrsub.vi v9, v9, 0
620; CHECK-NEXT:    vsrl.vv v10, v8, v10
621; CHECK-NEXT:    vand.vi v9, v9, 15
622; CHECK-NEXT:    vsll.vv v8, v8, v9
623; CHECK-NEXT:    vor.vv v8, v10, v8
624; CHECK-NEXT:    ret
625;
626; CHECK-ZVKB-LABEL: vror_vv_v1i16:
627; CHECK-ZVKB:       # %bb.0:
628; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
629; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
630; CHECK-ZVKB-NEXT:    ret
631  %x = call <1 x i16> @llvm.fshr.v1i16(<1 x i16> %a, <1 x i16> %a, <1 x i16> %b)
632  ret <1 x i16> %x
633}
634
635define <1 x i16> @vror_vx_v1i16(<1 x i16> %a, i16 %b) {
636; CHECK-LABEL: vror_vx_v1i16:
637; CHECK:       # %bb.0:
638; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
639; CHECK-NEXT:    vmv.s.x v9, a0
640; CHECK-NEXT:    vand.vi v10, v9, 15
641; CHECK-NEXT:    vrsub.vi v9, v9, 0
642; CHECK-NEXT:    vsrl.vv v10, v8, v10
643; CHECK-NEXT:    vand.vi v9, v9, 15
644; CHECK-NEXT:    vsll.vv v8, v8, v9
645; CHECK-NEXT:    vor.vv v8, v10, v8
646; CHECK-NEXT:    ret
647;
648; CHECK-ZVKB-LABEL: vror_vx_v1i16:
649; CHECK-ZVKB:       # %bb.0:
650; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
651; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
652; CHECK-ZVKB-NEXT:    ret
653  %b.head = insertelement <1 x i16> poison, i16 %b, i32 0
654  %b.splat = shufflevector <1 x i16> %b.head, <1 x i16> poison, <1 x i32> zeroinitializer
655  %x = call <1 x i16> @llvm.fshr.v1i16(<1 x i16> %a, <1 x i16> %a, <1 x i16> %b.splat)
656  ret <1 x i16> %x
657}
658
659define <1 x i16> @vror_vi_v1i16(<1 x i16> %a) {
660; CHECK-LABEL: vror_vi_v1i16:
661; CHECK:       # %bb.0:
662; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
663; CHECK-NEXT:    vsll.vi v9, v8, 15
664; CHECK-NEXT:    vsrl.vi v8, v8, 1
665; CHECK-NEXT:    vor.vv v8, v8, v9
666; CHECK-NEXT:    ret
667;
668; CHECK-ZVKB-LABEL: vror_vi_v1i16:
669; CHECK-ZVKB:       # %bb.0:
670; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
671; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
672; CHECK-ZVKB-NEXT:    ret
673  %x = call <1 x i16> @llvm.fshr.v1i16(<1 x i16> %a, <1 x i16> %a, <1 x i16> splat (i16 1))
674  ret <1 x i16> %x
675}
676
677define <1 x i16> @vror_vi_rotl_v1i16(<1 x i16> %a) {
678; CHECK-LABEL: vror_vi_rotl_v1i16:
679; CHECK:       # %bb.0:
680; CHECK-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
681; CHECK-NEXT:    vsrl.vi v9, v8, 15
682; CHECK-NEXT:    vadd.vv v8, v8, v8
683; CHECK-NEXT:    vor.vv v8, v8, v9
684; CHECK-NEXT:    ret
685;
686; CHECK-ZVKB-LABEL: vror_vi_rotl_v1i16:
687; CHECK-ZVKB:       # %bb.0:
688; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e16, mf4, ta, ma
689; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 15
690; CHECK-ZVKB-NEXT:    ret
691  %x = call <1 x i16> @llvm.fshl.v1i16(<1 x i16> %a, <1 x i16> %a, <1 x i16> splat (i16 1))
692  ret <1 x i16> %x
693}
694
695declare <2 x i16> @llvm.fshr.v2i16(<2 x i16>, <2 x i16>, <2 x i16>)
696declare <2 x i16> @llvm.fshl.v2i16(<2 x i16>, <2 x i16>, <2 x i16>)
697
698define <2 x i16> @vror_vv_v2i16(<2 x i16> %a, <2 x i16> %b) {
699; CHECK-LABEL: vror_vv_v2i16:
700; CHECK:       # %bb.0:
701; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
702; CHECK-NEXT:    vand.vi v10, v9, 15
703; CHECK-NEXT:    vrsub.vi v9, v9, 0
704; CHECK-NEXT:    vsrl.vv v10, v8, v10
705; CHECK-NEXT:    vand.vi v9, v9, 15
706; CHECK-NEXT:    vsll.vv v8, v8, v9
707; CHECK-NEXT:    vor.vv v8, v10, v8
708; CHECK-NEXT:    ret
709;
710; CHECK-ZVKB-LABEL: vror_vv_v2i16:
711; CHECK-ZVKB:       # %bb.0:
712; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
713; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
714; CHECK-ZVKB-NEXT:    ret
715  %x = call <2 x i16> @llvm.fshr.v2i16(<2 x i16> %a, <2 x i16> %a, <2 x i16> %b)
716  ret <2 x i16> %x
717}
718
719define <2 x i16> @vror_vx_v2i16(<2 x i16> %a, i16 %b) {
720; CHECK-LABEL: vror_vx_v2i16:
721; CHECK:       # %bb.0:
722; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
723; CHECK-NEXT:    vmv.v.x v9, a0
724; CHECK-NEXT:    vand.vi v10, v9, 15
725; CHECK-NEXT:    vrsub.vi v9, v9, 0
726; CHECK-NEXT:    vsrl.vv v10, v8, v10
727; CHECK-NEXT:    vand.vi v9, v9, 15
728; CHECK-NEXT:    vsll.vv v8, v8, v9
729; CHECK-NEXT:    vor.vv v8, v10, v8
730; CHECK-NEXT:    ret
731;
732; CHECK-ZVKB-LABEL: vror_vx_v2i16:
733; CHECK-ZVKB:       # %bb.0:
734; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
735; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
736; CHECK-ZVKB-NEXT:    ret
737  %b.head = insertelement <2 x i16> poison, i16 %b, i32 0
738  %b.splat = shufflevector <2 x i16> %b.head, <2 x i16> poison, <2 x i32> zeroinitializer
739  %x = call <2 x i16> @llvm.fshr.v2i16(<2 x i16> %a, <2 x i16> %a, <2 x i16> %b.splat)
740  ret <2 x i16> %x
741}
742
743define <2 x i16> @vror_vi_v2i16(<2 x i16> %a) {
744; CHECK-LABEL: vror_vi_v2i16:
745; CHECK:       # %bb.0:
746; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
747; CHECK-NEXT:    vsll.vi v9, v8, 15
748; CHECK-NEXT:    vsrl.vi v8, v8, 1
749; CHECK-NEXT:    vor.vv v8, v8, v9
750; CHECK-NEXT:    ret
751;
752; CHECK-ZVKB-LABEL: vror_vi_v2i16:
753; CHECK-ZVKB:       # %bb.0:
754; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
755; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
756; CHECK-ZVKB-NEXT:    ret
757  %x = call <2 x i16> @llvm.fshr.v2i16(<2 x i16> %a, <2 x i16> %a, <2 x i16> splat (i16 1))
758  ret <2 x i16> %x
759}
760
761define <2 x i16> @vror_vi_rotl_v2i16(<2 x i16> %a) {
762; CHECK-LABEL: vror_vi_rotl_v2i16:
763; CHECK:       # %bb.0:
764; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
765; CHECK-NEXT:    vsrl.vi v9, v8, 15
766; CHECK-NEXT:    vadd.vv v8, v8, v8
767; CHECK-NEXT:    vor.vv v8, v8, v9
768; CHECK-NEXT:    ret
769;
770; CHECK-ZVKB-LABEL: vror_vi_rotl_v2i16:
771; CHECK-ZVKB:       # %bb.0:
772; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
773; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 15
774; CHECK-ZVKB-NEXT:    ret
775  %x = call <2 x i16> @llvm.fshl.v2i16(<2 x i16> %a, <2 x i16> %a, <2 x i16> splat (i16 1))
776  ret <2 x i16> %x
777}
778
779declare <4 x i16> @llvm.fshr.v4i16(<4 x i16>, <4 x i16>, <4 x i16>)
780declare <4 x i16> @llvm.fshl.v4i16(<4 x i16>, <4 x i16>, <4 x i16>)
781
782define <4 x i16> @vror_vv_v4i16(<4 x i16> %a, <4 x i16> %b) {
783; CHECK-LABEL: vror_vv_v4i16:
784; CHECK:       # %bb.0:
785; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
786; CHECK-NEXT:    vand.vi v10, v9, 15
787; CHECK-NEXT:    vrsub.vi v9, v9, 0
788; CHECK-NEXT:    vsrl.vv v10, v8, v10
789; CHECK-NEXT:    vand.vi v9, v9, 15
790; CHECK-NEXT:    vsll.vv v8, v8, v9
791; CHECK-NEXT:    vor.vv v8, v10, v8
792; CHECK-NEXT:    ret
793;
794; CHECK-ZVKB-LABEL: vror_vv_v4i16:
795; CHECK-ZVKB:       # %bb.0:
796; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
797; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
798; CHECK-ZVKB-NEXT:    ret
799  %x = call <4 x i16> @llvm.fshr.v4i16(<4 x i16> %a, <4 x i16> %a, <4 x i16> %b)
800  ret <4 x i16> %x
801}
802
803define <4 x i16> @vror_vx_v4i16(<4 x i16> %a, i16 %b) {
804; CHECK-LABEL: vror_vx_v4i16:
805; CHECK:       # %bb.0:
806; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
807; CHECK-NEXT:    vmv.v.x v9, a0
808; CHECK-NEXT:    vand.vi v10, v9, 15
809; CHECK-NEXT:    vrsub.vi v9, v9, 0
810; CHECK-NEXT:    vsrl.vv v10, v8, v10
811; CHECK-NEXT:    vand.vi v9, v9, 15
812; CHECK-NEXT:    vsll.vv v8, v8, v9
813; CHECK-NEXT:    vor.vv v8, v10, v8
814; CHECK-NEXT:    ret
815;
816; CHECK-ZVKB-LABEL: vror_vx_v4i16:
817; CHECK-ZVKB:       # %bb.0:
818; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
819; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
820; CHECK-ZVKB-NEXT:    ret
821  %b.head = insertelement <4 x i16> poison, i16 %b, i32 0
822  %b.splat = shufflevector <4 x i16> %b.head, <4 x i16> poison, <4 x i32> zeroinitializer
823  %x = call <4 x i16> @llvm.fshr.v4i16(<4 x i16> %a, <4 x i16> %a, <4 x i16> %b.splat)
824  ret <4 x i16> %x
825}
826
827define <4 x i16> @vror_vi_v4i16(<4 x i16> %a) {
828; CHECK-LABEL: vror_vi_v4i16:
829; CHECK:       # %bb.0:
830; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
831; CHECK-NEXT:    vsll.vi v9, v8, 15
832; CHECK-NEXT:    vsrl.vi v8, v8, 1
833; CHECK-NEXT:    vor.vv v8, v8, v9
834; CHECK-NEXT:    ret
835;
836; CHECK-ZVKB-LABEL: vror_vi_v4i16:
837; CHECK-ZVKB:       # %bb.0:
838; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
839; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
840; CHECK-ZVKB-NEXT:    ret
841  %x = call <4 x i16> @llvm.fshr.v4i16(<4 x i16> %a, <4 x i16> %a, <4 x i16> splat (i16 1))
842  ret <4 x i16> %x
843}
844
845define <4 x i16> @vror_vi_rotl_v4i16(<4 x i16> %a) {
846; CHECK-LABEL: vror_vi_rotl_v4i16:
847; CHECK:       # %bb.0:
848; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
849; CHECK-NEXT:    vsrl.vi v9, v8, 15
850; CHECK-NEXT:    vadd.vv v8, v8, v8
851; CHECK-NEXT:    vor.vv v8, v8, v9
852; CHECK-NEXT:    ret
853;
854; CHECK-ZVKB-LABEL: vror_vi_rotl_v4i16:
855; CHECK-ZVKB:       # %bb.0:
856; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
857; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 15
858; CHECK-ZVKB-NEXT:    ret
859  %x = call <4 x i16> @llvm.fshl.v4i16(<4 x i16> %a, <4 x i16> %a, <4 x i16> splat (i16 1))
860  ret <4 x i16> %x
861}
862
863declare <8 x i16> @llvm.fshr.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)
864declare <8 x i16> @llvm.fshl.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)
865
866define <8 x i16> @vror_vv_v8i16(<8 x i16> %a, <8 x i16> %b) {
867; CHECK-LABEL: vror_vv_v8i16:
868; CHECK:       # %bb.0:
869; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
870; CHECK-NEXT:    vand.vi v10, v9, 15
871; CHECK-NEXT:    vrsub.vi v9, v9, 0
872; CHECK-NEXT:    vsrl.vv v10, v8, v10
873; CHECK-NEXT:    vand.vi v9, v9, 15
874; CHECK-NEXT:    vsll.vv v8, v8, v9
875; CHECK-NEXT:    vor.vv v8, v10, v8
876; CHECK-NEXT:    ret
877;
878; CHECK-ZVKB-LABEL: vror_vv_v8i16:
879; CHECK-ZVKB:       # %bb.0:
880; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
881; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
882; CHECK-ZVKB-NEXT:    ret
883  %x = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %a, <8 x i16> %a, <8 x i16> %b)
884  ret <8 x i16> %x
885}
886
887define <8 x i16> @vror_vx_v8i16(<8 x i16> %a, i16 %b) {
888; CHECK-LABEL: vror_vx_v8i16:
889; CHECK:       # %bb.0:
890; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
891; CHECK-NEXT:    vmv.v.x v9, a0
892; CHECK-NEXT:    vand.vi v10, v9, 15
893; CHECK-NEXT:    vrsub.vi v9, v9, 0
894; CHECK-NEXT:    vsrl.vv v10, v8, v10
895; CHECK-NEXT:    vand.vi v9, v9, 15
896; CHECK-NEXT:    vsll.vv v8, v8, v9
897; CHECK-NEXT:    vor.vv v8, v10, v8
898; CHECK-NEXT:    ret
899;
900; CHECK-ZVKB-LABEL: vror_vx_v8i16:
901; CHECK-ZVKB:       # %bb.0:
902; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
903; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
904; CHECK-ZVKB-NEXT:    ret
905  %b.head = insertelement <8 x i16> poison, i16 %b, i32 0
906  %b.splat = shufflevector <8 x i16> %b.head, <8 x i16> poison, <8 x i32> zeroinitializer
907  %x = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %a, <8 x i16> %a, <8 x i16> %b.splat)
908  ret <8 x i16> %x
909}
910
911define <8 x i16> @vror_vi_v8i16(<8 x i16> %a) {
912; CHECK-LABEL: vror_vi_v8i16:
913; CHECK:       # %bb.0:
914; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
915; CHECK-NEXT:    vsll.vi v9, v8, 15
916; CHECK-NEXT:    vsrl.vi v8, v8, 1
917; CHECK-NEXT:    vor.vv v8, v8, v9
918; CHECK-NEXT:    ret
919;
920; CHECK-ZVKB-LABEL: vror_vi_v8i16:
921; CHECK-ZVKB:       # %bb.0:
922; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
923; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
924; CHECK-ZVKB-NEXT:    ret
925  %x = call <8 x i16> @llvm.fshr.v8i16(<8 x i16> %a, <8 x i16> %a, <8 x i16> splat (i16 1))
926  ret <8 x i16> %x
927}
928
929define <8 x i16> @vror_vi_rotl_v8i16(<8 x i16> %a) {
930; CHECK-LABEL: vror_vi_rotl_v8i16:
931; CHECK:       # %bb.0:
932; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
933; CHECK-NEXT:    vsrl.vi v9, v8, 15
934; CHECK-NEXT:    vadd.vv v8, v8, v8
935; CHECK-NEXT:    vor.vv v8, v8, v9
936; CHECK-NEXT:    ret
937;
938; CHECK-ZVKB-LABEL: vror_vi_rotl_v8i16:
939; CHECK-ZVKB:       # %bb.0:
940; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
941; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 15
942; CHECK-ZVKB-NEXT:    ret
943  %x = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %a, <8 x i16> %a, <8 x i16> splat (i16 1))
944  ret <8 x i16> %x
945}
946
947declare <16 x i16> @llvm.fshr.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
948declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
949
950define <16 x i16> @vror_vv_v16i16(<16 x i16> %a, <16 x i16> %b) {
951; CHECK-LABEL: vror_vv_v16i16:
952; CHECK:       # %bb.0:
953; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
954; CHECK-NEXT:    vand.vi v12, v10, 15
955; CHECK-NEXT:    vrsub.vi v10, v10, 0
956; CHECK-NEXT:    vsrl.vv v12, v8, v12
957; CHECK-NEXT:    vand.vi v10, v10, 15
958; CHECK-NEXT:    vsll.vv v8, v8, v10
959; CHECK-NEXT:    vor.vv v8, v12, v8
960; CHECK-NEXT:    ret
961;
962; CHECK-ZVKB-LABEL: vror_vv_v16i16:
963; CHECK-ZVKB:       # %bb.0:
964; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
965; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v10
966; CHECK-ZVKB-NEXT:    ret
967  %x = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %a, <16 x i16> %a, <16 x i16> %b)
968  ret <16 x i16> %x
969}
970
971define <16 x i16> @vror_vx_v16i16(<16 x i16> %a, i16 %b) {
972; CHECK-LABEL: vror_vx_v16i16:
973; CHECK:       # %bb.0:
974; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
975; CHECK-NEXT:    vmv.v.x v10, a0
976; CHECK-NEXT:    vand.vi v12, v10, 15
977; CHECK-NEXT:    vrsub.vi v10, v10, 0
978; CHECK-NEXT:    vsrl.vv v12, v8, v12
979; CHECK-NEXT:    vand.vi v10, v10, 15
980; CHECK-NEXT:    vsll.vv v8, v8, v10
981; CHECK-NEXT:    vor.vv v8, v12, v8
982; CHECK-NEXT:    ret
983;
984; CHECK-ZVKB-LABEL: vror_vx_v16i16:
985; CHECK-ZVKB:       # %bb.0:
986; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
987; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
988; CHECK-ZVKB-NEXT:    ret
989  %b.head = insertelement <16 x i16> poison, i16 %b, i32 0
990  %b.splat = shufflevector <16 x i16> %b.head, <16 x i16> poison, <16 x i32> zeroinitializer
991  %x = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %a, <16 x i16> %a, <16 x i16> %b.splat)
992  ret <16 x i16> %x
993}
994
995define <16 x i16> @vror_vi_v16i16(<16 x i16> %a) {
996; CHECK-LABEL: vror_vi_v16i16:
997; CHECK:       # %bb.0:
998; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
999; CHECK-NEXT:    vsll.vi v10, v8, 15
1000; CHECK-NEXT:    vsrl.vi v8, v8, 1
1001; CHECK-NEXT:    vor.vv v8, v8, v10
1002; CHECK-NEXT:    ret
1003;
1004; CHECK-ZVKB-LABEL: vror_vi_v16i16:
1005; CHECK-ZVKB:       # %bb.0:
1006; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
1007; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1008; CHECK-ZVKB-NEXT:    ret
1009  %x = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %a, <16 x i16> %a, <16 x i16> splat (i16 1))
1010  ret <16 x i16> %x
1011}
1012
1013define <16 x i16> @vror_vi_rotl_v16i16(<16 x i16> %a) {
1014; CHECK-LABEL: vror_vi_rotl_v16i16:
1015; CHECK:       # %bb.0:
1016; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
1017; CHECK-NEXT:    vsrl.vi v10, v8, 15
1018; CHECK-NEXT:    vadd.vv v8, v8, v8
1019; CHECK-NEXT:    vor.vv v8, v8, v10
1020; CHECK-NEXT:    ret
1021;
1022; CHECK-ZVKB-LABEL: vror_vi_rotl_v16i16:
1023; CHECK-ZVKB:       # %bb.0:
1024; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
1025; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 15
1026; CHECK-ZVKB-NEXT:    ret
1027  %x = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %a, <16 x i16> %a, <16 x i16> splat (i16 1))
1028  ret <16 x i16> %x
1029}
1030
1031declare <32 x i16> @llvm.fshr.v32i16(<32 x i16>, <32 x i16>, <32 x i16>)
1032declare <32 x i16> @llvm.fshl.v32i16(<32 x i16>, <32 x i16>, <32 x i16>)
1033
1034define <32 x i16> @vror_vv_v32i16(<32 x i16> %a, <32 x i16> %b) {
1035; CHECK-LABEL: vror_vv_v32i16:
1036; CHECK:       # %bb.0:
1037; CHECK-NEXT:    li a0, 32
1038; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1039; CHECK-NEXT:    vand.vi v16, v12, 15
1040; CHECK-NEXT:    vrsub.vi v12, v12, 0
1041; CHECK-NEXT:    vsrl.vv v16, v8, v16
1042; CHECK-NEXT:    vand.vi v12, v12, 15
1043; CHECK-NEXT:    vsll.vv v8, v8, v12
1044; CHECK-NEXT:    vor.vv v8, v16, v8
1045; CHECK-NEXT:    ret
1046;
1047; CHECK-ZVKB-LABEL: vror_vv_v32i16:
1048; CHECK-ZVKB:       # %bb.0:
1049; CHECK-ZVKB-NEXT:    li a0, 32
1050; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1051; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v12
1052; CHECK-ZVKB-NEXT:    ret
1053  %x = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %a, <32 x i16> %a, <32 x i16> %b)
1054  ret <32 x i16> %x
1055}
1056
1057define <32 x i16> @vror_vx_v32i16(<32 x i16> %a, i16 %b) {
1058; CHECK-LABEL: vror_vx_v32i16:
1059; CHECK:       # %bb.0:
1060; CHECK-NEXT:    li a1, 32
1061; CHECK-NEXT:    vsetvli zero, a1, e16, m4, ta, ma
1062; CHECK-NEXT:    vmv.v.x v12, a0
1063; CHECK-NEXT:    vand.vi v16, v12, 15
1064; CHECK-NEXT:    vrsub.vi v12, v12, 0
1065; CHECK-NEXT:    vsrl.vv v16, v8, v16
1066; CHECK-NEXT:    vand.vi v12, v12, 15
1067; CHECK-NEXT:    vsll.vv v8, v8, v12
1068; CHECK-NEXT:    vor.vv v8, v16, v8
1069; CHECK-NEXT:    ret
1070;
1071; CHECK-ZVKB-LABEL: vror_vx_v32i16:
1072; CHECK-ZVKB:       # %bb.0:
1073; CHECK-ZVKB-NEXT:    li a1, 32
1074; CHECK-ZVKB-NEXT:    vsetvli zero, a1, e16, m4, ta, ma
1075; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1076; CHECK-ZVKB-NEXT:    ret
1077  %b.head = insertelement <32 x i16> poison, i16 %b, i32 0
1078  %b.splat = shufflevector <32 x i16> %b.head, <32 x i16> poison, <32 x i32> zeroinitializer
1079  %x = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %a, <32 x i16> %a, <32 x i16> %b.splat)
1080  ret <32 x i16> %x
1081}
1082
1083define <32 x i16> @vror_vi_v32i16(<32 x i16> %a) {
1084; CHECK-LABEL: vror_vi_v32i16:
1085; CHECK:       # %bb.0:
1086; CHECK-NEXT:    li a0, 32
1087; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1088; CHECK-NEXT:    vsll.vi v12, v8, 15
1089; CHECK-NEXT:    vsrl.vi v8, v8, 1
1090; CHECK-NEXT:    vor.vv v8, v8, v12
1091; CHECK-NEXT:    ret
1092;
1093; CHECK-ZVKB-LABEL: vror_vi_v32i16:
1094; CHECK-ZVKB:       # %bb.0:
1095; CHECK-ZVKB-NEXT:    li a0, 32
1096; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1097; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1098; CHECK-ZVKB-NEXT:    ret
1099  %x = call <32 x i16> @llvm.fshr.v32i16(<32 x i16> %a, <32 x i16> %a, <32 x i16> splat (i16 1))
1100  ret <32 x i16> %x
1101}
1102
1103define <32 x i16> @vror_vi_rotl_v32i16(<32 x i16> %a) {
1104; CHECK-LABEL: vror_vi_rotl_v32i16:
1105; CHECK:       # %bb.0:
1106; CHECK-NEXT:    li a0, 32
1107; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1108; CHECK-NEXT:    vsrl.vi v12, v8, 15
1109; CHECK-NEXT:    vadd.vv v8, v8, v8
1110; CHECK-NEXT:    vor.vv v8, v8, v12
1111; CHECK-NEXT:    ret
1112;
1113; CHECK-ZVKB-LABEL: vror_vi_rotl_v32i16:
1114; CHECK-ZVKB:       # %bb.0:
1115; CHECK-ZVKB-NEXT:    li a0, 32
1116; CHECK-ZVKB-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
1117; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 15
1118; CHECK-ZVKB-NEXT:    ret
1119  %x = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %a, <32 x i16> %a, <32 x i16> splat (i16 1))
1120  ret <32 x i16> %x
1121}
1122
1123declare <1 x i32> @llvm.fshr.v1i32(<1 x i32>, <1 x i32>, <1 x i32>)
1124declare <1 x i32> @llvm.fshl.v1i32(<1 x i32>, <1 x i32>, <1 x i32>)
1125
1126define <1 x i32> @vror_vv_v1i32(<1 x i32> %a, <1 x i32> %b) {
1127; CHECK-LABEL: vror_vv_v1i32:
1128; CHECK:       # %bb.0:
1129; CHECK-NEXT:    li a0, 31
1130; CHECK-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1131; CHECK-NEXT:    vrsub.vi v10, v9, 0
1132; CHECK-NEXT:    vand.vx v9, v9, a0
1133; CHECK-NEXT:    vand.vx v10, v10, a0
1134; CHECK-NEXT:    vsrl.vv v9, v8, v9
1135; CHECK-NEXT:    vsll.vv v8, v8, v10
1136; CHECK-NEXT:    vor.vv v8, v9, v8
1137; CHECK-NEXT:    ret
1138;
1139; CHECK-ZVKB-LABEL: vror_vv_v1i32:
1140; CHECK-ZVKB:       # %bb.0:
1141; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1142; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
1143; CHECK-ZVKB-NEXT:    ret
1144  %x = call <1 x i32> @llvm.fshr.v1i32(<1 x i32> %a, <1 x i32> %a, <1 x i32> %b)
1145  ret <1 x i32> %x
1146}
1147
1148define <1 x i32> @vror_vx_v1i32(<1 x i32> %a, i32 %b) {
1149; CHECK-LABEL: vror_vx_v1i32:
1150; CHECK:       # %bb.0:
1151; CHECK-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1152; CHECK-NEXT:    vmv.s.x v9, a0
1153; CHECK-NEXT:    li a0, 31
1154; CHECK-NEXT:    vand.vx v10, v9, a0
1155; CHECK-NEXT:    vrsub.vi v9, v9, 0
1156; CHECK-NEXT:    vsrl.vv v10, v8, v10
1157; CHECK-NEXT:    vand.vx v9, v9, a0
1158; CHECK-NEXT:    vsll.vv v8, v8, v9
1159; CHECK-NEXT:    vor.vv v8, v10, v8
1160; CHECK-NEXT:    ret
1161;
1162; CHECK-ZVKB-LABEL: vror_vx_v1i32:
1163; CHECK-ZVKB:       # %bb.0:
1164; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1165; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1166; CHECK-ZVKB-NEXT:    ret
1167  %b.head = insertelement <1 x i32> poison, i32 %b, i32 0
1168  %b.splat = shufflevector <1 x i32> %b.head, <1 x i32> poison, <1 x i32> zeroinitializer
1169  %x = call <1 x i32> @llvm.fshr.v1i32(<1 x i32> %a, <1 x i32> %a, <1 x i32> %b.splat)
1170  ret <1 x i32> %x
1171}
1172
1173define <1 x i32> @vror_vi_v1i32(<1 x i32> %a) {
1174; CHECK-LABEL: vror_vi_v1i32:
1175; CHECK:       # %bb.0:
1176; CHECK-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1177; CHECK-NEXT:    vsll.vi v9, v8, 31
1178; CHECK-NEXT:    vsrl.vi v8, v8, 1
1179; CHECK-NEXT:    vor.vv v8, v8, v9
1180; CHECK-NEXT:    ret
1181;
1182; CHECK-ZVKB-LABEL: vror_vi_v1i32:
1183; CHECK-ZVKB:       # %bb.0:
1184; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1185; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1186; CHECK-ZVKB-NEXT:    ret
1187  %x = call <1 x i32> @llvm.fshr.v1i32(<1 x i32> %a, <1 x i32> %a, <1 x i32> splat (i32 1))
1188  ret <1 x i32> %x
1189}
1190
1191define <1 x i32> @vror_vi_rotl_v1i32(<1 x i32> %a) {
1192; CHECK-LABEL: vror_vi_rotl_v1i32:
1193; CHECK:       # %bb.0:
1194; CHECK-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1195; CHECK-NEXT:    vsrl.vi v9, v8, 31
1196; CHECK-NEXT:    vadd.vv v8, v8, v8
1197; CHECK-NEXT:    vor.vv v8, v8, v9
1198; CHECK-NEXT:    ret
1199;
1200; CHECK-ZVKB-LABEL: vror_vi_rotl_v1i32:
1201; CHECK-ZVKB:       # %bb.0:
1202; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e32, mf2, ta, ma
1203; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 31
1204; CHECK-ZVKB-NEXT:    ret
1205  %x = call <1 x i32> @llvm.fshl.v1i32(<1 x i32> %a, <1 x i32> %a, <1 x i32> splat (i32 1))
1206  ret <1 x i32> %x
1207}
1208
1209declare <2 x i32> @llvm.fshr.v2i32(<2 x i32>, <2 x i32>, <2 x i32>)
1210declare <2 x i32> @llvm.fshl.v2i32(<2 x i32>, <2 x i32>, <2 x i32>)
1211
1212define <2 x i32> @vror_vv_v2i32(<2 x i32> %a, <2 x i32> %b) {
1213; CHECK-LABEL: vror_vv_v2i32:
1214; CHECK:       # %bb.0:
1215; CHECK-NEXT:    li a0, 31
1216; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1217; CHECK-NEXT:    vrsub.vi v10, v9, 0
1218; CHECK-NEXT:    vand.vx v9, v9, a0
1219; CHECK-NEXT:    vand.vx v10, v10, a0
1220; CHECK-NEXT:    vsrl.vv v9, v8, v9
1221; CHECK-NEXT:    vsll.vv v8, v8, v10
1222; CHECK-NEXT:    vor.vv v8, v9, v8
1223; CHECK-NEXT:    ret
1224;
1225; CHECK-ZVKB-LABEL: vror_vv_v2i32:
1226; CHECK-ZVKB:       # %bb.0:
1227; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1228; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
1229; CHECK-ZVKB-NEXT:    ret
1230  %x = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %a, <2 x i32> %a, <2 x i32> %b)
1231  ret <2 x i32> %x
1232}
1233
1234define <2 x i32> @vror_vx_v2i32(<2 x i32> %a, i32 %b) {
1235; CHECK-LABEL: vror_vx_v2i32:
1236; CHECK:       # %bb.0:
1237; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1238; CHECK-NEXT:    vmv.v.x v9, a0
1239; CHECK-NEXT:    li a0, 31
1240; CHECK-NEXT:    vand.vx v10, v9, a0
1241; CHECK-NEXT:    vrsub.vi v9, v9, 0
1242; CHECK-NEXT:    vsrl.vv v10, v8, v10
1243; CHECK-NEXT:    vand.vx v9, v9, a0
1244; CHECK-NEXT:    vsll.vv v8, v8, v9
1245; CHECK-NEXT:    vor.vv v8, v10, v8
1246; CHECK-NEXT:    ret
1247;
1248; CHECK-ZVKB-LABEL: vror_vx_v2i32:
1249; CHECK-ZVKB:       # %bb.0:
1250; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1251; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1252; CHECK-ZVKB-NEXT:    ret
1253  %b.head = insertelement <2 x i32> poison, i32 %b, i32 0
1254  %b.splat = shufflevector <2 x i32> %b.head, <2 x i32> poison, <2 x i32> zeroinitializer
1255  %x = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %a, <2 x i32> %a, <2 x i32> %b.splat)
1256  ret <2 x i32> %x
1257}
1258
1259define <2 x i32> @vror_vi_v2i32(<2 x i32> %a) {
1260; CHECK-LABEL: vror_vi_v2i32:
1261; CHECK:       # %bb.0:
1262; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1263; CHECK-NEXT:    vsll.vi v9, v8, 31
1264; CHECK-NEXT:    vsrl.vi v8, v8, 1
1265; CHECK-NEXT:    vor.vv v8, v8, v9
1266; CHECK-NEXT:    ret
1267;
1268; CHECK-ZVKB-LABEL: vror_vi_v2i32:
1269; CHECK-ZVKB:       # %bb.0:
1270; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1271; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1272; CHECK-ZVKB-NEXT:    ret
1273  %x = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %a, <2 x i32> %a, <2 x i32> splat (i32 1))
1274  ret <2 x i32> %x
1275}
1276
1277define <2 x i32> @vror_vi_rotl_v2i32(<2 x i32> %a) {
1278; CHECK-LABEL: vror_vi_rotl_v2i32:
1279; CHECK:       # %bb.0:
1280; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1281; CHECK-NEXT:    vsrl.vi v9, v8, 31
1282; CHECK-NEXT:    vadd.vv v8, v8, v8
1283; CHECK-NEXT:    vor.vv v8, v8, v9
1284; CHECK-NEXT:    ret
1285;
1286; CHECK-ZVKB-LABEL: vror_vi_rotl_v2i32:
1287; CHECK-ZVKB:       # %bb.0:
1288; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1289; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 31
1290; CHECK-ZVKB-NEXT:    ret
1291  %x = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %a, <2 x i32> %a, <2 x i32> splat (i32 1))
1292  ret <2 x i32> %x
1293}
1294
1295declare <4 x i32> @llvm.fshr.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
1296declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
1297
1298define <4 x i32> @vror_vv_v4i32(<4 x i32> %a, <4 x i32> %b) {
1299; CHECK-LABEL: vror_vv_v4i32:
1300; CHECK:       # %bb.0:
1301; CHECK-NEXT:    li a0, 31
1302; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1303; CHECK-NEXT:    vrsub.vi v10, v9, 0
1304; CHECK-NEXT:    vand.vx v9, v9, a0
1305; CHECK-NEXT:    vand.vx v10, v10, a0
1306; CHECK-NEXT:    vsrl.vv v9, v8, v9
1307; CHECK-NEXT:    vsll.vv v8, v8, v10
1308; CHECK-NEXT:    vor.vv v8, v9, v8
1309; CHECK-NEXT:    ret
1310;
1311; CHECK-ZVKB-LABEL: vror_vv_v4i32:
1312; CHECK-ZVKB:       # %bb.0:
1313; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1314; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
1315; CHECK-ZVKB-NEXT:    ret
1316  %x = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %a, <4 x i32> %a, <4 x i32> %b)
1317  ret <4 x i32> %x
1318}
1319
1320define <4 x i32> @vror_vx_v4i32(<4 x i32> %a, i32 %b) {
1321; CHECK-LABEL: vror_vx_v4i32:
1322; CHECK:       # %bb.0:
1323; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1324; CHECK-NEXT:    vmv.v.x v9, a0
1325; CHECK-NEXT:    li a0, 31
1326; CHECK-NEXT:    vand.vx v10, v9, a0
1327; CHECK-NEXT:    vrsub.vi v9, v9, 0
1328; CHECK-NEXT:    vsrl.vv v10, v8, v10
1329; CHECK-NEXT:    vand.vx v9, v9, a0
1330; CHECK-NEXT:    vsll.vv v8, v8, v9
1331; CHECK-NEXT:    vor.vv v8, v10, v8
1332; CHECK-NEXT:    ret
1333;
1334; CHECK-ZVKB-LABEL: vror_vx_v4i32:
1335; CHECK-ZVKB:       # %bb.0:
1336; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1337; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1338; CHECK-ZVKB-NEXT:    ret
1339  %b.head = insertelement <4 x i32> poison, i32 %b, i32 0
1340  %b.splat = shufflevector <4 x i32> %b.head, <4 x i32> poison, <4 x i32> zeroinitializer
1341  %x = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %a, <4 x i32> %a, <4 x i32> %b.splat)
1342  ret <4 x i32> %x
1343}
1344
1345define <4 x i32> @vror_vi_v4i32(<4 x i32> %a) {
1346; CHECK-LABEL: vror_vi_v4i32:
1347; CHECK:       # %bb.0:
1348; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1349; CHECK-NEXT:    vsll.vi v9, v8, 31
1350; CHECK-NEXT:    vsrl.vi v8, v8, 1
1351; CHECK-NEXT:    vor.vv v8, v8, v9
1352; CHECK-NEXT:    ret
1353;
1354; CHECK-ZVKB-LABEL: vror_vi_v4i32:
1355; CHECK-ZVKB:       # %bb.0:
1356; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1357; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1358; CHECK-ZVKB-NEXT:    ret
1359  %x = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %a, <4 x i32> %a, <4 x i32> splat (i32 1))
1360  ret <4 x i32> %x
1361}
1362
1363define <4 x i32> @vror_vi_rotl_v4i32(<4 x i32> %a) {
1364; CHECK-LABEL: vror_vi_rotl_v4i32:
1365; CHECK:       # %bb.0:
1366; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1367; CHECK-NEXT:    vsrl.vi v9, v8, 31
1368; CHECK-NEXT:    vadd.vv v8, v8, v8
1369; CHECK-NEXT:    vor.vv v8, v8, v9
1370; CHECK-NEXT:    ret
1371;
1372; CHECK-ZVKB-LABEL: vror_vi_rotl_v4i32:
1373; CHECK-ZVKB:       # %bb.0:
1374; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1375; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 31
1376; CHECK-ZVKB-NEXT:    ret
1377  %x = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %a, <4 x i32> %a, <4 x i32> splat (i32 1))
1378  ret <4 x i32> %x
1379}
1380
1381declare <8 x i32> @llvm.fshr.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
1382declare <8 x i32> @llvm.fshl.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
1383
1384define <8 x i32> @vror_vv_v8i32(<8 x i32> %a, <8 x i32> %b) {
1385; CHECK-LABEL: vror_vv_v8i32:
1386; CHECK:       # %bb.0:
1387; CHECK-NEXT:    li a0, 31
1388; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1389; CHECK-NEXT:    vrsub.vi v12, v10, 0
1390; CHECK-NEXT:    vand.vx v10, v10, a0
1391; CHECK-NEXT:    vand.vx v12, v12, a0
1392; CHECK-NEXT:    vsrl.vv v10, v8, v10
1393; CHECK-NEXT:    vsll.vv v8, v8, v12
1394; CHECK-NEXT:    vor.vv v8, v10, v8
1395; CHECK-NEXT:    ret
1396;
1397; CHECK-ZVKB-LABEL: vror_vv_v8i32:
1398; CHECK-ZVKB:       # %bb.0:
1399; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1400; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v10
1401; CHECK-ZVKB-NEXT:    ret
1402  %x = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %a, <8 x i32> %a, <8 x i32> %b)
1403  ret <8 x i32> %x
1404}
1405
1406define <8 x i32> @vror_vx_v8i32(<8 x i32> %a, i32 %b) {
1407; CHECK-LABEL: vror_vx_v8i32:
1408; CHECK:       # %bb.0:
1409; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1410; CHECK-NEXT:    vmv.v.x v10, a0
1411; CHECK-NEXT:    li a0, 31
1412; CHECK-NEXT:    vand.vx v12, v10, a0
1413; CHECK-NEXT:    vrsub.vi v10, v10, 0
1414; CHECK-NEXT:    vsrl.vv v12, v8, v12
1415; CHECK-NEXT:    vand.vx v10, v10, a0
1416; CHECK-NEXT:    vsll.vv v8, v8, v10
1417; CHECK-NEXT:    vor.vv v8, v12, v8
1418; CHECK-NEXT:    ret
1419;
1420; CHECK-ZVKB-LABEL: vror_vx_v8i32:
1421; CHECK-ZVKB:       # %bb.0:
1422; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1423; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1424; CHECK-ZVKB-NEXT:    ret
1425  %b.head = insertelement <8 x i32> poison, i32 %b, i32 0
1426  %b.splat = shufflevector <8 x i32> %b.head, <8 x i32> poison, <8 x i32> zeroinitializer
1427  %x = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %a, <8 x i32> %a, <8 x i32> %b.splat)
1428  ret <8 x i32> %x
1429}
1430
1431define <8 x i32> @vror_vi_v8i32(<8 x i32> %a) {
1432; CHECK-LABEL: vror_vi_v8i32:
1433; CHECK:       # %bb.0:
1434; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1435; CHECK-NEXT:    vsll.vi v10, v8, 31
1436; CHECK-NEXT:    vsrl.vi v8, v8, 1
1437; CHECK-NEXT:    vor.vv v8, v8, v10
1438; CHECK-NEXT:    ret
1439;
1440; CHECK-ZVKB-LABEL: vror_vi_v8i32:
1441; CHECK-ZVKB:       # %bb.0:
1442; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1443; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1444; CHECK-ZVKB-NEXT:    ret
1445  %x = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %a, <8 x i32> %a, <8 x i32> splat (i32 1))
1446  ret <8 x i32> %x
1447}
1448
1449define <8 x i32> @vror_vi_rotl_v8i32(<8 x i32> %a) {
1450; CHECK-LABEL: vror_vi_rotl_v8i32:
1451; CHECK:       # %bb.0:
1452; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1453; CHECK-NEXT:    vsrl.vi v10, v8, 31
1454; CHECK-NEXT:    vadd.vv v8, v8, v8
1455; CHECK-NEXT:    vor.vv v8, v8, v10
1456; CHECK-NEXT:    ret
1457;
1458; CHECK-ZVKB-LABEL: vror_vi_rotl_v8i32:
1459; CHECK-ZVKB:       # %bb.0:
1460; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1461; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 31
1462; CHECK-ZVKB-NEXT:    ret
1463  %x = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %a, <8 x i32> %a, <8 x i32> splat (i32 1))
1464  ret <8 x i32> %x
1465}
1466
1467declare <16 x i32> @llvm.fshr.v16i32(<16 x i32>, <16 x i32>, <16 x i32>)
1468declare <16 x i32> @llvm.fshl.v16i32(<16 x i32>, <16 x i32>, <16 x i32>)
1469
1470define <16 x i32> @vror_vv_v16i32(<16 x i32> %a, <16 x i32> %b) {
1471; CHECK-LABEL: vror_vv_v16i32:
1472; CHECK:       # %bb.0:
1473; CHECK-NEXT:    li a0, 31
1474; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1475; CHECK-NEXT:    vrsub.vi v16, v12, 0
1476; CHECK-NEXT:    vand.vx v12, v12, a0
1477; CHECK-NEXT:    vand.vx v16, v16, a0
1478; CHECK-NEXT:    vsrl.vv v12, v8, v12
1479; CHECK-NEXT:    vsll.vv v8, v8, v16
1480; CHECK-NEXT:    vor.vv v8, v12, v8
1481; CHECK-NEXT:    ret
1482;
1483; CHECK-ZVKB-LABEL: vror_vv_v16i32:
1484; CHECK-ZVKB:       # %bb.0:
1485; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1486; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v12
1487; CHECK-ZVKB-NEXT:    ret
1488  %x = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %a, <16 x i32> %a, <16 x i32> %b)
1489  ret <16 x i32> %x
1490}
1491
1492define <16 x i32> @vror_vx_v16i32(<16 x i32> %a, i32 %b) {
1493; CHECK-LABEL: vror_vx_v16i32:
1494; CHECK:       # %bb.0:
1495; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1496; CHECK-NEXT:    vmv.v.x v12, a0
1497; CHECK-NEXT:    li a0, 31
1498; CHECK-NEXT:    vand.vx v16, v12, a0
1499; CHECK-NEXT:    vrsub.vi v12, v12, 0
1500; CHECK-NEXT:    vsrl.vv v16, v8, v16
1501; CHECK-NEXT:    vand.vx v12, v12, a0
1502; CHECK-NEXT:    vsll.vv v8, v8, v12
1503; CHECK-NEXT:    vor.vv v8, v16, v8
1504; CHECK-NEXT:    ret
1505;
1506; CHECK-ZVKB-LABEL: vror_vx_v16i32:
1507; CHECK-ZVKB:       # %bb.0:
1508; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1509; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1510; CHECK-ZVKB-NEXT:    ret
1511  %b.head = insertelement <16 x i32> poison, i32 %b, i32 0
1512  %b.splat = shufflevector <16 x i32> %b.head, <16 x i32> poison, <16 x i32> zeroinitializer
1513  %x = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %a, <16 x i32> %a, <16 x i32> %b.splat)
1514  ret <16 x i32> %x
1515}
1516
1517define <16 x i32> @vror_vi_v16i32(<16 x i32> %a) {
1518; CHECK-LABEL: vror_vi_v16i32:
1519; CHECK:       # %bb.0:
1520; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1521; CHECK-NEXT:    vsll.vi v12, v8, 31
1522; CHECK-NEXT:    vsrl.vi v8, v8, 1
1523; CHECK-NEXT:    vor.vv v8, v8, v12
1524; CHECK-NEXT:    ret
1525;
1526; CHECK-ZVKB-LABEL: vror_vi_v16i32:
1527; CHECK-ZVKB:       # %bb.0:
1528; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1529; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1530; CHECK-ZVKB-NEXT:    ret
1531  %x = call <16 x i32> @llvm.fshr.v16i32(<16 x i32> %a, <16 x i32> %a, <16 x i32> splat (i32 1))
1532  ret <16 x i32> %x
1533}
1534
1535define <16 x i32> @vror_vi_rotl_v16i32(<16 x i32> %a) {
1536; CHECK-LABEL: vror_vi_rotl_v16i32:
1537; CHECK:       # %bb.0:
1538; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1539; CHECK-NEXT:    vsrl.vi v12, v8, 31
1540; CHECK-NEXT:    vadd.vv v8, v8, v8
1541; CHECK-NEXT:    vor.vv v8, v8, v12
1542; CHECK-NEXT:    ret
1543;
1544; CHECK-ZVKB-LABEL: vror_vi_rotl_v16i32:
1545; CHECK-ZVKB:       # %bb.0:
1546; CHECK-ZVKB-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
1547; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 31
1548; CHECK-ZVKB-NEXT:    ret
1549  %x = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %a, <16 x i32> %a, <16 x i32> splat (i32 1))
1550  ret <16 x i32> %x
1551}
1552
1553declare <1 x i64> @llvm.fshr.v1i64(<1 x i64>, <1 x i64>, <1 x i64>)
1554declare <1 x i64> @llvm.fshl.v1i64(<1 x i64>, <1 x i64>, <1 x i64>)
1555
1556define <1 x i64> @vror_vv_v1i64(<1 x i64> %a, <1 x i64> %b) {
1557; CHECK-LABEL: vror_vv_v1i64:
1558; CHECK:       # %bb.0:
1559; CHECK-NEXT:    li a0, 63
1560; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1561; CHECK-NEXT:    vrsub.vi v10, v9, 0
1562; CHECK-NEXT:    vand.vx v9, v9, a0
1563; CHECK-NEXT:    vand.vx v10, v10, a0
1564; CHECK-NEXT:    vsrl.vv v9, v8, v9
1565; CHECK-NEXT:    vsll.vv v8, v8, v10
1566; CHECK-NEXT:    vor.vv v8, v9, v8
1567; CHECK-NEXT:    ret
1568;
1569; CHECK-ZVKB-LABEL: vror_vv_v1i64:
1570; CHECK-ZVKB:       # %bb.0:
1571; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1572; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
1573; CHECK-ZVKB-NEXT:    ret
1574  %x = call <1 x i64> @llvm.fshr.v1i64(<1 x i64> %a, <1 x i64> %a, <1 x i64> %b)
1575  ret <1 x i64> %x
1576}
1577
1578define <1 x i64> @vror_vx_v1i64(<1 x i64> %a, i64 %b) {
1579; CHECK-LABEL: vror_vx_v1i64:
1580; CHECK:       # %bb.0:
1581; CHECK-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1582; CHECK-NEXT:    vmv.s.x v9, a0
1583; CHECK-NEXT:    li a0, 63
1584; CHECK-NEXT:    vand.vx v10, v9, a0
1585; CHECK-NEXT:    vrsub.vi v9, v9, 0
1586; CHECK-NEXT:    vsrl.vv v10, v8, v10
1587; CHECK-NEXT:    vand.vx v9, v9, a0
1588; CHECK-NEXT:    vsll.vv v8, v8, v9
1589; CHECK-NEXT:    vor.vv v8, v10, v8
1590; CHECK-NEXT:    ret
1591;
1592; CHECK-ZVKB-LABEL: vror_vx_v1i64:
1593; CHECK-ZVKB:       # %bb.0:
1594; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1595; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1596; CHECK-ZVKB-NEXT:    ret
1597  %b.head = insertelement <1 x i64> poison, i64 %b, i32 0
1598  %b.splat = shufflevector <1 x i64> %b.head, <1 x i64> poison, <1 x i32> zeroinitializer
1599  %x = call <1 x i64> @llvm.fshr.v1i64(<1 x i64> %a, <1 x i64> %a, <1 x i64> %b.splat)
1600  ret <1 x i64> %x
1601}
1602
1603define <1 x i64> @vror_vi_v1i64(<1 x i64> %a) {
1604; CHECK-RV32-LABEL: vror_vi_v1i64:
1605; CHECK-RV32:       # %bb.0:
1606; CHECK-RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1607; CHECK-RV32-NEXT:    vmv.v.i v9, 1
1608; CHECK-RV32-NEXT:    li a0, 63
1609; CHECK-RV32-NEXT:    vrsub.vi v9, v9, 0
1610; CHECK-RV32-NEXT:    vmv.s.x v10, a0
1611; CHECK-RV32-NEXT:    vand.vx v9, v9, a0
1612; CHECK-RV32-NEXT:    vand.vi v10, v10, 1
1613; CHECK-RV32-NEXT:    vsll.vv v9, v8, v9
1614; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v10
1615; CHECK-RV32-NEXT:    vor.vv v8, v8, v9
1616; CHECK-RV32-NEXT:    ret
1617;
1618; CHECK-RV64-LABEL: vror_vi_v1i64:
1619; CHECK-RV64:       # %bb.0:
1620; CHECK-RV64-NEXT:    li a0, 63
1621; CHECK-RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1622; CHECK-RV64-NEXT:    vsll.vx v9, v8, a0
1623; CHECK-RV64-NEXT:    vsrl.vi v8, v8, 1
1624; CHECK-RV64-NEXT:    vor.vv v8, v8, v9
1625; CHECK-RV64-NEXT:    ret
1626;
1627; CHECK-ZVKB-LABEL: vror_vi_v1i64:
1628; CHECK-ZVKB:       # %bb.0:
1629; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1630; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1631; CHECK-ZVKB-NEXT:    ret
1632  %x = call <1 x i64> @llvm.fshr.v1i64(<1 x i64> %a, <1 x i64> %a, <1 x i64> splat (i64 1))
1633  ret <1 x i64> %x
1634}
1635
1636define <1 x i64> @vror_vi_rotl_v1i64(<1 x i64> %a) {
1637; CHECK-RV32-LABEL: vror_vi_rotl_v1i64:
1638; CHECK-RV32:       # %bb.0:
1639; CHECK-RV32-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1640; CHECK-RV32-NEXT:    vmv.v.i v9, 1
1641; CHECK-RV32-NEXT:    li a0, 63
1642; CHECK-RV32-NEXT:    vrsub.vi v9, v9, 0
1643; CHECK-RV32-NEXT:    vmv.s.x v10, a0
1644; CHECK-RV32-NEXT:    vand.vx v9, v9, a0
1645; CHECK-RV32-NEXT:    vand.vi v10, v10, 1
1646; CHECK-RV32-NEXT:    vsrl.vv v9, v8, v9
1647; CHECK-RV32-NEXT:    vsll.vv v8, v8, v10
1648; CHECK-RV32-NEXT:    vor.vv v8, v8, v9
1649; CHECK-RV32-NEXT:    ret
1650;
1651; CHECK-RV64-LABEL: vror_vi_rotl_v1i64:
1652; CHECK-RV64:       # %bb.0:
1653; CHECK-RV64-NEXT:    li a0, 63
1654; CHECK-RV64-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1655; CHECK-RV64-NEXT:    vsrl.vx v9, v8, a0
1656; CHECK-RV64-NEXT:    vadd.vv v8, v8, v8
1657; CHECK-RV64-NEXT:    vor.vv v8, v8, v9
1658; CHECK-RV64-NEXT:    ret
1659;
1660; CHECK-ZVKB-LABEL: vror_vi_rotl_v1i64:
1661; CHECK-ZVKB:       # %bb.0:
1662; CHECK-ZVKB-NEXT:    vsetivli zero, 1, e64, m1, ta, ma
1663; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 63
1664; CHECK-ZVKB-NEXT:    ret
1665  %x = call <1 x i64> @llvm.fshl.v1i64(<1 x i64> %a, <1 x i64> %a, <1 x i64> splat (i64 1))
1666  ret <1 x i64> %x
1667}
1668
1669declare <2 x i64> @llvm.fshr.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)
1670declare <2 x i64> @llvm.fshl.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)
1671
1672define <2 x i64> @vror_vv_v2i64(<2 x i64> %a, <2 x i64> %b) {
1673; CHECK-LABEL: vror_vv_v2i64:
1674; CHECK:       # %bb.0:
1675; CHECK-NEXT:    li a0, 63
1676; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1677; CHECK-NEXT:    vrsub.vi v10, v9, 0
1678; CHECK-NEXT:    vand.vx v9, v9, a0
1679; CHECK-NEXT:    vand.vx v10, v10, a0
1680; CHECK-NEXT:    vsrl.vv v9, v8, v9
1681; CHECK-NEXT:    vsll.vv v8, v8, v10
1682; CHECK-NEXT:    vor.vv v8, v9, v8
1683; CHECK-NEXT:    ret
1684;
1685; CHECK-ZVKB-LABEL: vror_vv_v2i64:
1686; CHECK-ZVKB:       # %bb.0:
1687; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1688; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v9
1689; CHECK-ZVKB-NEXT:    ret
1690  %x = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %a, <2 x i64> %a, <2 x i64> %b)
1691  ret <2 x i64> %x
1692}
1693
1694define <2 x i64> @vror_vx_v2i64(<2 x i64> %a, i64 %b) {
1695; CHECK-RV32-LABEL: vror_vx_v2i64:
1696; CHECK-RV32:       # %bb.0:
1697; CHECK-RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1698; CHECK-RV32-NEXT:    vmv.v.x v9, a0
1699; CHECK-RV32-NEXT:    vsetvli zero, zero, e32, mf2, ta, ma
1700; CHECK-RV32-NEXT:    vmv.v.i v10, 0
1701; CHECK-RV32-NEXT:    vwsub.vx v11, v10, a0
1702; CHECK-RV32-NEXT:    li a0, 63
1703; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
1704; CHECK-RV32-NEXT:    vand.vx v9, v9, a0
1705; CHECK-RV32-NEXT:    vand.vx v10, v11, a0
1706; CHECK-RV32-NEXT:    vsll.vv v10, v8, v10
1707; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v9
1708; CHECK-RV32-NEXT:    vor.vv v8, v8, v10
1709; CHECK-RV32-NEXT:    ret
1710;
1711; CHECK-RV64-LABEL: vror_vx_v2i64:
1712; CHECK-RV64:       # %bb.0:
1713; CHECK-RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1714; CHECK-RV64-NEXT:    vmv.v.x v9, a0
1715; CHECK-RV64-NEXT:    li a0, 63
1716; CHECK-RV64-NEXT:    vand.vx v10, v9, a0
1717; CHECK-RV64-NEXT:    vrsub.vi v9, v9, 0
1718; CHECK-RV64-NEXT:    vsrl.vv v10, v8, v10
1719; CHECK-RV64-NEXT:    vand.vx v9, v9, a0
1720; CHECK-RV64-NEXT:    vsll.vv v8, v8, v9
1721; CHECK-RV64-NEXT:    vor.vv v8, v10, v8
1722; CHECK-RV64-NEXT:    ret
1723;
1724; CHECK-ZVKB-LABEL: vror_vx_v2i64:
1725; CHECK-ZVKB:       # %bb.0:
1726; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1727; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1728; CHECK-ZVKB-NEXT:    ret
1729  %b.head = insertelement <2 x i64> poison, i64 %b, i32 0
1730  %b.splat = shufflevector <2 x i64> %b.head, <2 x i64> poison, <2 x i32> zeroinitializer
1731  %x = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %a, <2 x i64> %a, <2 x i64> %b.splat)
1732  ret <2 x i64> %x
1733}
1734
1735define <2 x i64> @vror_vi_v2i64(<2 x i64> %a) {
1736; CHECK-RV32-LABEL: vror_vi_v2i64:
1737; CHECK-RV32:       # %bb.0:
1738; CHECK-RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1739; CHECK-RV32-NEXT:    vmv.v.i v9, 0
1740; CHECK-RV32-NEXT:    li a0, 1
1741; CHECK-RV32-NEXT:    vwsubu.vx v10, v9, a0
1742; CHECK-RV32-NEXT:    li a0, 63
1743; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
1744; CHECK-RV32-NEXT:    vmv.v.x v9, a0
1745; CHECK-RV32-NEXT:    vand.vx v10, v10, a0
1746; CHECK-RV32-NEXT:    vand.vi v9, v9, 1
1747; CHECK-RV32-NEXT:    vsll.vv v10, v8, v10
1748; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v9
1749; CHECK-RV32-NEXT:    vor.vv v8, v8, v10
1750; CHECK-RV32-NEXT:    ret
1751;
1752; CHECK-RV64-LABEL: vror_vi_v2i64:
1753; CHECK-RV64:       # %bb.0:
1754; CHECK-RV64-NEXT:    li a0, 63
1755; CHECK-RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1756; CHECK-RV64-NEXT:    vsll.vx v9, v8, a0
1757; CHECK-RV64-NEXT:    vsrl.vi v8, v8, 1
1758; CHECK-RV64-NEXT:    vor.vv v8, v8, v9
1759; CHECK-RV64-NEXT:    ret
1760;
1761; CHECK-ZVKB-LABEL: vror_vi_v2i64:
1762; CHECK-ZVKB:       # %bb.0:
1763; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1764; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1765; CHECK-ZVKB-NEXT:    ret
1766  %x = call <2 x i64> @llvm.fshr.v2i64(<2 x i64> %a, <2 x i64> %a, <2 x i64> splat (i64 1))
1767  ret <2 x i64> %x
1768}
1769
1770define <2 x i64> @vror_vi_rotl_v2i64(<2 x i64> %a) {
1771; CHECK-RV32-LABEL: vror_vi_rotl_v2i64:
1772; CHECK-RV32:       # %bb.0:
1773; CHECK-RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
1774; CHECK-RV32-NEXT:    vmv.v.i v9, 0
1775; CHECK-RV32-NEXT:    li a0, 1
1776; CHECK-RV32-NEXT:    vwsubu.vx v10, v9, a0
1777; CHECK-RV32-NEXT:    li a0, 63
1778; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m1, ta, ma
1779; CHECK-RV32-NEXT:    vmv.v.x v9, a0
1780; CHECK-RV32-NEXT:    vand.vx v10, v10, a0
1781; CHECK-RV32-NEXT:    vand.vi v9, v9, 1
1782; CHECK-RV32-NEXT:    vsrl.vv v10, v8, v10
1783; CHECK-RV32-NEXT:    vsll.vv v8, v8, v9
1784; CHECK-RV32-NEXT:    vor.vv v8, v8, v10
1785; CHECK-RV32-NEXT:    ret
1786;
1787; CHECK-RV64-LABEL: vror_vi_rotl_v2i64:
1788; CHECK-RV64:       # %bb.0:
1789; CHECK-RV64-NEXT:    li a0, 63
1790; CHECK-RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1791; CHECK-RV64-NEXT:    vsrl.vx v9, v8, a0
1792; CHECK-RV64-NEXT:    vadd.vv v8, v8, v8
1793; CHECK-RV64-NEXT:    vor.vv v8, v8, v9
1794; CHECK-RV64-NEXT:    ret
1795;
1796; CHECK-ZVKB-LABEL: vror_vi_rotl_v2i64:
1797; CHECK-ZVKB:       # %bb.0:
1798; CHECK-ZVKB-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1799; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 63
1800; CHECK-ZVKB-NEXT:    ret
1801  %x = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %a, <2 x i64> %a, <2 x i64> splat (i64 1))
1802  ret <2 x i64> %x
1803}
1804
1805declare <4 x i64> @llvm.fshr.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
1806declare <4 x i64> @llvm.fshl.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
1807
1808define <4 x i64> @vror_vv_v4i64(<4 x i64> %a, <4 x i64> %b) {
1809; CHECK-LABEL: vror_vv_v4i64:
1810; CHECK:       # %bb.0:
1811; CHECK-NEXT:    li a0, 63
1812; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1813; CHECK-NEXT:    vrsub.vi v12, v10, 0
1814; CHECK-NEXT:    vand.vx v10, v10, a0
1815; CHECK-NEXT:    vand.vx v12, v12, a0
1816; CHECK-NEXT:    vsrl.vv v10, v8, v10
1817; CHECK-NEXT:    vsll.vv v8, v8, v12
1818; CHECK-NEXT:    vor.vv v8, v10, v8
1819; CHECK-NEXT:    ret
1820;
1821; CHECK-ZVKB-LABEL: vror_vv_v4i64:
1822; CHECK-ZVKB:       # %bb.0:
1823; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1824; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v10
1825; CHECK-ZVKB-NEXT:    ret
1826  %x = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %a, <4 x i64> %a, <4 x i64> %b)
1827  ret <4 x i64> %x
1828}
1829
1830define <4 x i64> @vror_vx_v4i64(<4 x i64> %a, i64 %b) {
1831; CHECK-RV32-LABEL: vror_vx_v4i64:
1832; CHECK-RV32:       # %bb.0:
1833; CHECK-RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1834; CHECK-RV32-NEXT:    vmv.v.x v10, a0
1835; CHECK-RV32-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
1836; CHECK-RV32-NEXT:    vmv.v.i v12, 0
1837; CHECK-RV32-NEXT:    vwsub.vx v14, v12, a0
1838; CHECK-RV32-NEXT:    li a0, 63
1839; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
1840; CHECK-RV32-NEXT:    vand.vx v10, v10, a0
1841; CHECK-RV32-NEXT:    vand.vx v12, v14, a0
1842; CHECK-RV32-NEXT:    vsll.vv v12, v8, v12
1843; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v10
1844; CHECK-RV32-NEXT:    vor.vv v8, v8, v12
1845; CHECK-RV32-NEXT:    ret
1846;
1847; CHECK-RV64-LABEL: vror_vx_v4i64:
1848; CHECK-RV64:       # %bb.0:
1849; CHECK-RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1850; CHECK-RV64-NEXT:    vmv.v.x v10, a0
1851; CHECK-RV64-NEXT:    li a0, 63
1852; CHECK-RV64-NEXT:    vand.vx v12, v10, a0
1853; CHECK-RV64-NEXT:    vrsub.vi v10, v10, 0
1854; CHECK-RV64-NEXT:    vsrl.vv v12, v8, v12
1855; CHECK-RV64-NEXT:    vand.vx v10, v10, a0
1856; CHECK-RV64-NEXT:    vsll.vv v8, v8, v10
1857; CHECK-RV64-NEXT:    vor.vv v8, v12, v8
1858; CHECK-RV64-NEXT:    ret
1859;
1860; CHECK-ZVKB-LABEL: vror_vx_v4i64:
1861; CHECK-ZVKB:       # %bb.0:
1862; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1863; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
1864; CHECK-ZVKB-NEXT:    ret
1865  %b.head = insertelement <4 x i64> poison, i64 %b, i32 0
1866  %b.splat = shufflevector <4 x i64> %b.head, <4 x i64> poison, <4 x i32> zeroinitializer
1867  %x = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %a, <4 x i64> %a, <4 x i64> %b.splat)
1868  ret <4 x i64> %x
1869}
1870
1871define <4 x i64> @vror_vi_v4i64(<4 x i64> %a) {
1872; CHECK-RV32-LABEL: vror_vi_v4i64:
1873; CHECK-RV32:       # %bb.0:
1874; CHECK-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1875; CHECK-RV32-NEXT:    vmv.v.i v10, 0
1876; CHECK-RV32-NEXT:    li a0, 1
1877; CHECK-RV32-NEXT:    vwsubu.vx v12, v10, a0
1878; CHECK-RV32-NEXT:    li a0, 63
1879; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
1880; CHECK-RV32-NEXT:    vmv.v.x v10, a0
1881; CHECK-RV32-NEXT:    vand.vx v12, v12, a0
1882; CHECK-RV32-NEXT:    vand.vi v10, v10, 1
1883; CHECK-RV32-NEXT:    vsll.vv v12, v8, v12
1884; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v10
1885; CHECK-RV32-NEXT:    vor.vv v8, v8, v12
1886; CHECK-RV32-NEXT:    ret
1887;
1888; CHECK-RV64-LABEL: vror_vi_v4i64:
1889; CHECK-RV64:       # %bb.0:
1890; CHECK-RV64-NEXT:    li a0, 63
1891; CHECK-RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1892; CHECK-RV64-NEXT:    vsll.vx v10, v8, a0
1893; CHECK-RV64-NEXT:    vsrl.vi v8, v8, 1
1894; CHECK-RV64-NEXT:    vor.vv v8, v8, v10
1895; CHECK-RV64-NEXT:    ret
1896;
1897; CHECK-ZVKB-LABEL: vror_vi_v4i64:
1898; CHECK-ZVKB:       # %bb.0:
1899; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1900; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
1901; CHECK-ZVKB-NEXT:    ret
1902  %x = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %a, <4 x i64> %a, <4 x i64> splat (i64 1))
1903  ret <4 x i64> %x
1904}
1905
1906define <4 x i64> @vror_vi_rotl_v4i64(<4 x i64> %a) {
1907; CHECK-RV32-LABEL: vror_vi_rotl_v4i64:
1908; CHECK-RV32:       # %bb.0:
1909; CHECK-RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
1910; CHECK-RV32-NEXT:    vmv.v.i v10, 0
1911; CHECK-RV32-NEXT:    li a0, 1
1912; CHECK-RV32-NEXT:    vwsubu.vx v12, v10, a0
1913; CHECK-RV32-NEXT:    li a0, 63
1914; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
1915; CHECK-RV32-NEXT:    vmv.v.x v10, a0
1916; CHECK-RV32-NEXT:    vand.vx v12, v12, a0
1917; CHECK-RV32-NEXT:    vand.vi v10, v10, 1
1918; CHECK-RV32-NEXT:    vsrl.vv v12, v8, v12
1919; CHECK-RV32-NEXT:    vsll.vv v8, v8, v10
1920; CHECK-RV32-NEXT:    vor.vv v8, v8, v12
1921; CHECK-RV32-NEXT:    ret
1922;
1923; CHECK-RV64-LABEL: vror_vi_rotl_v4i64:
1924; CHECK-RV64:       # %bb.0:
1925; CHECK-RV64-NEXT:    li a0, 63
1926; CHECK-RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1927; CHECK-RV64-NEXT:    vsrl.vx v10, v8, a0
1928; CHECK-RV64-NEXT:    vadd.vv v8, v8, v8
1929; CHECK-RV64-NEXT:    vor.vv v8, v8, v10
1930; CHECK-RV64-NEXT:    ret
1931;
1932; CHECK-ZVKB-LABEL: vror_vi_rotl_v4i64:
1933; CHECK-ZVKB:       # %bb.0:
1934; CHECK-ZVKB-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1935; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 63
1936; CHECK-ZVKB-NEXT:    ret
1937  %x = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %a, <4 x i64> %a, <4 x i64> splat (i64 1))
1938  ret <4 x i64> %x
1939}
1940
1941declare <8 x i64> @llvm.fshr.v8i64(<8 x i64>, <8 x i64>, <8 x i64>)
1942declare <8 x i64> @llvm.fshl.v8i64(<8 x i64>, <8 x i64>, <8 x i64>)
1943
1944define <8 x i64> @vror_vv_v8i64(<8 x i64> %a, <8 x i64> %b) {
1945; CHECK-LABEL: vror_vv_v8i64:
1946; CHECK:       # %bb.0:
1947; CHECK-NEXT:    li a0, 63
1948; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1949; CHECK-NEXT:    vrsub.vi v16, v12, 0
1950; CHECK-NEXT:    vand.vx v12, v12, a0
1951; CHECK-NEXT:    vand.vx v16, v16, a0
1952; CHECK-NEXT:    vsrl.vv v12, v8, v12
1953; CHECK-NEXT:    vsll.vv v8, v8, v16
1954; CHECK-NEXT:    vor.vv v8, v12, v8
1955; CHECK-NEXT:    ret
1956;
1957; CHECK-ZVKB-LABEL: vror_vv_v8i64:
1958; CHECK-ZVKB:       # %bb.0:
1959; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1960; CHECK-ZVKB-NEXT:    vror.vv v8, v8, v12
1961; CHECK-ZVKB-NEXT:    ret
1962  %x = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %a, <8 x i64> %a, <8 x i64> %b)
1963  ret <8 x i64> %x
1964}
1965
1966define <8 x i64> @vror_vx_v8i64(<8 x i64> %a, i64 %b) {
1967; CHECK-RV32-LABEL: vror_vx_v8i64:
1968; CHECK-RV32:       # %bb.0:
1969; CHECK-RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1970; CHECK-RV32-NEXT:    vmv.v.x v12, a0
1971; CHECK-RV32-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
1972; CHECK-RV32-NEXT:    vmv.v.i v16, 0
1973; CHECK-RV32-NEXT:    vwsub.vx v20, v16, a0
1974; CHECK-RV32-NEXT:    li a0, 63
1975; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
1976; CHECK-RV32-NEXT:    vand.vx v12, v12, a0
1977; CHECK-RV32-NEXT:    vand.vx v16, v20, a0
1978; CHECK-RV32-NEXT:    vsll.vv v16, v8, v16
1979; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v12
1980; CHECK-RV32-NEXT:    vor.vv v8, v8, v16
1981; CHECK-RV32-NEXT:    ret
1982;
1983; CHECK-RV64-LABEL: vror_vx_v8i64:
1984; CHECK-RV64:       # %bb.0:
1985; CHECK-RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1986; CHECK-RV64-NEXT:    vmv.v.x v12, a0
1987; CHECK-RV64-NEXT:    li a0, 63
1988; CHECK-RV64-NEXT:    vand.vx v16, v12, a0
1989; CHECK-RV64-NEXT:    vrsub.vi v12, v12, 0
1990; CHECK-RV64-NEXT:    vsrl.vv v16, v8, v16
1991; CHECK-RV64-NEXT:    vand.vx v12, v12, a0
1992; CHECK-RV64-NEXT:    vsll.vv v8, v8, v12
1993; CHECK-RV64-NEXT:    vor.vv v8, v16, v8
1994; CHECK-RV64-NEXT:    ret
1995;
1996; CHECK-ZVKB-LABEL: vror_vx_v8i64:
1997; CHECK-ZVKB:       # %bb.0:
1998; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1999; CHECK-ZVKB-NEXT:    vror.vx v8, v8, a0
2000; CHECK-ZVKB-NEXT:    ret
2001  %b.head = insertelement <8 x i64> poison, i64 %b, i32 0
2002  %b.splat = shufflevector <8 x i64> %b.head, <8 x i64> poison, <8 x i32> zeroinitializer
2003  %x = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %a, <8 x i64> %a, <8 x i64> %b.splat)
2004  ret <8 x i64> %x
2005}
2006
2007define <8 x i64> @vror_vi_v8i64(<8 x i64> %a) {
2008; CHECK-RV32-LABEL: vror_vi_v8i64:
2009; CHECK-RV32:       # %bb.0:
2010; CHECK-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
2011; CHECK-RV32-NEXT:    vmv.v.i v12, 0
2012; CHECK-RV32-NEXT:    li a0, 1
2013; CHECK-RV32-NEXT:    vwsubu.vx v16, v12, a0
2014; CHECK-RV32-NEXT:    li a0, 63
2015; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
2016; CHECK-RV32-NEXT:    vmv.v.x v12, a0
2017; CHECK-RV32-NEXT:    vand.vx v16, v16, a0
2018; CHECK-RV32-NEXT:    vand.vi v12, v12, 1
2019; CHECK-RV32-NEXT:    vsll.vv v16, v8, v16
2020; CHECK-RV32-NEXT:    vsrl.vv v8, v8, v12
2021; CHECK-RV32-NEXT:    vor.vv v8, v8, v16
2022; CHECK-RV32-NEXT:    ret
2023;
2024; CHECK-RV64-LABEL: vror_vi_v8i64:
2025; CHECK-RV64:       # %bb.0:
2026; CHECK-RV64-NEXT:    li a0, 63
2027; CHECK-RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
2028; CHECK-RV64-NEXT:    vsll.vx v12, v8, a0
2029; CHECK-RV64-NEXT:    vsrl.vi v8, v8, 1
2030; CHECK-RV64-NEXT:    vor.vv v8, v8, v12
2031; CHECK-RV64-NEXT:    ret
2032;
2033; CHECK-ZVKB-LABEL: vror_vi_v8i64:
2034; CHECK-ZVKB:       # %bb.0:
2035; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
2036; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 1
2037; CHECK-ZVKB-NEXT:    ret
2038  %x = call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %a, <8 x i64> %a, <8 x i64> splat (i64 1))
2039  ret <8 x i64> %x
2040}
2041
2042define <8 x i64> @vror_vi_rotl_v8i64(<8 x i64> %a) {
2043; CHECK-RV32-LABEL: vror_vi_rotl_v8i64:
2044; CHECK-RV32:       # %bb.0:
2045; CHECK-RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
2046; CHECK-RV32-NEXT:    vmv.v.i v12, 0
2047; CHECK-RV32-NEXT:    li a0, 1
2048; CHECK-RV32-NEXT:    vwsubu.vx v16, v12, a0
2049; CHECK-RV32-NEXT:    li a0, 63
2050; CHECK-RV32-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
2051; CHECK-RV32-NEXT:    vmv.v.x v12, a0
2052; CHECK-RV32-NEXT:    vand.vx v16, v16, a0
2053; CHECK-RV32-NEXT:    vand.vi v12, v12, 1
2054; CHECK-RV32-NEXT:    vsrl.vv v16, v8, v16
2055; CHECK-RV32-NEXT:    vsll.vv v8, v8, v12
2056; CHECK-RV32-NEXT:    vor.vv v8, v8, v16
2057; CHECK-RV32-NEXT:    ret
2058;
2059; CHECK-RV64-LABEL: vror_vi_rotl_v8i64:
2060; CHECK-RV64:       # %bb.0:
2061; CHECK-RV64-NEXT:    li a0, 63
2062; CHECK-RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
2063; CHECK-RV64-NEXT:    vsrl.vx v12, v8, a0
2064; CHECK-RV64-NEXT:    vadd.vv v8, v8, v8
2065; CHECK-RV64-NEXT:    vor.vv v8, v8, v12
2066; CHECK-RV64-NEXT:    ret
2067;
2068; CHECK-ZVKB-LABEL: vror_vi_rotl_v8i64:
2069; CHECK-ZVKB:       # %bb.0:
2070; CHECK-ZVKB-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
2071; CHECK-ZVKB-NEXT:    vror.vi v8, v8, 63
2072; CHECK-ZVKB-NEXT:    ret
2073  %x = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %a, <8 x i64> %a, <8 x i64> splat (i64 1))
2074  ret <8 x i64> %x
2075}
2076