Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vssub.ll
blob941be4aba1b9fca9132055a020949eb2b6456193
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 <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
9 define <2 x i8> @ssub_v2i8_vv(<2 x i8> %va, <2 x i8> %b) {
10 ; CHECK-LABEL: ssub_v2i8_vv:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
13 ; CHECK-NEXT:    vssub.vv v8, v8, v9
14 ; CHECK-NEXT:    ret
15   %v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %b)
16   ret <2 x i8> %v
19 define <2 x i8> @ssub_v2i8_vx(<2 x i8> %va, i8 %b) {
20 ; CHECK-LABEL: ssub_v2i8_vx:
21 ; CHECK:       # %bb.0:
22 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
23 ; CHECK-NEXT:    vssub.vx v8, v8, a0
24 ; CHECK-NEXT:    ret
25   %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0
26   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
27   %v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %vb)
28   ret <2 x i8> %v
31 define <2 x i8> @ssub_v2i8_vi(<2 x i8> %va) {
32 ; CHECK-LABEL: ssub_v2i8_vi:
33 ; CHECK:       # %bb.0:
34 ; CHECK-NEXT:    li a0, 1
35 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
36 ; CHECK-NEXT:    vssub.vx v8, v8, a0
37 ; CHECK-NEXT:    ret
38   %elt.head = insertelement <2 x i8> poison, i8 1, i32 0
39   %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer
40   %v = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %va, <2 x i8> %vb)
41   ret <2 x i8> %v
44 declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>)
46 define <4 x i8> @ssub_v4i8_vv(<4 x i8> %va, <4 x i8> %b) {
47 ; CHECK-LABEL: ssub_v4i8_vv:
48 ; CHECK:       # %bb.0:
49 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
50 ; CHECK-NEXT:    vssub.vv v8, v8, v9
51 ; CHECK-NEXT:    ret
52   %v = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %b)
53   ret <4 x i8> %v
56 define <4 x i8> @ssub_v4i8_vx(<4 x i8> %va, i8 %b) {
57 ; CHECK-LABEL: ssub_v4i8_vx:
58 ; CHECK:       # %bb.0:
59 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
60 ; CHECK-NEXT:    vssub.vx v8, v8, a0
61 ; CHECK-NEXT:    ret
62   %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0
63   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
64   %v = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %vb)
65   ret <4 x i8> %v
68 define <4 x i8> @ssub_v4i8_vi(<4 x i8> %va) {
69 ; CHECK-LABEL: ssub_v4i8_vi:
70 ; CHECK:       # %bb.0:
71 ; CHECK-NEXT:    li a0, 1
72 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
73 ; CHECK-NEXT:    vssub.vx v8, v8, a0
74 ; CHECK-NEXT:    ret
75   %elt.head = insertelement <4 x i8> poison, i8 1, i32 0
76   %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer
77   %v = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %va, <4 x i8> %vb)
78   ret <4 x i8> %v
81 declare <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8>, <8 x i8>)
83 define <8 x i8> @ssub_v8i8_vv(<8 x i8> %va, <8 x i8> %b) {
84 ; CHECK-LABEL: ssub_v8i8_vv:
85 ; CHECK:       # %bb.0:
86 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
87 ; CHECK-NEXT:    vssub.vv v8, v8, v9
88 ; CHECK-NEXT:    ret
89   %v = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %b)
90   ret <8 x i8> %v
93 define <8 x i8> @ssub_v8i8_vx(<8 x i8> %va, i8 %b) {
94 ; CHECK-LABEL: ssub_v8i8_vx:
95 ; CHECK:       # %bb.0:
96 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
97 ; CHECK-NEXT:    vssub.vx v8, v8, a0
98 ; CHECK-NEXT:    ret
99   %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0
100   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
101   %v = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %vb)
102   ret <8 x i8> %v
105 define <8 x i8> @ssub_v8i8_vi(<8 x i8> %va) {
106 ; CHECK-LABEL: ssub_v8i8_vi:
107 ; CHECK:       # %bb.0:
108 ; CHECK-NEXT:    li a0, 1
109 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
110 ; CHECK-NEXT:    vssub.vx v8, v8, a0
111 ; CHECK-NEXT:    ret
112   %elt.head = insertelement <8 x i8> poison, i8 1, i32 0
113   %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer
114   %v = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %va, <8 x i8> %vb)
115   ret <8 x i8> %v
118 declare <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8>, <16 x i8>)
120 define <16 x i8> @ssub_v16i8_vv(<16 x i8> %va, <16 x i8> %b) {
121 ; CHECK-LABEL: ssub_v16i8_vv:
122 ; CHECK:       # %bb.0:
123 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
124 ; CHECK-NEXT:    vssub.vv v8, v8, v9
125 ; CHECK-NEXT:    ret
126   %v = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %b)
127   ret <16 x i8> %v
130 define <16 x i8> @ssub_v16i8_vx(<16 x i8> %va, i8 %b) {
131 ; CHECK-LABEL: ssub_v16i8_vx:
132 ; CHECK:       # %bb.0:
133 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
134 ; CHECK-NEXT:    vssub.vx v8, v8, a0
135 ; CHECK-NEXT:    ret
136   %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0
137   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
138   %v = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %vb)
139   ret <16 x i8> %v
142 define <16 x i8> @ssub_v16i8_vi(<16 x i8> %va) {
143 ; CHECK-LABEL: ssub_v16i8_vi:
144 ; CHECK:       # %bb.0:
145 ; CHECK-NEXT:    li a0, 1
146 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
147 ; CHECK-NEXT:    vssub.vx v8, v8, a0
148 ; CHECK-NEXT:    ret
149   %elt.head = insertelement <16 x i8> poison, i8 1, i32 0
150   %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer
151   %v = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %va, <16 x i8> %vb)
152   ret <16 x i8> %v
155 declare <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16>, <2 x i16>)
157 define <2 x i16> @ssub_v2i16_vv(<2 x i16> %va, <2 x i16> %b) {
158 ; CHECK-LABEL: ssub_v2i16_vv:
159 ; CHECK:       # %bb.0:
160 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
161 ; CHECK-NEXT:    vssub.vv v8, v8, v9
162 ; CHECK-NEXT:    ret
163   %v = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %b)
164   ret <2 x i16> %v
167 define <2 x i16> @ssub_v2i16_vx(<2 x i16> %va, i16 %b) {
168 ; CHECK-LABEL: ssub_v2i16_vx:
169 ; CHECK:       # %bb.0:
170 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
171 ; CHECK-NEXT:    vssub.vx v8, v8, a0
172 ; CHECK-NEXT:    ret
173   %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0
174   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
175   %v = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb)
176   ret <2 x i16> %v
179 define <2 x i16> @ssub_v2i16_vi(<2 x i16> %va) {
180 ; CHECK-LABEL: ssub_v2i16_vi:
181 ; CHECK:       # %bb.0:
182 ; CHECK-NEXT:    li a0, 1
183 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
184 ; CHECK-NEXT:    vssub.vx v8, v8, a0
185 ; CHECK-NEXT:    ret
186   %elt.head = insertelement <2 x i16> poison, i16 1, i32 0
187   %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer
188   %v = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %va, <2 x i16> %vb)
189   ret <2 x i16> %v
192 declare <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16>, <4 x i16>)
194 define <4 x i16> @ssub_v4i16_vv(<4 x i16> %va, <4 x i16> %b) {
195 ; CHECK-LABEL: ssub_v4i16_vv:
196 ; CHECK:       # %bb.0:
197 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
198 ; CHECK-NEXT:    vssub.vv v8, v8, v9
199 ; CHECK-NEXT:    ret
200   %v = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %b)
201   ret <4 x i16> %v
204 define <4 x i16> @ssub_v4i16_vx(<4 x i16> %va, i16 %b) {
205 ; CHECK-LABEL: ssub_v4i16_vx:
206 ; CHECK:       # %bb.0:
207 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
208 ; CHECK-NEXT:    vssub.vx v8, v8, a0
209 ; CHECK-NEXT:    ret
210   %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0
211   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
212   %v = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb)
213   ret <4 x i16> %v
216 define <4 x i16> @ssub_v4i16_vi(<4 x i16> %va) {
217 ; CHECK-LABEL: ssub_v4i16_vi:
218 ; CHECK:       # %bb.0:
219 ; CHECK-NEXT:    li a0, 1
220 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
221 ; CHECK-NEXT:    vssub.vx v8, v8, a0
222 ; CHECK-NEXT:    ret
223   %elt.head = insertelement <4 x i16> poison, i16 1, i32 0
224   %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer
225   %v = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %va, <4 x i16> %vb)
226   ret <4 x i16> %v
229 declare <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16>, <8 x i16>)
231 define <8 x i16> @ssub_v8i16_vv(<8 x i16> %va, <8 x i16> %b) {
232 ; CHECK-LABEL: ssub_v8i16_vv:
233 ; CHECK:       # %bb.0:
234 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
235 ; CHECK-NEXT:    vssub.vv v8, v8, v9
236 ; CHECK-NEXT:    ret
237   %v = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %b)
238   ret <8 x i16> %v
241 define <8 x i16> @ssub_v8i16_vx(<8 x i16> %va, i16 %b) {
242 ; CHECK-LABEL: ssub_v8i16_vx:
243 ; CHECK:       # %bb.0:
244 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
245 ; CHECK-NEXT:    vssub.vx v8, v8, a0
246 ; CHECK-NEXT:    ret
247   %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0
248   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
249   %v = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb)
250   ret <8 x i16> %v
253 define <8 x i16> @ssub_v8i16_vi(<8 x i16> %va) {
254 ; CHECK-LABEL: ssub_v8i16_vi:
255 ; CHECK:       # %bb.0:
256 ; CHECK-NEXT:    li a0, 1
257 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
258 ; CHECK-NEXT:    vssub.vx v8, v8, a0
259 ; CHECK-NEXT:    ret
260   %elt.head = insertelement <8 x i16> poison, i16 1, i32 0
261   %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer
262   %v = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %va, <8 x i16> %vb)
263   ret <8 x i16> %v
266 declare <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16>, <16 x i16>)
268 define <16 x i16> @ssub_v16i16_vv(<16 x i16> %va, <16 x i16> %b) {
269 ; CHECK-LABEL: ssub_v16i16_vv:
270 ; CHECK:       # %bb.0:
271 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
272 ; CHECK-NEXT:    vssub.vv v8, v8, v10
273 ; CHECK-NEXT:    ret
274   %v = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %b)
275   ret <16 x i16> %v
278 define <16 x i16> @ssub_v16i16_vx(<16 x i16> %va, i16 %b) {
279 ; CHECK-LABEL: ssub_v16i16_vx:
280 ; CHECK:       # %bb.0:
281 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
282 ; CHECK-NEXT:    vssub.vx v8, v8, a0
283 ; CHECK-NEXT:    ret
284   %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0
285   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
286   %v = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb)
287   ret <16 x i16> %v
290 define <16 x i16> @ssub_v16i16_vi(<16 x i16> %va) {
291 ; CHECK-LABEL: ssub_v16i16_vi:
292 ; CHECK:       # %bb.0:
293 ; CHECK-NEXT:    li a0, 1
294 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
295 ; CHECK-NEXT:    vssub.vx v8, v8, a0
296 ; CHECK-NEXT:    ret
297   %elt.head = insertelement <16 x i16> poison, i16 1, i32 0
298   %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer
299   %v = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %va, <16 x i16> %vb)
300   ret <16 x i16> %v
303 declare <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32>, <2 x i32>)
305 define <2 x i32> @ssub_v2i32_vv(<2 x i32> %va, <2 x i32> %b) {
306 ; CHECK-LABEL: ssub_v2i32_vv:
307 ; CHECK:       # %bb.0:
308 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
309 ; CHECK-NEXT:    vssub.vv v8, v8, v9
310 ; CHECK-NEXT:    ret
311   %v = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %b)
312   ret <2 x i32> %v
315 define <2 x i32> @ssub_v2i32_vx(<2 x i32> %va, i32 %b) {
316 ; CHECK-LABEL: ssub_v2i32_vx:
317 ; CHECK:       # %bb.0:
318 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
319 ; CHECK-NEXT:    vssub.vx v8, v8, a0
320 ; CHECK-NEXT:    ret
321   %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0
322   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
323   %v = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb)
324   ret <2 x i32> %v
327 define <2 x i32> @ssub_v2i32_vi(<2 x i32> %va) {
328 ; CHECK-LABEL: ssub_v2i32_vi:
329 ; CHECK:       # %bb.0:
330 ; CHECK-NEXT:    li a0, 1
331 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
332 ; CHECK-NEXT:    vssub.vx v8, v8, a0
333 ; CHECK-NEXT:    ret
334   %elt.head = insertelement <2 x i32> poison, i32 1, i32 0
335   %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer
336   %v = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %va, <2 x i32> %vb)
337   ret <2 x i32> %v
340 declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>)
342 define <4 x i32> @ssub_v4i32_vv(<4 x i32> %va, <4 x i32> %b) {
343 ; CHECK-LABEL: ssub_v4i32_vv:
344 ; CHECK:       # %bb.0:
345 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
346 ; CHECK-NEXT:    vssub.vv v8, v8, v9
347 ; CHECK-NEXT:    ret
348   %v = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %b)
349   ret <4 x i32> %v
352 define <4 x i32> @ssub_v4i32_vx(<4 x i32> %va, i32 %b) {
353 ; CHECK-LABEL: ssub_v4i32_vx:
354 ; CHECK:       # %bb.0:
355 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
356 ; CHECK-NEXT:    vssub.vx v8, v8, a0
357 ; CHECK-NEXT:    ret
358   %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0
359   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
360   %v = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb)
361   ret <4 x i32> %v
364 define <4 x i32> @ssub_v4i32_vi(<4 x i32> %va) {
365 ; CHECK-LABEL: ssub_v4i32_vi:
366 ; CHECK:       # %bb.0:
367 ; CHECK-NEXT:    li a0, 1
368 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
369 ; CHECK-NEXT:    vssub.vx v8, v8, a0
370 ; CHECK-NEXT:    ret
371   %elt.head = insertelement <4 x i32> poison, i32 1, i32 0
372   %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer
373   %v = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %va, <4 x i32> %vb)
374   ret <4 x i32> %v
377 declare <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32>, <8 x i32>)
379 define <8 x i32> @ssub_v8i32_vv(<8 x i32> %va, <8 x i32> %b) {
380 ; CHECK-LABEL: ssub_v8i32_vv:
381 ; CHECK:       # %bb.0:
382 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
383 ; CHECK-NEXT:    vssub.vv v8, v8, v10
384 ; CHECK-NEXT:    ret
385   %v = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %b)
386   ret <8 x i32> %v
389 define <8 x i32> @ssub_v8i32_vx(<8 x i32> %va, i32 %b) {
390 ; CHECK-LABEL: ssub_v8i32_vx:
391 ; CHECK:       # %bb.0:
392 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
393 ; CHECK-NEXT:    vssub.vx v8, v8, a0
394 ; CHECK-NEXT:    ret
395   %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0
396   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
397   %v = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb)
398   ret <8 x i32> %v
401 define <8 x i32> @ssub_v8i32_vi(<8 x i32> %va) {
402 ; CHECK-LABEL: ssub_v8i32_vi:
403 ; CHECK:       # %bb.0:
404 ; CHECK-NEXT:    li a0, 1
405 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
406 ; CHECK-NEXT:    vssub.vx v8, v8, a0
407 ; CHECK-NEXT:    ret
408   %elt.head = insertelement <8 x i32> poison, i32 1, i32 0
409   %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer
410   %v = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %va, <8 x i32> %vb)
411   ret <8 x i32> %v
414 declare <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32>, <16 x i32>)
416 define <16 x i32> @ssub_v16i32_vv(<16 x i32> %va, <16 x i32> %b) {
417 ; CHECK-LABEL: ssub_v16i32_vv:
418 ; CHECK:       # %bb.0:
419 ; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
420 ; CHECK-NEXT:    vssub.vv v8, v8, v12
421 ; CHECK-NEXT:    ret
422   %v = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %b)
423   ret <16 x i32> %v
426 define <16 x i32> @ssub_v16i32_vx(<16 x i32> %va, i32 %b) {
427 ; CHECK-LABEL: ssub_v16i32_vx:
428 ; CHECK:       # %bb.0:
429 ; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
430 ; CHECK-NEXT:    vssub.vx v8, v8, a0
431 ; CHECK-NEXT:    ret
432   %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0
433   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
434   %v = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb)
435   ret <16 x i32> %v
438 define <16 x i32> @ssub_v16i32_vi(<16 x i32> %va) {
439 ; CHECK-LABEL: ssub_v16i32_vi:
440 ; CHECK:       # %bb.0:
441 ; CHECK-NEXT:    li a0, 1
442 ; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
443 ; CHECK-NEXT:    vssub.vx v8, v8, a0
444 ; CHECK-NEXT:    ret
445   %elt.head = insertelement <16 x i32> poison, i32 1, i32 0
446   %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer
447   %v = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %va, <16 x i32> %vb)
448   ret <16 x i32> %v
451 declare <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64>, <2 x i64>)
453 define <2 x i64> @ssub_v2i64_vv(<2 x i64> %va, <2 x i64> %b) {
454 ; CHECK-LABEL: ssub_v2i64_vv:
455 ; CHECK:       # %bb.0:
456 ; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
457 ; CHECK-NEXT:    vssub.vv v8, v8, v9
458 ; CHECK-NEXT:    ret
459   %v = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %b)
460   ret <2 x i64> %v
463 define <2 x i64> @ssub_v2i64_vx(<2 x i64> %va, i64 %b) {
464 ; RV32-LABEL: ssub_v2i64_vx:
465 ; RV32:       # %bb.0:
466 ; RV32-NEXT:    addi sp, sp, -16
467 ; RV32-NEXT:    .cfi_def_cfa_offset 16
468 ; RV32-NEXT:    sw a1, 12(sp)
469 ; RV32-NEXT:    sw a0, 8(sp)
470 ; RV32-NEXT:    addi a0, sp, 8
471 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
472 ; RV32-NEXT:    vlse64.v v9, (a0), zero
473 ; RV32-NEXT:    vssub.vv v8, v8, v9
474 ; RV32-NEXT:    addi sp, sp, 16
475 ; RV32-NEXT:    ret
477 ; RV64-LABEL: ssub_v2i64_vx:
478 ; RV64:       # %bb.0:
479 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
480 ; RV64-NEXT:    vssub.vx v8, v8, a0
481 ; RV64-NEXT:    ret
482   %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0
483   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
484   %v = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb)
485   ret <2 x i64> %v
488 define <2 x i64> @ssub_v2i64_vi(<2 x i64> %va) {
489 ; CHECK-LABEL: ssub_v2i64_vi:
490 ; CHECK:       # %bb.0:
491 ; CHECK-NEXT:    li a0, 1
492 ; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
493 ; CHECK-NEXT:    vssub.vx v8, v8, a0
494 ; CHECK-NEXT:    ret
495   %elt.head = insertelement <2 x i64> poison, i64 1, i32 0
496   %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer
497   %v = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %va, <2 x i64> %vb)
498   ret <2 x i64> %v
501 declare <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64>, <4 x i64>)
503 define <4 x i64> @ssub_v4i64_vv(<4 x i64> %va, <4 x i64> %b) {
504 ; CHECK-LABEL: ssub_v4i64_vv:
505 ; CHECK:       # %bb.0:
506 ; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
507 ; CHECK-NEXT:    vssub.vv v8, v8, v10
508 ; CHECK-NEXT:    ret
509   %v = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %b)
510   ret <4 x i64> %v
513 define <4 x i64> @ssub_v4i64_vx(<4 x i64> %va, i64 %b) {
514 ; RV32-LABEL: ssub_v4i64_vx:
515 ; RV32:       # %bb.0:
516 ; RV32-NEXT:    addi sp, sp, -16
517 ; RV32-NEXT:    .cfi_def_cfa_offset 16
518 ; RV32-NEXT:    sw a1, 12(sp)
519 ; RV32-NEXT:    sw a0, 8(sp)
520 ; RV32-NEXT:    addi a0, sp, 8
521 ; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
522 ; RV32-NEXT:    vlse64.v v10, (a0), zero
523 ; RV32-NEXT:    vssub.vv v8, v8, v10
524 ; RV32-NEXT:    addi sp, sp, 16
525 ; RV32-NEXT:    ret
527 ; RV64-LABEL: ssub_v4i64_vx:
528 ; RV64:       # %bb.0:
529 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
530 ; RV64-NEXT:    vssub.vx v8, v8, a0
531 ; RV64-NEXT:    ret
532   %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0
533   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
534   %v = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb)
535   ret <4 x i64> %v
538 define <4 x i64> @ssub_v4i64_vi(<4 x i64> %va) {
539 ; CHECK-LABEL: ssub_v4i64_vi:
540 ; CHECK:       # %bb.0:
541 ; CHECK-NEXT:    li a0, 1
542 ; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
543 ; CHECK-NEXT:    vssub.vx v8, v8, a0
544 ; CHECK-NEXT:    ret
545   %elt.head = insertelement <4 x i64> poison, i64 1, i32 0
546   %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer
547   %v = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %va, <4 x i64> %vb)
548   ret <4 x i64> %v
551 declare <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64>, <8 x i64>)
553 define <8 x i64> @ssub_v8i64_vv(<8 x i64> %va, <8 x i64> %b) {
554 ; CHECK-LABEL: ssub_v8i64_vv:
555 ; CHECK:       # %bb.0:
556 ; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
557 ; CHECK-NEXT:    vssub.vv v8, v8, v12
558 ; CHECK-NEXT:    ret
559   %v = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %b)
560   ret <8 x i64> %v
563 define <8 x i64> @ssub_v8i64_vx(<8 x i64> %va, i64 %b) {
564 ; RV32-LABEL: ssub_v8i64_vx:
565 ; RV32:       # %bb.0:
566 ; RV32-NEXT:    addi sp, sp, -16
567 ; RV32-NEXT:    .cfi_def_cfa_offset 16
568 ; RV32-NEXT:    sw a1, 12(sp)
569 ; RV32-NEXT:    sw a0, 8(sp)
570 ; RV32-NEXT:    addi a0, sp, 8
571 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
572 ; RV32-NEXT:    vlse64.v v12, (a0), zero
573 ; RV32-NEXT:    vssub.vv v8, v8, v12
574 ; RV32-NEXT:    addi sp, sp, 16
575 ; RV32-NEXT:    ret
577 ; RV64-LABEL: ssub_v8i64_vx:
578 ; RV64:       # %bb.0:
579 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
580 ; RV64-NEXT:    vssub.vx v8, v8, a0
581 ; RV64-NEXT:    ret
582   %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0
583   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
584   %v = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb)
585   ret <8 x i64> %v
588 define <8 x i64> @ssub_v8i64_vi(<8 x i64> %va) {
589 ; CHECK-LABEL: ssub_v8i64_vi:
590 ; CHECK:       # %bb.0:
591 ; CHECK-NEXT:    li a0, 1
592 ; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
593 ; CHECK-NEXT:    vssub.vx v8, v8, a0
594 ; CHECK-NEXT:    ret
595   %elt.head = insertelement <8 x i64> poison, i64 1, i32 0
596   %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer
597   %v = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %va, <8 x i64> %vb)
598   ret <8 x i64> %v
601 declare <16 x i64> @llvm.ssub.sat.v16i64(<16 x i64>, <16 x i64>)
603 define <16 x i64> @ssub_v16i64_vv(<16 x i64> %va, <16 x i64> %b) {
604 ; CHECK-LABEL: ssub_v16i64_vv:
605 ; CHECK:       # %bb.0:
606 ; CHECK-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
607 ; CHECK-NEXT:    vssub.vv v8, v8, v16
608 ; CHECK-NEXT:    ret
609   %v = call <16 x i64> @llvm.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %b)
610   ret <16 x i64> %v
613 define <16 x i64> @ssub_v16i64_vx(<16 x i64> %va, i64 %b) {
614 ; RV32-LABEL: ssub_v16i64_vx:
615 ; RV32:       # %bb.0:
616 ; RV32-NEXT:    addi sp, sp, -16
617 ; RV32-NEXT:    .cfi_def_cfa_offset 16
618 ; RV32-NEXT:    sw a1, 12(sp)
619 ; RV32-NEXT:    sw a0, 8(sp)
620 ; RV32-NEXT:    addi a0, sp, 8
621 ; RV32-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
622 ; RV32-NEXT:    vlse64.v v16, (a0), zero
623 ; RV32-NEXT:    vssub.vv v8, v8, v16
624 ; RV32-NEXT:    addi sp, sp, 16
625 ; RV32-NEXT:    ret
627 ; RV64-LABEL: ssub_v16i64_vx:
628 ; RV64:       # %bb.0:
629 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
630 ; RV64-NEXT:    vssub.vx v8, v8, a0
631 ; RV64-NEXT:    ret
632   %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0
633   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
634   %v = call <16 x i64> @llvm.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb)
635   ret <16 x i64> %v
638 define <16 x i64> @ssub_v16i64_vi(<16 x i64> %va) {
639 ; CHECK-LABEL: ssub_v16i64_vi:
640 ; CHECK:       # %bb.0:
641 ; CHECK-NEXT:    li a0, 1
642 ; CHECK-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
643 ; CHECK-NEXT:    vssub.vx v8, v8, a0
644 ; CHECK-NEXT:    ret
645   %elt.head = insertelement <16 x i64> poison, i64 1, i32 0
646   %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer
647   %v = call <16 x i64> @llvm.ssub.sat.v16i64(<16 x i64> %va, <16 x i64> %vb)
648   ret <16 x i64> %v