Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vssubu-vp.ll
blob6d8ed563f02bd2795a9e5f6871087ebcadaf555f
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.usub.sat.v8i7(<8 x i7>, <8 x i7>, <8 x i1>, i32)
9 define <8 x i7> @vssubu_vv_v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 zeroext %evl) {
10 ; CHECK-LABEL: vssubu_vv_v8i7:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    li a1, 127
13 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
14 ; CHECK-NEXT:    vand.vx v9, v9, a1
15 ; CHECK-NEXT:    vand.vx v8, v8, a1
16 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
17 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
18 ; CHECK-NEXT:    ret
19   %v = call <8 x i7> @llvm.vp.usub.sat.v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 %evl)
20   ret <8 x i7> %v
23 declare <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32)
25 define <2 x i8> @vssubu_vv_v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 zeroext %evl) {
26 ; CHECK-LABEL: vssubu_vv_v2i8:
27 ; CHECK:       # %bb.0:
28 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
29 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
30 ; CHECK-NEXT:    ret
31   %v = call <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 %evl)
32   ret <2 x i8> %v
35 define <2 x i8> @vssubu_vv_v2i8_unmasked(<2 x i8> %va, <2 x i8> %b, i32 zeroext %evl) {
36 ; CHECK-LABEL: vssubu_vv_v2i8_unmasked:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
39 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
40 ; CHECK-NEXT:    ret
41   %v = call <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> splat (i1 true), i32 %evl)
42   ret <2 x i8> %v
45 define <2 x i8> @vssubu_vx_v2i8(<2 x i8> %va, i8 %b, <2 x i1> %m, i32 zeroext %evl) {
46 ; CHECK-LABEL: vssubu_vx_v2i8:
47 ; CHECK:       # %bb.0:
48 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
49 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
50 ; CHECK-NEXT:    ret
51   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
52   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
53   %v = call <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 %evl)
54   ret <2 x i8> %v
57 define <2 x i8> @vssubu_vx_v2i8_unmasked(<2 x i8> %va, i8 %b, i32 zeroext %evl) {
58 ; CHECK-LABEL: vssubu_vx_v2i8_unmasked:
59 ; CHECK:       # %bb.0:
60 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
61 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
62 ; CHECK-NEXT:    ret
63   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
64   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
65   %v = call <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> splat (i1 true), i32 %evl)
66   ret <2 x i8> %v
69 define <2 x i8> @vssubu_vi_v2i8(<2 x i8> %va, <2 x i1> %m, i32 zeroext %evl) {
70 ; CHECK-LABEL: vssubu_vi_v2i8:
71 ; CHECK:       # %bb.0:
72 ; CHECK-NEXT:    li a1, -1
73 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
74 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
75 ; CHECK-NEXT:    ret
76   %v = call <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> %m, i32 %evl)
77   ret <2 x i8> %v
80 define <2 x i8> @vssubu_vi_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
81 ; CHECK-LABEL: vssubu_vi_v2i8_unmasked:
82 ; CHECK:       # %bb.0:
83 ; CHECK-NEXT:    li a1, -1
84 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
85 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
86 ; CHECK-NEXT:    ret
87   %v = call <2 x i8> @llvm.vp.usub.sat.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> splat (i1 true), i32 %evl)
88   ret <2 x i8> %v
91 declare <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32)
93 define <4 x i8> @vssubu_vv_v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 zeroext %evl) {
94 ; CHECK-LABEL: vssubu_vv_v4i8:
95 ; CHECK:       # %bb.0:
96 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
97 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
98 ; CHECK-NEXT:    ret
99   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 %evl)
100   ret <4 x i8> %v
103 define <4 x i8> @vssubu_vv_v4i8_unmasked(<4 x i8> %va, <4 x i8> %b, i32 zeroext %evl) {
104 ; CHECK-LABEL: vssubu_vv_v4i8_unmasked:
105 ; CHECK:       # %bb.0:
106 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
107 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
108 ; CHECK-NEXT:    ret
109   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> splat (i1 true), i32 %evl)
110   ret <4 x i8> %v
113 define <4 x i8> @vssubu_vx_v4i8(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) {
114 ; CHECK-LABEL: vssubu_vx_v4i8:
115 ; CHECK:       # %bb.0:
116 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
117 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
118 ; CHECK-NEXT:    ret
119   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
120   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
121   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 %evl)
122   ret <4 x i8> %v
125 define <4 x i8> @vssubu_vx_v4i8_commute(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) {
126 ; CHECK-LABEL: vssubu_vx_v4i8_commute:
127 ; CHECK:       # %bb.0:
128 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
129 ; CHECK-NEXT:    vmv.v.x v9, a0
130 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
131 ; CHECK-NEXT:    vssubu.vv v8, v9, v8, v0.t
132 ; CHECK-NEXT:    ret
133   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
134   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
135   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %vb, <4 x i8> %va, <4 x i1> %m, i32 %evl)
136   ret <4 x i8> %v
139 define <4 x i8> @vssubu_vx_v4i8_unmasked(<4 x i8> %va, i8 %b, i32 zeroext %evl) {
140 ; CHECK-LABEL: vssubu_vx_v4i8_unmasked:
141 ; CHECK:       # %bb.0:
142 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
143 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
144 ; CHECK-NEXT:    ret
145   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
146   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
147   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> splat (i1 true), i32 %evl)
148   ret <4 x i8> %v
151 define <4 x i8> @vssubu_vi_v4i8(<4 x i8> %va, <4 x i1> %m, i32 zeroext %evl) {
152 ; CHECK-LABEL: vssubu_vi_v4i8:
153 ; CHECK:       # %bb.0:
154 ; CHECK-NEXT:    li a1, -1
155 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
156 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
157 ; CHECK-NEXT:    ret
158   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> %m, i32 %evl)
159   ret <4 x i8> %v
162 define <4 x i8> @vssubu_vi_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
163 ; CHECK-LABEL: vssubu_vi_v4i8_unmasked:
164 ; CHECK:       # %bb.0:
165 ; CHECK-NEXT:    li a1, -1
166 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
167 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
168 ; CHECK-NEXT:    ret
169   %v = call <4 x i8> @llvm.vp.usub.sat.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> splat (i1 true), i32 %evl)
170   ret <4 x i8> %v
173 declare <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8>, <5 x i8>, <5 x i1>, i32)
175 define <5 x i8> @vssubu_vv_v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 zeroext %evl) {
176 ; CHECK-LABEL: vssubu_vv_v5i8:
177 ; CHECK:       # %bb.0:
178 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
179 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
180 ; CHECK-NEXT:    ret
181   %v = call <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 %evl)
182   ret <5 x i8> %v
185 define <5 x i8> @vssubu_vv_v5i8_unmasked(<5 x i8> %va, <5 x i8> %b, i32 zeroext %evl) {
186 ; CHECK-LABEL: vssubu_vv_v5i8_unmasked:
187 ; CHECK:       # %bb.0:
188 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
189 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
190 ; CHECK-NEXT:    ret
191   %v = call <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> splat (i1 true), i32 %evl)
192   ret <5 x i8> %v
195 define <5 x i8> @vssubu_vx_v5i8(<5 x i8> %va, i8 %b, <5 x i1> %m, i32 zeroext %evl) {
196 ; CHECK-LABEL: vssubu_vx_v5i8:
197 ; CHECK:       # %bb.0:
198 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
199 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
200 ; CHECK-NEXT:    ret
201   %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0
202   %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer
203   %v = call <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> %m, i32 %evl)
204   ret <5 x i8> %v
207 define <5 x i8> @vssubu_vx_v5i8_unmasked(<5 x i8> %va, i8 %b, i32 zeroext %evl) {
208 ; CHECK-LABEL: vssubu_vx_v5i8_unmasked:
209 ; CHECK:       # %bb.0:
210 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
211 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
212 ; CHECK-NEXT:    ret
213   %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0
214   %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer
215   %v = call <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> splat (i1 true), i32 %evl)
216   ret <5 x i8> %v
219 define <5 x i8> @vssubu_vi_v5i8(<5 x i8> %va, <5 x i1> %m, i32 zeroext %evl) {
220 ; CHECK-LABEL: vssubu_vi_v5i8:
221 ; CHECK:       # %bb.0:
222 ; CHECK-NEXT:    li a1, -1
223 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
224 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
225 ; CHECK-NEXT:    ret
226   %v = call <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> %m, i32 %evl)
227   ret <5 x i8> %v
230 define <5 x i8> @vssubu_vi_v5i8_unmasked(<5 x i8> %va, i32 zeroext %evl) {
231 ; CHECK-LABEL: vssubu_vi_v5i8_unmasked:
232 ; CHECK:       # %bb.0:
233 ; CHECK-NEXT:    li a1, -1
234 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
235 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
236 ; CHECK-NEXT:    ret
237   %v = call <5 x i8> @llvm.vp.usub.sat.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> splat (i1 true), i32 %evl)
238   ret <5 x i8> %v
241 declare <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32)
243 define <8 x i8> @vssubu_vv_v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 zeroext %evl) {
244 ; CHECK-LABEL: vssubu_vv_v8i8:
245 ; CHECK:       # %bb.0:
246 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
247 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
248 ; CHECK-NEXT:    ret
249   %v = call <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 %evl)
250   ret <8 x i8> %v
253 define <8 x i8> @vssubu_vv_v8i8_unmasked(<8 x i8> %va, <8 x i8> %b, i32 zeroext %evl) {
254 ; CHECK-LABEL: vssubu_vv_v8i8_unmasked:
255 ; CHECK:       # %bb.0:
256 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
257 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
258 ; CHECK-NEXT:    ret
259   %v = call <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> splat (i1 true), i32 %evl)
260   ret <8 x i8> %v
263 define <8 x i8> @vssubu_vx_v8i8(<8 x i8> %va, i8 %b, <8 x i1> %m, i32 zeroext %evl) {
264 ; CHECK-LABEL: vssubu_vx_v8i8:
265 ; CHECK:       # %bb.0:
266 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
267 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
268 ; CHECK-NEXT:    ret
269   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
270   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
271   %v = call <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 %evl)
272   ret <8 x i8> %v
275 define <8 x i8> @vssubu_vx_v8i8_unmasked(<8 x i8> %va, i8 %b, i32 zeroext %evl) {
276 ; CHECK-LABEL: vssubu_vx_v8i8_unmasked:
277 ; CHECK:       # %bb.0:
278 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
279 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
280 ; CHECK-NEXT:    ret
281   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
282   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
283   %v = call <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> splat (i1 true), i32 %evl)
284   ret <8 x i8> %v
287 define <8 x i8> @vssubu_vi_v8i8(<8 x i8> %va, <8 x i1> %m, i32 zeroext %evl) {
288 ; CHECK-LABEL: vssubu_vi_v8i8:
289 ; CHECK:       # %bb.0:
290 ; CHECK-NEXT:    li a1, -1
291 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
292 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
293 ; CHECK-NEXT:    ret
294   %v = call <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> %m, i32 %evl)
295   ret <8 x i8> %v
298 define <8 x i8> @vssubu_vi_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
299 ; CHECK-LABEL: vssubu_vi_v8i8_unmasked:
300 ; CHECK:       # %bb.0:
301 ; CHECK-NEXT:    li a1, -1
302 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
303 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
304 ; CHECK-NEXT:    ret
305   %v = call <8 x i8> @llvm.vp.usub.sat.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> splat (i1 true), i32 %evl)
306   ret <8 x i8> %v
309 declare <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8>, <16 x i8>, <16 x i1>, i32)
311 define <16 x i8> @vssubu_vv_v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 zeroext %evl) {
312 ; CHECK-LABEL: vssubu_vv_v16i8:
313 ; CHECK:       # %bb.0:
314 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
315 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
316 ; CHECK-NEXT:    ret
317   %v = call <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 %evl)
318   ret <16 x i8> %v
321 define <16 x i8> @vssubu_vv_v16i8_unmasked(<16 x i8> %va, <16 x i8> %b, i32 zeroext %evl) {
322 ; CHECK-LABEL: vssubu_vv_v16i8_unmasked:
323 ; CHECK:       # %bb.0:
324 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
325 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
326 ; CHECK-NEXT:    ret
327   %v = call <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> splat (i1 true), i32 %evl)
328   ret <16 x i8> %v
331 define <16 x i8> @vssubu_vx_v16i8(<16 x i8> %va, i8 %b, <16 x i1> %m, i32 zeroext %evl) {
332 ; CHECK-LABEL: vssubu_vx_v16i8:
333 ; CHECK:       # %bb.0:
334 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
335 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
336 ; CHECK-NEXT:    ret
337   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
338   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
339   %v = call <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 %evl)
340   ret <16 x i8> %v
343 define <16 x i8> @vssubu_vx_v16i8_unmasked(<16 x i8> %va, i8 %b, i32 zeroext %evl) {
344 ; CHECK-LABEL: vssubu_vx_v16i8_unmasked:
345 ; CHECK:       # %bb.0:
346 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
347 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
348 ; CHECK-NEXT:    ret
349   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
350   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
351   %v = call <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> splat (i1 true), i32 %evl)
352   ret <16 x i8> %v
355 define <16 x i8> @vssubu_vi_v16i8(<16 x i8> %va, <16 x i1> %m, i32 zeroext %evl) {
356 ; CHECK-LABEL: vssubu_vi_v16i8:
357 ; CHECK:       # %bb.0:
358 ; CHECK-NEXT:    li a1, -1
359 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
360 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
361 ; CHECK-NEXT:    ret
362   %v = call <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> %m, i32 %evl)
363   ret <16 x i8> %v
366 define <16 x i8> @vssubu_vi_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
367 ; CHECK-LABEL: vssubu_vi_v16i8_unmasked:
368 ; CHECK:       # %bb.0:
369 ; CHECK-NEXT:    li a1, -1
370 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
371 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
372 ; CHECK-NEXT:    ret
373   %v = call <16 x i8> @llvm.vp.usub.sat.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> splat (i1 true), i32 %evl)
374   ret <16 x i8> %v
377 declare <256 x i8> @llvm.vp.usub.sat.v258i8(<256 x i8>, <256 x i8>, <256 x i1>, i32)
379 define <256 x i8> @vssubu_vi_v258i8(<256 x i8> %va, <256 x i1> %m, i32 zeroext %evl) {
380 ; CHECK-LABEL: vssubu_vi_v258i8:
381 ; CHECK:       # %bb.0:
382 ; CHECK-NEXT:    vmv1r.v v24, v0
383 ; CHECK-NEXT:    li a2, 128
384 ; CHECK-NEXT:    vsetvli zero, a2, e8, m8, ta, ma
385 ; CHECK-NEXT:    vlm.v v0, (a0)
386 ; CHECK-NEXT:    addi a0, a1, -128
387 ; CHECK-NEXT:    sltu a3, a1, a0
388 ; CHECK-NEXT:    addi a3, a3, -1
389 ; CHECK-NEXT:    and a3, a3, a0
390 ; CHECK-NEXT:    li a0, -1
391 ; CHECK-NEXT:    vsetvli zero, a3, e8, m8, ta, ma
392 ; CHECK-NEXT:    vssubu.vx v16, v16, a0, v0.t
393 ; CHECK-NEXT:    bltu a1, a2, .LBB32_2
394 ; CHECK-NEXT:  # %bb.1:
395 ; CHECK-NEXT:    li a1, 128
396 ; CHECK-NEXT:  .LBB32_2:
397 ; CHECK-NEXT:    vmv1r.v v0, v24
398 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
399 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
400 ; CHECK-NEXT:    ret
401   %v = call <256 x i8> @llvm.vp.usub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 %evl)
402   ret <256 x i8> %v
405 define <256 x i8> @vssubu_vi_v258i8_unmasked(<256 x i8> %va, i32 zeroext %evl) {
406 ; CHECK-LABEL: vssubu_vi_v258i8_unmasked:
407 ; CHECK:       # %bb.0:
408 ; CHECK-NEXT:    li a2, 128
409 ; CHECK-NEXT:    mv a1, a0
410 ; CHECK-NEXT:    bltu a0, a2, .LBB33_2
411 ; CHECK-NEXT:  # %bb.1:
412 ; CHECK-NEXT:    li a1, 128
413 ; CHECK-NEXT:  .LBB33_2:
414 ; CHECK-NEXT:    li a2, -1
415 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
416 ; CHECK-NEXT:    vssubu.vx v8, v8, a2
417 ; CHECK-NEXT:    addi a1, a0, -128
418 ; CHECK-NEXT:    sltu a0, a0, a1
419 ; CHECK-NEXT:    addi a0, a0, -1
420 ; CHECK-NEXT:    and a0, a0, a1
421 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
422 ; CHECK-NEXT:    vssubu.vx v16, v16, a2
423 ; CHECK-NEXT:    ret
424   %v = call <256 x i8> @llvm.vp.usub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> splat (i1 true), i32 %evl)
425   ret <256 x i8> %v
428 ; Test splitting when the %evl is a known constant.
430 define <256 x i8> @vssubu_vi_v258i8_evl129(<256 x i8> %va, <256 x i1> %m) {
431 ; CHECK-LABEL: vssubu_vi_v258i8_evl129:
432 ; CHECK:       # %bb.0:
433 ; CHECK-NEXT:    li a1, 128
434 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
435 ; CHECK-NEXT:    vlm.v v24, (a0)
436 ; CHECK-NEXT:    li a0, -1
437 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
438 ; CHECK-NEXT:    vmv1r.v v0, v24
439 ; CHECK-NEXT:    vsetivli zero, 1, e8, m8, ta, ma
440 ; CHECK-NEXT:    vssubu.vx v16, v16, a0, v0.t
441 ; CHECK-NEXT:    ret
442   %v = call <256 x i8> @llvm.vp.usub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 129)
443   ret <256 x i8> %v
446 ; FIXME: The upper half is doing nothing.
448 define <256 x i8> @vssubu_vi_v258i8_evl128(<256 x i8> %va, <256 x i1> %m) {
449 ; CHECK-LABEL: vssubu_vi_v258i8_evl128:
450 ; CHECK:       # %bb.0:
451 ; CHECK-NEXT:    li a1, 128
452 ; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
453 ; CHECK-NEXT:    vlm.v v24, (a0)
454 ; CHECK-NEXT:    li a0, -1
455 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
456 ; CHECK-NEXT:    vmv1r.v v0, v24
457 ; CHECK-NEXT:    vsetivli zero, 0, e8, m8, ta, ma
458 ; CHECK-NEXT:    vssubu.vx v16, v16, a0, v0.t
459 ; CHECK-NEXT:    ret
460   %v = call <256 x i8> @llvm.vp.usub.sat.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 128)
461   ret <256 x i8> %v
464 declare <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32)
466 define <2 x i16> @vssubu_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) {
467 ; CHECK-LABEL: vssubu_vv_v2i16:
468 ; CHECK:       # %bb.0:
469 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
470 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
471 ; CHECK-NEXT:    ret
472   %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl)
473   ret <2 x i16> %v
476 define <2 x i16> @vssubu_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) {
477 ; CHECK-LABEL: vssubu_vv_v2i16_unmasked:
478 ; CHECK:       # %bb.0:
479 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
480 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
481 ; CHECK-NEXT:    ret
482   %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> splat (i1 true), i32 %evl)
483   ret <2 x i16> %v
486 define <2 x i16> @vssubu_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) {
487 ; CHECK-LABEL: vssubu_vx_v2i16:
488 ; CHECK:       # %bb.0:
489 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
490 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
491 ; CHECK-NEXT:    ret
492   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
493   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
494   %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl)
495   ret <2 x i16> %v
498 define <2 x i16> @vssubu_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) {
499 ; CHECK-LABEL: vssubu_vx_v2i16_unmasked:
500 ; CHECK:       # %bb.0:
501 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
502 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
503 ; CHECK-NEXT:    ret
504   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
505   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
506   %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> splat (i1 true), i32 %evl)
507   ret <2 x i16> %v
510 define <2 x i16> @vssubu_vi_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) {
511 ; CHECK-LABEL: vssubu_vi_v2i16:
512 ; CHECK:       # %bb.0:
513 ; CHECK-NEXT:    li a1, -1
514 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
515 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
516 ; CHECK-NEXT:    ret
517   %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> %m, i32 %evl)
518   ret <2 x i16> %v
521 define <2 x i16> @vssubu_vi_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
522 ; CHECK-LABEL: vssubu_vi_v2i16_unmasked:
523 ; CHECK:       # %bb.0:
524 ; CHECK-NEXT:    li a1, -1
525 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
526 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
527 ; CHECK-NEXT:    ret
528   %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> splat (i1 true), i32 %evl)
529   ret <2 x i16> %v
532 declare <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32)
534 define <4 x i16> @vssubu_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) {
535 ; CHECK-LABEL: vssubu_vv_v4i16:
536 ; CHECK:       # %bb.0:
537 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
538 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
539 ; CHECK-NEXT:    ret
540   %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl)
541   ret <4 x i16> %v
544 define <4 x i16> @vssubu_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) {
545 ; CHECK-LABEL: vssubu_vv_v4i16_unmasked:
546 ; CHECK:       # %bb.0:
547 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
548 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
549 ; CHECK-NEXT:    ret
550   %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> splat (i1 true), i32 %evl)
551   ret <4 x i16> %v
554 define <4 x i16> @vssubu_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) {
555 ; CHECK-LABEL: vssubu_vx_v4i16:
556 ; CHECK:       # %bb.0:
557 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
558 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
559 ; CHECK-NEXT:    ret
560   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
561   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
562   %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl)
563   ret <4 x i16> %v
566 define <4 x i16> @vssubu_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) {
567 ; CHECK-LABEL: vssubu_vx_v4i16_unmasked:
568 ; CHECK:       # %bb.0:
569 ; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
570 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
571 ; CHECK-NEXT:    ret
572   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
573   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
574   %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> splat (i1 true), i32 %evl)
575   ret <4 x i16> %v
578 define <4 x i16> @vssubu_vi_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) {
579 ; CHECK-LABEL: vssubu_vi_v4i16:
580 ; CHECK:       # %bb.0:
581 ; CHECK-NEXT:    li a1, -1
582 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
583 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
584 ; CHECK-NEXT:    ret
585   %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> %m, i32 %evl)
586   ret <4 x i16> %v
589 define <4 x i16> @vssubu_vi_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
590 ; CHECK-LABEL: vssubu_vi_v4i16_unmasked:
591 ; CHECK:       # %bb.0:
592 ; CHECK-NEXT:    li a1, -1
593 ; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
594 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
595 ; CHECK-NEXT:    ret
596   %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> splat (i1 true), i32 %evl)
597   ret <4 x i16> %v
600 declare <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32)
602 define <8 x i16> @vssubu_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) {
603 ; CHECK-LABEL: vssubu_vv_v8i16:
604 ; CHECK:       # %bb.0:
605 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
606 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
607 ; CHECK-NEXT:    ret
608   %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl)
609   ret <8 x i16> %v
612 define <8 x i16> @vssubu_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) {
613 ; CHECK-LABEL: vssubu_vv_v8i16_unmasked:
614 ; CHECK:       # %bb.0:
615 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
616 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
617 ; CHECK-NEXT:    ret
618   %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> splat (i1 true), i32 %evl)
619   ret <8 x i16> %v
622 define <8 x i16> @vssubu_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) {
623 ; CHECK-LABEL: vssubu_vx_v8i16:
624 ; CHECK:       # %bb.0:
625 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
626 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
627 ; CHECK-NEXT:    ret
628   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
629   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
630   %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl)
631   ret <8 x i16> %v
634 define <8 x i16> @vssubu_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) {
635 ; CHECK-LABEL: vssubu_vx_v8i16_unmasked:
636 ; CHECK:       # %bb.0:
637 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
638 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
639 ; CHECK-NEXT:    ret
640   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
641   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
642   %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> splat (i1 true), i32 %evl)
643   ret <8 x i16> %v
646 define <8 x i16> @vssubu_vi_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) {
647 ; CHECK-LABEL: vssubu_vi_v8i16:
648 ; CHECK:       # %bb.0:
649 ; CHECK-NEXT:    li a1, -1
650 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
651 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
652 ; CHECK-NEXT:    ret
653   %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> %m, i32 %evl)
654   ret <8 x i16> %v
657 define <8 x i16> @vssubu_vi_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
658 ; CHECK-LABEL: vssubu_vi_v8i16_unmasked:
659 ; CHECK:       # %bb.0:
660 ; CHECK-NEXT:    li a1, -1
661 ; CHECK-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
662 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
663 ; CHECK-NEXT:    ret
664   %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> splat (i1 true), i32 %evl)
665   ret <8 x i16> %v
668 declare <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32)
670 define <16 x i16> @vssubu_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) {
671 ; CHECK-LABEL: vssubu_vv_v16i16:
672 ; CHECK:       # %bb.0:
673 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
674 ; CHECK-NEXT:    vssubu.vv v8, v8, v10, v0.t
675 ; CHECK-NEXT:    ret
676   %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl)
677   ret <16 x i16> %v
680 define <16 x i16> @vssubu_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) {
681 ; CHECK-LABEL: vssubu_vv_v16i16_unmasked:
682 ; CHECK:       # %bb.0:
683 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
684 ; CHECK-NEXT:    vssubu.vv v8, v8, v10
685 ; CHECK-NEXT:    ret
686   %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> splat (i1 true), i32 %evl)
687   ret <16 x i16> %v
690 define <16 x i16> @vssubu_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) {
691 ; CHECK-LABEL: vssubu_vx_v16i16:
692 ; CHECK:       # %bb.0:
693 ; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
694 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
695 ; CHECK-NEXT:    ret
696   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
697   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
698   %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl)
699   ret <16 x i16> %v
702 define <16 x i16> @vssubu_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) {
703 ; CHECK-LABEL: vssubu_vx_v16i16_unmasked:
704 ; CHECK:       # %bb.0:
705 ; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
706 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
707 ; CHECK-NEXT:    ret
708   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
709   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
710   %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> splat (i1 true), i32 %evl)
711   ret <16 x i16> %v
714 define <16 x i16> @vssubu_vi_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) {
715 ; CHECK-LABEL: vssubu_vi_v16i16:
716 ; CHECK:       # %bb.0:
717 ; CHECK-NEXT:    li a1, -1
718 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
719 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
720 ; CHECK-NEXT:    ret
721   %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> %m, i32 %evl)
722   ret <16 x i16> %v
725 define <16 x i16> @vssubu_vi_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
726 ; CHECK-LABEL: vssubu_vi_v16i16_unmasked:
727 ; CHECK:       # %bb.0:
728 ; CHECK-NEXT:    li a1, -1
729 ; CHECK-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
730 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
731 ; CHECK-NEXT:    ret
732   %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> splat (i1 true), i32 %evl)
733   ret <16 x i16> %v
736 declare <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32)
738 define <2 x i32> @vssubu_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) {
739 ; CHECK-LABEL: vssubu_vv_v2i32:
740 ; CHECK:       # %bb.0:
741 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
742 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
743 ; CHECK-NEXT:    ret
744   %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl)
745   ret <2 x i32> %v
748 define <2 x i32> @vssubu_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) {
749 ; CHECK-LABEL: vssubu_vv_v2i32_unmasked:
750 ; CHECK:       # %bb.0:
751 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
752 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
753 ; CHECK-NEXT:    ret
754   %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> splat (i1 true), i32 %evl)
755   ret <2 x i32> %v
758 define <2 x i32> @vssubu_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) {
759 ; CHECK-LABEL: vssubu_vx_v2i32:
760 ; CHECK:       # %bb.0:
761 ; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
762 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
763 ; CHECK-NEXT:    ret
764   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
765   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
766   %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl)
767   ret <2 x i32> %v
770 define <2 x i32> @vssubu_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) {
771 ; CHECK-LABEL: vssubu_vx_v2i32_unmasked:
772 ; CHECK:       # %bb.0:
773 ; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
774 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
775 ; CHECK-NEXT:    ret
776   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
777   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
778   %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> splat (i1 true), i32 %evl)
779   ret <2 x i32> %v
782 define <2 x i32> @vssubu_vi_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) {
783 ; CHECK-LABEL: vssubu_vi_v2i32:
784 ; CHECK:       # %bb.0:
785 ; CHECK-NEXT:    li a1, -1
786 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
787 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
788 ; CHECK-NEXT:    ret
789   %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> %m, i32 %evl)
790   ret <2 x i32> %v
793 define <2 x i32> @vssubu_vi_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
794 ; CHECK-LABEL: vssubu_vi_v2i32_unmasked:
795 ; CHECK:       # %bb.0:
796 ; CHECK-NEXT:    li a1, -1
797 ; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
798 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
799 ; CHECK-NEXT:    ret
800   %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> splat (i1 true), i32 %evl)
801   ret <2 x i32> %v
804 declare <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)
806 define <4 x i32> @vssubu_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) {
807 ; CHECK-LABEL: vssubu_vv_v4i32:
808 ; CHECK:       # %bb.0:
809 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
810 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
811 ; CHECK-NEXT:    ret
812   %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl)
813   ret <4 x i32> %v
816 define <4 x i32> @vssubu_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) {
817 ; CHECK-LABEL: vssubu_vv_v4i32_unmasked:
818 ; CHECK:       # %bb.0:
819 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
820 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
821 ; CHECK-NEXT:    ret
822   %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> splat (i1 true), i32 %evl)
823   ret <4 x i32> %v
826 define <4 x i32> @vssubu_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) {
827 ; CHECK-LABEL: vssubu_vx_v4i32:
828 ; CHECK:       # %bb.0:
829 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
830 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
831 ; CHECK-NEXT:    ret
832   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
833   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
834   %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)
835   ret <4 x i32> %v
838 define <4 x i32> @vssubu_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) {
839 ; CHECK-LABEL: vssubu_vx_v4i32_unmasked:
840 ; CHECK:       # %bb.0:
841 ; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
842 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
843 ; CHECK-NEXT:    ret
844   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
845   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
846   %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> splat (i1 true), i32 %evl)
847   ret <4 x i32> %v
850 define <4 x i32> @vssubu_vi_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {
851 ; CHECK-LABEL: vssubu_vi_v4i32:
852 ; CHECK:       # %bb.0:
853 ; CHECK-NEXT:    li a1, -1
854 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
855 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
856 ; CHECK-NEXT:    ret
857   %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> %m, i32 %evl)
858   ret <4 x i32> %v
861 define <4 x i32> @vssubu_vi_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
862 ; CHECK-LABEL: vssubu_vi_v4i32_unmasked:
863 ; CHECK:       # %bb.0:
864 ; CHECK-NEXT:    li a1, -1
865 ; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
866 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
867 ; CHECK-NEXT:    ret
868   %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> splat (i1 true), i32 %evl)
869   ret <4 x i32> %v
872 declare <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
874 define <8 x i32> @vssubu_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) {
875 ; CHECK-LABEL: vssubu_vv_v8i32:
876 ; CHECK:       # %bb.0:
877 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
878 ; CHECK-NEXT:    vssubu.vv v8, v8, v10, v0.t
879 ; CHECK-NEXT:    ret
880   %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl)
881   ret <8 x i32> %v
884 define <8 x i32> @vssubu_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) {
885 ; CHECK-LABEL: vssubu_vv_v8i32_unmasked:
886 ; CHECK:       # %bb.0:
887 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
888 ; CHECK-NEXT:    vssubu.vv v8, v8, v10
889 ; CHECK-NEXT:    ret
890   %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> splat (i1 true), i32 %evl)
891   ret <8 x i32> %v
894 define <8 x i32> @vssubu_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) {
895 ; CHECK-LABEL: vssubu_vx_v8i32:
896 ; CHECK:       # %bb.0:
897 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
898 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
899 ; CHECK-NEXT:    ret
900   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
901   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
902   %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl)
903   ret <8 x i32> %v
906 define <8 x i32> @vssubu_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) {
907 ; CHECK-LABEL: vssubu_vx_v8i32_unmasked:
908 ; CHECK:       # %bb.0:
909 ; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
910 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
911 ; CHECK-NEXT:    ret
912   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
913   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
914   %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> splat (i1 true), i32 %evl)
915   ret <8 x i32> %v
918 define <8 x i32> @vssubu_vi_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) {
919 ; CHECK-LABEL: vssubu_vi_v8i32:
920 ; CHECK:       # %bb.0:
921 ; CHECK-NEXT:    li a1, -1
922 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
923 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
924 ; CHECK-NEXT:    ret
925   %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> %m, i32 %evl)
926   ret <8 x i32> %v
929 define <8 x i32> @vssubu_vi_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
930 ; CHECK-LABEL: vssubu_vi_v8i32_unmasked:
931 ; CHECK:       # %bb.0:
932 ; CHECK-NEXT:    li a1, -1
933 ; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
934 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
935 ; CHECK-NEXT:    ret
936   %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> splat (i1 true), i32 %evl)
937   ret <8 x i32> %v
940 declare <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32)
942 define <16 x i32> @vssubu_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) {
943 ; CHECK-LABEL: vssubu_vv_v16i32:
944 ; CHECK:       # %bb.0:
945 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
946 ; CHECK-NEXT:    vssubu.vv v8, v8, v12, v0.t
947 ; CHECK-NEXT:    ret
948   %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl)
949   ret <16 x i32> %v
952 define <16 x i32> @vssubu_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) {
953 ; CHECK-LABEL: vssubu_vv_v16i32_unmasked:
954 ; CHECK:       # %bb.0:
955 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
956 ; CHECK-NEXT:    vssubu.vv v8, v8, v12
957 ; CHECK-NEXT:    ret
958   %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> splat (i1 true), i32 %evl)
959   ret <16 x i32> %v
962 define <16 x i32> @vssubu_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) {
963 ; CHECK-LABEL: vssubu_vx_v16i32:
964 ; CHECK:       # %bb.0:
965 ; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
966 ; CHECK-NEXT:    vssubu.vx v8, v8, a0, v0.t
967 ; CHECK-NEXT:    ret
968   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
969   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
970   %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl)
971   ret <16 x i32> %v
974 define <16 x i32> @vssubu_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) {
975 ; CHECK-LABEL: vssubu_vx_v16i32_unmasked:
976 ; CHECK:       # %bb.0:
977 ; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
978 ; CHECK-NEXT:    vssubu.vx v8, v8, a0
979 ; CHECK-NEXT:    ret
980   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
981   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
982   %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> splat (i1 true), i32 %evl)
983   ret <16 x i32> %v
986 define <16 x i32> @vssubu_vi_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) {
987 ; CHECK-LABEL: vssubu_vi_v16i32:
988 ; CHECK:       # %bb.0:
989 ; CHECK-NEXT:    li a1, -1
990 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
991 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
992 ; CHECK-NEXT:    ret
993   %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> %m, i32 %evl)
994   ret <16 x i32> %v
997 define <16 x i32> @vssubu_vi_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
998 ; CHECK-LABEL: vssubu_vi_v16i32_unmasked:
999 ; CHECK:       # %bb.0:
1000 ; CHECK-NEXT:    li a1, -1
1001 ; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1002 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
1003 ; CHECK-NEXT:    ret
1004   %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> splat (i1 true), i32 %evl)
1005   ret <16 x i32> %v
1008 declare <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32)
1010 define <2 x i64> @vssubu_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) {
1011 ; CHECK-LABEL: vssubu_vv_v2i64:
1012 ; CHECK:       # %bb.0:
1013 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1014 ; CHECK-NEXT:    vssubu.vv v8, v8, v9, v0.t
1015 ; CHECK-NEXT:    ret
1016   %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl)
1017   ret <2 x i64> %v
1020 define <2 x i64> @vssubu_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) {
1021 ; CHECK-LABEL: vssubu_vv_v2i64_unmasked:
1022 ; CHECK:       # %bb.0:
1023 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1024 ; CHECK-NEXT:    vssubu.vv v8, v8, v9
1025 ; CHECK-NEXT:    ret
1026   %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> splat (i1 true), i32 %evl)
1027   ret <2 x i64> %v
1030 define <2 x i64> @vssubu_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) {
1031 ; RV32-LABEL: vssubu_vx_v2i64:
1032 ; RV32:       # %bb.0:
1033 ; RV32-NEXT:    addi sp, sp, -16
1034 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1035 ; RV32-NEXT:    sw a1, 12(sp)
1036 ; RV32-NEXT:    sw a0, 8(sp)
1037 ; RV32-NEXT:    addi a0, sp, 8
1038 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1039 ; RV32-NEXT:    vlse64.v v9, (a0), zero
1040 ; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1041 ; RV32-NEXT:    vssubu.vv v8, v8, v9, v0.t
1042 ; RV32-NEXT:    addi sp, sp, 16
1043 ; RV32-NEXT:    ret
1045 ; RV64-LABEL: vssubu_vx_v2i64:
1046 ; RV64:       # %bb.0:
1047 ; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1048 ; RV64-NEXT:    vssubu.vx v8, v8, a0, v0.t
1049 ; RV64-NEXT:    ret
1050   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1051   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1052   %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl)
1053   ret <2 x i64> %v
1056 define <2 x i64> @vssubu_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) {
1057 ; RV32-LABEL: vssubu_vx_v2i64_unmasked:
1058 ; RV32:       # %bb.0:
1059 ; RV32-NEXT:    addi sp, sp, -16
1060 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1061 ; RV32-NEXT:    sw a1, 12(sp)
1062 ; RV32-NEXT:    sw a0, 8(sp)
1063 ; RV32-NEXT:    addi a0, sp, 8
1064 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
1065 ; RV32-NEXT:    vlse64.v v9, (a0), zero
1066 ; RV32-NEXT:    vsetvli zero, a2, e64, m1, ta, ma
1067 ; RV32-NEXT:    vssubu.vv v8, v8, v9
1068 ; RV32-NEXT:    addi sp, sp, 16
1069 ; RV32-NEXT:    ret
1071 ; RV64-LABEL: vssubu_vx_v2i64_unmasked:
1072 ; RV64:       # %bb.0:
1073 ; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
1074 ; RV64-NEXT:    vssubu.vx v8, v8, a0
1075 ; RV64-NEXT:    ret
1076   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1077   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1078   %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> splat (i1 true), i32 %evl)
1079   ret <2 x i64> %v
1082 define <2 x i64> @vssubu_vi_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) {
1083 ; CHECK-LABEL: vssubu_vi_v2i64:
1084 ; CHECK:       # %bb.0:
1085 ; CHECK-NEXT:    li a1, -1
1086 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1087 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
1088 ; CHECK-NEXT:    ret
1089   %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> %m, i32 %evl)
1090   ret <2 x i64> %v
1093 define <2 x i64> @vssubu_vi_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
1094 ; CHECK-LABEL: vssubu_vi_v2i64_unmasked:
1095 ; CHECK:       # %bb.0:
1096 ; CHECK-NEXT:    li a1, -1
1097 ; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1098 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
1099 ; CHECK-NEXT:    ret
1100   %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> splat (i1 true), i32 %evl)
1101   ret <2 x i64> %v
1104 declare <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32)
1106 define <4 x i64> @vssubu_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) {
1107 ; CHECK-LABEL: vssubu_vv_v4i64:
1108 ; CHECK:       # %bb.0:
1109 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1110 ; CHECK-NEXT:    vssubu.vv v8, v8, v10, v0.t
1111 ; CHECK-NEXT:    ret
1112   %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl)
1113   ret <4 x i64> %v
1116 define <4 x i64> @vssubu_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) {
1117 ; CHECK-LABEL: vssubu_vv_v4i64_unmasked:
1118 ; CHECK:       # %bb.0:
1119 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1120 ; CHECK-NEXT:    vssubu.vv v8, v8, v10
1121 ; CHECK-NEXT:    ret
1122   %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> splat (i1 true), i32 %evl)
1123   ret <4 x i64> %v
1126 define <4 x i64> @vssubu_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) {
1127 ; RV32-LABEL: vssubu_vx_v4i64:
1128 ; RV32:       # %bb.0:
1129 ; RV32-NEXT:    addi sp, sp, -16
1130 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1131 ; RV32-NEXT:    sw a1, 12(sp)
1132 ; RV32-NEXT:    sw a0, 8(sp)
1133 ; RV32-NEXT:    addi a0, sp, 8
1134 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1135 ; RV32-NEXT:    vlse64.v v10, (a0), zero
1136 ; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1137 ; RV32-NEXT:    vssubu.vv v8, v8, v10, v0.t
1138 ; RV32-NEXT:    addi sp, sp, 16
1139 ; RV32-NEXT:    ret
1141 ; RV64-LABEL: vssubu_vx_v4i64:
1142 ; RV64:       # %bb.0:
1143 ; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1144 ; RV64-NEXT:    vssubu.vx v8, v8, a0, v0.t
1145 ; RV64-NEXT:    ret
1146   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1147   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1148   %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl)
1149   ret <4 x i64> %v
1152 define <4 x i64> @vssubu_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) {
1153 ; RV32-LABEL: vssubu_vx_v4i64_unmasked:
1154 ; RV32:       # %bb.0:
1155 ; RV32-NEXT:    addi sp, sp, -16
1156 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1157 ; RV32-NEXT:    sw a1, 12(sp)
1158 ; RV32-NEXT:    sw a0, 8(sp)
1159 ; RV32-NEXT:    addi a0, sp, 8
1160 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
1161 ; RV32-NEXT:    vlse64.v v10, (a0), zero
1162 ; RV32-NEXT:    vsetvli zero, a2, e64, m2, ta, ma
1163 ; RV32-NEXT:    vssubu.vv v8, v8, v10
1164 ; RV32-NEXT:    addi sp, sp, 16
1165 ; RV32-NEXT:    ret
1167 ; RV64-LABEL: vssubu_vx_v4i64_unmasked:
1168 ; RV64:       # %bb.0:
1169 ; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
1170 ; RV64-NEXT:    vssubu.vx v8, v8, a0
1171 ; RV64-NEXT:    ret
1172   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1173   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1174   %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl)
1175   ret <4 x i64> %v
1178 define <4 x i64> @vssubu_vi_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) {
1179 ; CHECK-LABEL: vssubu_vi_v4i64:
1180 ; CHECK:       # %bb.0:
1181 ; CHECK-NEXT:    li a1, -1
1182 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1183 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
1184 ; CHECK-NEXT:    ret
1185   %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> %m, i32 %evl)
1186   ret <4 x i64> %v
1189 define <4 x i64> @vssubu_vi_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
1190 ; CHECK-LABEL: vssubu_vi_v4i64_unmasked:
1191 ; CHECK:       # %bb.0:
1192 ; CHECK-NEXT:    li a1, -1
1193 ; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1194 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
1195 ; CHECK-NEXT:    ret
1196   %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> splat (i1 true), i32 %evl)
1197   ret <4 x i64> %v
1200 declare <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32)
1202 define <8 x i64> @vssubu_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) {
1203 ; CHECK-LABEL: vssubu_vv_v8i64:
1204 ; CHECK:       # %bb.0:
1205 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1206 ; CHECK-NEXT:    vssubu.vv v8, v8, v12, v0.t
1207 ; CHECK-NEXT:    ret
1208   %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl)
1209   ret <8 x i64> %v
1212 define <8 x i64> @vssubu_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) {
1213 ; CHECK-LABEL: vssubu_vv_v8i64_unmasked:
1214 ; CHECK:       # %bb.0:
1215 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1216 ; CHECK-NEXT:    vssubu.vv v8, v8, v12
1217 ; CHECK-NEXT:    ret
1218   %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> splat (i1 true), i32 %evl)
1219   ret <8 x i64> %v
1222 define <8 x i64> @vssubu_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) {
1223 ; RV32-LABEL: vssubu_vx_v8i64:
1224 ; RV32:       # %bb.0:
1225 ; RV32-NEXT:    addi sp, sp, -16
1226 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1227 ; RV32-NEXT:    sw a1, 12(sp)
1228 ; RV32-NEXT:    sw a0, 8(sp)
1229 ; RV32-NEXT:    addi a0, sp, 8
1230 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1231 ; RV32-NEXT:    vlse64.v v12, (a0), zero
1232 ; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1233 ; RV32-NEXT:    vssubu.vv v8, v8, v12, v0.t
1234 ; RV32-NEXT:    addi sp, sp, 16
1235 ; RV32-NEXT:    ret
1237 ; RV64-LABEL: vssubu_vx_v8i64:
1238 ; RV64:       # %bb.0:
1239 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1240 ; RV64-NEXT:    vssubu.vx v8, v8, a0, v0.t
1241 ; RV64-NEXT:    ret
1242   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1243   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1244   %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl)
1245   ret <8 x i64> %v
1248 define <8 x i64> @vssubu_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) {
1249 ; RV32-LABEL: vssubu_vx_v8i64_unmasked:
1250 ; RV32:       # %bb.0:
1251 ; RV32-NEXT:    addi sp, sp, -16
1252 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1253 ; RV32-NEXT:    sw a1, 12(sp)
1254 ; RV32-NEXT:    sw a0, 8(sp)
1255 ; RV32-NEXT:    addi a0, sp, 8
1256 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1257 ; RV32-NEXT:    vlse64.v v12, (a0), zero
1258 ; RV32-NEXT:    vsetvli zero, a2, e64, m4, ta, ma
1259 ; RV32-NEXT:    vssubu.vv v8, v8, v12
1260 ; RV32-NEXT:    addi sp, sp, 16
1261 ; RV32-NEXT:    ret
1263 ; RV64-LABEL: vssubu_vx_v8i64_unmasked:
1264 ; RV64:       # %bb.0:
1265 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1266 ; RV64-NEXT:    vssubu.vx v8, v8, a0
1267 ; RV64-NEXT:    ret
1268   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1269   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1270   %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> splat (i1 true), i32 %evl)
1271   ret <8 x i64> %v
1274 define <8 x i64> @vssubu_vi_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) {
1275 ; CHECK-LABEL: vssubu_vi_v8i64:
1276 ; CHECK:       # %bb.0:
1277 ; CHECK-NEXT:    li a1, -1
1278 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1279 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
1280 ; CHECK-NEXT:    ret
1281   %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> %m, i32 %evl)
1282   ret <8 x i64> %v
1285 define <8 x i64> @vssubu_vi_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
1286 ; CHECK-LABEL: vssubu_vi_v8i64_unmasked:
1287 ; CHECK:       # %bb.0:
1288 ; CHECK-NEXT:    li a1, -1
1289 ; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1290 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
1291 ; CHECK-NEXT:    ret
1292   %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> splat (i1 true), i32 %evl)
1293   ret <8 x i64> %v
1296 declare <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32)
1298 define <16 x i64> @vssubu_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) {
1299 ; CHECK-LABEL: vssubu_vv_v16i64:
1300 ; CHECK:       # %bb.0:
1301 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1302 ; CHECK-NEXT:    vssubu.vv v8, v8, v16, v0.t
1303 ; CHECK-NEXT:    ret
1304   %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl)
1305   ret <16 x i64> %v
1308 define <16 x i64> @vssubu_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) {
1309 ; CHECK-LABEL: vssubu_vv_v16i64_unmasked:
1310 ; CHECK:       # %bb.0:
1311 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1312 ; CHECK-NEXT:    vssubu.vv v8, v8, v16
1313 ; CHECK-NEXT:    ret
1314   %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> splat (i1 true), i32 %evl)
1315   ret <16 x i64> %v
1318 define <16 x i64> @vssubu_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) {
1319 ; RV32-LABEL: vssubu_vx_v16i64:
1320 ; RV32:       # %bb.0:
1321 ; RV32-NEXT:    addi sp, sp, -16
1322 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1323 ; RV32-NEXT:    sw a1, 12(sp)
1324 ; RV32-NEXT:    sw a0, 8(sp)
1325 ; RV32-NEXT:    addi a0, sp, 8
1326 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1327 ; RV32-NEXT:    vlse64.v v16, (a0), zero
1328 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1329 ; RV32-NEXT:    vssubu.vv v8, v8, v16, v0.t
1330 ; RV32-NEXT:    addi sp, sp, 16
1331 ; RV32-NEXT:    ret
1333 ; RV64-LABEL: vssubu_vx_v16i64:
1334 ; RV64:       # %bb.0:
1335 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1336 ; RV64-NEXT:    vssubu.vx v8, v8, a0, v0.t
1337 ; RV64-NEXT:    ret
1338   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1339   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1340   %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl)
1341   ret <16 x i64> %v
1344 define <16 x i64> @vssubu_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) {
1345 ; RV32-LABEL: vssubu_vx_v16i64_unmasked:
1346 ; RV32:       # %bb.0:
1347 ; RV32-NEXT:    addi sp, sp, -16
1348 ; RV32-NEXT:    .cfi_def_cfa_offset 16
1349 ; RV32-NEXT:    sw a1, 12(sp)
1350 ; RV32-NEXT:    sw a0, 8(sp)
1351 ; RV32-NEXT:    addi a0, sp, 8
1352 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1353 ; RV32-NEXT:    vlse64.v v16, (a0), zero
1354 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
1355 ; RV32-NEXT:    vssubu.vv v8, v8, v16
1356 ; RV32-NEXT:    addi sp, sp, 16
1357 ; RV32-NEXT:    ret
1359 ; RV64-LABEL: vssubu_vx_v16i64_unmasked:
1360 ; RV64:       # %bb.0:
1361 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1362 ; RV64-NEXT:    vssubu.vx v8, v8, a0
1363 ; RV64-NEXT:    ret
1364   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1365   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1366   %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> splat (i1 true), i32 %evl)
1367   ret <16 x i64> %v
1370 define <16 x i64> @vssubu_vi_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) {
1371 ; CHECK-LABEL: vssubu_vi_v16i64:
1372 ; CHECK:       # %bb.0:
1373 ; CHECK-NEXT:    li a1, -1
1374 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1375 ; CHECK-NEXT:    vssubu.vx v8, v8, a1, v0.t
1376 ; CHECK-NEXT:    ret
1377   %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> %m, i32 %evl)
1378   ret <16 x i64> %v
1381 define <16 x i64> @vssubu_vi_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
1382 ; CHECK-LABEL: vssubu_vi_v16i64_unmasked:
1383 ; CHECK:       # %bb.0:
1384 ; CHECK-NEXT:    li a1, -1
1385 ; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1386 ; CHECK-NEXT:    vssubu.vx v8, v8, a1
1387 ; CHECK-NEXT:    ret
1388   %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> splat (i1 true), i32 %evl)
1389   ret <16 x i64> %v
1392 ; Test that split-legalization works as expected.
1394 declare <32 x i64> @llvm.vp.usub.sat.v32i64(<32 x i64>, <32 x i64>, <32 x i1>, i32)
1396 define <32 x i64> @vssubu_vx_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) {
1397 ; RV32-LABEL: vssubu_vx_v32i64:
1398 ; RV32:       # %bb.0:
1399 ; RV32-NEXT:    li a2, 16
1400 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1401 ; RV32-NEXT:    vslidedown.vi v7, v0, 2
1402 ; RV32-NEXT:    mv a1, a0
1403 ; RV32-NEXT:    bltu a0, a2, .LBB108_2
1404 ; RV32-NEXT:  # %bb.1:
1405 ; RV32-NEXT:    li a1, 16
1406 ; RV32-NEXT:  .LBB108_2:
1407 ; RV32-NEXT:    li a2, 32
1408 ; RV32-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1409 ; RV32-NEXT:    vmv.v.i v24, -1
1410 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1411 ; RV32-NEXT:    vssubu.vv v8, v8, v24, v0.t
1412 ; RV32-NEXT:    addi a1, a0, -16
1413 ; RV32-NEXT:    sltu a0, a0, a1
1414 ; RV32-NEXT:    addi a0, a0, -1
1415 ; RV32-NEXT:    and a0, a0, a1
1416 ; RV32-NEXT:    vmv1r.v v0, v7
1417 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1418 ; RV32-NEXT:    vssubu.vv v16, v16, v24, v0.t
1419 ; RV32-NEXT:    ret
1421 ; RV64-LABEL: vssubu_vx_v32i64:
1422 ; RV64:       # %bb.0:
1423 ; RV64-NEXT:    li a2, 16
1424 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1425 ; RV64-NEXT:    vslidedown.vi v24, v0, 2
1426 ; RV64-NEXT:    mv a1, a0
1427 ; RV64-NEXT:    bltu a0, a2, .LBB108_2
1428 ; RV64-NEXT:  # %bb.1:
1429 ; RV64-NEXT:    li a1, 16
1430 ; RV64-NEXT:  .LBB108_2:
1431 ; RV64-NEXT:    li a2, -1
1432 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1433 ; RV64-NEXT:    vssubu.vx v8, v8, a2, v0.t
1434 ; RV64-NEXT:    addi a1, a0, -16
1435 ; RV64-NEXT:    sltu a0, a0, a1
1436 ; RV64-NEXT:    addi a0, a0, -1
1437 ; RV64-NEXT:    and a0, a0, a1
1438 ; RV64-NEXT:    vmv1r.v v0, v24
1439 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1440 ; RV64-NEXT:    vssubu.vx v16, v16, a2, v0.t
1441 ; RV64-NEXT:    ret
1442   %v = call <32 x i64> @llvm.vp.usub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 %evl)
1443   ret <32 x i64> %v
1446 define <32 x i64> @vssubu_vi_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
1447 ; RV32-LABEL: vssubu_vi_v32i64_unmasked:
1448 ; RV32:       # %bb.0:
1449 ; RV32-NEXT:    li a2, 16
1450 ; RV32-NEXT:    mv a1, a0
1451 ; RV32-NEXT:    bltu a0, a2, .LBB109_2
1452 ; RV32-NEXT:  # %bb.1:
1453 ; RV32-NEXT:    li a1, 16
1454 ; RV32-NEXT:  .LBB109_2:
1455 ; RV32-NEXT:    li a2, 32
1456 ; RV32-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1457 ; RV32-NEXT:    vmv.v.i v24, -1
1458 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1459 ; RV32-NEXT:    vssubu.vv v8, v8, v24
1460 ; RV32-NEXT:    addi a1, a0, -16
1461 ; RV32-NEXT:    sltu a0, a0, a1
1462 ; RV32-NEXT:    addi a0, a0, -1
1463 ; RV32-NEXT:    and a0, a0, a1
1464 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1465 ; RV32-NEXT:    vssubu.vv v16, v16, v24
1466 ; RV32-NEXT:    ret
1468 ; RV64-LABEL: vssubu_vi_v32i64_unmasked:
1469 ; RV64:       # %bb.0:
1470 ; RV64-NEXT:    li a2, 16
1471 ; RV64-NEXT:    mv a1, a0
1472 ; RV64-NEXT:    bltu a0, a2, .LBB109_2
1473 ; RV64-NEXT:  # %bb.1:
1474 ; RV64-NEXT:    li a1, 16
1475 ; RV64-NEXT:  .LBB109_2:
1476 ; RV64-NEXT:    li a2, -1
1477 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1478 ; RV64-NEXT:    vssubu.vx v8, v8, a2
1479 ; RV64-NEXT:    addi a1, a0, -16
1480 ; RV64-NEXT:    sltu a0, a0, a1
1481 ; RV64-NEXT:    addi a0, a0, -1
1482 ; RV64-NEXT:    and a0, a0, a1
1483 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1484 ; RV64-NEXT:    vssubu.vx v16, v16, a2
1485 ; RV64-NEXT:    ret
1486   %v = call <32 x i64> @llvm.vp.usub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> splat (i1 true), i32 %evl)
1487   ret <32 x i64> %v
1490 ; FIXME: We don't match vssubu.vi on RV32.
1492 define <32 x i64> @vssubu_vx_v32i64_evl12(<32 x i64> %va, <32 x i1> %m) {
1493 ; RV32-LABEL: vssubu_vx_v32i64_evl12:
1494 ; RV32:       # %bb.0:
1495 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1496 ; RV32-NEXT:    vslidedown.vi v7, v0, 2
1497 ; RV32-NEXT:    li a0, 32
1498 ; RV32-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1499 ; RV32-NEXT:    vmv.v.i v24, -1
1500 ; RV32-NEXT:    vsetivli zero, 12, e64, m8, ta, ma
1501 ; RV32-NEXT:    vssubu.vv v8, v8, v24, v0.t
1502 ; RV32-NEXT:    vmv1r.v v0, v7
1503 ; RV32-NEXT:    vsetivli zero, 0, e64, m8, ta, ma
1504 ; RV32-NEXT:    vssubu.vv v16, v16, v24, v0.t
1505 ; RV32-NEXT:    ret
1507 ; RV64-LABEL: vssubu_vx_v32i64_evl12:
1508 ; RV64:       # %bb.0:
1509 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1510 ; RV64-NEXT:    vslidedown.vi v24, v0, 2
1511 ; RV64-NEXT:    li a0, -1
1512 ; RV64-NEXT:    vsetivli zero, 12, e64, m8, ta, ma
1513 ; RV64-NEXT:    vssubu.vx v8, v8, a0, v0.t
1514 ; RV64-NEXT:    vmv1r.v v0, v24
1515 ; RV64-NEXT:    vsetivli zero, 0, e64, m8, ta, ma
1516 ; RV64-NEXT:    vssubu.vx v16, v16, a0, v0.t
1517 ; RV64-NEXT:    ret
1518   %v = call <32 x i64> @llvm.vp.usub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 12)
1519   ret <32 x i64> %v
1522 define <32 x i64> @vssubu_vx_v32i64_evl27(<32 x i64> %va, <32 x i1> %m) {
1523 ; RV32-LABEL: vssubu_vx_v32i64_evl27:
1524 ; RV32:       # %bb.0:
1525 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1526 ; RV32-NEXT:    vslidedown.vi v7, v0, 2
1527 ; RV32-NEXT:    li a0, 32
1528 ; RV32-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
1529 ; RV32-NEXT:    vmv.v.i v24, -1
1530 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1531 ; RV32-NEXT:    vssubu.vv v8, v8, v24, v0.t
1532 ; RV32-NEXT:    vmv1r.v v0, v7
1533 ; RV32-NEXT:    vsetivli zero, 11, e64, m8, ta, ma
1534 ; RV32-NEXT:    vssubu.vv v16, v16, v24, v0.t
1535 ; RV32-NEXT:    ret
1537 ; RV64-LABEL: vssubu_vx_v32i64_evl27:
1538 ; RV64:       # %bb.0:
1539 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1540 ; RV64-NEXT:    vslidedown.vi v24, v0, 2
1541 ; RV64-NEXT:    li a0, -1
1542 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1543 ; RV64-NEXT:    vssubu.vx v8, v8, a0, v0.t
1544 ; RV64-NEXT:    vmv1r.v v0, v24
1545 ; RV64-NEXT:    vsetivli zero, 11, e64, m8, ta, ma
1546 ; RV64-NEXT:    vssubu.vx v16, v16, a0, v0.t
1547 ; RV64-NEXT:    ret
1548   %v = call <32 x i64> @llvm.vp.usub.sat.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 27)
1549   ret <32 x i64> %v