Skip to content

Commit 4b941ff

Browse files
committed
[RISCV] Add coverage for abdu and abds (absolute difference)
Test copied from aarch64 with minimal adaption. We likely need addition coverage, but this is a reasonable starting point.
1 parent 2cad43c commit 4b941ff

File tree

2 files changed

+1305
-0
lines changed

2 files changed

+1305
-0
lines changed

llvm/test/CodeGen/RISCV/rvv/abd.ll

Lines changed: 357 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,357 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv32 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3+
; RUN: llc -mtriple=riscv64 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
4+
5+
;
6+
; SABD
7+
;
8+
9+
define <vscale x 16 x i8> @sabd_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
10+
; CHECK-LABEL: sabd_b:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
13+
; CHECK-NEXT: vwsub.vv v12, v8, v10
14+
; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma
15+
; CHECK-NEXT: vrsub.vi v8, v12, 0
16+
; CHECK-NEXT: vmax.vv v12, v12, v8
17+
; CHECK-NEXT: vsetvli zero, zero, e8, m2, ta, ma
18+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
19+
; CHECK-NEXT: ret
20+
%a.sext = sext <vscale x 16 x i8> %a to <vscale x 16 x i16>
21+
%b.sext = sext <vscale x 16 x i8> %b to <vscale x 16 x i16>
22+
%sub = sub <vscale x 16 x i16> %a.sext, %b.sext
23+
%abs = call <vscale x 16 x i16> @llvm.abs.nxv16i16(<vscale x 16 x i16> %sub, i1 true)
24+
%trunc = trunc <vscale x 16 x i16> %abs to <vscale x 16 x i8>
25+
ret <vscale x 16 x i8> %trunc
26+
}
27+
28+
define <vscale x 16 x i8> @sabd_b_promoted_ops(<vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
29+
; CHECK-LABEL: sabd_b_promoted_ops:
30+
; CHECK: # %bb.0:
31+
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
32+
; CHECK-NEXT: vmv.v.i v10, 0
33+
; CHECK-NEXT: vmerge.vim v12, v10, -1, v0
34+
; CHECK-NEXT: vmv1r.v v0, v8
35+
; CHECK-NEXT: vmerge.vim v8, v10, -1, v0
36+
; CHECK-NEXT: vsub.vv v8, v12, v8
37+
; CHECK-NEXT: vrsub.vi v10, v8, 0
38+
; CHECK-NEXT: vmax.vv v8, v8, v10
39+
; CHECK-NEXT: ret
40+
%a.sext = sext <vscale x 16 x i1> %a to <vscale x 16 x i8>
41+
%b.sext = sext <vscale x 16 x i1> %b to <vscale x 16 x i8>
42+
%sub = sub <vscale x 16 x i8> %a.sext, %b.sext
43+
%abs = call <vscale x 16 x i8> @llvm.abs.nxv16i8(<vscale x 16 x i8> %sub, i1 true)
44+
ret <vscale x 16 x i8> %abs
45+
}
46+
47+
define <vscale x 8 x i16> @sabd_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
48+
; CHECK-LABEL: sabd_h:
49+
; CHECK: # %bb.0:
50+
; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma
51+
; CHECK-NEXT: vwsub.vv v12, v8, v10
52+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
53+
; CHECK-NEXT: vrsub.vi v8, v12, 0
54+
; CHECK-NEXT: vmax.vv v12, v12, v8
55+
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
56+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
57+
; CHECK-NEXT: ret
58+
%a.sext = sext <vscale x 8 x i16> %a to <vscale x 8 x i32>
59+
%b.sext = sext <vscale x 8 x i16> %b to <vscale x 8 x i32>
60+
%sub = sub <vscale x 8 x i32> %a.sext, %b.sext
61+
%abs = call <vscale x 8 x i32> @llvm.abs.nxv8i32(<vscale x 8 x i32> %sub, i1 true)
62+
%trunc = trunc <vscale x 8 x i32> %abs to <vscale x 8 x i16>
63+
ret <vscale x 8 x i16> %trunc
64+
}
65+
66+
define <vscale x 8 x i16> @sabd_h_promoted_ops(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
67+
; CHECK-LABEL: sabd_h_promoted_ops:
68+
; CHECK: # %bb.0:
69+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
70+
; CHECK-NEXT: vwsub.vv v10, v8, v9
71+
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
72+
; CHECK-NEXT: vrsub.vi v8, v10, 0
73+
; CHECK-NEXT: vmax.vv v8, v10, v8
74+
; CHECK-NEXT: ret
75+
%a.sext = sext <vscale x 8 x i8> %a to <vscale x 8 x i16>
76+
%b.sext = sext <vscale x 8 x i8> %b to <vscale x 8 x i16>
77+
%sub = sub <vscale x 8 x i16> %a.sext, %b.sext
78+
%abs = call <vscale x 8 x i16> @llvm.abs.nxv8i16(<vscale x 8 x i16> %sub, i1 true)
79+
ret <vscale x 8 x i16> %abs
80+
}
81+
82+
define <vscale x 4 x i32> @sabd_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
83+
; CHECK-LABEL: sabd_s:
84+
; CHECK: # %bb.0:
85+
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
86+
; CHECK-NEXT: vwsub.vv v12, v8, v10
87+
; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma
88+
; CHECK-NEXT: vrsub.vi v8, v12, 0
89+
; CHECK-NEXT: vmax.vv v12, v12, v8
90+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
91+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
92+
; CHECK-NEXT: ret
93+
%a.sext = sext <vscale x 4 x i32> %a to <vscale x 4 x i64>
94+
%b.sext = sext <vscale x 4 x i32> %b to <vscale x 4 x i64>
95+
%sub = sub <vscale x 4 x i64> %a.sext, %b.sext
96+
%abs = call <vscale x 4 x i64> @llvm.abs.nxv4i64(<vscale x 4 x i64> %sub, i1 true)
97+
%trunc = trunc <vscale x 4 x i64> %abs to <vscale x 4 x i32>
98+
ret <vscale x 4 x i32> %trunc
99+
}
100+
101+
define <vscale x 4 x i32> @sabd_s_promoted_ops(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b) {
102+
; CHECK-LABEL: sabd_s_promoted_ops:
103+
; CHECK: # %bb.0:
104+
; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
105+
; CHECK-NEXT: vwsub.vv v10, v8, v9
106+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
107+
; CHECK-NEXT: vrsub.vi v8, v10, 0
108+
; CHECK-NEXT: vmax.vv v8, v10, v8
109+
; CHECK-NEXT: ret
110+
%a.sext = sext <vscale x 4 x i16> %a to <vscale x 4 x i32>
111+
%b.sext = sext <vscale x 4 x i16> %b to <vscale x 4 x i32>
112+
%sub = sub <vscale x 4 x i32> %a.sext, %b.sext
113+
%abs = call <vscale x 4 x i32> @llvm.abs.nxv4i32(<vscale x 4 x i32> %sub, i1 true)
114+
ret <vscale x 4 x i32> %abs
115+
}
116+
117+
; FIXME: Crashes legalization if enabled
118+
;; define <vscale x 2 x i64> @sabd_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
119+
;; %a.sext = sext <vscale x 2 x i64> %a to <vscale x 2 x i128>
120+
;; %b.sext = sext <vscale x 2 x i64> %b to <vscale x 2 x i128>
121+
;; %sub = sub <vscale x 2 x i128> %a.sext, %b.sext
122+
;; %abs = call <vscale x 2 x i128> @llvm.abs.nxv2i128(<vscale x 2 x i128> %sub, i1 true)
123+
;; %trunc = trunc <vscale x 2 x i128> %abs to <vscale x 2 x i64>
124+
;; ret <vscale x 2 x i64> %trunc
125+
;; }
126+
127+
define <vscale x 2 x i64> @sabd_d_promoted_ops(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) {
128+
; CHECK-LABEL: sabd_d_promoted_ops:
129+
; CHECK: # %bb.0:
130+
; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
131+
; CHECK-NEXT: vwsub.vv v10, v8, v9
132+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
133+
; CHECK-NEXT: vrsub.vi v8, v10, 0
134+
; CHECK-NEXT: vmax.vv v8, v10, v8
135+
; CHECK-NEXT: ret
136+
%a.sext = sext <vscale x 2 x i32> %a to <vscale x 2 x i64>
137+
%b.sext = sext <vscale x 2 x i32> %b to <vscale x 2 x i64>
138+
%sub = sub <vscale x 2 x i64> %a.sext, %b.sext
139+
%abs = call <vscale x 2 x i64> @llvm.abs.nxv2i64(<vscale x 2 x i64> %sub, i1 true)
140+
ret <vscale x 2 x i64> %abs
141+
}
142+
143+
;
144+
; UABD
145+
;
146+
147+
define <vscale x 16 x i8> @uabd_b(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
148+
; CHECK-LABEL: uabd_b:
149+
; CHECK: # %bb.0:
150+
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
151+
; CHECK-NEXT: vwsubu.vv v12, v8, v10
152+
; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma
153+
; CHECK-NEXT: vrsub.vi v8, v12, 0
154+
; CHECK-NEXT: vmax.vv v12, v12, v8
155+
; CHECK-NEXT: vsetvli zero, zero, e8, m2, ta, ma
156+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
157+
; CHECK-NEXT: ret
158+
%a.zext = zext <vscale x 16 x i8> %a to <vscale x 16 x i16>
159+
%b.zext = zext <vscale x 16 x i8> %b to <vscale x 16 x i16>
160+
%sub = sub <vscale x 16 x i16> %a.zext, %b.zext
161+
%abs = call <vscale x 16 x i16> @llvm.abs.nxv16i16(<vscale x 16 x i16> %sub, i1 true)
162+
%trunc = trunc <vscale x 16 x i16> %abs to <vscale x 16 x i8>
163+
ret <vscale x 16 x i8> %trunc
164+
}
165+
166+
define <vscale x 16 x i8> @uabd_b_promoted_ops(<vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
167+
; CHECK-LABEL: uabd_b_promoted_ops:
168+
; CHECK: # %bb.0:
169+
; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma
170+
; CHECK-NEXT: vmv.v.i v10, 0
171+
; CHECK-NEXT: vmerge.vim v12, v10, 1, v0
172+
; CHECK-NEXT: vmv1r.v v0, v8
173+
; CHECK-NEXT: vmerge.vim v8, v10, 1, v0
174+
; CHECK-NEXT: vsub.vv v8, v12, v8
175+
; CHECK-NEXT: vrsub.vi v10, v8, 0
176+
; CHECK-NEXT: vmax.vv v8, v8, v10
177+
; CHECK-NEXT: ret
178+
%a.zext = zext <vscale x 16 x i1> %a to <vscale x 16 x i8>
179+
%b.zext = zext <vscale x 16 x i1> %b to <vscale x 16 x i8>
180+
%sub = sub <vscale x 16 x i8> %a.zext, %b.zext
181+
%abs = call <vscale x 16 x i8> @llvm.abs.nxv16i8(<vscale x 16 x i8> %sub, i1 true)
182+
ret <vscale x 16 x i8> %abs
183+
}
184+
185+
define <vscale x 8 x i16> @uabd_h(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
186+
; CHECK-LABEL: uabd_h:
187+
; CHECK: # %bb.0:
188+
; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma
189+
; CHECK-NEXT: vwsubu.vv v12, v8, v10
190+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
191+
; CHECK-NEXT: vrsub.vi v8, v12, 0
192+
; CHECK-NEXT: vmax.vv v12, v12, v8
193+
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
194+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
195+
; CHECK-NEXT: ret
196+
%a.zext = zext <vscale x 8 x i16> %a to <vscale x 8 x i32>
197+
%b.zext = zext <vscale x 8 x i16> %b to <vscale x 8 x i32>
198+
%sub = sub <vscale x 8 x i32> %a.zext, %b.zext
199+
%abs = call <vscale x 8 x i32> @llvm.abs.nxv8i32(<vscale x 8 x i32> %sub, i1 true)
200+
%trunc = trunc <vscale x 8 x i32> %abs to <vscale x 8 x i16>
201+
ret <vscale x 8 x i16> %trunc
202+
}
203+
204+
define <vscale x 8 x i16> @uabd_h_promoted_ops(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
205+
; CHECK-LABEL: uabd_h_promoted_ops:
206+
; CHECK: # %bb.0:
207+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
208+
; CHECK-NEXT: vwsubu.vv v10, v8, v9
209+
; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma
210+
; CHECK-NEXT: vrsub.vi v8, v10, 0
211+
; CHECK-NEXT: vmax.vv v8, v10, v8
212+
; CHECK-NEXT: ret
213+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i16>
214+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i16>
215+
%sub = sub <vscale x 8 x i16> %a.zext, %b.zext
216+
%abs = call <vscale x 8 x i16> @llvm.abs.nxv8i16(<vscale x 8 x i16> %sub, i1 true)
217+
ret <vscale x 8 x i16> %abs
218+
}
219+
220+
define <vscale x 4 x i32> @uabd_s(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
221+
; CHECK-LABEL: uabd_s:
222+
; CHECK: # %bb.0:
223+
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
224+
; CHECK-NEXT: vwsubu.vv v12, v8, v10
225+
; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma
226+
; CHECK-NEXT: vrsub.vi v8, v12, 0
227+
; CHECK-NEXT: vmax.vv v12, v12, v8
228+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
229+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
230+
; CHECK-NEXT: ret
231+
%a.zext = zext <vscale x 4 x i32> %a to <vscale x 4 x i64>
232+
%b.zext = zext <vscale x 4 x i32> %b to <vscale x 4 x i64>
233+
%sub = sub <vscale x 4 x i64> %a.zext, %b.zext
234+
%abs = call <vscale x 4 x i64> @llvm.abs.nxv4i64(<vscale x 4 x i64> %sub, i1 true)
235+
%trunc = trunc <vscale x 4 x i64> %abs to <vscale x 4 x i32>
236+
ret <vscale x 4 x i32> %trunc
237+
}
238+
239+
define <vscale x 4 x i32> @uabd_s_promoted_ops(<vscale x 4 x i16> %a, <vscale x 4 x i16> %b) {
240+
; CHECK-LABEL: uabd_s_promoted_ops:
241+
; CHECK: # %bb.0:
242+
; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
243+
; CHECK-NEXT: vwsubu.vv v10, v8, v9
244+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
245+
; CHECK-NEXT: vrsub.vi v8, v10, 0
246+
; CHECK-NEXT: vmax.vv v8, v10, v8
247+
; CHECK-NEXT: ret
248+
%a.zext = zext <vscale x 4 x i16> %a to <vscale x 4 x i32>
249+
%b.zext = zext <vscale x 4 x i16> %b to <vscale x 4 x i32>
250+
%sub = sub <vscale x 4 x i32> %a.zext, %b.zext
251+
%abs = call <vscale x 4 x i32> @llvm.abs.nxv4i32(<vscale x 4 x i32> %sub, i1 true)
252+
ret <vscale x 4 x i32> %abs
253+
}
254+
255+
; FIXME: Crashes legalization if enabled
256+
;; define <vscale x 2 x i64> @uabd_d(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
257+
;; %a.zext = zext <vscale x 2 x i64> %a to <vscale x 2 x i128>
258+
;; %b.zext = zext <vscale x 2 x i64> %b to <vscale x 2 x i128>
259+
;; %sub = sub <vscale x 2 x i128> %a.zext, %b.zext
260+
;; %abs = call <vscale x 2 x i128> @llvm.abs.nxv2i128(<vscale x 2 x i128> %sub, i1 true)
261+
;; %trunc = trunc <vscale x 2 x i128> %abs to <vscale x 2 x i64>
262+
;; ret <vscale x 2 x i64> %trunc
263+
;; }
264+
265+
define <vscale x 2 x i64> @uabd_d_promoted_ops(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) {
266+
; CHECK-LABEL: uabd_d_promoted_ops:
267+
; CHECK: # %bb.0:
268+
; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
269+
; CHECK-NEXT: vwsubu.vv v10, v8, v9
270+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
271+
; CHECK-NEXT: vrsub.vi v8, v10, 0
272+
; CHECK-NEXT: vmax.vv v8, v10, v8
273+
; CHECK-NEXT: ret
274+
%a.zext = zext <vscale x 2 x i32> %a to <vscale x 2 x i64>
275+
%b.zext = zext <vscale x 2 x i32> %b to <vscale x 2 x i64>
276+
%sub = sub <vscale x 2 x i64> %a.zext, %b.zext
277+
%abs = call <vscale x 2 x i64> @llvm.abs.nxv2i64(<vscale x 2 x i64> %sub, i1 true)
278+
ret <vscale x 2 x i64> %abs
279+
}
280+
281+
; Test the situation where isLegal(ISD::ABD, typeof(%a)) returns true but %a and
282+
; %b have differing types.
283+
define <vscale x 4 x i32> @uabd_non_matching_extension(<vscale x 4 x i32> %a, <vscale x 4 x i8> %b) {
284+
; CHECK-LABEL: uabd_non_matching_extension:
285+
; CHECK: # %bb.0:
286+
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
287+
; CHECK-NEXT: vzext.vf4 v12, v10
288+
; CHECK-NEXT: vwsubu.vv v16, v8, v12
289+
; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma
290+
; CHECK-NEXT: vrsub.vi v8, v16, 0
291+
; CHECK-NEXT: vmax.vv v12, v16, v8
292+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
293+
; CHECK-NEXT: vnsrl.wi v8, v12, 0
294+
; CHECK-NEXT: ret
295+
%a.zext = zext <vscale x 4 x i32> %a to <vscale x 4 x i64>
296+
%b.zext = zext <vscale x 4 x i8> %b to <vscale x 4 x i64>
297+
%sub = sub <vscale x 4 x i64> %a.zext, %b.zext
298+
%abs = call <vscale x 4 x i64> @llvm.abs.nxv4i64(<vscale x 4 x i64> %sub, i1 true)
299+
%trunc = trunc <vscale x 4 x i64> %abs to <vscale x 4 x i32>
300+
ret <vscale x 4 x i32> %trunc
301+
}
302+
303+
; Test the situation where isLegal(ISD::ABD, typeof(%a.zext)) returns true but
304+
; %a and %b have differing types.
305+
define <vscale x 4 x i32> @uabd_non_matching_promoted_ops(<vscale x 4 x i8> %a, <vscale x 4 x i16> %b) {
306+
; CHECK-LABEL: uabd_non_matching_promoted_ops:
307+
; CHECK: # %bb.0:
308+
; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
309+
; CHECK-NEXT: vzext.vf2 v10, v8
310+
; CHECK-NEXT: vwsubu.vv v12, v10, v9
311+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
312+
; CHECK-NEXT: vrsub.vi v8, v12, 0
313+
; CHECK-NEXT: vmax.vv v8, v12, v8
314+
; CHECK-NEXT: ret
315+
%a.zext = zext <vscale x 4 x i8> %a to <vscale x 4 x i32>
316+
%b.zext = zext <vscale x 4 x i16> %b to <vscale x 4 x i32>
317+
%sub = sub <vscale x 4 x i32> %a.zext, %b.zext
318+
%abs = call <vscale x 4 x i32> @llvm.abs.nxv4i32(<vscale x 4 x i32> %sub, i1 true)
319+
ret <vscale x 4 x i32> %abs
320+
}
321+
322+
; Test the situation where isLegal(ISD::ABD, typeof(%a)) returns true but %a and
323+
; %b are promoted differently.
324+
define <vscale x 4 x i32> @uabd_non_matching_promotion(<vscale x 4 x i8> %a, <vscale x 4 x i8> %b) {
325+
; CHECK-LABEL: uabd_non_matching_promotion:
326+
; CHECK: # %bb.0:
327+
; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
328+
; CHECK-NEXT: vzext.vf4 v10, v8
329+
; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma
330+
; CHECK-NEXT: vsext.vf2 v8, v9
331+
; CHECK-NEXT: vwsub.wv v10, v10, v8
332+
; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
333+
; CHECK-NEXT: vrsub.vi v8, v10, 0
334+
; CHECK-NEXT: vmax.vv v8, v10, v8
335+
; CHECK-NEXT: ret
336+
%a.zext = zext <vscale x 4 x i8> %a to <vscale x 4 x i32>
337+
%b.zext = sext <vscale x 4 x i8> %b to <vscale x 4 x i32>
338+
%sub = sub <vscale x 4 x i32> %a.zext, %b.zext
339+
%abs = call <vscale x 4 x i32> @llvm.abs.nxv4i32(<vscale x 4 x i32> %sub, i1 true)
340+
ret <vscale x 4 x i32> %abs
341+
}
342+
343+
declare <vscale x 16 x i8> @llvm.abs.nxv16i8(<vscale x 16 x i8>, i1)
344+
345+
declare <vscale x 8 x i16> @llvm.abs.nxv8i16(<vscale x 8 x i16>, i1)
346+
declare <vscale x 16 x i16> @llvm.abs.nxv16i16(<vscale x 16 x i16>, i1)
347+
348+
declare <vscale x 4 x i32> @llvm.abs.nxv4i32(<vscale x 4 x i32>, i1)
349+
declare <vscale x 8 x i32> @llvm.abs.nxv8i32(<vscale x 8 x i32>, i1)
350+
351+
declare <vscale x 2 x i64> @llvm.abs.nxv2i64(<vscale x 2 x i64>, i1)
352+
declare <vscale x 4 x i64> @llvm.abs.nxv4i64(<vscale x 4 x i64>, i1)
353+
354+
declare <vscale x 2 x i128> @llvm.abs.nxv2i128(<vscale x 2 x i128>, i1)
355+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
356+
; RV32: {{.*}}
357+
; RV64: {{.*}}

0 commit comments

Comments
 (0)