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:
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
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)
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:
28 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
29 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
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)
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:
38 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
39 ; CHECK-NEXT: vssubu.vv v8, v8, v9
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)
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:
48 ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma
49 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
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)
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:
60 ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma
61 ; CHECK-NEXT: vssubu.vx v8, v8, a0
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)
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:
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
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)
80 define <2 x i8> @vssubu_vi_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) {
81 ; CHECK-LABEL: vssubu_vi_v2i8_unmasked:
83 ; CHECK-NEXT: li a1, -1
84 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma
85 ; CHECK-NEXT: vssubu.vx v8, v8, a1
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)
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:
96 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
97 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
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)
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:
106 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
107 ; CHECK-NEXT: vssubu.vv v8, v8, v9
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)
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:
116 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma
117 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
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)
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:
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
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)
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:
142 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma
143 ; CHECK-NEXT: vssubu.vx v8, v8, a0
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)
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:
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
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)
162 define <4 x i8> @vssubu_vi_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) {
163 ; CHECK-LABEL: vssubu_vi_v4i8_unmasked:
165 ; CHECK-NEXT: li a1, -1
166 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma
167 ; CHECK-NEXT: vssubu.vx v8, v8, a1
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)
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:
178 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
179 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
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)
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:
188 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
189 ; CHECK-NEXT: vssubu.vv v8, v8, v9
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)
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:
198 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
199 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
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)
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:
210 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
211 ; CHECK-NEXT: vssubu.vx v8, v8, a0
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)
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:
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
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)
230 define <5 x i8> @vssubu_vi_v5i8_unmasked(<5 x i8> %va, i32 zeroext %evl) {
231 ; CHECK-LABEL: vssubu_vi_v5i8_unmasked:
233 ; CHECK-NEXT: li a1, -1
234 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
235 ; CHECK-NEXT: vssubu.vx v8, v8, a1
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)
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:
246 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
247 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
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)
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:
256 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
257 ; CHECK-NEXT: vssubu.vv v8, v8, v9
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)
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:
266 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
267 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
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)
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:
278 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
279 ; CHECK-NEXT: vssubu.vx v8, v8, a0
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)
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:
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
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)
298 define <8 x i8> @vssubu_vi_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) {
299 ; CHECK-LABEL: vssubu_vi_v8i8_unmasked:
301 ; CHECK-NEXT: li a1, -1
302 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma
303 ; CHECK-NEXT: vssubu.vx v8, v8, a1
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)
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:
314 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
315 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
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)
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:
324 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
325 ; CHECK-NEXT: vssubu.vv v8, v8, v9
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)
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:
334 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma
335 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
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)
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:
346 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma
347 ; CHECK-NEXT: vssubu.vx v8, v8, a0
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)
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:
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
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)
366 define <16 x i8> @vssubu_vi_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) {
367 ; CHECK-LABEL: vssubu_vi_v16i8_unmasked:
369 ; CHECK-NEXT: li a1, -1
370 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma
371 ; CHECK-NEXT: vssubu.vx v8, v8, a1
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)
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:
382 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
383 ; CHECK-NEXT: vmv1r.v v24, v0
384 ; CHECK-NEXT: li a2, 128
385 ; CHECK-NEXT: addi a3, a1, -128
386 ; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma
387 ; CHECK-NEXT: vlm.v v0, (a0)
388 ; CHECK-NEXT: sltu a0, a1, a3
389 ; CHECK-NEXT: addi a0, a0, -1
390 ; CHECK-NEXT: and a3, a0, a3
391 ; CHECK-NEXT: li a0, -1
392 ; CHECK-NEXT: vsetvli zero, a3, e8, m8, ta, ma
393 ; CHECK-NEXT: vssubu.vx v16, v16, a0, v0.t
394 ; CHECK-NEXT: bltu a1, a2, .LBB32_2
395 ; CHECK-NEXT: # %bb.1:
396 ; CHECK-NEXT: li a1, 128
397 ; CHECK-NEXT: .LBB32_2:
398 ; CHECK-NEXT: vmv1r.v v0, v24
399 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma
400 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
402 %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)
406 define <256 x i8> @vssubu_vi_v258i8_unmasked(<256 x i8> %va, i32 zeroext %evl) {
407 ; CHECK-LABEL: vssubu_vi_v258i8_unmasked:
409 ; CHECK-NEXT: li a2, 128
410 ; CHECK-NEXT: mv a1, a0
411 ; CHECK-NEXT: bltu a0, a2, .LBB33_2
412 ; CHECK-NEXT: # %bb.1:
413 ; CHECK-NEXT: li a1, 128
414 ; CHECK-NEXT: .LBB33_2:
415 ; CHECK-NEXT: li a2, -1
416 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma
417 ; CHECK-NEXT: vssubu.vx v8, v8, a2
418 ; CHECK-NEXT: addi a1, a0, -128
419 ; CHECK-NEXT: sltu a0, a0, a1
420 ; CHECK-NEXT: addi a0, a0, -1
421 ; CHECK-NEXT: and a0, a0, a1
422 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
423 ; CHECK-NEXT: vssubu.vx v16, v16, a2
425 %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)
429 ; Test splitting when the %evl is a known constant.
431 define <256 x i8> @vssubu_vi_v258i8_evl129(<256 x i8> %va, <256 x i1> %m) {
432 ; CHECK-LABEL: vssubu_vi_v258i8_evl129:
434 ; CHECK-NEXT: li a1, 128
435 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma
436 ; CHECK-NEXT: vlm.v v24, (a0)
437 ; CHECK-NEXT: li a0, -1
438 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
439 ; CHECK-NEXT: vmv1r.v v0, v24
440 ; CHECK-NEXT: vsetivli zero, 1, e8, m8, ta, ma
441 ; CHECK-NEXT: vssubu.vx v16, v16, a0, v0.t
443 %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)
447 ; FIXME: The upper half is doing nothing.
449 define <256 x i8> @vssubu_vi_v258i8_evl128(<256 x i8> %va, <256 x i1> %m) {
450 ; CHECK-LABEL: vssubu_vi_v258i8_evl128:
452 ; CHECK-NEXT: li a1, 128
453 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma
454 ; CHECK-NEXT: vlm.v v24, (a0)
455 ; CHECK-NEXT: li a0, -1
456 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
457 ; CHECK-NEXT: vmv1r.v v0, v24
458 ; CHECK-NEXT: vsetivli zero, 0, e8, m8, ta, ma
459 ; CHECK-NEXT: vssubu.vx v16, v16, a0, v0.t
461 %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)
465 declare <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32)
467 define <2 x i16> @vssubu_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) {
468 ; CHECK-LABEL: vssubu_vv_v2i16:
470 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
471 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
473 %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl)
477 define <2 x i16> @vssubu_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) {
478 ; CHECK-LABEL: vssubu_vv_v2i16_unmasked:
480 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
481 ; CHECK-NEXT: vssubu.vv v8, v8, v9
483 %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)
487 define <2 x i16> @vssubu_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) {
488 ; CHECK-LABEL: vssubu_vx_v2i16:
490 ; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma
491 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
493 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
494 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
495 %v = call <2 x i16> @llvm.vp.usub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl)
499 define <2 x i16> @vssubu_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) {
500 ; CHECK-LABEL: vssubu_vx_v2i16_unmasked:
502 ; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma
503 ; CHECK-NEXT: vssubu.vx v8, v8, a0
505 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
506 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
507 %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)
511 define <2 x i16> @vssubu_vi_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) {
512 ; CHECK-LABEL: vssubu_vi_v2i16:
514 ; CHECK-NEXT: li a1, -1
515 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
516 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
518 %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)
522 define <2 x i16> @vssubu_vi_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) {
523 ; CHECK-LABEL: vssubu_vi_v2i16_unmasked:
525 ; CHECK-NEXT: li a1, -1
526 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
527 ; CHECK-NEXT: vssubu.vx v8, v8, a1
529 %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)
533 declare <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32)
535 define <4 x i16> @vssubu_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) {
536 ; CHECK-LABEL: vssubu_vv_v4i16:
538 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
539 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
541 %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl)
545 define <4 x i16> @vssubu_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) {
546 ; CHECK-LABEL: vssubu_vv_v4i16_unmasked:
548 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
549 ; CHECK-NEXT: vssubu.vv v8, v8, v9
551 %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)
555 define <4 x i16> @vssubu_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) {
556 ; CHECK-LABEL: vssubu_vx_v4i16:
558 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma
559 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
561 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
562 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
563 %v = call <4 x i16> @llvm.vp.usub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl)
567 define <4 x i16> @vssubu_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) {
568 ; CHECK-LABEL: vssubu_vx_v4i16_unmasked:
570 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma
571 ; CHECK-NEXT: vssubu.vx v8, v8, a0
573 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
574 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
575 %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)
579 define <4 x i16> @vssubu_vi_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) {
580 ; CHECK-LABEL: vssubu_vi_v4i16:
582 ; CHECK-NEXT: li a1, -1
583 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
584 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
586 %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)
590 define <4 x i16> @vssubu_vi_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) {
591 ; CHECK-LABEL: vssubu_vi_v4i16_unmasked:
593 ; CHECK-NEXT: li a1, -1
594 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
595 ; CHECK-NEXT: vssubu.vx v8, v8, a1
597 %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)
601 declare <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32)
603 define <8 x i16> @vssubu_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) {
604 ; CHECK-LABEL: vssubu_vv_v8i16:
606 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
607 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
609 %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl)
613 define <8 x i16> @vssubu_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) {
614 ; CHECK-LABEL: vssubu_vv_v8i16_unmasked:
616 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
617 ; CHECK-NEXT: vssubu.vv v8, v8, v9
619 %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)
623 define <8 x i16> @vssubu_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) {
624 ; CHECK-LABEL: vssubu_vx_v8i16:
626 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
627 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
629 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
630 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
631 %v = call <8 x i16> @llvm.vp.usub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl)
635 define <8 x i16> @vssubu_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) {
636 ; CHECK-LABEL: vssubu_vx_v8i16_unmasked:
638 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
639 ; CHECK-NEXT: vssubu.vx v8, v8, a0
641 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
642 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
643 %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)
647 define <8 x i16> @vssubu_vi_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) {
648 ; CHECK-LABEL: vssubu_vi_v8i16:
650 ; CHECK-NEXT: li a1, -1
651 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
652 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
654 %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)
658 define <8 x i16> @vssubu_vi_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) {
659 ; CHECK-LABEL: vssubu_vi_v8i16_unmasked:
661 ; CHECK-NEXT: li a1, -1
662 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma
663 ; CHECK-NEXT: vssubu.vx v8, v8, a1
665 %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)
669 declare <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32)
671 define <16 x i16> @vssubu_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) {
672 ; CHECK-LABEL: vssubu_vv_v16i16:
674 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
675 ; CHECK-NEXT: vssubu.vv v8, v8, v10, v0.t
677 %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl)
681 define <16 x i16> @vssubu_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) {
682 ; CHECK-LABEL: vssubu_vv_v16i16_unmasked:
684 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
685 ; CHECK-NEXT: vssubu.vv v8, v8, v10
687 %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)
691 define <16 x i16> @vssubu_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) {
692 ; CHECK-LABEL: vssubu_vx_v16i16:
694 ; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma
695 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
697 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
698 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
699 %v = call <16 x i16> @llvm.vp.usub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl)
703 define <16 x i16> @vssubu_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) {
704 ; CHECK-LABEL: vssubu_vx_v16i16_unmasked:
706 ; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma
707 ; CHECK-NEXT: vssubu.vx v8, v8, a0
709 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
710 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
711 %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)
715 define <16 x i16> @vssubu_vi_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) {
716 ; CHECK-LABEL: vssubu_vi_v16i16:
718 ; CHECK-NEXT: li a1, -1
719 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
720 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
722 %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)
726 define <16 x i16> @vssubu_vi_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) {
727 ; CHECK-LABEL: vssubu_vi_v16i16_unmasked:
729 ; CHECK-NEXT: li a1, -1
730 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma
731 ; CHECK-NEXT: vssubu.vx v8, v8, a1
733 %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)
737 declare <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32)
739 define <2 x i32> @vssubu_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) {
740 ; CHECK-LABEL: vssubu_vv_v2i32:
742 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
743 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
745 %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl)
749 define <2 x i32> @vssubu_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) {
750 ; CHECK-LABEL: vssubu_vv_v2i32_unmasked:
752 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
753 ; CHECK-NEXT: vssubu.vv v8, v8, v9
755 %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)
759 define <2 x i32> @vssubu_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) {
760 ; CHECK-LABEL: vssubu_vx_v2i32:
762 ; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma
763 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
765 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
766 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
767 %v = call <2 x i32> @llvm.vp.usub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl)
771 define <2 x i32> @vssubu_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) {
772 ; CHECK-LABEL: vssubu_vx_v2i32_unmasked:
774 ; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma
775 ; CHECK-NEXT: vssubu.vx v8, v8, a0
777 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
778 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
779 %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)
783 define <2 x i32> @vssubu_vi_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) {
784 ; CHECK-LABEL: vssubu_vi_v2i32:
786 ; CHECK-NEXT: li a1, -1
787 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
788 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
790 %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)
794 define <2 x i32> @vssubu_vi_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) {
795 ; CHECK-LABEL: vssubu_vi_v2i32_unmasked:
797 ; CHECK-NEXT: li a1, -1
798 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma
799 ; CHECK-NEXT: vssubu.vx v8, v8, a1
801 %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)
805 declare <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32)
807 define <4 x i32> @vssubu_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) {
808 ; CHECK-LABEL: vssubu_vv_v4i32:
810 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
811 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
813 %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl)
817 define <4 x i32> @vssubu_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) {
818 ; CHECK-LABEL: vssubu_vv_v4i32_unmasked:
820 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
821 ; CHECK-NEXT: vssubu.vv v8, v8, v9
823 %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)
827 define <4 x i32> @vssubu_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) {
828 ; CHECK-LABEL: vssubu_vx_v4i32:
830 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
831 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
833 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
834 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
835 %v = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl)
839 define <4 x i32> @vssubu_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) {
840 ; CHECK-LABEL: vssubu_vx_v4i32_unmasked:
842 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
843 ; CHECK-NEXT: vssubu.vx v8, v8, a0
845 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
846 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
847 %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)
851 define <4 x i32> @vssubu_vi_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) {
852 ; CHECK-LABEL: vssubu_vi_v4i32:
854 ; CHECK-NEXT: li a1, -1
855 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
856 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
858 %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)
862 define <4 x i32> @vssubu_vi_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) {
863 ; CHECK-LABEL: vssubu_vi_v4i32_unmasked:
865 ; CHECK-NEXT: li a1, -1
866 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
867 ; CHECK-NEXT: vssubu.vx v8, v8, a1
869 %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)
873 declare <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
875 define <8 x i32> @vssubu_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) {
876 ; CHECK-LABEL: vssubu_vv_v8i32:
878 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
879 ; CHECK-NEXT: vssubu.vv v8, v8, v10, v0.t
881 %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl)
885 define <8 x i32> @vssubu_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) {
886 ; CHECK-LABEL: vssubu_vv_v8i32_unmasked:
888 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
889 ; CHECK-NEXT: vssubu.vv v8, v8, v10
891 %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)
895 define <8 x i32> @vssubu_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) {
896 ; CHECK-LABEL: vssubu_vx_v8i32:
898 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
899 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
901 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
902 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
903 %v = call <8 x i32> @llvm.vp.usub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl)
907 define <8 x i32> @vssubu_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) {
908 ; CHECK-LABEL: vssubu_vx_v8i32_unmasked:
910 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
911 ; CHECK-NEXT: vssubu.vx v8, v8, a0
913 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
914 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
915 %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)
919 define <8 x i32> @vssubu_vi_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) {
920 ; CHECK-LABEL: vssubu_vi_v8i32:
922 ; CHECK-NEXT: li a1, -1
923 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
924 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
926 %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)
930 define <8 x i32> @vssubu_vi_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) {
931 ; CHECK-LABEL: vssubu_vi_v8i32_unmasked:
933 ; CHECK-NEXT: li a1, -1
934 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma
935 ; CHECK-NEXT: vssubu.vx v8, v8, a1
937 %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)
941 declare <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32)
943 define <16 x i32> @vssubu_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) {
944 ; CHECK-LABEL: vssubu_vv_v16i32:
946 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
947 ; CHECK-NEXT: vssubu.vv v8, v8, v12, v0.t
949 %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl)
953 define <16 x i32> @vssubu_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) {
954 ; CHECK-LABEL: vssubu_vv_v16i32_unmasked:
956 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
957 ; CHECK-NEXT: vssubu.vv v8, v8, v12
959 %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)
963 define <16 x i32> @vssubu_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) {
964 ; CHECK-LABEL: vssubu_vx_v16i32:
966 ; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma
967 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
969 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
970 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
971 %v = call <16 x i32> @llvm.vp.usub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl)
975 define <16 x i32> @vssubu_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) {
976 ; CHECK-LABEL: vssubu_vx_v16i32_unmasked:
978 ; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma
979 ; CHECK-NEXT: vssubu.vx v8, v8, a0
981 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
982 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
983 %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)
987 define <16 x i32> @vssubu_vi_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) {
988 ; CHECK-LABEL: vssubu_vi_v16i32:
990 ; CHECK-NEXT: li a1, -1
991 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
992 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
994 %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)
998 define <16 x i32> @vssubu_vi_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) {
999 ; CHECK-LABEL: vssubu_vi_v16i32_unmasked:
1001 ; CHECK-NEXT: li a1, -1
1002 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma
1003 ; CHECK-NEXT: vssubu.vx v8, v8, a1
1005 %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)
1009 declare <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32)
1011 define <2 x i64> @vssubu_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) {
1012 ; CHECK-LABEL: vssubu_vv_v2i64:
1014 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1015 ; CHECK-NEXT: vssubu.vv v8, v8, v9, v0.t
1017 %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl)
1021 define <2 x i64> @vssubu_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) {
1022 ; CHECK-LABEL: vssubu_vv_v2i64_unmasked:
1024 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1025 ; CHECK-NEXT: vssubu.vv v8, v8, v9
1027 %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)
1031 define <2 x i64> @vssubu_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) {
1032 ; RV32-LABEL: vssubu_vx_v2i64:
1034 ; RV32-NEXT: addi sp, sp, -16
1035 ; RV32-NEXT: .cfi_def_cfa_offset 16
1036 ; RV32-NEXT: sw a0, 8(sp)
1037 ; RV32-NEXT: sw a1, 12(sp)
1038 ; RV32-NEXT: addi a0, sp, 8
1039 ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1040 ; RV32-NEXT: vlse64.v v9, (a0), zero
1041 ; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma
1042 ; RV32-NEXT: vssubu.vv v8, v8, v9, v0.t
1043 ; RV32-NEXT: addi sp, sp, 16
1044 ; RV32-NEXT: .cfi_def_cfa_offset 0
1047 ; RV64-LABEL: vssubu_vx_v2i64:
1049 ; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma
1050 ; RV64-NEXT: vssubu.vx v8, v8, a0, v0.t
1052 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1053 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1054 %v = call <2 x i64> @llvm.vp.usub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl)
1058 define <2 x i64> @vssubu_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) {
1059 ; RV32-LABEL: vssubu_vx_v2i64_unmasked:
1061 ; RV32-NEXT: addi sp, sp, -16
1062 ; RV32-NEXT: .cfi_def_cfa_offset 16
1063 ; RV32-NEXT: sw a0, 8(sp)
1064 ; RV32-NEXT: sw a1, 12(sp)
1065 ; RV32-NEXT: addi a0, sp, 8
1066 ; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma
1067 ; RV32-NEXT: vlse64.v v9, (a0), zero
1068 ; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma
1069 ; RV32-NEXT: vssubu.vv v8, v8, v9
1070 ; RV32-NEXT: addi sp, sp, 16
1071 ; RV32-NEXT: .cfi_def_cfa_offset 0
1074 ; RV64-LABEL: vssubu_vx_v2i64_unmasked:
1076 ; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma
1077 ; RV64-NEXT: vssubu.vx v8, v8, a0
1079 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
1080 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
1081 %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)
1085 define <2 x i64> @vssubu_vi_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) {
1086 ; CHECK-LABEL: vssubu_vi_v2i64:
1088 ; CHECK-NEXT: li a1, -1
1089 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1090 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
1092 %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)
1096 define <2 x i64> @vssubu_vi_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) {
1097 ; CHECK-LABEL: vssubu_vi_v2i64_unmasked:
1099 ; CHECK-NEXT: li a1, -1
1100 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
1101 ; CHECK-NEXT: vssubu.vx v8, v8, a1
1103 %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)
1107 declare <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32)
1109 define <4 x i64> @vssubu_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) {
1110 ; CHECK-LABEL: vssubu_vv_v4i64:
1112 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1113 ; CHECK-NEXT: vssubu.vv v8, v8, v10, v0.t
1115 %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl)
1119 define <4 x i64> @vssubu_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) {
1120 ; CHECK-LABEL: vssubu_vv_v4i64_unmasked:
1122 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1123 ; CHECK-NEXT: vssubu.vv v8, v8, v10
1125 %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)
1129 define <4 x i64> @vssubu_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) {
1130 ; RV32-LABEL: vssubu_vx_v4i64:
1132 ; RV32-NEXT: addi sp, sp, -16
1133 ; RV32-NEXT: .cfi_def_cfa_offset 16
1134 ; RV32-NEXT: sw a0, 8(sp)
1135 ; RV32-NEXT: sw a1, 12(sp)
1136 ; RV32-NEXT: addi a0, sp, 8
1137 ; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1138 ; RV32-NEXT: vlse64.v v10, (a0), zero
1139 ; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma
1140 ; RV32-NEXT: vssubu.vv v8, v8, v10, v0.t
1141 ; RV32-NEXT: addi sp, sp, 16
1142 ; RV32-NEXT: .cfi_def_cfa_offset 0
1145 ; RV64-LABEL: vssubu_vx_v4i64:
1147 ; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma
1148 ; RV64-NEXT: vssubu.vx v8, v8, a0, v0.t
1150 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
1151 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
1152 %v = call <4 x i64> @llvm.vp.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl)
1156 define <4 x i64> @vssubu_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) {
1157 ; RV32-LABEL: vssubu_vx_v4i64_unmasked:
1159 ; RV32-NEXT: addi sp, sp, -16
1160 ; RV32-NEXT: .cfi_def_cfa_offset 16
1161 ; RV32-NEXT: sw a0, 8(sp)
1162 ; RV32-NEXT: sw a1, 12(sp)
1163 ; RV32-NEXT: addi a0, sp, 8
1164 ; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
1165 ; RV32-NEXT: vlse64.v v10, (a0), zero
1166 ; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma
1167 ; RV32-NEXT: vssubu.vv v8, v8, v10
1168 ; RV32-NEXT: addi sp, sp, 16
1169 ; RV32-NEXT: .cfi_def_cfa_offset 0
1172 ; RV64-LABEL: vssubu_vx_v4i64_unmasked:
1174 ; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma
1175 ; RV64-NEXT: vssubu.vx v8, v8, a0
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.usub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl)
1183 define <4 x i64> @vssubu_vi_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) {
1184 ; CHECK-LABEL: vssubu_vi_v4i64:
1186 ; CHECK-NEXT: li a1, -1
1187 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1188 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
1190 %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)
1194 define <4 x i64> @vssubu_vi_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) {
1195 ; CHECK-LABEL: vssubu_vi_v4i64_unmasked:
1197 ; CHECK-NEXT: li a1, -1
1198 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma
1199 ; CHECK-NEXT: vssubu.vx v8, v8, a1
1201 %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)
1205 declare <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32)
1207 define <8 x i64> @vssubu_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) {
1208 ; CHECK-LABEL: vssubu_vv_v8i64:
1210 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1211 ; CHECK-NEXT: vssubu.vv v8, v8, v12, v0.t
1213 %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl)
1217 define <8 x i64> @vssubu_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) {
1218 ; CHECK-LABEL: vssubu_vv_v8i64_unmasked:
1220 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1221 ; CHECK-NEXT: vssubu.vv v8, v8, v12
1223 %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)
1227 define <8 x i64> @vssubu_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) {
1228 ; RV32-LABEL: vssubu_vx_v8i64:
1230 ; RV32-NEXT: addi sp, sp, -16
1231 ; RV32-NEXT: .cfi_def_cfa_offset 16
1232 ; RV32-NEXT: sw a0, 8(sp)
1233 ; RV32-NEXT: sw a1, 12(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: vssubu.vv v8, v8, v12, v0.t
1239 ; RV32-NEXT: addi sp, sp, 16
1240 ; RV32-NEXT: .cfi_def_cfa_offset 0
1243 ; RV64-LABEL: vssubu_vx_v8i64:
1245 ; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma
1246 ; RV64-NEXT: vssubu.vx v8, v8, a0, v0.t
1248 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1249 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1250 %v = call <8 x i64> @llvm.vp.usub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl)
1254 define <8 x i64> @vssubu_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) {
1255 ; RV32-LABEL: vssubu_vx_v8i64_unmasked:
1257 ; RV32-NEXT: addi sp, sp, -16
1258 ; RV32-NEXT: .cfi_def_cfa_offset 16
1259 ; RV32-NEXT: sw a0, 8(sp)
1260 ; RV32-NEXT: sw a1, 12(sp)
1261 ; RV32-NEXT: addi a0, sp, 8
1262 ; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma
1263 ; RV32-NEXT: vlse64.v v12, (a0), zero
1264 ; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma
1265 ; RV32-NEXT: vssubu.vv v8, v8, v12
1266 ; RV32-NEXT: addi sp, sp, 16
1267 ; RV32-NEXT: .cfi_def_cfa_offset 0
1270 ; RV64-LABEL: vssubu_vx_v8i64_unmasked:
1272 ; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma
1273 ; RV64-NEXT: vssubu.vx v8, v8, a0
1275 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
1276 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
1277 %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)
1281 define <8 x i64> @vssubu_vi_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) {
1282 ; CHECK-LABEL: vssubu_vi_v8i64:
1284 ; CHECK-NEXT: li a1, -1
1285 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1286 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
1288 %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)
1292 define <8 x i64> @vssubu_vi_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) {
1293 ; CHECK-LABEL: vssubu_vi_v8i64_unmasked:
1295 ; CHECK-NEXT: li a1, -1
1296 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma
1297 ; CHECK-NEXT: vssubu.vx v8, v8, a1
1299 %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)
1303 declare <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32)
1305 define <16 x i64> @vssubu_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) {
1306 ; CHECK-LABEL: vssubu_vv_v16i64:
1308 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1309 ; CHECK-NEXT: vssubu.vv v8, v8, v16, v0.t
1311 %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl)
1315 define <16 x i64> @vssubu_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) {
1316 ; CHECK-LABEL: vssubu_vv_v16i64_unmasked:
1318 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1319 ; CHECK-NEXT: vssubu.vv v8, v8, v16
1321 %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)
1325 define <16 x i64> @vssubu_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) {
1326 ; RV32-LABEL: vssubu_vx_v16i64:
1328 ; RV32-NEXT: addi sp, sp, -16
1329 ; RV32-NEXT: .cfi_def_cfa_offset 16
1330 ; RV32-NEXT: sw a0, 8(sp)
1331 ; RV32-NEXT: sw a1, 12(sp)
1332 ; RV32-NEXT: addi a0, sp, 8
1333 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1334 ; RV32-NEXT: vlse64.v v16, (a0), zero
1335 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
1336 ; RV32-NEXT: vssubu.vv v8, v8, v16, v0.t
1337 ; RV32-NEXT: addi sp, sp, 16
1338 ; RV32-NEXT: .cfi_def_cfa_offset 0
1341 ; RV64-LABEL: vssubu_vx_v16i64:
1343 ; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
1344 ; RV64-NEXT: vssubu.vx v8, v8, a0, v0.t
1346 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1347 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1348 %v = call <16 x i64> @llvm.vp.usub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl)
1352 define <16 x i64> @vssubu_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) {
1353 ; RV32-LABEL: vssubu_vx_v16i64_unmasked:
1355 ; RV32-NEXT: addi sp, sp, -16
1356 ; RV32-NEXT: .cfi_def_cfa_offset 16
1357 ; RV32-NEXT: sw a0, 8(sp)
1358 ; RV32-NEXT: sw a1, 12(sp)
1359 ; RV32-NEXT: addi a0, sp, 8
1360 ; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1361 ; RV32-NEXT: vlse64.v v16, (a0), zero
1362 ; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma
1363 ; RV32-NEXT: vssubu.vv v8, v8, v16
1364 ; RV32-NEXT: addi sp, sp, 16
1365 ; RV32-NEXT: .cfi_def_cfa_offset 0
1368 ; RV64-LABEL: vssubu_vx_v16i64_unmasked:
1370 ; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
1371 ; RV64-NEXT: vssubu.vx v8, v8, a0
1373 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
1374 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
1375 %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)
1379 define <16 x i64> @vssubu_vi_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) {
1380 ; CHECK-LABEL: vssubu_vi_v16i64:
1382 ; CHECK-NEXT: li a1, -1
1383 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1384 ; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t
1386 %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)
1390 define <16 x i64> @vssubu_vi_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) {
1391 ; CHECK-LABEL: vssubu_vi_v16i64_unmasked:
1393 ; CHECK-NEXT: li a1, -1
1394 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1395 ; CHECK-NEXT: vssubu.vx v8, v8, a1
1397 %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)
1401 ; Test that split-legalization works as expected.
1403 declare <32 x i64> @llvm.vp.usub.sat.v32i64(<32 x i64>, <32 x i64>, <32 x i1>, i32)
1405 define <32 x i64> @vssubu_vx_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) {
1406 ; CHECK-LABEL: vssubu_vx_v32i64:
1408 ; CHECK-NEXT: li a2, 16
1409 ; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
1410 ; CHECK-NEXT: vslidedown.vi v24, v0, 2
1411 ; CHECK-NEXT: mv a1, a0
1412 ; CHECK-NEXT: bltu a0, a2, .LBB108_2
1413 ; CHECK-NEXT: # %bb.1:
1414 ; CHECK-NEXT: li a1, 16
1415 ; CHECK-NEXT: .LBB108_2:
1416 ; CHECK-NEXT: li a2, -1
1417 ; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma
1418 ; CHECK-NEXT: vssubu.vx v8, v8, a2, v0.t
1419 ; CHECK-NEXT: addi a1, a0, -16
1420 ; CHECK-NEXT: sltu a0, a0, a1
1421 ; CHECK-NEXT: addi a0, a0, -1
1422 ; CHECK-NEXT: and a0, a0, a1
1423 ; CHECK-NEXT: vmv1r.v v0, v24
1424 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1425 ; CHECK-NEXT: vssubu.vx v16, v16, a2, v0.t
1427 %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)
1431 define <32 x i64> @vssubu_vi_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) {
1432 ; CHECK-LABEL: vssubu_vi_v32i64_unmasked:
1434 ; CHECK-NEXT: li a2, 16
1435 ; CHECK-NEXT: mv a1, a0
1436 ; CHECK-NEXT: bltu a0, a2, .LBB109_2
1437 ; CHECK-NEXT: # %bb.1:
1438 ; CHECK-NEXT: li a1, 16
1439 ; CHECK-NEXT: .LBB109_2:
1440 ; CHECK-NEXT: li a2, -1
1441 ; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma
1442 ; CHECK-NEXT: vssubu.vx v8, v8, a2
1443 ; CHECK-NEXT: addi a1, a0, -16
1444 ; CHECK-NEXT: sltu a0, a0, a1
1445 ; CHECK-NEXT: addi a0, a0, -1
1446 ; CHECK-NEXT: and a0, a0, a1
1447 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1448 ; CHECK-NEXT: vssubu.vx v16, v16, a2
1450 %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)
1454 define <32 x i64> @vssubu_vx_v32i64_evl12(<32 x i64> %va, <32 x i1> %m) {
1455 ; CHECK-LABEL: vssubu_vx_v32i64_evl12:
1457 ; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
1458 ; CHECK-NEXT: vslidedown.vi v24, v0, 2
1459 ; CHECK-NEXT: li a0, -1
1460 ; CHECK-NEXT: vsetivli zero, 12, e64, m8, ta, ma
1461 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
1462 ; CHECK-NEXT: vmv1r.v v0, v24
1463 ; CHECK-NEXT: vsetivli zero, 0, e64, m8, ta, ma
1464 ; CHECK-NEXT: vssubu.vx v16, v16, a0, v0.t
1466 %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)
1470 define <32 x i64> @vssubu_vx_v32i64_evl27(<32 x i64> %va, <32 x i1> %m) {
1471 ; CHECK-LABEL: vssubu_vx_v32i64_evl27:
1473 ; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma
1474 ; CHECK-NEXT: vslidedown.vi v24, v0, 2
1475 ; CHECK-NEXT: li a0, -1
1476 ; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma
1477 ; CHECK-NEXT: vssubu.vx v8, v8, a0, v0.t
1478 ; CHECK-NEXT: vmv1r.v v0, v24
1479 ; CHECK-NEXT: vsetivli zero, 11, e64, m8, ta, ma
1480 ; CHECK-NEXT: vssubu.vx v16, v16, a0, v0.t
1482 %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)