1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
4
5define <vscale x 1 x i8> @vrem_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb) {
6; CHECK-LABEL: vrem_vv_nxv1i8:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
9; CHECK-NEXT:    vrem.vv v8, v8, v9
10; CHECK-NEXT:    ret
11  %vc = srem <vscale x 1 x i8> %va, %vb
12  ret <vscale x 1 x i8> %vc
13}
14
15define <vscale x 1 x i8> @vrem_vx_nxv1i8(<vscale x 1 x i8> %va, i8 signext %b) {
16; CHECK-LABEL: vrem_vx_nxv1i8:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
19; CHECK-NEXT:    vrem.vx v8, v8, a0
20; CHECK-NEXT:    ret
21  %head = insertelement <vscale x 1 x i8> undef, i8 %b, i32 0
22  %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> undef, <vscale x 1 x i32> zeroinitializer
23  %vc = srem <vscale x 1 x i8> %va, %splat
24  ret <vscale x 1 x i8> %vc
25}
26
27define <vscale x 1 x i8> @vrem_vi_nxv1i8_0(<vscale x 1 x i8> %va) {
28; CHECK-LABEL: vrem_vi_nxv1i8_0:
29; CHECK:       # %bb.0:
30; CHECK-NEXT:    addi a0, zero, 109
31; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, mu
32; CHECK-NEXT:    vmulh.vx v9, v8, a0
33; CHECK-NEXT:    vsub.vv v9, v9, v8
34; CHECK-NEXT:    vsra.vi v9, v9, 2
35; CHECK-NEXT:    vsrl.vi v10, v9, 7
36; CHECK-NEXT:    vadd.vv v9, v9, v10
37; CHECK-NEXT:    addi a0, zero, -7
38; CHECK-NEXT:    vnmsac.vx v8, a0, v9
39; CHECK-NEXT:    ret
40  %head = insertelement <vscale x 1 x i8> undef, i8 -7, i32 0
41  %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> undef, <vscale x 1 x i32> zeroinitializer
42  %vc = srem <vscale x 1 x i8> %va, %splat
43  ret <vscale x 1 x i8> %vc
44}
45
46define <vscale x 2 x i8> @vrem_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb) {
47; CHECK-LABEL: vrem_vv_nxv2i8:
48; CHECK:       # %bb.0:
49; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
50; CHECK-NEXT:    vrem.vv v8, v8, v9
51; CHECK-NEXT:    ret
52  %vc = srem <vscale x 2 x i8> %va, %vb
53  ret <vscale x 2 x i8> %vc
54}
55
56define <vscale x 2 x i8> @vrem_vx_nxv2i8(<vscale x 2 x i8> %va, i8 signext %b) {
57; CHECK-LABEL: vrem_vx_nxv2i8:
58; CHECK:       # %bb.0:
59; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
60; CHECK-NEXT:    vrem.vx v8, v8, a0
61; CHECK-NEXT:    ret
62  %head = insertelement <vscale x 2 x i8> undef, i8 %b, i32 0
63  %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> undef, <vscale x 2 x i32> zeroinitializer
64  %vc = srem <vscale x 2 x i8> %va, %splat
65  ret <vscale x 2 x i8> %vc
66}
67
68define <vscale x 2 x i8> @vrem_vi_nxv2i8_0(<vscale x 2 x i8> %va) {
69; CHECK-LABEL: vrem_vi_nxv2i8_0:
70; CHECK:       # %bb.0:
71; CHECK-NEXT:    addi a0, zero, 109
72; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
73; CHECK-NEXT:    vmulh.vx v9, v8, a0
74; CHECK-NEXT:    vsub.vv v9, v9, v8
75; CHECK-NEXT:    vsra.vi v9, v9, 2
76; CHECK-NEXT:    vsrl.vi v10, v9, 7
77; CHECK-NEXT:    vadd.vv v9, v9, v10
78; CHECK-NEXT:    addi a0, zero, -7
79; CHECK-NEXT:    vnmsac.vx v8, a0, v9
80; CHECK-NEXT:    ret
81  %head = insertelement <vscale x 2 x i8> undef, i8 -7, i32 0
82  %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> undef, <vscale x 2 x i32> zeroinitializer
83  %vc = srem <vscale x 2 x i8> %va, %splat
84  ret <vscale x 2 x i8> %vc
85}
86
87define <vscale x 4 x i8> @vrem_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb) {
88; CHECK-LABEL: vrem_vv_nxv4i8:
89; CHECK:       # %bb.0:
90; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
91; CHECK-NEXT:    vrem.vv v8, v8, v9
92; CHECK-NEXT:    ret
93  %vc = srem <vscale x 4 x i8> %va, %vb
94  ret <vscale x 4 x i8> %vc
95}
96
97define <vscale x 4 x i8> @vrem_vx_nxv4i8(<vscale x 4 x i8> %va, i8 signext %b) {
98; CHECK-LABEL: vrem_vx_nxv4i8:
99; CHECK:       # %bb.0:
100; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
101; CHECK-NEXT:    vrem.vx v8, v8, a0
102; CHECK-NEXT:    ret
103  %head = insertelement <vscale x 4 x i8> undef, i8 %b, i32 0
104  %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> undef, <vscale x 4 x i32> zeroinitializer
105  %vc = srem <vscale x 4 x i8> %va, %splat
106  ret <vscale x 4 x i8> %vc
107}
108
109define <vscale x 4 x i8> @vrem_vi_nxv4i8_0(<vscale x 4 x i8> %va) {
110; CHECK-LABEL: vrem_vi_nxv4i8_0:
111; CHECK:       # %bb.0:
112; CHECK-NEXT:    addi a0, zero, 109
113; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, mu
114; CHECK-NEXT:    vmulh.vx v9, v8, a0
115; CHECK-NEXT:    vsub.vv v9, v9, v8
116; CHECK-NEXT:    vsra.vi v9, v9, 2
117; CHECK-NEXT:    vsrl.vi v10, v9, 7
118; CHECK-NEXT:    vadd.vv v9, v9, v10
119; CHECK-NEXT:    addi a0, zero, -7
120; CHECK-NEXT:    vnmsac.vx v8, a0, v9
121; CHECK-NEXT:    ret
122  %head = insertelement <vscale x 4 x i8> undef, i8 -7, i32 0
123  %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> undef, <vscale x 4 x i32> zeroinitializer
124  %vc = srem <vscale x 4 x i8> %va, %splat
125  ret <vscale x 4 x i8> %vc
126}
127
128define <vscale x 8 x i8> @vrem_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb) {
129; CHECK-LABEL: vrem_vv_nxv8i8:
130; CHECK:       # %bb.0:
131; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
132; CHECK-NEXT:    vrem.vv v8, v8, v9
133; CHECK-NEXT:    ret
134  %vc = srem <vscale x 8 x i8> %va, %vb
135  ret <vscale x 8 x i8> %vc
136}
137
138define <vscale x 8 x i8> @vrem_vx_nxv8i8(<vscale x 8 x i8> %va, i8 signext %b) {
139; CHECK-LABEL: vrem_vx_nxv8i8:
140; CHECK:       # %bb.0:
141; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, mu
142; CHECK-NEXT:    vrem.vx v8, v8, a0
143; CHECK-NEXT:    ret
144  %head = insertelement <vscale x 8 x i8> undef, i8 %b, i32 0
145  %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> undef, <vscale x 8 x i32> zeroinitializer
146  %vc = srem <vscale x 8 x i8> %va, %splat
147  ret <vscale x 8 x i8> %vc
148}
149
150define <vscale x 8 x i8> @vrem_vi_nxv8i8_0(<vscale x 8 x i8> %va) {
151; CHECK-LABEL: vrem_vi_nxv8i8_0:
152; CHECK:       # %bb.0:
153; CHECK-NEXT:    addi a0, zero, 109
154; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, mu
155; CHECK-NEXT:    vmulh.vx v9, v8, a0
156; CHECK-NEXT:    vsub.vv v9, v9, v8
157; CHECK-NEXT:    vsra.vi v9, v9, 2
158; CHECK-NEXT:    vsrl.vi v10, v9, 7
159; CHECK-NEXT:    vadd.vv v9, v9, v10
160; CHECK-NEXT:    addi a0, zero, -7
161; CHECK-NEXT:    vnmsac.vx v8, a0, v9
162; CHECK-NEXT:    ret
163  %head = insertelement <vscale x 8 x i8> undef, i8 -7, i32 0
164  %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> undef, <vscale x 8 x i32> zeroinitializer
165  %vc = srem <vscale x 8 x i8> %va, %splat
166  ret <vscale x 8 x i8> %vc
167}
168
169define <vscale x 16 x i8> @vrem_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb) {
170; CHECK-LABEL: vrem_vv_nxv16i8:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
173; CHECK-NEXT:    vrem.vv v8, v8, v10
174; CHECK-NEXT:    ret
175  %vc = srem <vscale x 16 x i8> %va, %vb
176  ret <vscale x 16 x i8> %vc
177}
178
179define <vscale x 16 x i8> @vrem_vx_nxv16i8(<vscale x 16 x i8> %va, i8 signext %b) {
180; CHECK-LABEL: vrem_vx_nxv16i8:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, mu
183; CHECK-NEXT:    vrem.vx v8, v8, a0
184; CHECK-NEXT:    ret
185  %head = insertelement <vscale x 16 x i8> undef, i8 %b, i32 0
186  %splat = shufflevector <vscale x 16 x i8> %head, <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer
187  %vc = srem <vscale x 16 x i8> %va, %splat
188  ret <vscale x 16 x i8> %vc
189}
190
191define <vscale x 16 x i8> @vrem_vi_nxv16i8_0(<vscale x 16 x i8> %va) {
192; CHECK-LABEL: vrem_vi_nxv16i8_0:
193; CHECK:       # %bb.0:
194; CHECK-NEXT:    addi a0, zero, 109
195; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, mu
196; CHECK-NEXT:    vmulh.vx v10, v8, a0
197; CHECK-NEXT:    vsub.vv v10, v10, v8
198; CHECK-NEXT:    vsra.vi v10, v10, 2
199; CHECK-NEXT:    vsrl.vi v12, v10, 7
200; CHECK-NEXT:    vadd.vv v10, v10, v12
201; CHECK-NEXT:    addi a0, zero, -7
202; CHECK-NEXT:    vnmsac.vx v8, a0, v10
203; CHECK-NEXT:    ret
204  %head = insertelement <vscale x 16 x i8> undef, i8 -7, i32 0
205  %splat = shufflevector <vscale x 16 x i8> %head, <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer
206  %vc = srem <vscale x 16 x i8> %va, %splat
207  ret <vscale x 16 x i8> %vc
208}
209
210define <vscale x 32 x i8> @vrem_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb) {
211; CHECK-LABEL: vrem_vv_nxv32i8:
212; CHECK:       # %bb.0:
213; CHECK-NEXT:    vsetvli a0, zero, e8, m4, ta, mu
214; CHECK-NEXT:    vrem.vv v8, v8, v12
215; CHECK-NEXT:    ret
216  %vc = srem <vscale x 32 x i8> %va, %vb
217  ret <vscale x 32 x i8> %vc
218}
219
220define <vscale x 32 x i8> @vrem_vx_nxv32i8(<vscale x 32 x i8> %va, i8 signext %b) {
221; CHECK-LABEL: vrem_vx_nxv32i8:
222; CHECK:       # %bb.0:
223; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, mu
224; CHECK-NEXT:    vrem.vx v8, v8, a0
225; CHECK-NEXT:    ret
226  %head = insertelement <vscale x 32 x i8> undef, i8 %b, i32 0
227  %splat = shufflevector <vscale x 32 x i8> %head, <vscale x 32 x i8> undef, <vscale x 32 x i32> zeroinitializer
228  %vc = srem <vscale x 32 x i8> %va, %splat
229  ret <vscale x 32 x i8> %vc
230}
231
232define <vscale x 32 x i8> @vrem_vi_nxv32i8_0(<vscale x 32 x i8> %va) {
233; CHECK-LABEL: vrem_vi_nxv32i8_0:
234; CHECK:       # %bb.0:
235; CHECK-NEXT:    addi a0, zero, 109
236; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, mu
237; CHECK-NEXT:    vmulh.vx v12, v8, a0
238; CHECK-NEXT:    vsub.vv v12, v12, v8
239; CHECK-NEXT:    vsra.vi v12, v12, 2
240; CHECK-NEXT:    vsrl.vi v16, v12, 7
241; CHECK-NEXT:    vadd.vv v12, v12, v16
242; CHECK-NEXT:    addi a0, zero, -7
243; CHECK-NEXT:    vnmsac.vx v8, a0, v12
244; CHECK-NEXT:    ret
245  %head = insertelement <vscale x 32 x i8> undef, i8 -7, i32 0
246  %splat = shufflevector <vscale x 32 x i8> %head, <vscale x 32 x i8> undef, <vscale x 32 x i32> zeroinitializer
247  %vc = srem <vscale x 32 x i8> %va, %splat
248  ret <vscale x 32 x i8> %vc
249}
250
251define <vscale x 64 x i8> @vrem_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb) {
252; CHECK-LABEL: vrem_vv_nxv64i8:
253; CHECK:       # %bb.0:
254; CHECK-NEXT:    vsetvli a0, zero, e8, m8, ta, mu
255; CHECK-NEXT:    vrem.vv v8, v8, v16
256; CHECK-NEXT:    ret
257  %vc = srem <vscale x 64 x i8> %va, %vb
258  ret <vscale x 64 x i8> %vc
259}
260
261define <vscale x 64 x i8> @vrem_vx_nxv64i8(<vscale x 64 x i8> %va, i8 signext %b) {
262; CHECK-LABEL: vrem_vx_nxv64i8:
263; CHECK:       # %bb.0:
264; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, mu
265; CHECK-NEXT:    vrem.vx v8, v8, a0
266; CHECK-NEXT:    ret
267  %head = insertelement <vscale x 64 x i8> undef, i8 %b, i32 0
268  %splat = shufflevector <vscale x 64 x i8> %head, <vscale x 64 x i8> undef, <vscale x 64 x i32> zeroinitializer
269  %vc = srem <vscale x 64 x i8> %va, %splat
270  ret <vscale x 64 x i8> %vc
271}
272
273define <vscale x 64 x i8> @vrem_vi_nxv64i8_0(<vscale x 64 x i8> %va) {
274; CHECK-LABEL: vrem_vi_nxv64i8_0:
275; CHECK:       # %bb.0:
276; CHECK-NEXT:    addi a0, zero, 109
277; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, mu
278; CHECK-NEXT:    vmulh.vx v16, v8, a0
279; CHECK-NEXT:    vsub.vv v16, v16, v8
280; CHECK-NEXT:    vsra.vi v16, v16, 2
281; CHECK-NEXT:    vsrl.vi v24, v16, 7
282; CHECK-NEXT:    vadd.vv v16, v16, v24
283; CHECK-NEXT:    addi a0, zero, -7
284; CHECK-NEXT:    vnmsac.vx v8, a0, v16
285; CHECK-NEXT:    ret
286  %head = insertelement <vscale x 64 x i8> undef, i8 -7, i32 0
287  %splat = shufflevector <vscale x 64 x i8> %head, <vscale x 64 x i8> undef, <vscale x 64 x i32> zeroinitializer
288  %vc = srem <vscale x 64 x i8> %va, %splat
289  ret <vscale x 64 x i8> %vc
290}
291
292define <vscale x 1 x i16> @vrem_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb) {
293; CHECK-LABEL: vrem_vv_nxv1i16:
294; CHECK:       # %bb.0:
295; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, mu
296; CHECK-NEXT:    vrem.vv v8, v8, v9
297; CHECK-NEXT:    ret
298  %vc = srem <vscale x 1 x i16> %va, %vb
299  ret <vscale x 1 x i16> %vc
300}
301
302define <vscale x 1 x i16> @vrem_vx_nxv1i16(<vscale x 1 x i16> %va, i16 signext %b) {
303; CHECK-LABEL: vrem_vx_nxv1i16:
304; CHECK:       # %bb.0:
305; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
306; CHECK-NEXT:    vrem.vx v8, v8, a0
307; CHECK-NEXT:    ret
308  %head = insertelement <vscale x 1 x i16> undef, i16 %b, i32 0
309  %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> undef, <vscale x 1 x i32> zeroinitializer
310  %vc = srem <vscale x 1 x i16> %va, %splat
311  ret <vscale x 1 x i16> %vc
312}
313
314define <vscale x 1 x i16> @vrem_vi_nxv1i16_0(<vscale x 1 x i16> %va) {
315; RV32-LABEL: vrem_vi_nxv1i16_0:
316; RV32:       # %bb.0:
317; RV32-NEXT:    lui a0, 1048571
318; RV32-NEXT:    addi a0, a0, 1755
319; RV32-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
320; RV32-NEXT:    vmulh.vx v9, v8, a0
321; RV32-NEXT:    vsra.vi v9, v9, 1
322; RV32-NEXT:    vsrl.vi v10, v9, 15
323; RV32-NEXT:    vadd.vv v9, v9, v10
324; RV32-NEXT:    addi a0, zero, -7
325; RV32-NEXT:    vnmsac.vx v8, a0, v9
326; RV32-NEXT:    ret
327;
328; RV64-LABEL: vrem_vi_nxv1i16_0:
329; RV64:       # %bb.0:
330; RV64-NEXT:    lui a0, 1048571
331; RV64-NEXT:    addiw a0, a0, 1755
332; RV64-NEXT:    vsetvli a1, zero, e16, mf4, ta, mu
333; RV64-NEXT:    vmulh.vx v9, v8, a0
334; RV64-NEXT:    vsra.vi v9, v9, 1
335; RV64-NEXT:    vsrl.vi v10, v9, 15
336; RV64-NEXT:    vadd.vv v9, v9, v10
337; RV64-NEXT:    addi a0, zero, -7
338; RV64-NEXT:    vnmsac.vx v8, a0, v9
339; RV64-NEXT:    ret
340  %head = insertelement <vscale x 1 x i16> undef, i16 -7, i32 0
341  %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> undef, <vscale x 1 x i32> zeroinitializer
342  %vc = srem <vscale x 1 x i16> %va, %splat
343  ret <vscale x 1 x i16> %vc
344}
345
346define <vscale x 2 x i16> @vrem_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb) {
347; CHECK-LABEL: vrem_vv_nxv2i16:
348; CHECK:       # %bb.0:
349; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
350; CHECK-NEXT:    vrem.vv v8, v8, v9
351; CHECK-NEXT:    ret
352  %vc = srem <vscale x 2 x i16> %va, %vb
353  ret <vscale x 2 x i16> %vc
354}
355
356define <vscale x 2 x i16> @vrem_vx_nxv2i16(<vscale x 2 x i16> %va, i16 signext %b) {
357; CHECK-LABEL: vrem_vx_nxv2i16:
358; CHECK:       # %bb.0:
359; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
360; CHECK-NEXT:    vrem.vx v8, v8, a0
361; CHECK-NEXT:    ret
362  %head = insertelement <vscale x 2 x i16> undef, i16 %b, i32 0
363  %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> undef, <vscale x 2 x i32> zeroinitializer
364  %vc = srem <vscale x 2 x i16> %va, %splat
365  ret <vscale x 2 x i16> %vc
366}
367
368define <vscale x 2 x i16> @vrem_vi_nxv2i16_0(<vscale x 2 x i16> %va) {
369; RV32-LABEL: vrem_vi_nxv2i16_0:
370; RV32:       # %bb.0:
371; RV32-NEXT:    lui a0, 1048571
372; RV32-NEXT:    addi a0, a0, 1755
373; RV32-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
374; RV32-NEXT:    vmulh.vx v9, v8, a0
375; RV32-NEXT:    vsra.vi v9, v9, 1
376; RV32-NEXT:    vsrl.vi v10, v9, 15
377; RV32-NEXT:    vadd.vv v9, v9, v10
378; RV32-NEXT:    addi a0, zero, -7
379; RV32-NEXT:    vnmsac.vx v8, a0, v9
380; RV32-NEXT:    ret
381;
382; RV64-LABEL: vrem_vi_nxv2i16_0:
383; RV64:       # %bb.0:
384; RV64-NEXT:    lui a0, 1048571
385; RV64-NEXT:    addiw a0, a0, 1755
386; RV64-NEXT:    vsetvli a1, zero, e16, mf2, ta, mu
387; RV64-NEXT:    vmulh.vx v9, v8, a0
388; RV64-NEXT:    vsra.vi v9, v9, 1
389; RV64-NEXT:    vsrl.vi v10, v9, 15
390; RV64-NEXT:    vadd.vv v9, v9, v10
391; RV64-NEXT:    addi a0, zero, -7
392; RV64-NEXT:    vnmsac.vx v8, a0, v9
393; RV64-NEXT:    ret
394  %head = insertelement <vscale x 2 x i16> undef, i16 -7, i32 0
395  %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> undef, <vscale x 2 x i32> zeroinitializer
396  %vc = srem <vscale x 2 x i16> %va, %splat
397  ret <vscale x 2 x i16> %vc
398}
399
400define <vscale x 4 x i16> @vrem_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb) {
401; CHECK-LABEL: vrem_vv_nxv4i16:
402; CHECK:       # %bb.0:
403; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, mu
404; CHECK-NEXT:    vrem.vv v8, v8, v9
405; CHECK-NEXT:    ret
406  %vc = srem <vscale x 4 x i16> %va, %vb
407  ret <vscale x 4 x i16> %vc
408}
409
410define <vscale x 4 x i16> @vrem_vx_nxv4i16(<vscale x 4 x i16> %va, i16 signext %b) {
411; CHECK-LABEL: vrem_vx_nxv4i16:
412; CHECK:       # %bb.0:
413; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, mu
414; CHECK-NEXT:    vrem.vx v8, v8, a0
415; CHECK-NEXT:    ret
416  %head = insertelement <vscale x 4 x i16> undef, i16 %b, i32 0
417  %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> undef, <vscale x 4 x i32> zeroinitializer
418  %vc = srem <vscale x 4 x i16> %va, %splat
419  ret <vscale x 4 x i16> %vc
420}
421
422define <vscale x 4 x i16> @vrem_vi_nxv4i16_0(<vscale x 4 x i16> %va) {
423; RV32-LABEL: vrem_vi_nxv4i16_0:
424; RV32:       # %bb.0:
425; RV32-NEXT:    lui a0, 1048571
426; RV32-NEXT:    addi a0, a0, 1755
427; RV32-NEXT:    vsetvli a1, zero, e16, m1, ta, mu
428; RV32-NEXT:    vmulh.vx v9, v8, a0
429; RV32-NEXT:    vsra.vi v9, v9, 1
430; RV32-NEXT:    vsrl.vi v10, v9, 15
431; RV32-NEXT:    vadd.vv v9, v9, v10
432; RV32-NEXT:    addi a0, zero, -7
433; RV32-NEXT:    vnmsac.vx v8, a0, v9
434; RV32-NEXT:    ret
435;
436; RV64-LABEL: vrem_vi_nxv4i16_0:
437; RV64:       # %bb.0:
438; RV64-NEXT:    lui a0, 1048571
439; RV64-NEXT:    addiw a0, a0, 1755
440; RV64-NEXT:    vsetvli a1, zero, e16, m1, ta, mu
441; RV64-NEXT:    vmulh.vx v9, v8, a0
442; RV64-NEXT:    vsra.vi v9, v9, 1
443; RV64-NEXT:    vsrl.vi v10, v9, 15
444; RV64-NEXT:    vadd.vv v9, v9, v10
445; RV64-NEXT:    addi a0, zero, -7
446; RV64-NEXT:    vnmsac.vx v8, a0, v9
447; RV64-NEXT:    ret
448  %head = insertelement <vscale x 4 x i16> undef, i16 -7, i32 0
449  %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> undef, <vscale x 4 x i32> zeroinitializer
450  %vc = srem <vscale x 4 x i16> %va, %splat
451  ret <vscale x 4 x i16> %vc
452}
453
454define <vscale x 8 x i16> @vrem_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb) {
455; CHECK-LABEL: vrem_vv_nxv8i16:
456; CHECK:       # %bb.0:
457; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, mu
458; CHECK-NEXT:    vrem.vv v8, v8, v10
459; CHECK-NEXT:    ret
460  %vc = srem <vscale x 8 x i16> %va, %vb
461  ret <vscale x 8 x i16> %vc
462}
463
464define <vscale x 8 x i16> @vrem_vx_nxv8i16(<vscale x 8 x i16> %va, i16 signext %b) {
465; CHECK-LABEL: vrem_vx_nxv8i16:
466; CHECK:       # %bb.0:
467; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, mu
468; CHECK-NEXT:    vrem.vx v8, v8, a0
469; CHECK-NEXT:    ret
470  %head = insertelement <vscale x 8 x i16> undef, i16 %b, i32 0
471  %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> undef, <vscale x 8 x i32> zeroinitializer
472  %vc = srem <vscale x 8 x i16> %va, %splat
473  ret <vscale x 8 x i16> %vc
474}
475
476define <vscale x 8 x i16> @vrem_vi_nxv8i16_0(<vscale x 8 x i16> %va) {
477; RV32-LABEL: vrem_vi_nxv8i16_0:
478; RV32:       # %bb.0:
479; RV32-NEXT:    lui a0, 1048571
480; RV32-NEXT:    addi a0, a0, 1755
481; RV32-NEXT:    vsetvli a1, zero, e16, m2, ta, mu
482; RV32-NEXT:    vmulh.vx v10, v8, a0
483; RV32-NEXT:    vsra.vi v10, v10, 1
484; RV32-NEXT:    vsrl.vi v12, v10, 15
485; RV32-NEXT:    vadd.vv v10, v10, v12
486; RV32-NEXT:    addi a0, zero, -7
487; RV32-NEXT:    vnmsac.vx v8, a0, v10
488; RV32-NEXT:    ret
489;
490; RV64-LABEL: vrem_vi_nxv8i16_0:
491; RV64:       # %bb.0:
492; RV64-NEXT:    lui a0, 1048571
493; RV64-NEXT:    addiw a0, a0, 1755
494; RV64-NEXT:    vsetvli a1, zero, e16, m2, ta, mu
495; RV64-NEXT:    vmulh.vx v10, v8, a0
496; RV64-NEXT:    vsra.vi v10, v10, 1
497; RV64-NEXT:    vsrl.vi v12, v10, 15
498; RV64-NEXT:    vadd.vv v10, v10, v12
499; RV64-NEXT:    addi a0, zero, -7
500; RV64-NEXT:    vnmsac.vx v8, a0, v10
501; RV64-NEXT:    ret
502  %head = insertelement <vscale x 8 x i16> undef, i16 -7, i32 0
503  %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> undef, <vscale x 8 x i32> zeroinitializer
504  %vc = srem <vscale x 8 x i16> %va, %splat
505  ret <vscale x 8 x i16> %vc
506}
507
508define <vscale x 16 x i16> @vrem_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb) {
509; CHECK-LABEL: vrem_vv_nxv16i16:
510; CHECK:       # %bb.0:
511; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, mu
512; CHECK-NEXT:    vrem.vv v8, v8, v12
513; CHECK-NEXT:    ret
514  %vc = srem <vscale x 16 x i16> %va, %vb
515  ret <vscale x 16 x i16> %vc
516}
517
518define <vscale x 16 x i16> @vrem_vx_nxv16i16(<vscale x 16 x i16> %va, i16 signext %b) {
519; CHECK-LABEL: vrem_vx_nxv16i16:
520; CHECK:       # %bb.0:
521; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, mu
522; CHECK-NEXT:    vrem.vx v8, v8, a0
523; CHECK-NEXT:    ret
524  %head = insertelement <vscale x 16 x i16> undef, i16 %b, i32 0
525  %splat = shufflevector <vscale x 16 x i16> %head, <vscale x 16 x i16> undef, <vscale x 16 x i32> zeroinitializer
526  %vc = srem <vscale x 16 x i16> %va, %splat
527  ret <vscale x 16 x i16> %vc
528}
529
530define <vscale x 16 x i16> @vrem_vi_nxv16i16_0(<vscale x 16 x i16> %va) {
531; RV32-LABEL: vrem_vi_nxv16i16_0:
532; RV32:       # %bb.0:
533; RV32-NEXT:    lui a0, 1048571
534; RV32-NEXT:    addi a0, a0, 1755
535; RV32-NEXT:    vsetvli a1, zero, e16, m4, ta, mu
536; RV32-NEXT:    vmulh.vx v12, v8, a0
537; RV32-NEXT:    vsra.vi v12, v12, 1
538; RV32-NEXT:    vsrl.vi v16, v12, 15
539; RV32-NEXT:    vadd.vv v12, v12, v16
540; RV32-NEXT:    addi a0, zero, -7
541; RV32-NEXT:    vnmsac.vx v8, a0, v12
542; RV32-NEXT:    ret
543;
544; RV64-LABEL: vrem_vi_nxv16i16_0:
545; RV64:       # %bb.0:
546; RV64-NEXT:    lui a0, 1048571
547; RV64-NEXT:    addiw a0, a0, 1755
548; RV64-NEXT:    vsetvli a1, zero, e16, m4, ta, mu
549; RV64-NEXT:    vmulh.vx v12, v8, a0
550; RV64-NEXT:    vsra.vi v12, v12, 1
551; RV64-NEXT:    vsrl.vi v16, v12, 15
552; RV64-NEXT:    vadd.vv v12, v12, v16
553; RV64-NEXT:    addi a0, zero, -7
554; RV64-NEXT:    vnmsac.vx v8, a0, v12
555; RV64-NEXT:    ret
556  %head = insertelement <vscale x 16 x i16> undef, i16 -7, i32 0
557  %splat = shufflevector <vscale x 16 x i16> %head, <vscale x 16 x i16> undef, <vscale x 16 x i32> zeroinitializer
558  %vc = srem <vscale x 16 x i16> %va, %splat
559  ret <vscale x 16 x i16> %vc
560}
561
562define <vscale x 32 x i16> @vrem_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb) {
563; CHECK-LABEL: vrem_vv_nxv32i16:
564; CHECK:       # %bb.0:
565; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, mu
566; CHECK-NEXT:    vrem.vv v8, v8, v16
567; CHECK-NEXT:    ret
568  %vc = srem <vscale x 32 x i16> %va, %vb
569  ret <vscale x 32 x i16> %vc
570}
571
572define <vscale x 32 x i16> @vrem_vx_nxv32i16(<vscale x 32 x i16> %va, i16 signext %b) {
573; CHECK-LABEL: vrem_vx_nxv32i16:
574; CHECK:       # %bb.0:
575; CHECK-NEXT:    vsetvli a1, zero, e16, m8, ta, mu
576; CHECK-NEXT:    vrem.vx v8, v8, a0
577; CHECK-NEXT:    ret
578  %head = insertelement <vscale x 32 x i16> undef, i16 %b, i32 0
579  %splat = shufflevector <vscale x 32 x i16> %head, <vscale x 32 x i16> undef, <vscale x 32 x i32> zeroinitializer
580  %vc = srem <vscale x 32 x i16> %va, %splat
581  ret <vscale x 32 x i16> %vc
582}
583
584define <vscale x 32 x i16> @vrem_vi_nxv32i16_0(<vscale x 32 x i16> %va) {
585; RV32-LABEL: vrem_vi_nxv32i16_0:
586; RV32:       # %bb.0:
587; RV32-NEXT:    lui a0, 1048571
588; RV32-NEXT:    addi a0, a0, 1755
589; RV32-NEXT:    vsetvli a1, zero, e16, m8, ta, mu
590; RV32-NEXT:    vmulh.vx v16, v8, a0
591; RV32-NEXT:    vsra.vi v16, v16, 1
592; RV32-NEXT:    vsrl.vi v24, v16, 15
593; RV32-NEXT:    vadd.vv v16, v16, v24
594; RV32-NEXT:    addi a0, zero, -7
595; RV32-NEXT:    vnmsac.vx v8, a0, v16
596; RV32-NEXT:    ret
597;
598; RV64-LABEL: vrem_vi_nxv32i16_0:
599; RV64:       # %bb.0:
600; RV64-NEXT:    lui a0, 1048571
601; RV64-NEXT:    addiw a0, a0, 1755
602; RV64-NEXT:    vsetvli a1, zero, e16, m8, ta, mu
603; RV64-NEXT:    vmulh.vx v16, v8, a0
604; RV64-NEXT:    vsra.vi v16, v16, 1
605; RV64-NEXT:    vsrl.vi v24, v16, 15
606; RV64-NEXT:    vadd.vv v16, v16, v24
607; RV64-NEXT:    addi a0, zero, -7
608; RV64-NEXT:    vnmsac.vx v8, a0, v16
609; RV64-NEXT:    ret
610  %head = insertelement <vscale x 32 x i16> undef, i16 -7, i32 0
611  %splat = shufflevector <vscale x 32 x i16> %head, <vscale x 32 x i16> undef, <vscale x 32 x i32> zeroinitializer
612  %vc = srem <vscale x 32 x i16> %va, %splat
613  ret <vscale x 32 x i16> %vc
614}
615
616define <vscale x 1 x i32> @vrem_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb) {
617; CHECK-LABEL: vrem_vv_nxv1i32:
618; CHECK:       # %bb.0:
619; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, mu
620; CHECK-NEXT:    vrem.vv v8, v8, v9
621; CHECK-NEXT:    ret
622  %vc = srem <vscale x 1 x i32> %va, %vb
623  ret <vscale x 1 x i32> %vc
624}
625
626define <vscale x 1 x i32> @vrem_vx_nxv1i32(<vscale x 1 x i32> %va, i32 signext %b) {
627; CHECK-LABEL: vrem_vx_nxv1i32:
628; CHECK:       # %bb.0:
629; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
630; CHECK-NEXT:    vrem.vx v8, v8, a0
631; CHECK-NEXT:    ret
632  %head = insertelement <vscale x 1 x i32> undef, i32 %b, i32 0
633  %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> undef, <vscale x 1 x i32> zeroinitializer
634  %vc = srem <vscale x 1 x i32> %va, %splat
635  ret <vscale x 1 x i32> %vc
636}
637
638define <vscale x 1 x i32> @vrem_vi_nxv1i32_0(<vscale x 1 x i32> %va) {
639; RV32-LABEL: vrem_vi_nxv1i32_0:
640; RV32:       # %bb.0:
641; RV32-NEXT:    lui a0, 449390
642; RV32-NEXT:    addi a0, a0, -1171
643; RV32-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
644; RV32-NEXT:    vmulh.vx v9, v8, a0
645; RV32-NEXT:    vsub.vv v9, v9, v8
646; RV32-NEXT:    vsrl.vi v10, v9, 31
647; RV32-NEXT:    vsra.vi v9, v9, 2
648; RV32-NEXT:    vadd.vv v9, v9, v10
649; RV32-NEXT:    addi a0, zero, -7
650; RV32-NEXT:    vnmsac.vx v8, a0, v9
651; RV32-NEXT:    ret
652;
653; RV64-LABEL: vrem_vi_nxv1i32_0:
654; RV64:       # %bb.0:
655; RV64-NEXT:    lui a0, 449390
656; RV64-NEXT:    addiw a0, a0, -1171
657; RV64-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
658; RV64-NEXT:    vmulh.vx v9, v8, a0
659; RV64-NEXT:    vsub.vv v9, v9, v8
660; RV64-NEXT:    vsra.vi v9, v9, 2
661; RV64-NEXT:    vsrl.vi v10, v9, 31
662; RV64-NEXT:    vadd.vv v9, v9, v10
663; RV64-NEXT:    addi a0, zero, -7
664; RV64-NEXT:    vnmsac.vx v8, a0, v9
665; RV64-NEXT:    ret
666  %head = insertelement <vscale x 1 x i32> undef, i32 -7, i32 0
667  %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> undef, <vscale x 1 x i32> zeroinitializer
668  %vc = srem <vscale x 1 x i32> %va, %splat
669  ret <vscale x 1 x i32> %vc
670}
671
672define <vscale x 2 x i32> @vrem_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb) {
673; CHECK-LABEL: vrem_vv_nxv2i32:
674; CHECK:       # %bb.0:
675; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
676; CHECK-NEXT:    vrem.vv v8, v8, v9
677; CHECK-NEXT:    ret
678  %vc = srem <vscale x 2 x i32> %va, %vb
679  ret <vscale x 2 x i32> %vc
680}
681
682define <vscale x 2 x i32> @vrem_vx_nxv2i32(<vscale x 2 x i32> %va, i32 signext %b) {
683; CHECK-LABEL: vrem_vx_nxv2i32:
684; CHECK:       # %bb.0:
685; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
686; CHECK-NEXT:    vrem.vx v8, v8, a0
687; CHECK-NEXT:    ret
688  %head = insertelement <vscale x 2 x i32> undef, i32 %b, i32 0
689  %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer
690  %vc = srem <vscale x 2 x i32> %va, %splat
691  ret <vscale x 2 x i32> %vc
692}
693
694define <vscale x 2 x i32> @vrem_vi_nxv2i32_0(<vscale x 2 x i32> %va) {
695; RV32-LABEL: vrem_vi_nxv2i32_0:
696; RV32:       # %bb.0:
697; RV32-NEXT:    lui a0, 449390
698; RV32-NEXT:    addi a0, a0, -1171
699; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
700; RV32-NEXT:    vmulh.vx v9, v8, a0
701; RV32-NEXT:    vsub.vv v9, v9, v8
702; RV32-NEXT:    vsrl.vi v10, v9, 31
703; RV32-NEXT:    vsra.vi v9, v9, 2
704; RV32-NEXT:    vadd.vv v9, v9, v10
705; RV32-NEXT:    addi a0, zero, -7
706; RV32-NEXT:    vnmsac.vx v8, a0, v9
707; RV32-NEXT:    ret
708;
709; RV64-LABEL: vrem_vi_nxv2i32_0:
710; RV64:       # %bb.0:
711; RV64-NEXT:    lui a0, 449390
712; RV64-NEXT:    addiw a0, a0, -1171
713; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, mu
714; RV64-NEXT:    vmulh.vx v9, v8, a0
715; RV64-NEXT:    vsub.vv v9, v9, v8
716; RV64-NEXT:    vsra.vi v9, v9, 2
717; RV64-NEXT:    vsrl.vi v10, v9, 31
718; RV64-NEXT:    vadd.vv v9, v9, v10
719; RV64-NEXT:    addi a0, zero, -7
720; RV64-NEXT:    vnmsac.vx v8, a0, v9
721; RV64-NEXT:    ret
722  %head = insertelement <vscale x 2 x i32> undef, i32 -7, i32 0
723  %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer
724  %vc = srem <vscale x 2 x i32> %va, %splat
725  ret <vscale x 2 x i32> %vc
726}
727
728define <vscale x 4 x i32> @vrem_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb) {
729; CHECK-LABEL: vrem_vv_nxv4i32:
730; CHECK:       # %bb.0:
731; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, mu
732; CHECK-NEXT:    vrem.vv v8, v8, v10
733; CHECK-NEXT:    ret
734  %vc = srem <vscale x 4 x i32> %va, %vb
735  ret <vscale x 4 x i32> %vc
736}
737
738define <vscale x 4 x i32> @vrem_vx_nxv4i32(<vscale x 4 x i32> %va, i32 signext %b) {
739; CHECK-LABEL: vrem_vx_nxv4i32:
740; CHECK:       # %bb.0:
741; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
742; CHECK-NEXT:    vrem.vx v8, v8, a0
743; CHECK-NEXT:    ret
744  %head = insertelement <vscale x 4 x i32> undef, i32 %b, i32 0
745  %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
746  %vc = srem <vscale x 4 x i32> %va, %splat
747  ret <vscale x 4 x i32> %vc
748}
749
750define <vscale x 4 x i32> @vrem_vi_nxv4i32_0(<vscale x 4 x i32> %va) {
751; RV32-LABEL: vrem_vi_nxv4i32_0:
752; RV32:       # %bb.0:
753; RV32-NEXT:    lui a0, 449390
754; RV32-NEXT:    addi a0, a0, -1171
755; RV32-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
756; RV32-NEXT:    vmulh.vx v10, v8, a0
757; RV32-NEXT:    vsub.vv v10, v10, v8
758; RV32-NEXT:    vsrl.vi v12, v10, 31
759; RV32-NEXT:    vsra.vi v10, v10, 2
760; RV32-NEXT:    vadd.vv v10, v10, v12
761; RV32-NEXT:    addi a0, zero, -7
762; RV32-NEXT:    vnmsac.vx v8, a0, v10
763; RV32-NEXT:    ret
764;
765; RV64-LABEL: vrem_vi_nxv4i32_0:
766; RV64:       # %bb.0:
767; RV64-NEXT:    lui a0, 449390
768; RV64-NEXT:    addiw a0, a0, -1171
769; RV64-NEXT:    vsetvli a1, zero, e32, m2, ta, mu
770; RV64-NEXT:    vmulh.vx v10, v8, a0
771; RV64-NEXT:    vsub.vv v10, v10, v8
772; RV64-NEXT:    vsra.vi v10, v10, 2
773; RV64-NEXT:    vsrl.vi v12, v10, 31
774; RV64-NEXT:    vadd.vv v10, v10, v12
775; RV64-NEXT:    addi a0, zero, -7
776; RV64-NEXT:    vnmsac.vx v8, a0, v10
777; RV64-NEXT:    ret
778  %head = insertelement <vscale x 4 x i32> undef, i32 -7, i32 0
779  %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
780  %vc = srem <vscale x 4 x i32> %va, %splat
781  ret <vscale x 4 x i32> %vc
782}
783
784define <vscale x 8 x i32> @vrem_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb) {
785; CHECK-LABEL: vrem_vv_nxv8i32:
786; CHECK:       # %bb.0:
787; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, mu
788; CHECK-NEXT:    vrem.vv v8, v8, v12
789; CHECK-NEXT:    ret
790  %vc = srem <vscale x 8 x i32> %va, %vb
791  ret <vscale x 8 x i32> %vc
792}
793
794define <vscale x 8 x i32> @vrem_vx_nxv8i32(<vscale x 8 x i32> %va, i32 signext %b) {
795; CHECK-LABEL: vrem_vx_nxv8i32:
796; CHECK:       # %bb.0:
797; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
798; CHECK-NEXT:    vrem.vx v8, v8, a0
799; CHECK-NEXT:    ret
800  %head = insertelement <vscale x 8 x i32> undef, i32 %b, i32 0
801  %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> undef, <vscale x 8 x i32> zeroinitializer
802  %vc = srem <vscale x 8 x i32> %va, %splat
803  ret <vscale x 8 x i32> %vc
804}
805
806define <vscale x 8 x i32> @vrem_vi_nxv8i32_0(<vscale x 8 x i32> %va) {
807; RV32-LABEL: vrem_vi_nxv8i32_0:
808; RV32:       # %bb.0:
809; RV32-NEXT:    lui a0, 449390
810; RV32-NEXT:    addi a0, a0, -1171
811; RV32-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
812; RV32-NEXT:    vmulh.vx v12, v8, a0
813; RV32-NEXT:    vsub.vv v12, v12, v8
814; RV32-NEXT:    vsrl.vi v16, v12, 31
815; RV32-NEXT:    vsra.vi v12, v12, 2
816; RV32-NEXT:    vadd.vv v12, v12, v16
817; RV32-NEXT:    addi a0, zero, -7
818; RV32-NEXT:    vnmsac.vx v8, a0, v12
819; RV32-NEXT:    ret
820;
821; RV64-LABEL: vrem_vi_nxv8i32_0:
822; RV64:       # %bb.0:
823; RV64-NEXT:    lui a0, 449390
824; RV64-NEXT:    addiw a0, a0, -1171
825; RV64-NEXT:    vsetvli a1, zero, e32, m4, ta, mu
826; RV64-NEXT:    vmulh.vx v12, v8, a0
827; RV64-NEXT:    vsub.vv v12, v12, v8
828; RV64-NEXT:    vsra.vi v12, v12, 2
829; RV64-NEXT:    vsrl.vi v16, v12, 31
830; RV64-NEXT:    vadd.vv v12, v12, v16
831; RV64-NEXT:    addi a0, zero, -7
832; RV64-NEXT:    vnmsac.vx v8, a0, v12
833; RV64-NEXT:    ret
834  %head = insertelement <vscale x 8 x i32> undef, i32 -7, i32 0
835  %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> undef, <vscale x 8 x i32> zeroinitializer
836  %vc = srem <vscale x 8 x i32> %va, %splat
837  ret <vscale x 8 x i32> %vc
838}
839
840define <vscale x 16 x i32> @vrem_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb) {
841; CHECK-LABEL: vrem_vv_nxv16i32:
842; CHECK:       # %bb.0:
843; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, mu
844; CHECK-NEXT:    vrem.vv v8, v8, v16
845; CHECK-NEXT:    ret
846  %vc = srem <vscale x 16 x i32> %va, %vb
847  ret <vscale x 16 x i32> %vc
848}
849
850define <vscale x 16 x i32> @vrem_vx_nxv16i32(<vscale x 16 x i32> %va, i32 signext %b) {
851; CHECK-LABEL: vrem_vx_nxv16i32:
852; CHECK:       # %bb.0:
853; CHECK-NEXT:    vsetvli a1, zero, e32, m8, ta, mu
854; CHECK-NEXT:    vrem.vx v8, v8, a0
855; CHECK-NEXT:    ret
856  %head = insertelement <vscale x 16 x i32> undef, i32 %b, i32 0
857  %splat = shufflevector <vscale x 16 x i32> %head, <vscale x 16 x i32> undef, <vscale x 16 x i32> zeroinitializer
858  %vc = srem <vscale x 16 x i32> %va, %splat
859  ret <vscale x 16 x i32> %vc
860}
861
862define <vscale x 16 x i32> @vrem_vi_nxv16i32_0(<vscale x 16 x i32> %va) {
863; RV32-LABEL: vrem_vi_nxv16i32_0:
864; RV32:       # %bb.0:
865; RV32-NEXT:    lui a0, 449390
866; RV32-NEXT:    addi a0, a0, -1171
867; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, mu
868; RV32-NEXT:    vmulh.vx v16, v8, a0
869; RV32-NEXT:    vsub.vv v16, v16, v8
870; RV32-NEXT:    vsrl.vi v24, v16, 31
871; RV32-NEXT:    vsra.vi v16, v16, 2
872; RV32-NEXT:    vadd.vv v16, v16, v24
873; RV32-NEXT:    addi a0, zero, -7
874; RV32-NEXT:    vnmsac.vx v8, a0, v16
875; RV32-NEXT:    ret
876;
877; RV64-LABEL: vrem_vi_nxv16i32_0:
878; RV64:       # %bb.0:
879; RV64-NEXT:    lui a0, 449390
880; RV64-NEXT:    addiw a0, a0, -1171
881; RV64-NEXT:    vsetvli a1, zero, e32, m8, ta, mu
882; RV64-NEXT:    vmulh.vx v16, v8, a0
883; RV64-NEXT:    vsub.vv v16, v16, v8
884; RV64-NEXT:    vsra.vi v16, v16, 2
885; RV64-NEXT:    vsrl.vi v24, v16, 31
886; RV64-NEXT:    vadd.vv v16, v16, v24
887; RV64-NEXT:    addi a0, zero, -7
888; RV64-NEXT:    vnmsac.vx v8, a0, v16
889; RV64-NEXT:    ret
890  %head = insertelement <vscale x 16 x i32> undef, i32 -7, i32 0
891  %splat = shufflevector <vscale x 16 x i32> %head, <vscale x 16 x i32> undef, <vscale x 16 x i32> zeroinitializer
892  %vc = srem <vscale x 16 x i32> %va, %splat
893  ret <vscale x 16 x i32> %vc
894}
895
896define <vscale x 1 x i64> @vrem_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb) {
897; CHECK-LABEL: vrem_vv_nxv1i64:
898; CHECK:       # %bb.0:
899; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
900; CHECK-NEXT:    vrem.vv v8, v8, v9
901; CHECK-NEXT:    ret
902  %vc = srem <vscale x 1 x i64> %va, %vb
903  ret <vscale x 1 x i64> %vc
904}
905
906define <vscale x 1 x i64> @vrem_vx_nxv1i64(<vscale x 1 x i64> %va, i64 %b) {
907; RV32-LABEL: vrem_vx_nxv1i64:
908; RV32:       # %bb.0:
909; RV32-NEXT:    addi sp, sp, -16
910; RV32-NEXT:    .cfi_def_cfa_offset 16
911; RV32-NEXT:    sw a1, 12(sp)
912; RV32-NEXT:    sw a0, 8(sp)
913; RV32-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
914; RV32-NEXT:    addi a0, sp, 8
915; RV32-NEXT:    vlse64.v v9, (a0), zero
916; RV32-NEXT:    vrem.vv v8, v8, v9
917; RV32-NEXT:    addi sp, sp, 16
918; RV32-NEXT:    ret
919;
920; RV64-LABEL: vrem_vx_nxv1i64:
921; RV64:       # %bb.0:
922; RV64-NEXT:    vsetvli a1, zero, e64, m1, ta, mu
923; RV64-NEXT:    vrem.vx v8, v8, a0
924; RV64-NEXT:    ret
925  %head = insertelement <vscale x 1 x i64> undef, i64 %b, i32 0
926  %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> undef, <vscale x 1 x i32> zeroinitializer
927  %vc = srem <vscale x 1 x i64> %va, %splat
928  ret <vscale x 1 x i64> %vc
929}
930
931define <vscale x 1 x i64> @vrem_vi_nxv1i64_0(<vscale x 1 x i64> %va) {
932; RV32-LABEL: vrem_vi_nxv1i64_0:
933; RV32:       # %bb.0:
934; RV32-NEXT:    addi sp, sp, -16
935; RV32-NEXT:    .cfi_def_cfa_offset 16
936; RV32-NEXT:    lui a0, 748983
937; RV32-NEXT:    addi a0, a0, -586
938; RV32-NEXT:    sw a0, 12(sp)
939; RV32-NEXT:    lui a0, 898779
940; RV32-NEXT:    addi a0, a0, 1755
941; RV32-NEXT:    sw a0, 8(sp)
942; RV32-NEXT:    vsetvli a0, zero, e64, m1, ta, mu
943; RV32-NEXT:    addi a0, sp, 8
944; RV32-NEXT:    vlse64.v v9, (a0), zero
945; RV32-NEXT:    vmulh.vv v9, v8, v9
946; RV32-NEXT:    addi a0, zero, 63
947; RV32-NEXT:    vsrl.vx v10, v9, a0
948; RV32-NEXT:    vsra.vi v9, v9, 1
949; RV32-NEXT:    vadd.vv v9, v9, v10
950; RV32-NEXT:    addi a0, zero, -7
951; RV32-NEXT:    vnmsac.vx v8, a0, v9
952; RV32-NEXT:    addi sp, sp, 16
953; RV32-NEXT:    ret
954;
955; RV64-LABEL: vrem_vi_nxv1i64_0:
956; RV64:       # %bb.0:
957; RV64-NEXT:    lui a0, 1029851
958; RV64-NEXT:    addiw a0, a0, 1755
959; RV64-NEXT:    slli a0, a0, 12
960; RV64-NEXT:    addi a0, a0, 1755
961; RV64-NEXT:    slli a0, a0, 12
962; RV64-NEXT:    addi a0, a0, 1755
963; RV64-NEXT:    slli a0, a0, 12
964; RV64-NEXT:    addi a0, a0, 1755
965; RV64-NEXT:    vsetvli a1, zero, e64, m1, ta, mu
966; RV64-NEXT:    vmulh.vx v9, v8, a0
967; RV64-NEXT:    addi a0, zero, 63
968; RV64-NEXT:    vsrl.vx v10, v9, a0
969; RV64-NEXT:    vsra.vi v9, v9, 1
970; RV64-NEXT:    vadd.vv v9, v9, v10
971; RV64-NEXT:    addi a0, zero, -7
972; RV64-NEXT:    vnmsac.vx v8, a0, v9
973; RV64-NEXT:    ret
974  %head = insertelement <vscale x 1 x i64> undef, i64 -7, i32 0
975  %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> undef, <vscale x 1 x i32> zeroinitializer
976  %vc = srem <vscale x 1 x i64> %va, %splat
977  ret <vscale x 1 x i64> %vc
978}
979
980define <vscale x 2 x i64> @vrem_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb) {
981; CHECK-LABEL: vrem_vv_nxv2i64:
982; CHECK:       # %bb.0:
983; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
984; CHECK-NEXT:    vrem.vv v8, v8, v10
985; CHECK-NEXT:    ret
986  %vc = srem <vscale x 2 x i64> %va, %vb
987  ret <vscale x 2 x i64> %vc
988}
989
990define <vscale x 2 x i64> @vrem_vx_nxv2i64(<vscale x 2 x i64> %va, i64 %b) {
991; RV32-LABEL: vrem_vx_nxv2i64:
992; RV32:       # %bb.0:
993; RV32-NEXT:    addi sp, sp, -16
994; RV32-NEXT:    .cfi_def_cfa_offset 16
995; RV32-NEXT:    sw a1, 12(sp)
996; RV32-NEXT:    sw a0, 8(sp)
997; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
998; RV32-NEXT:    addi a0, sp, 8
999; RV32-NEXT:    vlse64.v v10, (a0), zero
1000; RV32-NEXT:    vrem.vv v8, v8, v10
1001; RV32-NEXT:    addi sp, sp, 16
1002; RV32-NEXT:    ret
1003;
1004; RV64-LABEL: vrem_vx_nxv2i64:
1005; RV64:       # %bb.0:
1006; RV64-NEXT:    vsetvli a1, zero, e64, m2, ta, mu
1007; RV64-NEXT:    vrem.vx v8, v8, a0
1008; RV64-NEXT:    ret
1009  %head = insertelement <vscale x 2 x i64> undef, i64 %b, i32 0
1010  %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer
1011  %vc = srem <vscale x 2 x i64> %va, %splat
1012  ret <vscale x 2 x i64> %vc
1013}
1014
1015define <vscale x 2 x i64> @vrem_vi_nxv2i64_0(<vscale x 2 x i64> %va) {
1016; RV32-LABEL: vrem_vi_nxv2i64_0:
1017; RV32:       # %bb.0:
1018; RV32-NEXT:    addi sp, sp, -16
1019; RV32-NEXT:    .cfi_def_cfa_offset 16
1020; RV32-NEXT:    lui a0, 748983
1021; RV32-NEXT:    addi a0, a0, -586
1022; RV32-NEXT:    sw a0, 12(sp)
1023; RV32-NEXT:    lui a0, 898779
1024; RV32-NEXT:    addi a0, a0, 1755
1025; RV32-NEXT:    sw a0, 8(sp)
1026; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
1027; RV32-NEXT:    addi a0, sp, 8
1028; RV32-NEXT:    vlse64.v v10, (a0), zero
1029; RV32-NEXT:    vmulh.vv v10, v8, v10
1030; RV32-NEXT:    addi a0, zero, 63
1031; RV32-NEXT:    vsrl.vx v12, v10, a0
1032; RV32-NEXT:    vsra.vi v10, v10, 1
1033; RV32-NEXT:    vadd.vv v10, v10, v12
1034; RV32-NEXT:    addi a0, zero, -7
1035; RV32-NEXT:    vnmsac.vx v8, a0, v10
1036; RV32-NEXT:    addi sp, sp, 16
1037; RV32-NEXT:    ret
1038;
1039; RV64-LABEL: vrem_vi_nxv2i64_0:
1040; RV64:       # %bb.0:
1041; RV64-NEXT:    lui a0, 1029851
1042; RV64-NEXT:    addiw a0, a0, 1755
1043; RV64-NEXT:    slli a0, a0, 12
1044; RV64-NEXT:    addi a0, a0, 1755
1045; RV64-NEXT:    slli a0, a0, 12
1046; RV64-NEXT:    addi a0, a0, 1755
1047; RV64-NEXT:    slli a0, a0, 12
1048; RV64-NEXT:    addi a0, a0, 1755
1049; RV64-NEXT:    vsetvli a1, zero, e64, m2, ta, mu
1050; RV64-NEXT:    vmulh.vx v10, v8, a0
1051; RV64-NEXT:    addi a0, zero, 63
1052; RV64-NEXT:    vsrl.vx v12, v10, a0
1053; RV64-NEXT:    vsra.vi v10, v10, 1
1054; RV64-NEXT:    vadd.vv v10, v10, v12
1055; RV64-NEXT:    addi a0, zero, -7
1056; RV64-NEXT:    vnmsac.vx v8, a0, v10
1057; RV64-NEXT:    ret
1058  %head = insertelement <vscale x 2 x i64> undef, i64 -7, i32 0
1059  %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer
1060  %vc = srem <vscale x 2 x i64> %va, %splat
1061  ret <vscale x 2 x i64> %vc
1062}
1063
1064define <vscale x 4 x i64> @vrem_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb) {
1065; CHECK-LABEL: vrem_vv_nxv4i64:
1066; CHECK:       # %bb.0:
1067; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1068; CHECK-NEXT:    vrem.vv v8, v8, v12
1069; CHECK-NEXT:    ret
1070  %vc = srem <vscale x 4 x i64> %va, %vb
1071  ret <vscale x 4 x i64> %vc
1072}
1073
1074define <vscale x 4 x i64> @vrem_vx_nxv4i64(<vscale x 4 x i64> %va, i64 %b) {
1075; RV32-LABEL: vrem_vx_nxv4i64:
1076; RV32:       # %bb.0:
1077; RV32-NEXT:    addi sp, sp, -16
1078; RV32-NEXT:    .cfi_def_cfa_offset 16
1079; RV32-NEXT:    sw a1, 12(sp)
1080; RV32-NEXT:    sw a0, 8(sp)
1081; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1082; RV32-NEXT:    addi a0, sp, 8
1083; RV32-NEXT:    vlse64.v v12, (a0), zero
1084; RV32-NEXT:    vrem.vv v8, v8, v12
1085; RV32-NEXT:    addi sp, sp, 16
1086; RV32-NEXT:    ret
1087;
1088; RV64-LABEL: vrem_vx_nxv4i64:
1089; RV64:       # %bb.0:
1090; RV64-NEXT:    vsetvli a1, zero, e64, m4, ta, mu
1091; RV64-NEXT:    vrem.vx v8, v8, a0
1092; RV64-NEXT:    ret
1093  %head = insertelement <vscale x 4 x i64> undef, i64 %b, i32 0
1094  %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> undef, <vscale x 4 x i32> zeroinitializer
1095  %vc = srem <vscale x 4 x i64> %va, %splat
1096  ret <vscale x 4 x i64> %vc
1097}
1098
1099define <vscale x 4 x i64> @vrem_vi_nxv4i64_0(<vscale x 4 x i64> %va) {
1100; RV32-LABEL: vrem_vi_nxv4i64_0:
1101; RV32:       # %bb.0:
1102; RV32-NEXT:    addi sp, sp, -16
1103; RV32-NEXT:    .cfi_def_cfa_offset 16
1104; RV32-NEXT:    lui a0, 748983
1105; RV32-NEXT:    addi a0, a0, -586
1106; RV32-NEXT:    sw a0, 12(sp)
1107; RV32-NEXT:    lui a0, 898779
1108; RV32-NEXT:    addi a0, a0, 1755
1109; RV32-NEXT:    sw a0, 8(sp)
1110; RV32-NEXT:    vsetvli a0, zero, e64, m4, ta, mu
1111; RV32-NEXT:    addi a0, sp, 8
1112; RV32-NEXT:    vlse64.v v12, (a0), zero
1113; RV32-NEXT:    vmulh.vv v12, v8, v12
1114; RV32-NEXT:    addi a0, zero, 63
1115; RV32-NEXT:    vsrl.vx v16, v12, a0
1116; RV32-NEXT:    vsra.vi v12, v12, 1
1117; RV32-NEXT:    vadd.vv v12, v12, v16
1118; RV32-NEXT:    addi a0, zero, -7
1119; RV32-NEXT:    vnmsac.vx v8, a0, v12
1120; RV32-NEXT:    addi sp, sp, 16
1121; RV32-NEXT:    ret
1122;
1123; RV64-LABEL: vrem_vi_nxv4i64_0:
1124; RV64:       # %bb.0:
1125; RV64-NEXT:    lui a0, 1029851
1126; RV64-NEXT:    addiw a0, a0, 1755
1127; RV64-NEXT:    slli a0, a0, 12
1128; RV64-NEXT:    addi a0, a0, 1755
1129; RV64-NEXT:    slli a0, a0, 12
1130; RV64-NEXT:    addi a0, a0, 1755
1131; RV64-NEXT:    slli a0, a0, 12
1132; RV64-NEXT:    addi a0, a0, 1755
1133; RV64-NEXT:    vsetvli a1, zero, e64, m4, ta, mu
1134; RV64-NEXT:    vmulh.vx v12, v8, a0
1135; RV64-NEXT:    addi a0, zero, 63
1136; RV64-NEXT:    vsrl.vx v16, v12, a0
1137; RV64-NEXT:    vsra.vi v12, v12, 1
1138; RV64-NEXT:    vadd.vv v12, v12, v16
1139; RV64-NEXT:    addi a0, zero, -7
1140; RV64-NEXT:    vnmsac.vx v8, a0, v12
1141; RV64-NEXT:    ret
1142  %head = insertelement <vscale x 4 x i64> undef, i64 -7, i32 0
1143  %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> undef, <vscale x 4 x i32> zeroinitializer
1144  %vc = srem <vscale x 4 x i64> %va, %splat
1145  ret <vscale x 4 x i64> %vc
1146}
1147
1148define <vscale x 8 x i64> @vrem_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb) {
1149; CHECK-LABEL: vrem_vv_nxv8i64:
1150; CHECK:       # %bb.0:
1151; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1152; CHECK-NEXT:    vrem.vv v8, v8, v16
1153; CHECK-NEXT:    ret
1154  %vc = srem <vscale x 8 x i64> %va, %vb
1155  ret <vscale x 8 x i64> %vc
1156}
1157
1158define <vscale x 8 x i64> @vrem_vx_nxv8i64(<vscale x 8 x i64> %va, i64 %b) {
1159; RV32-LABEL: vrem_vx_nxv8i64:
1160; RV32:       # %bb.0:
1161; RV32-NEXT:    addi sp, sp, -16
1162; RV32-NEXT:    .cfi_def_cfa_offset 16
1163; RV32-NEXT:    sw a1, 12(sp)
1164; RV32-NEXT:    sw a0, 8(sp)
1165; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1166; RV32-NEXT:    addi a0, sp, 8
1167; RV32-NEXT:    vlse64.v v16, (a0), zero
1168; RV32-NEXT:    vrem.vv v8, v8, v16
1169; RV32-NEXT:    addi sp, sp, 16
1170; RV32-NEXT:    ret
1171;
1172; RV64-LABEL: vrem_vx_nxv8i64:
1173; RV64:       # %bb.0:
1174; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, mu
1175; RV64-NEXT:    vrem.vx v8, v8, a0
1176; RV64-NEXT:    ret
1177  %head = insertelement <vscale x 8 x i64> undef, i64 %b, i32 0
1178  %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> undef, <vscale x 8 x i32> zeroinitializer
1179  %vc = srem <vscale x 8 x i64> %va, %splat
1180  ret <vscale x 8 x i64> %vc
1181}
1182
1183define <vscale x 8 x i64> @vrem_vi_nxv8i64_0(<vscale x 8 x i64> %va) {
1184; RV32-LABEL: vrem_vi_nxv8i64_0:
1185; RV32:       # %bb.0:
1186; RV32-NEXT:    addi sp, sp, -16
1187; RV32-NEXT:    .cfi_def_cfa_offset 16
1188; RV32-NEXT:    lui a0, 748983
1189; RV32-NEXT:    addi a0, a0, -586
1190; RV32-NEXT:    sw a0, 12(sp)
1191; RV32-NEXT:    lui a0, 898779
1192; RV32-NEXT:    addi a0, a0, 1755
1193; RV32-NEXT:    sw a0, 8(sp)
1194; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, mu
1195; RV32-NEXT:    addi a0, sp, 8
1196; RV32-NEXT:    vlse64.v v16, (a0), zero
1197; RV32-NEXT:    vmulh.vv v16, v8, v16
1198; RV32-NEXT:    addi a0, zero, 63
1199; RV32-NEXT:    vsrl.vx v24, v16, a0
1200; RV32-NEXT:    vsra.vi v16, v16, 1
1201; RV32-NEXT:    vadd.vv v16, v16, v24
1202; RV32-NEXT:    addi a0, zero, -7
1203; RV32-NEXT:    vnmsac.vx v8, a0, v16
1204; RV32-NEXT:    addi sp, sp, 16
1205; RV32-NEXT:    ret
1206;
1207; RV64-LABEL: vrem_vi_nxv8i64_0:
1208; RV64:       # %bb.0:
1209; RV64-NEXT:    lui a0, 1029851
1210; RV64-NEXT:    addiw a0, a0, 1755
1211; RV64-NEXT:    slli a0, a0, 12
1212; RV64-NEXT:    addi a0, a0, 1755
1213; RV64-NEXT:    slli a0, a0, 12
1214; RV64-NEXT:    addi a0, a0, 1755
1215; RV64-NEXT:    slli a0, a0, 12
1216; RV64-NEXT:    addi a0, a0, 1755
1217; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, mu
1218; RV64-NEXT:    vmulh.vx v16, v8, a0
1219; RV64-NEXT:    addi a0, zero, 63
1220; RV64-NEXT:    vsrl.vx v24, v16, a0
1221; RV64-NEXT:    vsra.vi v16, v16, 1
1222; RV64-NEXT:    vadd.vv v16, v16, v24
1223; RV64-NEXT:    addi a0, zero, -7
1224; RV64-NEXT:    vnmsac.vx v8, a0, v16
1225; RV64-NEXT:    ret
1226  %head = insertelement <vscale x 8 x i64> undef, i64 -7, i32 0
1227  %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> undef, <vscale x 8 x i32> zeroinitializer
1228  %vc = srem <vscale x 8 x i64> %va, %splat
1229  ret <vscale x 8 x i64> %vc
1230}
1231
1232