Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vssub-vp.ll
blobb82ca70477ba36499443f78237edce407881091e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s --check-prefixes=CHECK,RV32
4 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s --check-prefixes=CHECK,RV64
7 declare <8 x i7> @llvm.vp.ssub.sat.v8i7(<8 x i7>, <8 x i7>, <8 x i1>, i32)
9 define <8 x i7> @vssub_vv_v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 zeroext %evl) {
10 ; CHECK-LABEL: vssub_vv_v8i7:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
13 ; CHECK-NEXT:    vadd.vv v9, v9, v9
14 ; CHECK-NEXT:    vsra.vi v9, v9, 1
15 ; CHECK-NEXT:    vadd.vv v8, v8, v8
16 ; CHECK-NEXT:    vsra.vi v8, v8, 1
17 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
18 ; CHECK-NEXT:    vsub.vv v8, v8, v9, v0.t
19 ; CHECK-NEXT:    li a0, 63
20 ; CHECK-NEXT:    vmin.vx v8, v8, a0, v0.t
21 ; CHECK-NEXT:    li a0, 192
22 ; CHECK-NEXT:    vmax.vx v8, v8, a0, v0.t
23 ; CHECK-NEXT:    ret
24   %v = call <8 x i7> @llvm.vp.ssub.sat.v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 %evl)
25   ret <8 x i7> %v
28 declare <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32)
30 define <2 x i8> @vssub_vv_v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 zeroext %evl) {
31 ; CHECK-LABEL: vssub_vv_v2i8:
32 ; CHECK:       # %bb.0:
33 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
34 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
35 ; CHECK-NEXT:    ret
36   %v = call <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 %evl)
37   ret <2 x i8> %v
40 define <2 x i8> @vssub_vv_v2i8_unmasked(<2 x i8> %va, <2 x i8> %b, i32 zeroext %evl) {
41 ; CHECK-LABEL: vssub_vv_v2i8_unmasked:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
44 ; CHECK-NEXT:    vssub.vv v8, v8, v9
45 ; CHECK-NEXT:    ret
46   %v = call <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> splat (i1 true), i32 %evl)
47   ret <2 x i8> %v
50 define <2 x i8> @vssub_vx_v2i8(<2 x i8> %va, i8 %b, <2 x i1> %m, i32 zeroext %evl) {
51 ; CHECK-LABEL: vssub_vx_v2i8:
52 ; CHECK:       # %bb.0:
53 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
54 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
55 ; CHECK-NEXT:    ret
56   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
57   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
58   %v = call <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 %evl)
59   ret <2 x i8> %v
62 define <2 x i8> @vssub_vx_v2i8_unmasked(<2 x i8> %va, i8 %b, i32 zeroext %evl) {
63 ; CHECK-LABEL: vssub_vx_v2i8_unmasked:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
66 ; CHECK-NEXT:    vssub.vx v8, v8, a0
67 ; CHECK-NEXT:    ret
68   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
69   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
70   %v = call <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> splat (i1 true), i32 %evl)
71   ret <2 x i8> %v
74 define <2 x i8> @vssub_vi_v2i8(<2 x i8> %va, <2 x i1> %m, i32 zeroext %evl) {
75 ; CHECK-LABEL: vssub_vi_v2i8:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    li a1, -1
78 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
79 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
80 ; CHECK-NEXT:    ret
81   %v = call <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> %m, i32 %evl)
82   ret <2 x i8> %v
85 define <2 x i8> @vssub_vi_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
86 ; CHECK-LABEL: vssub_vi_v2i8_unmasked:
87 ; CHECK:       # %bb.0:
88 ; CHECK-NEXT:    li a1, -1
89 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
90 ; CHECK-NEXT:    vssub.vx v8, v8, a1
91 ; CHECK-NEXT:    ret
92   %v = call <2 x i8> @llvm.vp.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> splat (i1 true), i32 %evl)
93   ret <2 x i8> %v
96 declare <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32)
98 define <4 x i8> @vssub_vv_v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 zeroext %evl) {
99 ; CHECK-LABEL: vssub_vv_v4i8:
100 ; CHECK:       # %bb.0:
101 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
102 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
103 ; CHECK-NEXT:    ret
104   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 %evl)
105   ret <4 x i8> %v
108 define <4 x i8> @vssub_vv_v4i8_unmasked(<4 x i8> %va, <4 x i8> %b, i32 zeroext %evl) {
109 ; CHECK-LABEL: vssub_vv_v4i8_unmasked:
110 ; CHECK:       # %bb.0:
111 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
112 ; CHECK-NEXT:    vssub.vv v8, v8, v9
113 ; CHECK-NEXT:    ret
114   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> splat (i1 true), i32 %evl)
115   ret <4 x i8> %v
118 define <4 x i8> @vssub_vx_v4i8(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) {
119 ; CHECK-LABEL: vssub_vx_v4i8:
120 ; CHECK:       # %bb.0:
121 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
122 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
123 ; CHECK-NEXT:    ret
124   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
125   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
126   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 %evl)
127   ret <4 x i8> %v
130 define <4 x i8> @vssub_vx_v4i8_commute(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) {
131 ; CHECK-LABEL: vssub_vx_v4i8_commute:
132 ; CHECK:       # %bb.0:
133 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
134 ; CHECK-NEXT:    vmv.v.x v9, a0
135 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
136 ; CHECK-NEXT:    vssub.vv v8, v9, v8, v0.t
137 ; CHECK-NEXT:    ret
138   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
139   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
140   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %vb, <4 x i8> %va, <4 x i1> %m, i32 %evl)
141   ret <4 x i8> %v
144 define <4 x i8> @vssub_vx_v4i8_unmasked(<4 x i8> %va, i8 %b, i32 zeroext %evl) {
145 ; CHECK-LABEL: vssub_vx_v4i8_unmasked:
146 ; CHECK:       # %bb.0:
147 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
148 ; CHECK-NEXT:    vssub.vx v8, v8, a0
149 ; CHECK-NEXT:    ret
150   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
151   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
152   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> splat (i1 true), i32 %evl)
153   ret <4 x i8> %v
156 define <4 x i8> @vssub_vi_v4i8(<4 x i8> %va, <4 x i1> %m, i32 zeroext %evl) {
157 ; CHECK-LABEL: vssub_vi_v4i8:
158 ; CHECK:       # %bb.0:
159 ; CHECK-NEXT:    li a1, -1
160 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
161 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
162 ; CHECK-NEXT:    ret
163   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> %m, i32 %evl)
164   ret <4 x i8> %v
167 define <4 x i8> @vssub_vi_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
168 ; CHECK-LABEL: vssub_vi_v4i8_unmasked:
169 ; CHECK:       # %bb.0:
170 ; CHECK-NEXT:    li a1, -1
171 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
172 ; CHECK-NEXT:    vssub.vx v8, v8, a1
173 ; CHECK-NEXT:    ret
174   %v = call <4 x i8> @llvm.vp.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> splat (i1 true), i32 %evl)
175   ret <4 x i8> %v
178 declare <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8>, <5 x i8>, <5 x i1>, i32)
180 define <5 x i8> @vssub_vv_v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 zeroext %evl) {
181 ; CHECK-LABEL: vssub_vv_v5i8:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
184 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
185 ; CHECK-NEXT:    ret
186   %v = call <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 %evl)
187   ret <5 x i8> %v
190 define <5 x i8> @vssub_vv_v5i8_unmasked(<5 x i8> %va, <5 x i8> %b, i32 zeroext %evl) {
191 ; CHECK-LABEL: vssub_vv_v5i8_unmasked:
192 ; CHECK:       # %bb.0:
193 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
194 ; CHECK-NEXT:    vssub.vv v8, v8, v9
195 ; CHECK-NEXT:    ret
196   %v = call <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> splat (i1 true), i32 %evl)
197   ret <5 x i8> %v
200 define <5 x i8> @vssub_vx_v5i8(<5 x i8> %va, i8 %b, <5 x i1> %m, i32 zeroext %evl) {
201 ; CHECK-LABEL: vssub_vx_v5i8:
202 ; CHECK:       # %bb.0:
203 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
204 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
205 ; CHECK-NEXT:    ret
206   %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0
207   %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer
208   %v = call <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> %m, i32 %evl)
209   ret <5 x i8> %v
212 define <5 x i8> @vssub_vx_v5i8_unmasked(<5 x i8> %va, i8 %b, i32 zeroext %evl) {
213 ; CHECK-LABEL: vssub_vx_v5i8_unmasked:
214 ; CHECK:       # %bb.0:
215 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
216 ; CHECK-NEXT:    vssub.vx v8, v8, a0
217 ; CHECK-NEXT:    ret
218   %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0
219   %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer
220   %v = call <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> splat (i1 true), i32 %evl)
221   ret <5 x i8> %v
224 define <5 x i8> @vssub_vi_v5i8(<5 x i8> %va, <5 x i1> %m, i32 zeroext %evl) {
225 ; CHECK-LABEL: vssub_vi_v5i8:
226 ; CHECK:       # %bb.0:
227 ; CHECK-NEXT:    li a1, -1
228 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
229 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
230 ; CHECK-NEXT:    ret
231   %v = call <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> %m, i32 %evl)
232   ret <5 x i8> %v
235 define <5 x i8> @vssub_vi_v5i8_unmasked(<5 x i8> %va, i32 zeroext %evl) {
236 ; CHECK-LABEL: vssub_vi_v5i8_unmasked:
237 ; CHECK:       # %bb.0:
238 ; CHECK-NEXT:    li a1, -1
239 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
240 ; CHECK-NEXT:    vssub.vx v8, v8, a1
241 ; CHECK-NEXT:    ret
242   %v = call <5 x i8> @llvm.vp.ssub.sat.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> splat (i1 true), i32 %evl)
243   ret <5 x i8> %v
246 declare <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32)
248 define <8 x i8> @vssub_vv_v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 zeroext %evl) {
249 ; CHECK-LABEL: vssub_vv_v8i8:
250 ; CHECK:       # %bb.0:
251 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
252 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
253 ; CHECK-NEXT:    ret
254   %v = call <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 %evl)
255   ret <8 x i8> %v
258 define <8 x i8> @vssub_vv_v8i8_unmasked(<8 x i8> %va, <8 x i8> %b, i32 zeroext %evl) {
259 ; CHECK-LABEL: vssub_vv_v8i8_unmasked:
260 ; CHECK:       # %bb.0:
261 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
262 ; CHECK-NEXT:    vssub.vv v8, v8, v9
263 ; CHECK-NEXT:    ret
264   %v = call <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> splat (i1 true), i32 %evl)
265   ret <8 x i8> %v
268 define <8 x i8> @vssub_vx_v8i8(<8 x i8> %va, i8 %b, <8 x i1> %m, i32 zeroext %evl) {
269 ; CHECK-LABEL: vssub_vx_v8i8:
270 ; CHECK:       # %bb.0:
271 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
272 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
273 ; CHECK-NEXT:    ret
274   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
275   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
276   %v = call <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 %evl)
277   ret <8 x i8> %v
280 define <8 x i8> @vssub_vx_v8i8_unmasked(<8 x i8> %va, i8 %b, i32 zeroext %evl) {
281 ; CHECK-LABEL: vssub_vx_v8i8_unmasked:
282 ; CHECK:       # %bb.0:
283 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
284 ; CHECK-NEXT:    vssub.vx v8, v8, a0
285 ; CHECK-NEXT:    ret
286   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
287   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
288   %v = call <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> splat (i1 true), i32 %evl)
289   ret <8 x i8> %v
292 define <8 x i8> @vssub_vi_v8i8(<8 x i8> %va, <8 x i1> %m, i32 zeroext %evl) {
293 ; CHECK-LABEL: vssub_vi_v8i8:
294 ; CHECK:       # %bb.0:
295 ; CHECK-NEXT:    li a1, -1
296 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
297 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
298 ; CHECK-NEXT:    ret
299   %v = call <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> %m, i32 %evl)
300   ret <8 x i8> %v
303 define <8 x i8> @vssub_vi_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
304 ; CHECK-LABEL: vssub_vi_v8i8_unmasked:
305 ; CHECK:       # %bb.0:
306 ; CHECK-NEXT:    li a1, -1
307 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
308 ; CHECK-NEXT:    vssub.vx v8, v8, a1
309 ; CHECK-NEXT:    ret
310   %v = call <8 x i8> @llvm.vp.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> splat (i1 true), i32 %evl)
311   ret <8 x i8> %v
314 declare <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8>, <16 x i8>, <16 x i1>, i32)
316 define <16 x i8> @vssub_vv_v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 zeroext %evl) {
317 ; CHECK-LABEL: vssub_vv_v16i8:
318 ; CHECK:       # %bb.0:
319 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
320 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
321 ; CHECK-NEXT:    ret
322   %v = call <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 %evl)
323   ret <16 x i8> %v
326 define <16 x i8> @vssub_vv_v16i8_unmasked(<16 x i8> %va, <16 x i8> %b, i32 zeroext %evl) {
327 ; CHECK-LABEL: vssub_vv_v16i8_unmasked:
328 ; CHECK:       # %bb.0:
329 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
330 ; CHECK-NEXT:    vssub.vv v8, v8, v9
331 ; CHECK-NEXT:    ret
332   %v = call <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> splat (i1 true), i32 %evl)
333   ret <16 x i8> %v
336 define <16 x i8> @vssub_vx_v16i8(<16 x i8> %va, i8 %b, <16 x i1> %m, i32 zeroext %evl) {
337 ; CHECK-LABEL: vssub_vx_v16i8:
338 ; CHECK:       # %bb.0:
339 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
340 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
341 ; CHECK-NEXT:    ret
342   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
343   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
344   %v = call <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 %evl)
345   ret <16 x i8> %v
348 define <16 x i8> @vssub_vx_v16i8_unmasked(<16 x i8> %va, i8 %b, i32 zeroext %evl) {
349 ; CHECK-LABEL: vssub_vx_v16i8_unmasked:
350 ; CHECK:       # %bb.0:
351 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
352 ; CHECK-NEXT:    vssub.vx v8, v8, a0
353 ; CHECK-NEXT:    ret
354   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
355   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
356   %v = call <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> splat (i1 true), i32 %evl)
357   ret <16 x i8> %v
360 define <16 x i8> @vssub_vi_v16i8(<16 x i8> %va, <16 x i1> %m, i32 zeroext %evl) {
361 ; CHECK-LABEL: vssub_vi_v16i8:
362 ; CHECK:       # %bb.0:
363 ; CHECK-NEXT:    li a1, -1
364 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
365 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
366 ; CHECK-NEXT:    ret
367   %v = call <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> %m, i32 %evl)
368   ret <16 x i8> %v
371 define <16 x i8> @vssub_vi_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
372 ; CHECK-LABEL: vssub_vi_v16i8_unmasked:
373 ; CHECK:       # %bb.0:
374 ; CHECK-NEXT:    li a1, -1
375 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
376 ; CHECK-NEXT:    vssub.vx v8, v8, a1
377 ; CHECK-NEXT:    ret
378   %v = call <16 x i8> @llvm.vp.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> splat (i1 true), i32 %evl)
379   ret <16 x i8> %v
382 declare <256 x i8> @llvm.vp.ssub.sat.v258i8(<256 x i8>, <256 x i8>, <256 x i1>, i32)
384 define <256 x i8> @vssub_vi_v258i8(<256 x i8> %va, <256 x i1> %m, i32 zeroext %evl) {
385 ; CHECK-LABEL: vssub_vi_v258i8:
386 ; CHECK:       # %bb.0:
387 ; CHECK-NEXT:    vmv1r.v v24, v0
388 ; CHECK-NEXT:    li a2, 128
389 ; CHECK-NEXT:    vsetvli zero, a2, e8, m8, ta, ma
390 ; CHECK-NEXT:    vlm.v v0, (a0)
391 ; CHECK-NEXT:    addi a0, a1, -128
392 ; CHECK-NEXT:    sltu a3, a1, a0
393 ; CHECK-NEXT:    addi a3, a3, -1
394 ; CHECK-NEXT:    and a3, a3, a0
395 ; CHECK-NEXT:    li a0, -1
396 ; CHECK-NEXT:    vsetvli zero, a3, e8, m8, ta, ma
397 ; CHECK-NEXT:    vssub.vx v16, v16, a0, v0.t
398 ; CHECK-NEXT:    bltu a1, a2, .LBB32_2
399 ; CHECK-NEXT:  # %bb.1:
400 ; CHECK-NEXT:    li a1, 128
401 ; CHECK-NEXT:  .LBB32_2:
402 ; CHECK-NEXT:    vmv1r.v v0, v24
403 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
404 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
405 ; CHECK-NEXT:    ret
406   %v = call <256 x i8> @llvm.vp.ssub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 %evl)
407   ret <256 x i8> %v
410 define <256 x i8> @vssub_vi_v258i8_unmasked(<256 x i8> %va, i32 zeroext %evl) {
411 ; CHECK-LABEL: vssub_vi_v258i8_unmasked:
412 ; CHECK:       # %bb.0:
413 ; CHECK-NEXT:    li a2, 128
414 ; CHECK-NEXT:    mv a1, a0
415 ; CHECK-NEXT:    bltu a0, a2, .LBB33_2
416 ; CHECK-NEXT:  # %bb.1:
417 ; CHECK-NEXT:    li a1, 128
418 ; CHECK-NEXT:  .LBB33_2:
419 ; CHECK-NEXT:    li a2, -1
420 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
421 ; CHECK-NEXT:    vssub.vx v8, v8, a2
422 ; CHECK-NEXT:    addi a1, a0, -128
423 ; CHECK-NEXT:    sltu a0, a0, a1
424 ; CHECK-NEXT:    addi a0, a0, -1
425 ; CHECK-NEXT:    and a0, a0, a1
426 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
427 ; CHECK-NEXT:    vssub.vx v16, v16, a2
428 ; CHECK-NEXT:    ret
429   %v = call <256 x i8> @llvm.vp.ssub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> splat (i1 true), i32 %evl)
430   ret <256 x i8> %v
433 ; Test splitting when the %evl is a known constant.
435 define <256 x i8> @vssub_vi_v258i8_evl129(<256 x i8> %va, <256 x i1> %m) {
436 ; CHECK-LABEL: vssub_vi_v258i8_evl129:
437 ; CHECK:       # %bb.0:
438 ; CHECK-NEXT:    li a1, 128
439 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
440 ; CHECK-NEXT:    vlm.v v24, (a0)
441 ; CHECK-NEXT:    li a0, -1
442 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
443 ; CHECK-NEXT:    vmv1r.v v0, v24
444 ; CHECK-NEXT:    vsetivli zero, 1, e8, m8, ta, ma
445 ; CHECK-NEXT:    vssub.vx v16, v16, a0, v0.t
446 ; CHECK-NEXT:    ret
447   %v = call <256 x i8> @llvm.vp.ssub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 129)
448   ret <256 x i8> %v
451 ; FIXME: The upper half is doing nothing.
453 define <256 x i8> @vssub_vi_v258i8_evl128(<256 x i8> %va, <256 x i1> %m) {
454 ; CHECK-LABEL: vssub_vi_v258i8_evl128:
455 ; CHECK:       # %bb.0:
456 ; CHECK-NEXT:    li a1, 128
457 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
458 ; CHECK-NEXT:    vlm.v v24, (a0)
459 ; CHECK-NEXT:    li a0, -1
460 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
461 ; CHECK-NEXT:    vmv1r.v v0, v24
462 ; CHECK-NEXT:    vsetivli zero, 0, e8, m8, ta, ma
463 ; CHECK-NEXT:    vssub.vx v16, v16, a0, v0.t
464 ; CHECK-NEXT:    ret
465   %v = call <256 x i8> @llvm.vp.ssub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 128)
466   ret <256 x i8> %v
469 declare <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32)
471 define <2 x i16> @vssub_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) {
472 ; CHECK-LABEL: vssub_vv_v2i16:
473 ; CHECK:       # %bb.0:
474 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
475 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
476 ; CHECK-NEXT:    ret
477   %v = call <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl)
478   ret <2 x i16> %v
481 define <2 x i16> @vssub_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) {
482 ; CHECK-LABEL: vssub_vv_v2i16_unmasked:
483 ; CHECK:       # %bb.0:
484 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
485 ; CHECK-NEXT:    vssub.vv v8, v8, v9
486 ; CHECK-NEXT:    ret
487   %v = call <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> splat (i1 true), i32 %evl)
488   ret <2 x i16> %v
491 define <2 x i16> @vssub_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) {
492 ; CHECK-LABEL: vssub_vx_v2i16:
493 ; CHECK:       # %bb.0:
494 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
495 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
496 ; CHECK-NEXT:    ret
497   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
498   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
499   %v = call <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl)
500   ret <2 x i16> %v
503 define <2 x i16> @vssub_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) {
504 ; CHECK-LABEL: vssub_vx_v2i16_unmasked:
505 ; CHECK:       # %bb.0:
506 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
507 ; CHECK-NEXT:    vssub.vx v8, v8, a0
508 ; CHECK-NEXT:    ret
509   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
510   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
511   %v = call <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> splat (i1 true), i32 %evl)
512   ret <2 x i16> %v
515 define <2 x i16> @vssub_vi_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) {
516 ; CHECK-LABEL: vssub_vi_v2i16:
517 ; CHECK:       # %bb.0:
518 ; CHECK-NEXT:    li a1, -1
519 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
520 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
521 ; CHECK-NEXT:    ret
522   %v = call <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> %m, i32 %evl)
523   ret <2 x i16> %v
526 define <2 x i16> @vssub_vi_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
527 ; CHECK-LABEL: vssub_vi_v2i16_unmasked:
528 ; CHECK:       # %bb.0:
529 ; CHECK-NEXT:    li a1, -1
530 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
531 ; CHECK-NEXT:    vssub.vx v8, v8, a1
532 ; CHECK-NEXT:    ret
533   %v = call <2 x i16> @llvm.vp.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> splat (i1 true), i32 %evl)
534   ret <2 x i16> %v
537 declare <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32)
539 define <4 x i16> @vssub_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) {
540 ; CHECK-LABEL: vssub_vv_v4i16:
541 ; CHECK:       # %bb.0:
542 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
543 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
544 ; CHECK-NEXT:    ret
545   %v = call <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl)
546   ret <4 x i16> %v
549 define <4 x i16> @vssub_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) {
550 ; CHECK-LABEL: vssub_vv_v4i16_unmasked:
551 ; CHECK:       # %bb.0:
552 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
553 ; CHECK-NEXT:    vssub.vv v8, v8, v9
554 ; CHECK-NEXT:    ret
555   %v = call <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> splat (i1 true), i32 %evl)
556   ret <4 x i16> %v
559 define <4 x i16> @vssub_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) {
560 ; CHECK-LABEL: vssub_vx_v4i16:
561 ; CHECK:       # %bb.0:
562 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
563 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
564 ; CHECK-NEXT:    ret
565   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
566   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
567   %v = call <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl)
568   ret <4 x i16> %v
571 define <4 x i16> @vssub_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) {
572 ; CHECK-LABEL: vssub_vx_v4i16_unmasked:
573 ; CHECK:       # %bb.0:
574 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
575 ; CHECK-NEXT:    vssub.vx v8, v8, a0
576 ; CHECK-NEXT:    ret
577   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
578   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
579   %v = call <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> splat (i1 true), i32 %evl)
580   ret <4 x i16> %v
583 define <4 x i16> @vssub_vi_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) {
584 ; CHECK-LABEL: vssub_vi_v4i16:
585 ; CHECK:       # %bb.0:
586 ; CHECK-NEXT:    li a1, -1
587 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
588 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
589 ; CHECK-NEXT:    ret
590   %v = call <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> %m, i32 %evl)
591   ret <4 x i16> %v
594 define <4 x i16> @vssub_vi_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
595 ; CHECK-LABEL: vssub_vi_v4i16_unmasked:
596 ; CHECK:       # %bb.0:
597 ; CHECK-NEXT:    li a1, -1
598 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
599 ; CHECK-NEXT:    vssub.vx v8, v8, a1
600 ; CHECK-NEXT:    ret
601   %v = call <4 x i16> @llvm.vp.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> splat (i1 true), i32 %evl)
602   ret <4 x i16> %v
605 declare <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32)
607 define <8 x i16> @vssub_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) {
608 ; CHECK-LABEL: vssub_vv_v8i16:
609 ; CHECK:       # %bb.0:
610 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
611 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
612 ; CHECK-NEXT:    ret
613   %v = call <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl)
614   ret <8 x i16> %v
617 define <8 x i16> @vssub_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) {
618 ; CHECK-LABEL: vssub_vv_v8i16_unmasked:
619 ; CHECK:       # %bb.0:
620 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
621 ; CHECK-NEXT:    vssub.vv v8, v8, v9
622 ; CHECK-NEXT:    ret
623   %v = call <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> splat (i1 true), i32 %evl)
624   ret <8 x i16> %v
627 define <8 x i16> @vssub_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) {
628 ; CHECK-LABEL: vssub_vx_v8i16:
629 ; CHECK:       # %bb.0:
630 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
631 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
632 ; CHECK-NEXT:    ret
633   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
634   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
635   %v = call <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl)
636   ret <8 x i16> %v
639 define <8 x i16> @vssub_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) {
640 ; CHECK-LABEL: vssub_vx_v8i16_unmasked:
641 ; CHECK:       # %bb.0:
642 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
643 ; CHECK-NEXT:    vssub.vx v8, v8, a0
644 ; CHECK-NEXT:    ret
645   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
646   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
647   %v = call <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> splat (i1 true), i32 %evl)
648   ret <8 x i16> %v
651 define <8 x i16> @vssub_vi_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) {
652 ; CHECK-LABEL: vssub_vi_v8i16:
653 ; CHECK:       # %bb.0:
654 ; CHECK-NEXT:    li a1, -1
655 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
656 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
657 ; CHECK-NEXT:    ret
658   %v = call <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> %m, i32 %evl)
659   ret <8 x i16> %v
662 define <8 x i16> @vssub_vi_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
663 ; CHECK-LABEL: vssub_vi_v8i16_unmasked:
664 ; CHECK:       # %bb.0:
665 ; CHECK-NEXT:    li a1, -1
666 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
667 ; CHECK-NEXT:    vssub.vx v8, v8, a1
668 ; CHECK-NEXT:    ret
669   %v = call <8 x i16> @llvm.vp.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> splat (i1 true), i32 %evl)
670   ret <8 x i16> %v
673 declare <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32)
675 define <16 x i16> @vssub_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) {
676 ; CHECK-LABEL: vssub_vv_v16i16:
677 ; CHECK:       # %bb.0:
678 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
679 ; CHECK-NEXT:    vssub.vv v8, v8, v10, v0.t
680 ; CHECK-NEXT:    ret
681   %v = call <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl)
682   ret <16 x i16> %v
685 define <16 x i16> @vssub_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) {
686 ; CHECK-LABEL: vssub_vv_v16i16_unmasked:
687 ; CHECK:       # %bb.0:
688 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
689 ; CHECK-NEXT:    vssub.vv v8, v8, v10
690 ; CHECK-NEXT:    ret
691   %v = call <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> splat (i1 true), i32 %evl)
692   ret <16 x i16> %v
695 define <16 x i16> @vssub_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) {
696 ; CHECK-LABEL: vssub_vx_v16i16:
697 ; CHECK:       # %bb.0:
698 ; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
699 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
700 ; CHECK-NEXT:    ret
701   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
702   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
703   %v = call <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl)
704   ret <16 x i16> %v
707 define <16 x i16> @vssub_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) {
708 ; CHECK-LABEL: vssub_vx_v16i16_unmasked:
709 ; CHECK:       # %bb.0:
710 ; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
711 ; CHECK-NEXT:    vssub.vx v8, v8, a0
712 ; CHECK-NEXT:    ret
713   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
714   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
715   %v = call <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> splat (i1 true), i32 %evl)
716   ret <16 x i16> %v
719 define <16 x i16> @vssub_vi_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) {
720 ; CHECK-LABEL: vssub_vi_v16i16:
721 ; CHECK:       # %bb.0:
722 ; CHECK-NEXT:    li a1, -1
723 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
724 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
725 ; CHECK-NEXT:    ret
726   %v = call <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> %m, i32 %evl)
727   ret <16 x i16> %v
730 define <16 x i16> @vssub_vi_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
731 ; CHECK-LABEL: vssub_vi_v16i16_unmasked:
732 ; CHECK:       # %bb.0:
733 ; CHECK-NEXT:    li a1, -1
734 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
735 ; CHECK-NEXT:    vssub.vx v8, v8, a1
736 ; CHECK-NEXT:    ret
737   %v = call <16 x i16> @llvm.vp.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> splat (i1 true), i32 %evl)
738   ret <16 x i16> %v
741 declare <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32)
743 define <2 x i32> @vssub_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) {
744 ; CHECK-LABEL: vssub_vv_v2i32:
745 ; CHECK:       # %bb.0:
746 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
747 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
748 ; CHECK-NEXT:    ret
749   %v = call <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl)
750   ret <2 x i32> %v
753 define <2 x i32> @vssub_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) {
754 ; CHECK-LABEL: vssub_vv_v2i32_unmasked:
755 ; CHECK:       # %bb.0:
756 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
757 ; CHECK-NEXT:    vssub.vv v8, v8, v9
758 ; CHECK-NEXT:    ret
759   %v = call <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> splat (i1 true), i32 %evl)
760   ret <2 x i32> %v
763 define <2 x i32> @vssub_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) {
764 ; CHECK-LABEL: vssub_vx_v2i32:
765 ; CHECK:       # %bb.0:
766 ; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
767 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
768 ; CHECK-NEXT:    ret
769   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
770   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
771   %v = call <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl)
772   ret <2 x i32> %v
775 define <2 x i32> @vssub_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) {
776 ; CHECK-LABEL: vssub_vx_v2i32_unmasked:
777 ; CHECK:       # %bb.0:
778 ; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
779 ; CHECK-NEXT:    vssub.vx v8, v8, a0
780 ; CHECK-NEXT:    ret
781   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
782   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
783   %v = call <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> splat (i1 true), i32 %evl)
784   ret <2 x i32> %v
787 define <2 x i32> @vssub_vi_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) {
788 ; CHECK-LABEL: vssub_vi_v2i32:
789 ; CHECK:       # %bb.0:
790 ; CHECK-NEXT:    li a1, -1
791 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
792 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
793 ; CHECK-NEXT:    ret
794   %v = call <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> %m, i32 %evl)
795   ret <2 x i32> %v
798 define <2 x i32> @vssub_vi_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
799 ; CHECK-LABEL: vssub_vi_v2i32_unmasked:
800 ; CHECK:       # %bb.0:
801 ; CHECK-NEXT:    li a1, -1
802 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
803 ; CHECK-NEXT:    vssub.vx v8, v8, a1
804 ; CHECK-NEXT:    ret
805   %v = call <2 x i32> @llvm.vp.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> splat (i1 true), i32 %evl)
806   ret <2 x i32> %v
809 declare <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)
811 define <4 x i32> @vssub_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) {
812 ; CHECK-LABEL: vssub_vv_v4i32:
813 ; CHECK:       # %bb.0:
814 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
815 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
816 ; CHECK-NEXT:    ret
817   %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl)
818   ret <4 x i32> %v
821 define <4 x i32> @vssub_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) {
822 ; CHECK-LABEL: vssub_vv_v4i32_unmasked:
823 ; CHECK:       # %bb.0:
824 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
825 ; CHECK-NEXT:    vssub.vv v8, v8, v9
826 ; CHECK-NEXT:    ret
827   %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> splat (i1 true), i32 %evl)
828   ret <4 x i32> %v
831 define <4 x i32> @vssub_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) {
832 ; CHECK-LABEL: vssub_vx_v4i32:
833 ; CHECK:       # %bb.0:
834 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
835 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
836 ; CHECK-NEXT:    ret
837   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
838   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
839   %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)
840   ret <4 x i32> %v
843 define <4 x i32> @vssub_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) {
844 ; CHECK-LABEL: vssub_vx_v4i32_unmasked:
845 ; CHECK:       # %bb.0:
846 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
847 ; CHECK-NEXT:    vssub.vx v8, v8, a0
848 ; CHECK-NEXT:    ret
849   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
850   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
851   %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> splat (i1 true), i32 %evl)
852   ret <4 x i32> %v
855 define <4 x i32> @vssub_vi_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {
856 ; CHECK-LABEL: vssub_vi_v4i32:
857 ; CHECK:       # %bb.0:
858 ; CHECK-NEXT:    li a1, -1
859 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
860 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
861 ; CHECK-NEXT:    ret
862   %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> %m, i32 %evl)
863   ret <4 x i32> %v
866 define <4 x i32> @vssub_vi_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
867 ; CHECK-LABEL: vssub_vi_v4i32_unmasked:
868 ; CHECK:       # %bb.0:
869 ; CHECK-NEXT:    li a1, -1
870 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
871 ; CHECK-NEXT:    vssub.vx v8, v8, a1
872 ; CHECK-NEXT:    ret
873   %v = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> splat (i1 true), i32 %evl)
874   ret <4 x i32> %v
877 declare <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
879 define <8 x i32> @vssub_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) {
880 ; CHECK-LABEL: vssub_vv_v8i32:
881 ; CHECK:       # %bb.0:
882 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
883 ; CHECK-NEXT:    vssub.vv v8, v8, v10, v0.t
884 ; CHECK-NEXT:    ret
885   %v = call <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl)
886   ret <8 x i32> %v
889 define <8 x i32> @vssub_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) {
890 ; CHECK-LABEL: vssub_vv_v8i32_unmasked:
891 ; CHECK:       # %bb.0:
892 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
893 ; CHECK-NEXT:    vssub.vv v8, v8, v10
894 ; CHECK-NEXT:    ret
895   %v = call <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> splat (i1 true), i32 %evl)
896   ret <8 x i32> %v
899 define <8 x i32> @vssub_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) {
900 ; CHECK-LABEL: vssub_vx_v8i32:
901 ; CHECK:       # %bb.0:
902 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
903 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
904 ; CHECK-NEXT:    ret
905   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
906   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
907   %v = call <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl)
908   ret <8 x i32> %v
911 define <8 x i32> @vssub_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) {
912 ; CHECK-LABEL: vssub_vx_v8i32_unmasked:
913 ; CHECK:       # %bb.0:
914 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
915 ; CHECK-NEXT:    vssub.vx v8, v8, a0
916 ; CHECK-NEXT:    ret
917   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
918   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
919   %v = call <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> splat (i1 true), i32 %evl)
920   ret <8 x i32> %v
923 define <8 x i32> @vssub_vi_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) {
924 ; CHECK-LABEL: vssub_vi_v8i32:
925 ; CHECK:       # %bb.0:
926 ; CHECK-NEXT:    li a1, -1
927 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
928 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
929 ; CHECK-NEXT:    ret
930   %v = call <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> %m, i32 %evl)
931   ret <8 x i32> %v
934 define <8 x i32> @vssub_vi_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
935 ; CHECK-LABEL: vssub_vi_v8i32_unmasked:
936 ; CHECK:       # %bb.0:
937 ; CHECK-NEXT:    li a1, -1
938 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
939 ; CHECK-NEXT:    vssub.vx v8, v8, a1
940 ; CHECK-NEXT:    ret
941   %v = call <8 x i32> @llvm.vp.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> splat (i1 true), i32 %evl)
942   ret <8 x i32> %v
945 declare <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32)
947 define <16 x i32> @vssub_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) {
948 ; CHECK-LABEL: vssub_vv_v16i32:
949 ; CHECK:       # %bb.0:
950 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
951 ; CHECK-NEXT:    vssub.vv v8, v8, v12, v0.t
952 ; CHECK-NEXT:    ret
953   %v = call <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl)
954   ret <16 x i32> %v
957 define <16 x i32> @vssub_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) {
958 ; CHECK-LABEL: vssub_vv_v16i32_unmasked:
959 ; CHECK:       # %bb.0:
960 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
961 ; CHECK-NEXT:    vssub.vv v8, v8, v12
962 ; CHECK-NEXT:    ret
963   %v = call <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> splat (i1 true), i32 %evl)
964   ret <16 x i32> %v
967 define <16 x i32> @vssub_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) {
968 ; CHECK-LABEL: vssub_vx_v16i32:
969 ; CHECK:       # %bb.0:
970 ; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
971 ; CHECK-NEXT:    vssub.vx v8, v8, a0, v0.t
972 ; CHECK-NEXT:    ret
973   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
974   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
975   %v = call <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl)
976   ret <16 x i32> %v
979 define <16 x i32> @vssub_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) {
980 ; CHECK-LABEL: vssub_vx_v16i32_unmasked:
981 ; CHECK:       # %bb.0:
982 ; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
983 ; CHECK-NEXT:    vssub.vx v8, v8, a0
984 ; CHECK-NEXT:    ret
985   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
986   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
987   %v = call <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> splat (i1 true), i32 %evl)
988   ret <16 x i32> %v
991 define <16 x i32> @vssub_vi_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) {
992 ; CHECK-LABEL: vssub_vi_v16i32:
993 ; CHECK:       # %bb.0:
994 ; CHECK-NEXT:    li a1, -1
995 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
996 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
997 ; CHECK-NEXT:    ret
998   %v = call <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> %m, i32 %evl)
999   ret <16 x i32> %v
1002 define <16 x i32> @vssub_vi_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
1003 ; CHECK-LABEL: vssub_vi_v16i32_unmasked:
1004 ; CHECK:       # %bb.0:
1005 ; CHECK-NEXT:    li a1, -1
1006 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1007 ; CHECK-NEXT:    vssub.vx v8, v8, a1
1008 ; CHECK-NEXT:    ret
1009   %v = call <16 x i32> @llvm.vp.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> splat (i1 true), i32 %evl)
1010   ret <16 x i32> %v
1013 declare <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32)
1015 define <2 x i64> @vssub_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) {
1016 ; CHECK-LABEL: vssub_vv_v2i64:
1017 ; CHECK:       # %bb.0:
1018 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1019 ; CHECK-NEXT:    vssub.vv v8, v8, v9, v0.t
1020 ; CHECK-NEXT:    ret
1021   %v = call <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl)
1022   ret <2 x i64> %v
1025 define <2 x i64> @vssub_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) {
1026 ; CHECK-LABEL: vssub_vv_v2i64_unmasked:
1027 ; CHECK:       # %bb.0:
1028 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1029 ; CHECK-NEXT:    vssub.vv v8, v8, v9
1030 ; CHECK-NEXT:    ret
1031   %v = call <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> splat (i1 true), i32 %evl)
1032   ret <2 x i64> %v
1035 define <2 x i64> @vssub_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) {
1036 ; RV32-LABEL: vssub_vx_v2i64:
1037 ; RV32:       # %bb.0:
1038 ; RV32-NEXT:    addi sp, sp, -16
1039 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1040 ; RV32-NEXT:    sw a1, 12(sp)
1041 ; RV32-NEXT:    sw a0, 8(sp)
1042 ; RV32-NEXT:    addi a0, sp, 8
1043 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1044 ; RV32-NEXT:    vlse64.v v9, (a0), zero
1045 ; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1046 ; RV32-NEXT:    vssub.vv v8, v8, v9, v0.t
1047 ; RV32-NEXT:    addi sp, sp, 16
1048 ; RV32-NEXT:    ret
1050 ; RV64-LABEL: vssub_vx_v2i64:
1051 ; RV64:       # %bb.0:
1052 ; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1053 ; RV64-NEXT:    vssub.vx v8, v8, a0, v0.t
1054 ; RV64-NEXT:    ret
1055   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1056   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1057   %v = call <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl)
1058   ret <2 x i64> %v
1061 define <2 x i64> @vssub_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) {
1062 ; RV32-LABEL: vssub_vx_v2i64_unmasked:
1063 ; RV32:       # %bb.0:
1064 ; RV32-NEXT:    addi sp, sp, -16
1065 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1066 ; RV32-NEXT:    sw a1, 12(sp)
1067 ; RV32-NEXT:    sw a0, 8(sp)
1068 ; RV32-NEXT:    addi a0, sp, 8
1069 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1070 ; RV32-NEXT:    vlse64.v v9, (a0), zero
1071 ; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1072 ; RV32-NEXT:    vssub.vv v8, v8, v9
1073 ; RV32-NEXT:    addi sp, sp, 16
1074 ; RV32-NEXT:    ret
1076 ; RV64-LABEL: vssub_vx_v2i64_unmasked:
1077 ; RV64:       # %bb.0:
1078 ; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1079 ; RV64-NEXT:    vssub.vx v8, v8, a0
1080 ; RV64-NEXT:    ret
1081   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1082   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1083   %v = call <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> splat (i1 true), i32 %evl)
1084   ret <2 x i64> %v
1087 define <2 x i64> @vssub_vi_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) {
1088 ; CHECK-LABEL: vssub_vi_v2i64:
1089 ; CHECK:       # %bb.0:
1090 ; CHECK-NEXT:    li a1, -1
1091 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1092 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
1093 ; CHECK-NEXT:    ret
1094   %v = call <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> %m, i32 %evl)
1095   ret <2 x i64> %v
1098 define <2 x i64> @vssub_vi_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
1099 ; CHECK-LABEL: vssub_vi_v2i64_unmasked:
1100 ; CHECK:       # %bb.0:
1101 ; CHECK-NEXT:    li a1, -1
1102 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1103 ; CHECK-NEXT:    vssub.vx v8, v8, a1
1104 ; CHECK-NEXT:    ret
1105   %v = call <2 x i64> @llvm.vp.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> splat (i1 true), i32 %evl)
1106   ret <2 x i64> %v
1109 declare <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32)
1111 define <4 x i64> @vssub_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) {
1112 ; CHECK-LABEL: vssub_vv_v4i64:
1113 ; CHECK:       # %bb.0:
1114 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1115 ; CHECK-NEXT:    vssub.vv v8, v8, v10, v0.t
1116 ; CHECK-NEXT:    ret
1117   %v = call <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl)
1118   ret <4 x i64> %v
1121 define <4 x i64> @vssub_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) {
1122 ; CHECK-LABEL: vssub_vv_v4i64_unmasked:
1123 ; CHECK:       # %bb.0:
1124 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1125 ; CHECK-NEXT:    vssub.vv v8, v8, v10
1126 ; CHECK-NEXT:    ret
1127   %v = call <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> splat (i1 true), i32 %evl)
1128   ret <4 x i64> %v
1131 define <4 x i64> @vssub_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) {
1132 ; RV32-LABEL: vssub_vx_v4i64:
1133 ; RV32:       # %bb.0:
1134 ; RV32-NEXT:    addi sp, sp, -16
1135 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1136 ; RV32-NEXT:    sw a1, 12(sp)
1137 ; RV32-NEXT:    sw a0, 8(sp)
1138 ; RV32-NEXT:    addi a0, sp, 8
1139 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1140 ; RV32-NEXT:    vlse64.v v10, (a0), zero
1141 ; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1142 ; RV32-NEXT:    vssub.vv v8, v8, v10, v0.t
1143 ; RV32-NEXT:    addi sp, sp, 16
1144 ; RV32-NEXT:    ret
1146 ; RV64-LABEL: vssub_vx_v4i64:
1147 ; RV64:       # %bb.0:
1148 ; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1149 ; RV64-NEXT:    vssub.vx v8, v8, a0, v0.t
1150 ; RV64-NEXT:    ret
1151   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1152   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1153   %v = call <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl)
1154   ret <4 x i64> %v
1157 define <4 x i64> @vssub_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) {
1158 ; RV32-LABEL: vssub_vx_v4i64_unmasked:
1159 ; RV32:       # %bb.0:
1160 ; RV32-NEXT:    addi sp, sp, -16
1161 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1162 ; RV32-NEXT:    sw a1, 12(sp)
1163 ; RV32-NEXT:    sw a0, 8(sp)
1164 ; RV32-NEXT:    addi a0, sp, 8
1165 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1166 ; RV32-NEXT:    vlse64.v v10, (a0), zero
1167 ; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1168 ; RV32-NEXT:    vssub.vv v8, v8, v10
1169 ; RV32-NEXT:    addi sp, sp, 16
1170 ; RV32-NEXT:    ret
1172 ; RV64-LABEL: vssub_vx_v4i64_unmasked:
1173 ; RV64:       # %bb.0:
1174 ; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1175 ; RV64-NEXT:    vssub.vx v8, v8, a0
1176 ; RV64-NEXT:    ret
1177   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1178   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1179   %v = call <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl)
1180   ret <4 x i64> %v
1183 define <4 x i64> @vssub_vi_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) {
1184 ; CHECK-LABEL: vssub_vi_v4i64:
1185 ; CHECK:       # %bb.0:
1186 ; CHECK-NEXT:    li a1, -1
1187 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1188 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
1189 ; CHECK-NEXT:    ret
1190   %v = call <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> %m, i32 %evl)
1191   ret <4 x i64> %v
1194 define <4 x i64> @vssub_vi_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
1195 ; CHECK-LABEL: vssub_vi_v4i64_unmasked:
1196 ; CHECK:       # %bb.0:
1197 ; CHECK-NEXT:    li a1, -1
1198 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1199 ; CHECK-NEXT:    vssub.vx v8, v8, a1
1200 ; CHECK-NEXT:    ret
1201   %v = call <4 x i64> @llvm.vp.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> splat (i1 true), i32 %evl)
1202   ret <4 x i64> %v
1205 declare <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32)
1207 define <8 x i64> @vssub_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) {
1208 ; CHECK-LABEL: vssub_vv_v8i64:
1209 ; CHECK:       # %bb.0:
1210 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1211 ; CHECK-NEXT:    vssub.vv v8, v8, v12, v0.t
1212 ; CHECK-NEXT:    ret
1213   %v = call <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl)
1214   ret <8 x i64> %v
1217 define <8 x i64> @vssub_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) {
1218 ; CHECK-LABEL: vssub_vv_v8i64_unmasked:
1219 ; CHECK:       # %bb.0:
1220 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1221 ; CHECK-NEXT:    vssub.vv v8, v8, v12
1222 ; CHECK-NEXT:    ret
1223   %v = call <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> splat (i1 true), i32 %evl)
1224   ret <8 x i64> %v
1227 define <8 x i64> @vssub_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) {
1228 ; RV32-LABEL: vssub_vx_v8i64:
1229 ; RV32:       # %bb.0:
1230 ; RV32-NEXT:    addi sp, sp, -16
1231 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1232 ; RV32-NEXT:    sw a1, 12(sp)
1233 ; RV32-NEXT:    sw a0, 8(sp)
1234 ; RV32-NEXT:    addi a0, sp, 8
1235 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1236 ; RV32-NEXT:    vlse64.v v12, (a0), zero
1237 ; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1238 ; RV32-NEXT:    vssub.vv v8, v8, v12, v0.t
1239 ; RV32-NEXT:    addi sp, sp, 16
1240 ; RV32-NEXT:    ret
1242 ; RV64-LABEL: vssub_vx_v8i64:
1243 ; RV64:       # %bb.0:
1244 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1245 ; RV64-NEXT:    vssub.vx v8, v8, a0, v0.t
1246 ; RV64-NEXT:    ret
1247   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1248   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1249   %v = call <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl)
1250   ret <8 x i64> %v
1253 define <8 x i64> @vssub_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) {
1254 ; RV32-LABEL: vssub_vx_v8i64_unmasked:
1255 ; RV32:       # %bb.0:
1256 ; RV32-NEXT:    addi sp, sp, -16
1257 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1258 ; RV32-NEXT:    sw a1, 12(sp)
1259 ; RV32-NEXT:    sw a0, 8(sp)
1260 ; RV32-NEXT:    addi a0, sp, 8
1261 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1262 ; RV32-NEXT:    vlse64.v v12, (a0), zero
1263 ; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1264 ; RV32-NEXT:    vssub.vv v8, v8, v12
1265 ; RV32-NEXT:    addi sp, sp, 16
1266 ; RV32-NEXT:    ret
1268 ; RV64-LABEL: vssub_vx_v8i64_unmasked:
1269 ; RV64:       # %bb.0:
1270 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1271 ; RV64-NEXT:    vssub.vx v8, v8, a0
1272 ; RV64-NEXT:    ret
1273   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1274   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1275   %v = call <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> splat (i1 true), i32 %evl)
1276   ret <8 x i64> %v
1279 define <8 x i64> @vssub_vi_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) {
1280 ; CHECK-LABEL: vssub_vi_v8i64:
1281 ; CHECK:       # %bb.0:
1282 ; CHECK-NEXT:    li a1, -1
1283 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1284 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
1285 ; CHECK-NEXT:    ret
1286   %v = call <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> %m, i32 %evl)
1287   ret <8 x i64> %v
1290 define <8 x i64> @vssub_vi_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
1291 ; CHECK-LABEL: vssub_vi_v8i64_unmasked:
1292 ; CHECK:       # %bb.0:
1293 ; CHECK-NEXT:    li a1, -1
1294 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1295 ; CHECK-NEXT:    vssub.vx v8, v8, a1
1296 ; CHECK-NEXT:    ret
1297   %v = call <8 x i64> @llvm.vp.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> splat (i1 true), i32 %evl)
1298   ret <8 x i64> %v
1301 declare <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32)
1303 define <16 x i64> @vssub_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) {
1304 ; CHECK-LABEL: vssub_vv_v16i64:
1305 ; CHECK:       # %bb.0:
1306 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1307 ; CHECK-NEXT:    vssub.vv v8, v8, v16, v0.t
1308 ; CHECK-NEXT:    ret
1309   %v = call <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl)
1310   ret <16 x i64> %v
1313 define <16 x i64> @vssub_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) {
1314 ; CHECK-LABEL: vssub_vv_v16i64_unmasked:
1315 ; CHECK:       # %bb.0:
1316 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1317 ; CHECK-NEXT:    vssub.vv v8, v8, v16
1318 ; CHECK-NEXT:    ret
1319   %v = call <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> splat (i1 true), i32 %evl)
1320   ret <16 x i64> %v
1323 define <16 x i64> @vssub_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) {
1324 ; RV32-LABEL: vssub_vx_v16i64:
1325 ; RV32:       # %bb.0:
1326 ; RV32-NEXT:    addi sp, sp, -16
1327 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1328 ; RV32-NEXT:    sw a1, 12(sp)
1329 ; RV32-NEXT:    sw a0, 8(sp)
1330 ; RV32-NEXT:    addi a0, sp, 8
1331 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1332 ; RV32-NEXT:    vlse64.v v16, (a0), zero
1333 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1334 ; RV32-NEXT:    vssub.vv v8, v8, v16, v0.t
1335 ; RV32-NEXT:    addi sp, sp, 16
1336 ; RV32-NEXT:    ret
1338 ; RV64-LABEL: vssub_vx_v16i64:
1339 ; RV64:       # %bb.0:
1340 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1341 ; RV64-NEXT:    vssub.vx v8, v8, a0, v0.t
1342 ; RV64-NEXT:    ret
1343   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1344   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1345   %v = call <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl)
1346   ret <16 x i64> %v
1349 define <16 x i64> @vssub_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) {
1350 ; RV32-LABEL: vssub_vx_v16i64_unmasked:
1351 ; RV32:       # %bb.0:
1352 ; RV32-NEXT:    addi sp, sp, -16
1353 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1354 ; RV32-NEXT:    sw a1, 12(sp)
1355 ; RV32-NEXT:    sw a0, 8(sp)
1356 ; RV32-NEXT:    addi a0, sp, 8
1357 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1358 ; RV32-NEXT:    vlse64.v v16, (a0), zero
1359 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1360 ; RV32-NEXT:    vssub.vv v8, v8, v16
1361 ; RV32-NEXT:    addi sp, sp, 16
1362 ; RV32-NEXT:    ret
1364 ; RV64-LABEL: vssub_vx_v16i64_unmasked:
1365 ; RV64:       # %bb.0:
1366 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1367 ; RV64-NEXT:    vssub.vx v8, v8, a0
1368 ; RV64-NEXT:    ret
1369   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1370   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1371   %v = call <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> splat (i1 true), i32 %evl)
1372   ret <16 x i64> %v
1375 define <16 x i64> @vssub_vi_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) {
1376 ; CHECK-LABEL: vssub_vi_v16i64:
1377 ; CHECK:       # %bb.0:
1378 ; CHECK-NEXT:    li a1, -1
1379 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1380 ; CHECK-NEXT:    vssub.vx v8, v8, a1, v0.t
1381 ; CHECK-NEXT:    ret
1382   %v = call <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> %m, i32 %evl)
1383   ret <16 x i64> %v
1386 define <16 x i64> @vssub_vi_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
1387 ; CHECK-LABEL: vssub_vi_v16i64_unmasked:
1388 ; CHECK:       # %bb.0:
1389 ; CHECK-NEXT:    li a1, -1
1390 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1391 ; CHECK-NEXT:    vssub.vx v8, v8, a1
1392 ; CHECK-NEXT:    ret
1393   %v = call <16 x i64> @llvm.vp.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> splat (i1 true), i32 %evl)
1394   ret <16 x i64> %v
1397 ; Test that split-legalization works as expected.
1399 declare <32 x i64> @llvm.vp.ssub.sat.v32i64(<32 x i64>, <32 x i64>, <32 x i1>, i32)
1401 define <32 x i64> @vssub_vx_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) {
1402 ; RV32-LABEL: vssub_vx_v32i64:
1403 ; RV32:       # %bb.0:
1404 ; RV32-NEXT:    li a2, 16
1405 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1406 ; RV32-NEXT:    vslidedown.vi v7, v0, 2
1407 ; RV32-NEXT:    mv a1, a0
1408 ; RV32-NEXT:    bltu a0, a2, .LBB108_2
1409 ; RV32-NEXT:  # %bb.1:
1410 ; RV32-NEXT:    li a1, 16
1411 ; RV32-NEXT:  .LBB108_2:
1412 ; RV32-NEXT:    li a2, 32
1413 ; RV32-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1414 ; RV32-NEXT:    vmv.v.i v24, -1
1415 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1416 ; RV32-NEXT:    vssub.vv v8, v8, v24, v0.t
1417 ; RV32-NEXT:    addi a1, a0, -16
1418 ; RV32-NEXT:    sltu a0, a0, a1
1419 ; RV32-NEXT:    addi a0, a0, -1
1420 ; RV32-NEXT:    and a0, a0, a1
1421 ; RV32-NEXT:    vmv1r.v v0, v7
1422 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1423 ; RV32-NEXT:    vssub.vv v16, v16, v24, v0.t
1424 ; RV32-NEXT:    ret
1426 ; RV64-LABEL: vssub_vx_v32i64:
1427 ; RV64:       # %bb.0:
1428 ; RV64-NEXT:    li a2, 16
1429 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1430 ; RV64-NEXT:    vslidedown.vi v24, v0, 2
1431 ; RV64-NEXT:    mv a1, a0
1432 ; RV64-NEXT:    bltu a0, a2, .LBB108_2
1433 ; RV64-NEXT:  # %bb.1:
1434 ; RV64-NEXT:    li a1, 16
1435 ; RV64-NEXT:  .LBB108_2:
1436 ; RV64-NEXT:    li a2, -1
1437 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1438 ; RV64-NEXT:    vssub.vx v8, v8, a2, v0.t
1439 ; RV64-NEXT:    addi a1, a0, -16
1440 ; RV64-NEXT:    sltu a0, a0, a1
1441 ; RV64-NEXT:    addi a0, a0, -1
1442 ; RV64-NEXT:    and a0, a0, a1
1443 ; RV64-NEXT:    vmv1r.v v0, v24
1444 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1445 ; RV64-NEXT:    vssub.vx v16, v16, a2, v0.t
1446 ; RV64-NEXT:    ret
1447   %v = call <32 x i64> @llvm.vp.ssub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 %evl)
1448   ret <32 x i64> %v
1451 define <32 x i64> @vssub_vi_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
1452 ; RV32-LABEL: vssub_vi_v32i64_unmasked:
1453 ; RV32:       # %bb.0:
1454 ; RV32-NEXT:    li a2, 16
1455 ; RV32-NEXT:    mv a1, a0
1456 ; RV32-NEXT:    bltu a0, a2, .LBB109_2
1457 ; RV32-NEXT:  # %bb.1:
1458 ; RV32-NEXT:    li a1, 16
1459 ; RV32-NEXT:  .LBB109_2:
1460 ; RV32-NEXT:    li a2, 32
1461 ; RV32-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1462 ; RV32-NEXT:    vmv.v.i v24, -1
1463 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1464 ; RV32-NEXT:    vssub.vv v8, v8, v24
1465 ; RV32-NEXT:    addi a1, a0, -16
1466 ; RV32-NEXT:    sltu a0, a0, a1
1467 ; RV32-NEXT:    addi a0, a0, -1
1468 ; RV32-NEXT:    and a0, a0, a1
1469 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1470 ; RV32-NEXT:    vssub.vv v16, v16, v24
1471 ; RV32-NEXT:    ret
1473 ; RV64-LABEL: vssub_vi_v32i64_unmasked:
1474 ; RV64:       # %bb.0:
1475 ; RV64-NEXT:    li a2, 16
1476 ; RV64-NEXT:    mv a1, a0
1477 ; RV64-NEXT:    bltu a0, a2, .LBB109_2
1478 ; RV64-NEXT:  # %bb.1:
1479 ; RV64-NEXT:    li a1, 16
1480 ; RV64-NEXT:  .LBB109_2:
1481 ; RV64-NEXT:    li a2, -1
1482 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1483 ; RV64-NEXT:    vssub.vx v8, v8, a2
1484 ; RV64-NEXT:    addi a1, a0, -16
1485 ; RV64-NEXT:    sltu a0, a0, a1
1486 ; RV64-NEXT:    addi a0, a0, -1
1487 ; RV64-NEXT:    and a0, a0, a1
1488 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1489 ; RV64-NEXT:    vssub.vx v16, v16, a2
1490 ; RV64-NEXT:    ret
1491   %v = call <32 x i64> @llvm.vp.ssub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> splat (i1 true), i32 %evl)
1492   ret <32 x i64> %v
1495 ; FIXME: We don't match vssub.vi on RV32.
1497 define <32 x i64> @vssub_vx_v32i64_evl12(<32 x i64> %va, <32 x i1> %m) {
1498 ; RV32-LABEL: vssub_vx_v32i64_evl12:
1499 ; RV32:       # %bb.0:
1500 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1501 ; RV32-NEXT:    vslidedown.vi v7, v0, 2
1502 ; RV32-NEXT:    li a0, 32
1503 ; RV32-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1504 ; RV32-NEXT:    vmv.v.i v24, -1
1505 ; RV32-NEXT:    vsetivli zero, 12, e64, m8, ta, ma
1506 ; RV32-NEXT:    vssub.vv v8, v8, v24, v0.t
1507 ; RV32-NEXT:    vmv1r.v v0, v7
1508 ; RV32-NEXT:    vsetivli zero, 0, e64, m8, ta, ma
1509 ; RV32-NEXT:    vssub.vv v16, v16, v24, v0.t
1510 ; RV32-NEXT:    ret
1512 ; RV64-LABEL: vssub_vx_v32i64_evl12:
1513 ; RV64:       # %bb.0:
1514 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1515 ; RV64-NEXT:    vslidedown.vi v24, v0, 2
1516 ; RV64-NEXT:    li a0, -1
1517 ; RV64-NEXT:    vsetivli zero, 12, e64, m8, ta, ma
1518 ; RV64-NEXT:    vssub.vx v8, v8, a0, v0.t
1519 ; RV64-NEXT:    vmv1r.v v0, v24
1520 ; RV64-NEXT:    vsetivli zero, 0, e64, m8, ta, ma
1521 ; RV64-NEXT:    vssub.vx v16, v16, a0, v0.t
1522 ; RV64-NEXT:    ret
1523   %v = call <32 x i64> @llvm.vp.ssub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 12)
1524   ret <32 x i64> %v
1527 define <32 x i64> @vssub_vx_v32i64_evl27(<32 x i64> %va, <32 x i1> %m) {
1528 ; RV32-LABEL: vssub_vx_v32i64_evl27:
1529 ; RV32:       # %bb.0:
1530 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1531 ; RV32-NEXT:    vslidedown.vi v7, v0, 2
1532 ; RV32-NEXT:    li a0, 32
1533 ; RV32-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1534 ; RV32-NEXT:    vmv.v.i v24, -1
1535 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1536 ; RV32-NEXT:    vssub.vv v8, v8, v24, v0.t
1537 ; RV32-NEXT:    vmv1r.v v0, v7
1538 ; RV32-NEXT:    vsetivli zero, 11, e64, m8, ta, ma
1539 ; RV32-NEXT:    vssub.vv v16, v16, v24, v0.t
1540 ; RV32-NEXT:    ret
1542 ; RV64-LABEL: vssub_vx_v32i64_evl27:
1543 ; RV64:       # %bb.0:
1544 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1545 ; RV64-NEXT:    vslidedown.vi v24, v0, 2
1546 ; RV64-NEXT:    li a0, -1
1547 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1548 ; RV64-NEXT:    vssub.vx v8, v8, a0, v0.t
1549 ; RV64-NEXT:    vmv1r.v v0, v24
1550 ; RV64-NEXT:    vsetivli zero, 11, e64, m8, ta, ma
1551 ; RV64-NEXT:    vssub.vx v16, v16, a0, v0.t
1552 ; RV64-NEXT:    ret
1553   %v = call <32 x i64> @llvm.vp.ssub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 27)
1554   ret <32 x i64> %v