Skip to content

Commit 7f7fc30

Browse files
committed
[ARM] Add and adjust saturation tests for upcoming qadd changes. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375401 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 2bcdb48 commit 7f7fc30

File tree

3 files changed

+416
-49
lines changed

3 files changed

+416
-49
lines changed

test/CodeGen/ARM/qdadd.ll

Lines changed: 328 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=thumbv7m-none-eabi | FileCheck %s --check-prefix=CHECK-T2 --check-prefix=CHECK-T2NODSP
3+
; RUN: llc < %s -mtriple=thumbv7em-none-eabi | FileCheck %s --check-prefix=CHECK-T2 --check-prefix=CHECK-T2DSP
4+
; RUN: llc < %s -mtriple=armv5te-none-none-eabi | FileCheck %s --check-prefix=CHECK-ARM --check-prefix=CHECK-ARM6
5+
; RUN: llc < %s -mtriple=armv8a-none-eabi | FileCheck %s --check-prefix=CHECK-ARM --check-prefix=CHECK-ARM8
6+
7+
define i32 @qdadd(i32 %x, i32 %y) nounwind {
8+
; CHECK-T2-LABEL: qdadd:
9+
; CHECK-T2: @ %bb.0:
10+
; CHECK-T2-NEXT: .save {r7, lr}
11+
; CHECK-T2-NEXT: push {r7, lr}
12+
; CHECK-T2-NEXT: movs r3, #0
13+
; CHECK-T2-NEXT: adds.w r12, r0, r0
14+
; CHECK-T2-NEXT: it mi
15+
; CHECK-T2-NEXT: movmi r3, #1
16+
; CHECK-T2-NEXT: cmp r3, #0
17+
; CHECK-T2-NEXT: mov.w r3, #-2147483648
18+
; CHECK-T2-NEXT: mov.w lr, #0
19+
; CHECK-T2-NEXT: it ne
20+
; CHECK-T2-NEXT: mvnne r3, #-2147483648
21+
; CHECK-T2-NEXT: cmp r12, r0
22+
; CHECK-T2-NEXT: it vc
23+
; CHECK-T2-NEXT: movvc r3, r12
24+
; CHECK-T2-NEXT: adds r0, r3, r1
25+
; CHECK-T2-NEXT: mov.w r2, #-2147483648
26+
; CHECK-T2-NEXT: it mi
27+
; CHECK-T2-NEXT: movmi.w lr, #1
28+
; CHECK-T2-NEXT: cmp.w lr, #0
29+
; CHECK-T2-NEXT: it ne
30+
; CHECK-T2-NEXT: mvnne r2, #-2147483648
31+
; CHECK-T2-NEXT: cmp r0, r3
32+
; CHECK-T2-NEXT: it vc
33+
; CHECK-T2-NEXT: movvc r2, r0
34+
; CHECK-T2-NEXT: mov r0, r2
35+
; CHECK-T2-NEXT: pop {r7, pc}
36+
;
37+
; CHECK-ARM6-LABEL: qdadd:
38+
; CHECK-ARM6: @ %bb.0:
39+
; CHECK-ARM6-NEXT: .save {r11, lr}
40+
; CHECK-ARM6-NEXT: push {r11, lr}
41+
; CHECK-ARM6-NEXT: adds r12, r0, r0
42+
; CHECK-ARM6-NEXT: mov r3, #0
43+
; CHECK-ARM6-NEXT: movmi r3, #1
44+
; CHECK-ARM6-NEXT: cmp r3, #0
45+
; CHECK-ARM6-NEXT: mov r3, #-2147483648
46+
; CHECK-ARM6-NEXT: mov lr, #0
47+
; CHECK-ARM6-NEXT: mvnne r3, #-2147483648
48+
; CHECK-ARM6-NEXT: cmp r12, r0
49+
; CHECK-ARM6-NEXT: movvc r3, r12
50+
; CHECK-ARM6-NEXT: adds r0, r3, r1
51+
; CHECK-ARM6-NEXT: movmi lr, #1
52+
; CHECK-ARM6-NEXT: mov r2, #-2147483648
53+
; CHECK-ARM6-NEXT: cmp lr, #0
54+
; CHECK-ARM6-NEXT: mvnne r2, #-2147483648
55+
; CHECK-ARM6-NEXT: cmp r0, r3
56+
; CHECK-ARM6-NEXT: movvc r2, r0
57+
; CHECK-ARM6-NEXT: mov r0, r2
58+
; CHECK-ARM6-NEXT: pop {r11, pc}
59+
;
60+
; CHECK-ARM8-LABEL: qdadd:
61+
; CHECK-ARM8: @ %bb.0:
62+
; CHECK-ARM8-NEXT: .save {r11, lr}
63+
; CHECK-ARM8-NEXT: push {r11, lr}
64+
; CHECK-ARM8-NEXT: adds r12, r0, r0
65+
; CHECK-ARM8-NEXT: mov r3, #0
66+
; CHECK-ARM8-NEXT: movwmi r3, #1
67+
; CHECK-ARM8-NEXT: cmp r3, #0
68+
; CHECK-ARM8-NEXT: mov r3, #-2147483648
69+
; CHECK-ARM8-NEXT: mov lr, #0
70+
; CHECK-ARM8-NEXT: mvnne r3, #-2147483648
71+
; CHECK-ARM8-NEXT: cmp r12, r0
72+
; CHECK-ARM8-NEXT: movvc r3, r12
73+
; CHECK-ARM8-NEXT: adds r0, r3, r1
74+
; CHECK-ARM8-NEXT: movwmi lr, #1
75+
; CHECK-ARM8-NEXT: mov r2, #-2147483648
76+
; CHECK-ARM8-NEXT: cmp lr, #0
77+
; CHECK-ARM8-NEXT: mvnne r2, #-2147483648
78+
; CHECK-ARM8-NEXT: cmp r0, r3
79+
; CHECK-ARM8-NEXT: movvc r2, r0
80+
; CHECK-ARM8-NEXT: mov r0, r2
81+
; CHECK-ARM8-NEXT: pop {r11, pc}
82+
%z = call i32 @llvm.sadd.sat.i32(i32 %x, i32 %x)
83+
%tmp = call i32 @llvm.sadd.sat.i32(i32 %z, i32 %y)
84+
ret i32 %tmp
85+
}
86+
87+
define i32 @qdadd_c(i32 %x, i32 %y) nounwind {
88+
; CHECK-T2-LABEL: qdadd_c:
89+
; CHECK-T2: @ %bb.0:
90+
; CHECK-T2-NEXT: .save {r7, lr}
91+
; CHECK-T2-NEXT: push {r7, lr}
92+
; CHECK-T2-NEXT: movs r3, #0
93+
; CHECK-T2-NEXT: adds.w r12, r0, r0
94+
; CHECK-T2-NEXT: it mi
95+
; CHECK-T2-NEXT: movmi r3, #1
96+
; CHECK-T2-NEXT: cmp r3, #0
97+
; CHECK-T2-NEXT: mov.w r3, #-2147483648
98+
; CHECK-T2-NEXT: mov.w lr, #0
99+
; CHECK-T2-NEXT: it ne
100+
; CHECK-T2-NEXT: mvnne r3, #-2147483648
101+
; CHECK-T2-NEXT: cmp r12, r0
102+
; CHECK-T2-NEXT: it vc
103+
; CHECK-T2-NEXT: movvc r3, r12
104+
; CHECK-T2-NEXT: adds r0, r1, r3
105+
; CHECK-T2-NEXT: mov.w r2, #-2147483648
106+
; CHECK-T2-NEXT: it mi
107+
; CHECK-T2-NEXT: movmi.w lr, #1
108+
; CHECK-T2-NEXT: cmp.w lr, #0
109+
; CHECK-T2-NEXT: it ne
110+
; CHECK-T2-NEXT: mvnne r2, #-2147483648
111+
; CHECK-T2-NEXT: cmp r0, r1
112+
; CHECK-T2-NEXT: it vc
113+
; CHECK-T2-NEXT: movvc r2, r0
114+
; CHECK-T2-NEXT: mov r0, r2
115+
; CHECK-T2-NEXT: pop {r7, pc}
116+
;
117+
; CHECK-ARM6-LABEL: qdadd_c:
118+
; CHECK-ARM6: @ %bb.0:
119+
; CHECK-ARM6-NEXT: .save {r11, lr}
120+
; CHECK-ARM6-NEXT: push {r11, lr}
121+
; CHECK-ARM6-NEXT: adds r12, r0, r0
122+
; CHECK-ARM6-NEXT: mov r3, #0
123+
; CHECK-ARM6-NEXT: movmi r3, #1
124+
; CHECK-ARM6-NEXT: cmp r3, #0
125+
; CHECK-ARM6-NEXT: mov r3, #-2147483648
126+
; CHECK-ARM6-NEXT: mov lr, #0
127+
; CHECK-ARM6-NEXT: mvnne r3, #-2147483648
128+
; CHECK-ARM6-NEXT: cmp r12, r0
129+
; CHECK-ARM6-NEXT: movvc r3, r12
130+
; CHECK-ARM6-NEXT: adds r0, r1, r3
131+
; CHECK-ARM6-NEXT: movmi lr, #1
132+
; CHECK-ARM6-NEXT: mov r2, #-2147483648
133+
; CHECK-ARM6-NEXT: cmp lr, #0
134+
; CHECK-ARM6-NEXT: mvnne r2, #-2147483648
135+
; CHECK-ARM6-NEXT: cmp r0, r1
136+
; CHECK-ARM6-NEXT: movvc r2, r0
137+
; CHECK-ARM6-NEXT: mov r0, r2
138+
; CHECK-ARM6-NEXT: pop {r11, pc}
139+
;
140+
; CHECK-ARM8-LABEL: qdadd_c:
141+
; CHECK-ARM8: @ %bb.0:
142+
; CHECK-ARM8-NEXT: .save {r11, lr}
143+
; CHECK-ARM8-NEXT: push {r11, lr}
144+
; CHECK-ARM8-NEXT: adds r12, r0, r0
145+
; CHECK-ARM8-NEXT: mov r3, #0
146+
; CHECK-ARM8-NEXT: movwmi r3, #1
147+
; CHECK-ARM8-NEXT: cmp r3, #0
148+
; CHECK-ARM8-NEXT: mov r3, #-2147483648
149+
; CHECK-ARM8-NEXT: mov lr, #0
150+
; CHECK-ARM8-NEXT: mvnne r3, #-2147483648
151+
; CHECK-ARM8-NEXT: cmp r12, r0
152+
; CHECK-ARM8-NEXT: movvc r3, r12
153+
; CHECK-ARM8-NEXT: adds r0, r1, r3
154+
; CHECK-ARM8-NEXT: movwmi lr, #1
155+
; CHECK-ARM8-NEXT: mov r2, #-2147483648
156+
; CHECK-ARM8-NEXT: cmp lr, #0
157+
; CHECK-ARM8-NEXT: mvnne r2, #-2147483648
158+
; CHECK-ARM8-NEXT: cmp r0, r1
159+
; CHECK-ARM8-NEXT: movvc r2, r0
160+
; CHECK-ARM8-NEXT: mov r0, r2
161+
; CHECK-ARM8-NEXT: pop {r11, pc}
162+
%z = call i32 @llvm.sadd.sat.i32(i32 %x, i32 %x)
163+
%tmp = call i32 @llvm.sadd.sat.i32(i32 %y, i32 %z)
164+
ret i32 %tmp
165+
}
166+
167+
define i32 @qdsub(i32 %x, i32 %y) nounwind {
168+
; CHECK-T2-LABEL: qdsub:
169+
; CHECK-T2: @ %bb.0:
170+
; CHECK-T2-NEXT: .save {r7, lr}
171+
; CHECK-T2-NEXT: push {r7, lr}
172+
; CHECK-T2-NEXT: movs r3, #0
173+
; CHECK-T2-NEXT: adds.w r12, r0, r0
174+
; CHECK-T2-NEXT: it mi
175+
; CHECK-T2-NEXT: movmi r3, #1
176+
; CHECK-T2-NEXT: cmp r3, #0
177+
; CHECK-T2-NEXT: mov.w r3, #-2147483648
178+
; CHECK-T2-NEXT: mov.w lr, #0
179+
; CHECK-T2-NEXT: it ne
180+
; CHECK-T2-NEXT: mvnne r3, #-2147483648
181+
; CHECK-T2-NEXT: cmp r12, r0
182+
; CHECK-T2-NEXT: it vc
183+
; CHECK-T2-NEXT: movvc r3, r12
184+
; CHECK-T2-NEXT: subs r0, r1, r3
185+
; CHECK-T2-NEXT: mov.w r2, #-2147483648
186+
; CHECK-T2-NEXT: it mi
187+
; CHECK-T2-NEXT: movmi.w lr, #1
188+
; CHECK-T2-NEXT: cmp.w lr, #0
189+
; CHECK-T2-NEXT: it ne
190+
; CHECK-T2-NEXT: mvnne r2, #-2147483648
191+
; CHECK-T2-NEXT: cmp r1, r3
192+
; CHECK-T2-NEXT: it vc
193+
; CHECK-T2-NEXT: movvc r2, r0
194+
; CHECK-T2-NEXT: mov r0, r2
195+
; CHECK-T2-NEXT: pop {r7, pc}
196+
;
197+
; CHECK-ARM6-LABEL: qdsub:
198+
; CHECK-ARM6: @ %bb.0:
199+
; CHECK-ARM6-NEXT: .save {r11, lr}
200+
; CHECK-ARM6-NEXT: push {r11, lr}
201+
; CHECK-ARM6-NEXT: adds r12, r0, r0
202+
; CHECK-ARM6-NEXT: mov r3, #0
203+
; CHECK-ARM6-NEXT: movmi r3, #1
204+
; CHECK-ARM6-NEXT: cmp r3, #0
205+
; CHECK-ARM6-NEXT: mov r3, #-2147483648
206+
; CHECK-ARM6-NEXT: mov lr, #0
207+
; CHECK-ARM6-NEXT: mvnne r3, #-2147483648
208+
; CHECK-ARM6-NEXT: cmp r12, r0
209+
; CHECK-ARM6-NEXT: movvc r3, r12
210+
; CHECK-ARM6-NEXT: subs r0, r1, r3
211+
; CHECK-ARM6-NEXT: movmi lr, #1
212+
; CHECK-ARM6-NEXT: mov r2, #-2147483648
213+
; CHECK-ARM6-NEXT: cmp lr, #0
214+
; CHECK-ARM6-NEXT: mvnne r2, #-2147483648
215+
; CHECK-ARM6-NEXT: cmp r1, r3
216+
; CHECK-ARM6-NEXT: movvc r2, r0
217+
; CHECK-ARM6-NEXT: mov r0, r2
218+
; CHECK-ARM6-NEXT: pop {r11, pc}
219+
;
220+
; CHECK-ARM8-LABEL: qdsub:
221+
; CHECK-ARM8: @ %bb.0:
222+
; CHECK-ARM8-NEXT: .save {r11, lr}
223+
; CHECK-ARM8-NEXT: push {r11, lr}
224+
; CHECK-ARM8-NEXT: adds r12, r0, r0
225+
; CHECK-ARM8-NEXT: mov r3, #0
226+
; CHECK-ARM8-NEXT: movwmi r3, #1
227+
; CHECK-ARM8-NEXT: cmp r3, #0
228+
; CHECK-ARM8-NEXT: mov r3, #-2147483648
229+
; CHECK-ARM8-NEXT: mov lr, #0
230+
; CHECK-ARM8-NEXT: mvnne r3, #-2147483648
231+
; CHECK-ARM8-NEXT: cmp r12, r0
232+
; CHECK-ARM8-NEXT: movvc r3, r12
233+
; CHECK-ARM8-NEXT: subs r0, r1, r3
234+
; CHECK-ARM8-NEXT: movwmi lr, #1
235+
; CHECK-ARM8-NEXT: mov r2, #-2147483648
236+
; CHECK-ARM8-NEXT: cmp lr, #0
237+
; CHECK-ARM8-NEXT: mvnne r2, #-2147483648
238+
; CHECK-ARM8-NEXT: cmp r1, r3
239+
; CHECK-ARM8-NEXT: movvc r2, r0
240+
; CHECK-ARM8-NEXT: mov r0, r2
241+
; CHECK-ARM8-NEXT: pop {r11, pc}
242+
%z = call i32 @llvm.sadd.sat.i32(i32 %x, i32 %x)
243+
%tmp = call i32 @llvm.ssub.sat.i32(i32 %y, i32 %z)
244+
ret i32 %tmp
245+
}
246+
247+
define i32 @qdsub_c(i32 %x, i32 %y) nounwind {
248+
; CHECK-T2-LABEL: qdsub_c:
249+
; CHECK-T2: @ %bb.0:
250+
; CHECK-T2-NEXT: .save {r7, lr}
251+
; CHECK-T2-NEXT: push {r7, lr}
252+
; CHECK-T2-NEXT: movs r3, #0
253+
; CHECK-T2-NEXT: adds.w r12, r0, r0
254+
; CHECK-T2-NEXT: it mi
255+
; CHECK-T2-NEXT: movmi r3, #1
256+
; CHECK-T2-NEXT: cmp r3, #0
257+
; CHECK-T2-NEXT: mov.w r3, #-2147483648
258+
; CHECK-T2-NEXT: mov.w lr, #0
259+
; CHECK-T2-NEXT: it ne
260+
; CHECK-T2-NEXT: mvnne r3, #-2147483648
261+
; CHECK-T2-NEXT: cmp r12, r0
262+
; CHECK-T2-NEXT: it vc
263+
; CHECK-T2-NEXT: movvc r3, r12
264+
; CHECK-T2-NEXT: subs r0, r3, r1
265+
; CHECK-T2-NEXT: mov.w r2, #-2147483648
266+
; CHECK-T2-NEXT: it mi
267+
; CHECK-T2-NEXT: movmi.w lr, #1
268+
; CHECK-T2-NEXT: cmp.w lr, #0
269+
; CHECK-T2-NEXT: it ne
270+
; CHECK-T2-NEXT: mvnne r2, #-2147483648
271+
; CHECK-T2-NEXT: cmp r3, r1
272+
; CHECK-T2-NEXT: it vc
273+
; CHECK-T2-NEXT: movvc r2, r0
274+
; CHECK-T2-NEXT: mov r0, r2
275+
; CHECK-T2-NEXT: pop {r7, pc}
276+
;
277+
; CHECK-ARM6-LABEL: qdsub_c:
278+
; CHECK-ARM6: @ %bb.0:
279+
; CHECK-ARM6-NEXT: .save {r11, lr}
280+
; CHECK-ARM6-NEXT: push {r11, lr}
281+
; CHECK-ARM6-NEXT: adds r12, r0, r0
282+
; CHECK-ARM6-NEXT: mov r3, #0
283+
; CHECK-ARM6-NEXT: movmi r3, #1
284+
; CHECK-ARM6-NEXT: cmp r3, #0
285+
; CHECK-ARM6-NEXT: mov r3, #-2147483648
286+
; CHECK-ARM6-NEXT: mov lr, #0
287+
; CHECK-ARM6-NEXT: mvnne r3, #-2147483648
288+
; CHECK-ARM6-NEXT: cmp r12, r0
289+
; CHECK-ARM6-NEXT: movvc r3, r12
290+
; CHECK-ARM6-NEXT: subs r0, r3, r1
291+
; CHECK-ARM6-NEXT: movmi lr, #1
292+
; CHECK-ARM6-NEXT: mov r2, #-2147483648
293+
; CHECK-ARM6-NEXT: cmp lr, #0
294+
; CHECK-ARM6-NEXT: mvnne r2, #-2147483648
295+
; CHECK-ARM6-NEXT: cmp r3, r1
296+
; CHECK-ARM6-NEXT: movvc r2, r0
297+
; CHECK-ARM6-NEXT: mov r0, r2
298+
; CHECK-ARM6-NEXT: pop {r11, pc}
299+
;
300+
; CHECK-ARM8-LABEL: qdsub_c:
301+
; CHECK-ARM8: @ %bb.0:
302+
; CHECK-ARM8-NEXT: .save {r11, lr}
303+
; CHECK-ARM8-NEXT: push {r11, lr}
304+
; CHECK-ARM8-NEXT: adds r12, r0, r0
305+
; CHECK-ARM8-NEXT: mov r3, #0
306+
; CHECK-ARM8-NEXT: movwmi r3, #1
307+
; CHECK-ARM8-NEXT: cmp r3, #0
308+
; CHECK-ARM8-NEXT: mov r3, #-2147483648
309+
; CHECK-ARM8-NEXT: mov lr, #0
310+
; CHECK-ARM8-NEXT: mvnne r3, #-2147483648
311+
; CHECK-ARM8-NEXT: cmp r12, r0
312+
; CHECK-ARM8-NEXT: movvc r3, r12
313+
; CHECK-ARM8-NEXT: subs r0, r3, r1
314+
; CHECK-ARM8-NEXT: movwmi lr, #1
315+
; CHECK-ARM8-NEXT: mov r2, #-2147483648
316+
; CHECK-ARM8-NEXT: cmp lr, #0
317+
; CHECK-ARM8-NEXT: mvnne r2, #-2147483648
318+
; CHECK-ARM8-NEXT: cmp r3, r1
319+
; CHECK-ARM8-NEXT: movvc r2, r0
320+
; CHECK-ARM8-NEXT: mov r0, r2
321+
; CHECK-ARM8-NEXT: pop {r11, pc}
322+
%z = call i32 @llvm.sadd.sat.i32(i32 %x, i32 %x)
323+
%tmp = call i32 @llvm.ssub.sat.i32(i32 %z, i32 %y)
324+
ret i32 %tmp
325+
}
326+
327+
declare i32 @llvm.sadd.sat.i32(i32, i32)
328+
declare i32 @llvm.ssub.sat.i32(i32, i32)

0 commit comments

Comments
 (0)