Skip to content

Commit 216097d

Browse files
committed
Pre-commit tests for absolute difference
1 parent 9356091 commit 216097d

File tree

2 files changed

+652
-0
lines changed
  • llvm/test/CodeGen/LoongArch

2 files changed

+652
-0
lines changed
Lines changed: 326 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,326 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=loongarch64 -mattr=+lasx < %s | FileCheck %s
3+
4+
;; Mostly copy from AArch64/neon-abd.ll
5+
6+
;
7+
; VABDS_[B/H/W/D]
8+
;
9+
define <32 x i8> @xvabsd_b(<32 x i8> %a, <32 x i8> %b) #0 {
10+
; CHECK-LABEL: xvabsd_b:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: xvmin.b $xr2, $xr0, $xr1
13+
; CHECK-NEXT: xvmax.b $xr0, $xr0, $xr1
14+
; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr2
15+
; CHECK-NEXT: ret
16+
%a.sext = sext <32 x i8> %a to <32 x i16>
17+
%b.sext = sext <32 x i8> %b to <32 x i16>
18+
%sub = sub <32 x i16> %a.sext, %b.sext
19+
%abs = call <32 x i16> @llvm.abs.v32i16(<32 x i16> %sub, i1 true)
20+
%trunc = trunc <32 x i16> %abs to <32 x i8>
21+
ret <32 x i8> %trunc
22+
}
23+
24+
define <16 x i16> @xvabsd_h(<16 x i16> %a, <16 x i16> %b) #0 {
25+
; CHECK-LABEL: xvabsd_h:
26+
; CHECK: # %bb.0:
27+
; CHECK-NEXT: xvmin.h $xr2, $xr0, $xr1
28+
; CHECK-NEXT: xvmax.h $xr0, $xr0, $xr1
29+
; CHECK-NEXT: xvsub.h $xr0, $xr0, $xr2
30+
; CHECK-NEXT: ret
31+
%a.sext = sext <16 x i16> %a to <16 x i32>
32+
%b.sext = sext <16 x i16> %b to <16 x i32>
33+
%sub = sub <16 x i32> %a.sext, %b.sext
34+
%abs = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %sub, i1 true)
35+
%trunc = trunc <16 x i32> %abs to <16 x i16>
36+
ret <16 x i16> %trunc
37+
}
38+
39+
define <8 x i32> @xvabsd_w(<8 x i32> %a, <8 x i32> %b) #0 {
40+
; CHECK-LABEL: xvabsd_w:
41+
; CHECK: # %bb.0:
42+
; CHECK-NEXT: xvmin.w $xr2, $xr0, $xr1
43+
; CHECK-NEXT: xvmax.w $xr0, $xr0, $xr1
44+
; CHECK-NEXT: xvsub.w $xr0, $xr0, $xr2
45+
; CHECK-NEXT: ret
46+
%a.sext = sext <8 x i32> %a to <8 x i64>
47+
%b.sext = sext <8 x i32> %b to <8 x i64>
48+
%sub = sub <8 x i64> %a.sext, %b.sext
49+
%abs = call <8 x i64> @llvm.abs.v8i64(<8 x i64> %sub, i1 true)
50+
%trunc = trunc <8 x i64> %abs to <8 x i32>
51+
ret <8 x i32> %trunc
52+
}
53+
54+
define <4 x i64> @xvabsd_d(<4 x i64> %a, <4 x i64> %b) #0 {
55+
; CHECK-LABEL: xvabsd_d:
56+
; CHECK: # %bb.0:
57+
; CHECK-NEXT: xvmin.d $xr2, $xr0, $xr1
58+
; CHECK-NEXT: xvmax.d $xr0, $xr0, $xr1
59+
; CHECK-NEXT: xvsub.d $xr0, $xr0, $xr2
60+
; CHECK-NEXT: ret
61+
%a.sext = sext <4 x i64> %a to <4 x i128>
62+
%b.sext = sext <4 x i64> %b to <4 x i128>
63+
%sub = sub <4 x i128> %a.sext, %b.sext
64+
%abs = call <4 x i128> @llvm.abs.v4i128(<4 x i128> %sub, i1 true)
65+
%trunc = trunc <4 x i128> %abs to <4 x i64>
66+
ret <4 x i64> %trunc
67+
}
68+
69+
;
70+
; xvabsd_[B/H/W/D]U
71+
;
72+
73+
define <32 x i8> @xvabsd_bu(<32 x i8> %a, <32 x i8> %b) #0 {
74+
; CHECK-LABEL: xvabsd_bu:
75+
; CHECK: # %bb.0:
76+
; CHECK-NEXT: xvmin.bu $xr2, $xr0, $xr1
77+
; CHECK-NEXT: xvmax.bu $xr0, $xr0, $xr1
78+
; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr2
79+
; CHECK-NEXT: ret
80+
%a.zext = zext <32 x i8> %a to <32 x i16>
81+
%b.zext = zext <32 x i8> %b to <32 x i16>
82+
%sub = sub <32 x i16> %a.zext, %b.zext
83+
%abs = call <32 x i16> @llvm.abs.v32i16(<32 x i16> %sub, i1 true)
84+
%trunc = trunc <32 x i16> %abs to <32 x i8>
85+
ret <32 x i8> %trunc
86+
}
87+
88+
define <16 x i16> @xvabsd_hu(<16 x i16> %a, <16 x i16> %b) #0 {
89+
; CHECK-LABEL: xvabsd_hu:
90+
; CHECK: # %bb.0:
91+
; CHECK-NEXT: xvmin.hu $xr2, $xr0, $xr1
92+
; CHECK-NEXT: xvmax.hu $xr0, $xr0, $xr1
93+
; CHECK-NEXT: xvsub.h $xr0, $xr0, $xr2
94+
; CHECK-NEXT: ret
95+
%a.zext = zext <16 x i16> %a to <16 x i32>
96+
%b.zext = zext <16 x i16> %b to <16 x i32>
97+
%sub = sub <16 x i32> %a.zext, %b.zext
98+
%abs = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %sub, i1 true)
99+
%trunc = trunc <16 x i32> %abs to <16 x i16>
100+
ret <16 x i16> %trunc
101+
}
102+
103+
define <8 x i32> @xvabsd_wu(<8 x i32> %a, <8 x i32> %b) #0 {
104+
; CHECK-LABEL: xvabsd_wu:
105+
; CHECK: # %bb.0:
106+
; CHECK-NEXT: xvmin.wu $xr2, $xr0, $xr1
107+
; CHECK-NEXT: xvmax.wu $xr0, $xr0, $xr1
108+
; CHECK-NEXT: xvsub.w $xr0, $xr0, $xr2
109+
; CHECK-NEXT: ret
110+
%a.zext = zext <8 x i32> %a to <8 x i64>
111+
%b.zext = zext <8 x i32> %b to <8 x i64>
112+
%sub = sub <8 x i64> %a.zext, %b.zext
113+
%abs = call <8 x i64> @llvm.abs.v8i64(<8 x i64> %sub, i1 true)
114+
%trunc = trunc <8 x i64> %abs to <8 x i32>
115+
ret <8 x i32> %trunc
116+
}
117+
118+
define <4 x i64> @xvabsd_du(<4 x i64> %a, <4 x i64> %b) #0 {
119+
; CHECK-LABEL: xvabsd_du:
120+
; CHECK: # %bb.0:
121+
; CHECK-NEXT: xvmin.du $xr2, $xr0, $xr1
122+
; CHECK-NEXT: xvmax.du $xr0, $xr0, $xr1
123+
; CHECK-NEXT: xvsub.d $xr0, $xr0, $xr2
124+
; CHECK-NEXT: ret
125+
%a.zext = zext <4 x i64> %a to <4 x i128>
126+
%b.zext = zext <4 x i64> %b to <4 x i128>
127+
%sub = sub <4 x i128> %a.zext, %b.zext
128+
%abs = call <4 x i128> @llvm.abs.v4i128(<4 x i128> %sub, i1 true)
129+
%trunc = trunc <4 x i128> %abs to <4 x i64>
130+
ret <4 x i64> %trunc
131+
}
132+
133+
define <32 x i8> @xvabsd_v32i8_nsw(<32 x i8> %a, <32 x i8> %b) #0 {
134+
; CHECK-LABEL: xvabsd_v32i8_nsw:
135+
; CHECK: # %bb.0:
136+
; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr1
137+
; CHECK-NEXT: xvneg.b $xr1, $xr0
138+
; CHECK-NEXT: xvmax.b $xr0, $xr0, $xr1
139+
; CHECK-NEXT: ret
140+
%sub = sub nsw <32 x i8> %a, %b
141+
%abs = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %sub, i1 true)
142+
ret <32 x i8> %abs
143+
}
144+
145+
define <16 x i16> @xvabsd_v16i16_nsw(<16 x i16> %a, <16 x i16> %b) #0 {
146+
; CHECK-LABEL: xvabsd_v16i16_nsw:
147+
; CHECK: # %bb.0:
148+
; CHECK-NEXT: xvsub.h $xr0, $xr0, $xr1
149+
; CHECK-NEXT: xvneg.h $xr1, $xr0
150+
; CHECK-NEXT: xvmax.h $xr0, $xr0, $xr1
151+
; CHECK-NEXT: ret
152+
%sub = sub nsw <16 x i16> %a, %b
153+
%abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %sub, i1 true)
154+
ret <16 x i16> %abs
155+
}
156+
157+
define <8 x i32> @xvabsd_v8i32_nsw(<8 x i32> %a, <8 x i32> %b) #0 {
158+
; CHECK-LABEL: xvabsd_v8i32_nsw:
159+
; CHECK: # %bb.0:
160+
; CHECK-NEXT: xvsub.w $xr0, $xr0, $xr1
161+
; CHECK-NEXT: xvneg.w $xr1, $xr0
162+
; CHECK-NEXT: xvmax.w $xr0, $xr0, $xr1
163+
; CHECK-NEXT: ret
164+
%sub = sub nsw <8 x i32> %a, %b
165+
%abs = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %sub, i1 true)
166+
ret <8 x i32> %abs
167+
}
168+
169+
define <4 x i64> @xvabsd_v4i64_nsw(<4 x i64> %a, <4 x i64> %b) #0 {
170+
; CHECK-LABEL: xvabsd_v4i64_nsw:
171+
; CHECK: # %bb.0:
172+
; CHECK-NEXT: xvsub.d $xr0, $xr0, $xr1
173+
; CHECK-NEXT: xvneg.d $xr1, $xr0
174+
; CHECK-NEXT: xvmax.d $xr0, $xr0, $xr1
175+
; CHECK-NEXT: ret
176+
%sub = sub nsw <4 x i64> %a, %b
177+
%abs = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %sub, i1 true)
178+
ret <4 x i64> %abs
179+
}
180+
181+
define <32 x i8> @smaxmin_v32i8(<32 x i8> %0, <32 x i8> %1) {
182+
; CHECK-LABEL: smaxmin_v32i8:
183+
; CHECK: # %bb.0:
184+
; CHECK-NEXT: xvmin.b $xr2, $xr0, $xr1
185+
; CHECK-NEXT: xvmax.b $xr0, $xr0, $xr1
186+
; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr2
187+
; CHECK-NEXT: ret
188+
%a = tail call <32 x i8> @llvm.smax.v32i8(<32 x i8> %0, <32 x i8> %1)
189+
%b = tail call <32 x i8> @llvm.smin.v32i8(<32 x i8> %0, <32 x i8> %1)
190+
%sub = sub <32 x i8> %a, %b
191+
ret <32 x i8> %sub
192+
}
193+
194+
define <16 x i16> @smaxmin_v16i16(<16 x i16> %0, <16 x i16> %1) {
195+
; CHECK-LABEL: smaxmin_v16i16:
196+
; CHECK: # %bb.0:
197+
; CHECK-NEXT: xvmin.h $xr2, $xr0, $xr1
198+
; CHECK-NEXT: xvmax.h $xr0, $xr0, $xr1
199+
; CHECK-NEXT: xvsub.h $xr0, $xr0, $xr2
200+
; CHECK-NEXT: ret
201+
%a = tail call <16 x i16> @llvm.smax.v16i16(<16 x i16> %0, <16 x i16> %1)
202+
%b = tail call <16 x i16> @llvm.smin.v16i16(<16 x i16> %0, <16 x i16> %1)
203+
%sub = sub <16 x i16> %a, %b
204+
ret <16 x i16> %sub
205+
}
206+
207+
define <8 x i32> @smaxmin_v8i32(<8 x i32> %0, <8 x i32> %1) {
208+
; CHECK-LABEL: smaxmin_v8i32:
209+
; CHECK: # %bb.0:
210+
; CHECK-NEXT: xvmin.w $xr2, $xr0, $xr1
211+
; CHECK-NEXT: xvmax.w $xr0, $xr0, $xr1
212+
; CHECK-NEXT: xvsub.w $xr0, $xr0, $xr2
213+
; CHECK-NEXT: ret
214+
%a = tail call <8 x i32> @llvm.smax.v8i32(<8 x i32> %0, <8 x i32> %1)
215+
%b = tail call <8 x i32> @llvm.smin.v8i32(<8 x i32> %0, <8 x i32> %1)
216+
%sub = sub <8 x i32> %a, %b
217+
ret <8 x i32> %sub
218+
}
219+
220+
define <4 x i64> @smaxmin_v4i64(<4 x i64> %0, <4 x i64> %1) {
221+
; CHECK-LABEL: smaxmin_v4i64:
222+
; CHECK: # %bb.0:
223+
; CHECK-NEXT: xvmin.d $xr2, $xr0, $xr1
224+
; CHECK-NEXT: xvmax.d $xr0, $xr0, $xr1
225+
; CHECK-NEXT: xvsub.d $xr0, $xr0, $xr2
226+
; CHECK-NEXT: ret
227+
%a = tail call <4 x i64> @llvm.smax.v4i64(<4 x i64> %0, <4 x i64> %1)
228+
%b = tail call <4 x i64> @llvm.smin.v4i64(<4 x i64> %0, <4 x i64> %1)
229+
%sub = sub <4 x i64> %a, %b
230+
ret <4 x i64> %sub
231+
}
232+
233+
define <32 x i8> @umaxmin_v32i8(<32 x i8> %0, <32 x i8> %1) {
234+
; CHECK-LABEL: umaxmin_v32i8:
235+
; CHECK: # %bb.0:
236+
; CHECK-NEXT: xvmin.bu $xr2, $xr0, $xr1
237+
; CHECK-NEXT: xvmax.bu $xr0, $xr0, $xr1
238+
; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr2
239+
; CHECK-NEXT: ret
240+
%a = tail call <32 x i8> @llvm.umax.v32i8(<32 x i8> %0, <32 x i8> %1)
241+
%b = tail call <32 x i8> @llvm.umin.v32i8(<32 x i8> %0, <32 x i8> %1)
242+
%sub = sub <32 x i8> %a, %b
243+
ret <32 x i8> %sub
244+
}
245+
246+
define <16 x i16> @umaxmin_v16i16(<16 x i16> %0, <16 x i16> %1) {
247+
; CHECK-LABEL: umaxmin_v16i16:
248+
; CHECK: # %bb.0:
249+
; CHECK-NEXT: xvmin.hu $xr2, $xr0, $xr1
250+
; CHECK-NEXT: xvmax.hu $xr0, $xr0, $xr1
251+
; CHECK-NEXT: xvsub.h $xr0, $xr0, $xr2
252+
; CHECK-NEXT: ret
253+
%a = tail call <16 x i16> @llvm.umax.v16i16(<16 x i16> %0, <16 x i16> %1)
254+
%b = tail call <16 x i16> @llvm.umin.v16i16(<16 x i16> %0, <16 x i16> %1)
255+
%sub = sub <16 x i16> %a, %b
256+
ret <16 x i16> %sub
257+
}
258+
259+
define <8 x i32> @umaxmin_v8i32(<8 x i32> %0, <8 x i32> %1) {
260+
; CHECK-LABEL: umaxmin_v8i32:
261+
; CHECK: # %bb.0:
262+
; CHECK-NEXT: xvmin.wu $xr2, $xr0, $xr1
263+
; CHECK-NEXT: xvmax.wu $xr0, $xr0, $xr1
264+
; CHECK-NEXT: xvsub.w $xr0, $xr0, $xr2
265+
; CHECK-NEXT: ret
266+
%a = tail call <8 x i32> @llvm.umax.v8i32(<8 x i32> %0, <8 x i32> %1)
267+
%b = tail call <8 x i32> @llvm.umin.v8i32(<8 x i32> %0, <8 x i32> %1)
268+
%sub = sub <8 x i32> %a, %b
269+
ret <8 x i32> %sub
270+
}
271+
272+
define <4 x i64> @umaxmin_v4i64(<4 x i64> %0, <4 x i64> %1) {
273+
; CHECK-LABEL: umaxmin_v4i64:
274+
; CHECK: # %bb.0:
275+
; CHECK-NEXT: xvmin.du $xr2, $xr0, $xr1
276+
; CHECK-NEXT: xvmax.du $xr0, $xr0, $xr1
277+
; CHECK-NEXT: xvsub.d $xr0, $xr0, $xr2
278+
; CHECK-NEXT: ret
279+
%a = tail call <4 x i64> @llvm.umax.v4i64(<4 x i64> %0, <4 x i64> %1)
280+
%b = tail call <4 x i64> @llvm.umin.v4i64(<4 x i64> %0, <4 x i64> %1)
281+
%sub = sub <4 x i64> %a, %b
282+
ret <4 x i64> %sub
283+
}
284+
285+
define <32 x i8> @umaxmin_v32i8_com1(<32 x i8> %0, <32 x i8> %1) {
286+
; CHECK-LABEL: umaxmin_v32i8_com1:
287+
; CHECK: # %bb.0:
288+
; CHECK-NEXT: xvmin.bu $xr2, $xr0, $xr1
289+
; CHECK-NEXT: xvmax.bu $xr0, $xr0, $xr1
290+
; CHECK-NEXT: xvsub.b $xr0, $xr0, $xr2
291+
; CHECK-NEXT: ret
292+
%a = tail call <32 x i8> @llvm.umax.v32i8(<32 x i8> %0, <32 x i8> %1)
293+
%b = tail call <32 x i8> @llvm.umin.v32i8(<32 x i8> %1, <32 x i8> %0)
294+
%sub = sub <32 x i8> %a, %b
295+
ret <32 x i8> %sub
296+
}
297+
298+
declare <32 x i8> @llvm.abs.v32i8(<32 x i8>, i1)
299+
300+
declare <16 x i16> @llvm.abs.v16i16(<16 x i16>, i1)
301+
declare <32 x i16> @llvm.abs.v32i16(<32 x i16>, i1)
302+
303+
declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1)
304+
declare <16 x i32> @llvm.abs.v16i32(<16 x i32>, i1)
305+
306+
declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1)
307+
declare <8 x i64> @llvm.abs.v8i64(<8 x i64>, i1)
308+
309+
declare <4 x i128> @llvm.abs.v4i128(<4 x i128>, i1)
310+
311+
declare <32 x i8> @llvm.smax.v32i8(<32 x i8>, <32 x i8>)
312+
declare <16 x i16> @llvm.smax.v16i16(<16 x i16>, <16 x i16>)
313+
declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)
314+
declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)
315+
declare <32 x i8> @llvm.smin.v32i8(<32 x i8>, <32 x i8>)
316+
declare <16 x i16> @llvm.smin.v16i16(<16 x i16>, <16 x i16>)
317+
declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)
318+
declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)
319+
declare <32 x i8> @llvm.umax.v32i8(<32 x i8>, <32 x i8>)
320+
declare <16 x i16> @llvm.umax.v16i16(<16 x i16>, <16 x i16>)
321+
declare <8 x i32> @llvm.umax.v8i32(<8 x i32>, <8 x i32>)
322+
declare <4 x i64> @llvm.umax.v4i64(<4 x i64>, <4 x i64>)
323+
declare <32 x i8> @llvm.umin.v32i8(<32 x i8>, <32 x i8>)
324+
declare <16 x i16> @llvm.umin.v16i16(<16 x i16>, <16 x i16>)
325+
declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)
326+
declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)

0 commit comments

Comments
 (0)