xref: /llvm-project/llvm/test/CodeGen/ARM/cmp-peephole.ll (revision 945a1468c922573a07b334a130d05f0ecca40926)
1c4d0509eSFilipp Zhinkin; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2c4d0509eSFilipp Zhinkin; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM
3c4d0509eSFilipp Zhinkin; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB
4c4d0509eSFilipp Zhinkin; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2
5c4d0509eSFilipp Zhinkin
6c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_rr(i32 %a, i32 %b) {
7c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_rr:
8c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
9c4d0509eSFilipp Zhinkin; ARM-NEXT:    ands r0, r0, r1
10c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
11c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
12c4d0509eSFilipp Zhinkin;
13c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_rr:
14c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
15c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
16c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
17c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
18c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
19c4d0509eSFilipp Zhinkin;
20c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_rr:
21c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
22c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    ands r0, r1
23c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
24c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
25c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
26c4d0509eSFilipp Zhinkin  %and = and i32 %a, %b
27c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
28c4d0509eSFilipp Zhinkin  ret i1 %res
29c4d0509eSFilipp Zhinkin}
30c4d0509eSFilipp Zhinkin
31c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_ri(i32 %a) {
32c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_ri:
33c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
34c4d0509eSFilipp Zhinkin; ARM-NEXT:    ands r0, r0, #42
35c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
36c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
37c4d0509eSFilipp Zhinkin;
38c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_ri:
39c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
40c4d0509eSFilipp Zhinkin; THUMB-NEXT:    movs r1, #42
41c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
42c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
43c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
44c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
45c4d0509eSFilipp Zhinkin;
46c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_ri:
47c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
48c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    ands r0, r0, #42
49c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
50c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
51c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
52c4d0509eSFilipp Zhinkin  %and = and i32 %a, 42
53c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
54c4d0509eSFilipp Zhinkin  ret i1 %res
55c4d0509eSFilipp Zhinkin}
56c4d0509eSFilipp Zhinkin
57c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_rsr(i32 %a, i32 %b, i32 %c) {
58c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_rsr:
59c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
60*945a1468SFilipp Zhinkin; ARM-NEXT:    ands r0, r0, r1, lsl r2
61c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
62c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
63c4d0509eSFilipp Zhinkin;
64c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_rsr:
65c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
66c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
67c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
68c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
69c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
70c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
71c4d0509eSFilipp Zhinkin;
72c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_rsr:
73c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
74c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
75c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    ands r0, r1
76c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
77c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
78c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
79c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
80c4d0509eSFilipp Zhinkin  %and = and i32 %sh, %a
81c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
82c4d0509eSFilipp Zhinkin  ret i1 %res
83c4d0509eSFilipp Zhinkin}
84c4d0509eSFilipp Zhinkin
85c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_rsi(i32 %a, i32 %b) {
86c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_rsi:
87c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
88*945a1468SFilipp Zhinkin; ARM-NEXT:    ands r0, r0, r1, lsr #17
89c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
90c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
91c4d0509eSFilipp Zhinkin;
92c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_rsi:
93c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
94c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
95c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
96c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
97c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
98c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
99c4d0509eSFilipp Zhinkin;
100c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_rsi:
101c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
102*945a1468SFilipp Zhinkin; THUMB2-NEXT:    ands.w r0, r0, r1, lsr #17
103c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
104c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
105c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
106c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
107c4d0509eSFilipp Zhinkin  %and = and i32 %sh, %a
108c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
109c4d0509eSFilipp Zhinkin  ret i1 %res
110c4d0509eSFilipp Zhinkin}
111c4d0509eSFilipp Zhinkin
112c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_or_rr(i32 %a, i32 %b) {
113c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_or_rr:
114c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
115c4d0509eSFilipp Zhinkin; ARM-NEXT:    orrs r0, r0, r1
116c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
117c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
118c4d0509eSFilipp Zhinkin;
119c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_or_rr:
120c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
121c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
122c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
123c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
124c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
125c4d0509eSFilipp Zhinkin;
126c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_or_rr:
127c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
128c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    orrs r0, r1
129c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
130c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
131c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
132c4d0509eSFilipp Zhinkin  %or = or i32 %a, %b
133c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %or, 0
134c4d0509eSFilipp Zhinkin  ret i1 %res
135c4d0509eSFilipp Zhinkin}
136c4d0509eSFilipp Zhinkin
137c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_or_ri(i32 %a) {
138c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_or_ri:
139c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
140c4d0509eSFilipp Zhinkin; ARM-NEXT:    orrs r0, r0, #42
141c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
142c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
143c4d0509eSFilipp Zhinkin;
144c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_or_ri:
145c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
146c4d0509eSFilipp Zhinkin; THUMB-NEXT:    movs r1, #42
147c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
148c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
149c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
150c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
151c4d0509eSFilipp Zhinkin;
152c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_or_ri:
153c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
154c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    orrs r0, r0, #42
155c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
156c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
157c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
158c4d0509eSFilipp Zhinkin  %or = or i32 %a, 42
159c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %or, 0
160c4d0509eSFilipp Zhinkin  ret i1 %res
161c4d0509eSFilipp Zhinkin}
162c4d0509eSFilipp Zhinkin
163c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_or_rsr(i32 %a, i32 %b, i32 %c) {
164c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_or_rsr:
165c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
166*945a1468SFilipp Zhinkin; ARM-NEXT:    orrs r0, r0, r1, lsl r2
167c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
168c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
169c4d0509eSFilipp Zhinkin;
170c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_or_rsr:
171c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
172c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
173c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
174c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
175c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
176c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
177c4d0509eSFilipp Zhinkin;
178c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_or_rsr:
179c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
180c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
181c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    orrs r0, r1
182c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
183c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
184c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
185c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
186c4d0509eSFilipp Zhinkin  %or = or i32 %sh, %a
187c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %or, 0
188c4d0509eSFilipp Zhinkin  ret i1 %res
189c4d0509eSFilipp Zhinkin}
190c4d0509eSFilipp Zhinkin
191c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_or_rsi(i32 %a, i32 %b) {
192c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_or_rsi:
193c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
194*945a1468SFilipp Zhinkin; ARM-NEXT:    orrs r0, r0, r1, lsr #17
195c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
196c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
197c4d0509eSFilipp Zhinkin;
198c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_or_rsi:
199c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
200c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
201c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
202c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
203c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
204c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
205c4d0509eSFilipp Zhinkin;
206c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_or_rsi:
207c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
208*945a1468SFilipp Zhinkin; THUMB2-NEXT:    orrs.w r0, r0, r1, lsr #17
209c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
210c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
211c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
212c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
213c4d0509eSFilipp Zhinkin  %or = or i32 %sh, %a
214c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %or, 0
215c4d0509eSFilipp Zhinkin  ret i1 %res
216c4d0509eSFilipp Zhinkin}
217c4d0509eSFilipp Zhinkin
218c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_xor_rr(i32 %a, i32 %b) {
219c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_xor_rr:
220c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
221c4d0509eSFilipp Zhinkin; ARM-NEXT:    eors r0, r0, r1
222c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
223c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
224c4d0509eSFilipp Zhinkin;
225c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_xor_rr:
226c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
227c4d0509eSFilipp Zhinkin; THUMB-NEXT:    eors r0, r1
228c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
229c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
230c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
231c4d0509eSFilipp Zhinkin;
232c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_xor_rr:
233c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
234c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    eors r0, r1
235c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
236c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
237c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
238c4d0509eSFilipp Zhinkin  %xor = xor i32 %a, %b
239c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %xor, 0
240c4d0509eSFilipp Zhinkin  ret i1 %res
241c4d0509eSFilipp Zhinkin}
242c4d0509eSFilipp Zhinkin
243c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_xor_ri(i32 %a) {
244c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_xor_ri:
245c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
246c4d0509eSFilipp Zhinkin; ARM-NEXT:    subs r0, r0, #42
247c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
248c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
249c4d0509eSFilipp Zhinkin;
250c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_xor_ri:
251c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
252c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r0, #42
253c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
254c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
255c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
256c4d0509eSFilipp Zhinkin;
257c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_xor_ri:
258c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
259c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    subs r0, #42
260c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
261c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
262c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
263c4d0509eSFilipp Zhinkin  %xor = xor i32 %a, 42
264c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %xor, 0
265c4d0509eSFilipp Zhinkin  ret i1 %res
266c4d0509eSFilipp Zhinkin}
267c4d0509eSFilipp Zhinkin
268c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_xor_rsr(i32 %a, i32 %b, i32 %c) {
269c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_xor_rsr:
270c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
271*945a1468SFilipp Zhinkin; ARM-NEXT:    eors r0, r0, r1, lsl r2
272c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
273c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
274c4d0509eSFilipp Zhinkin;
275c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_xor_rsr:
276c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
277c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
278c4d0509eSFilipp Zhinkin; THUMB-NEXT:    eors r0, r1
279c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
280c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
281c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
282c4d0509eSFilipp Zhinkin;
283c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_xor_rsr:
284c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
285c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
286c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    eors r0, r1
287c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
288c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
289c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
290c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
291c4d0509eSFilipp Zhinkin  %xor = xor i32 %sh, %a
292c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %xor, 0
293c4d0509eSFilipp Zhinkin  ret i1 %res
294c4d0509eSFilipp Zhinkin}
295c4d0509eSFilipp Zhinkin
296c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_xor_rsi(i32 %a, i32 %b) {
297c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_xor_rsi:
298c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
299*945a1468SFilipp Zhinkin; ARM-NEXT:    eors r0, r0, r1, lsr #17
300c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
301c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
302c4d0509eSFilipp Zhinkin;
303c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_xor_rsi:
304c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
305c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
306c4d0509eSFilipp Zhinkin; THUMB-NEXT:    eors r0, r1
307c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
308c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
309c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
310c4d0509eSFilipp Zhinkin;
311c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_xor_rsi:
312c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
313*945a1468SFilipp Zhinkin; THUMB2-NEXT:    eors.w r0, r0, r1, lsr #17
314c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
315c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
316c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
317c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
318c4d0509eSFilipp Zhinkin  %xor = xor i32 %sh, %a
319c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %xor, 0
320c4d0509eSFilipp Zhinkin  ret i1 %res
321c4d0509eSFilipp Zhinkin}
322c4d0509eSFilipp Zhinkin
323c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_not_rr(i32 %a, i32 %b) {
324c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_not_rr:
325c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
326*945a1468SFilipp Zhinkin; ARM-NEXT:    bics r0, r0, r1
327c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
328c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
329c4d0509eSFilipp Zhinkin;
330c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_not_rr:
331c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
332c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
333c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
334c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
335c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
336c4d0509eSFilipp Zhinkin;
337c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_not_rr:
338c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
339c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bics r0, r1
340c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
341c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
342c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
343c4d0509eSFilipp Zhinkin  %not = xor i32 %b, -1
344c4d0509eSFilipp Zhinkin  %and = and i32 %a, %not
345c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
346c4d0509eSFilipp Zhinkin  ret i1 %res
347c4d0509eSFilipp Zhinkin}
348c4d0509eSFilipp Zhinkin
349c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_not_ri(i32 %a) {
350c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_not_ri:
351c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
352*945a1468SFilipp Zhinkin; ARM-NEXT:    bics r0, r0, #42
353c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
354c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
355c4d0509eSFilipp Zhinkin;
356c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_not_ri:
357c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
358c4d0509eSFilipp Zhinkin; THUMB-NEXT:    movs r1, #42
359c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
360c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
361c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
362c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
363c4d0509eSFilipp Zhinkin;
364c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_not_ri:
365c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
366*945a1468SFilipp Zhinkin; THUMB2-NEXT:    bics r0, r0, #42
367c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
368c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
369c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
370c4d0509eSFilipp Zhinkin  %not = xor i32 42, -1
371c4d0509eSFilipp Zhinkin  %and = and i32 %a, %not
372c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
373c4d0509eSFilipp Zhinkin  ret i1 %res
374c4d0509eSFilipp Zhinkin}
375c4d0509eSFilipp Zhinkin
376c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) {
377c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_not_rsr:
378c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
379*945a1468SFilipp Zhinkin; ARM-NEXT:    bics r0, r0, r1, lsl r2
380c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
381c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
382c4d0509eSFilipp Zhinkin;
383c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_not_rsr:
384c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
385c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
386c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
387c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
388c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
389c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
390c4d0509eSFilipp Zhinkin;
391c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_not_rsr:
392c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
393c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
394c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bics r0, r1
395c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
396c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
397c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
398c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
399c4d0509eSFilipp Zhinkin  %not = xor i32 %sh, -1
400c4d0509eSFilipp Zhinkin  %and = and i32 %not, %a
401c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
402c4d0509eSFilipp Zhinkin  ret i1 %res
403c4d0509eSFilipp Zhinkin}
404c4d0509eSFilipp Zhinkin
405c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_and_not_rsi(i32 %a, i32 %b) {
406c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_and_not_rsi:
407c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
408*945a1468SFilipp Zhinkin; ARM-NEXT:    bics r0, r0, r1, lsr #17
409c4d0509eSFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
410c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
411c4d0509eSFilipp Zhinkin;
412c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_and_not_rsi:
413c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
414c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
415c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
416c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
417c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
418c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
419c4d0509eSFilipp Zhinkin;
420c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_and_not_rsi:
421c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
422*945a1468SFilipp Zhinkin; THUMB2-NEXT:    bics.w r0, r0, r1, lsr #17
423c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
424c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
425c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
426c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
427c4d0509eSFilipp Zhinkin  %not = xor i32 %sh, -1
428c4d0509eSFilipp Zhinkin  %and = and i32 %not, %a
429c4d0509eSFilipp Zhinkin  %res = icmp ne i32 %and, 0
430c4d0509eSFilipp Zhinkin  ret i1 %res
431c4d0509eSFilipp Zhinkin}
432c4d0509eSFilipp Zhinkin
433c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_shl_rr(i32 %a, i32 %b) {
434c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_shl_rr:
435c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
436*945a1468SFilipp Zhinkin; ARM-NEXT:    lsls r0, r0, r1
437*945a1468SFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
438c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
439c4d0509eSFilipp Zhinkin;
440c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_shl_rr:
441c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
442c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r0, r1
443c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
444c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
445c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
446c4d0509eSFilipp Zhinkin;
447c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_shl_rr:
448c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
449c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r0, r1
450c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
451c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
452c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
453c4d0509eSFilipp Zhinkin    %sh = shl i32 %a, %b
454c4d0509eSFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
455c4d0509eSFilipp Zhinkin    ret i1 %cmp
456c4d0509eSFilipp Zhinkin}
457c4d0509eSFilipp Zhinkin
458c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_shl_ri(i32 %a) {
459c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_shl_ri:
460c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
461*945a1468SFilipp Zhinkin; ARM-NEXT:    lsls r0, r0, #7
462*945a1468SFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
463c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
464c4d0509eSFilipp Zhinkin;
465c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_shl_ri:
466c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
467c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r0, r0, #7
468c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
469c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
470c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
471c4d0509eSFilipp Zhinkin;
472c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_shl_ri:
473c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
474c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r0, r0, #7
475c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
476c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
477c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
478c4d0509eSFilipp Zhinkin    %sh = shl i32 %a, 7
479c4d0509eSFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
480c4d0509eSFilipp Zhinkin    ret i1 %cmp
481c4d0509eSFilipp Zhinkin}
482c4d0509eSFilipp Zhinkin
483c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_lshr_rr(i32 %a, i32 %b) {
484c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_lshr_rr:
485c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
486*945a1468SFilipp Zhinkin; ARM-NEXT:    lsrs r0, r0, r1
487*945a1468SFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
488c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
489c4d0509eSFilipp Zhinkin;
490c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_lshr_rr:
491c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
492c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r0, r1
493c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
494c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
495c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
496c4d0509eSFilipp Zhinkin;
497c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_lshr_rr:
498c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
499c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r1
500c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
501c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
502c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
503c4d0509eSFilipp Zhinkin    %sh = lshr i32 %a, %b
504c4d0509eSFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
505c4d0509eSFilipp Zhinkin    ret i1 %cmp
506c4d0509eSFilipp Zhinkin}
507c4d0509eSFilipp Zhinkin
508c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_lshr_ri(i32 %a) {
509c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_lshr_ri:
510c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
511*945a1468SFilipp Zhinkin; ARM-NEXT:    lsrs r0, r0, #7
512*945a1468SFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
513c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
514c4d0509eSFilipp Zhinkin;
515c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_lshr_ri:
516c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
517c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r0, r0, #7
518c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
519c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
520c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
521c4d0509eSFilipp Zhinkin;
522c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_lshr_ri:
523c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
524c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #7
525c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
526c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
527c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
528c4d0509eSFilipp Zhinkin    %sh = lshr i32 %a, 7
529c4d0509eSFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
530c4d0509eSFilipp Zhinkin    ret i1 %cmp
531c4d0509eSFilipp Zhinkin}
532c4d0509eSFilipp Zhinkin
533c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_ashr_rr(i32 %a, i32 %b) {
534c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_ashr_rr:
535c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
536*945a1468SFilipp Zhinkin; ARM-NEXT:    asrs r0, r0, r1
537*945a1468SFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
538c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
539c4d0509eSFilipp Zhinkin;
540c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_ashr_rr:
541c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
542c4d0509eSFilipp Zhinkin; THUMB-NEXT:    asrs r0, r1
543c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
544c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
545c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
546c4d0509eSFilipp Zhinkin;
547c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_ashr_rr:
548c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
549c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    asrs r0, r1
550c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    cmp r0, #0
551c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
552c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
553c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
554c4d0509eSFilipp Zhinkin    %sh = ashr i32 %a, %b
555c4d0509eSFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
556c4d0509eSFilipp Zhinkin    ret i1 %cmp
557c4d0509eSFilipp Zhinkin}
558c4d0509eSFilipp Zhinkin
559c4d0509eSFilipp Zhinkindefine i1 @cmp_ne_zero_ashr_ri(i32 %a) {
560c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_ne_zero_ashr_ri:
561c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
562*945a1468SFilipp Zhinkin; ARM-NEXT:    asrs r0, r0, #7
563*945a1468SFilipp Zhinkin; ARM-NEXT:    movwne r0, #1
564c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
565c4d0509eSFilipp Zhinkin;
566c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_ne_zero_ashr_ri:
567c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
568c4d0509eSFilipp Zhinkin; THUMB-NEXT:    asrs r0, r0, #7
569c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r1, r0, #1
570c4d0509eSFilipp Zhinkin; THUMB-NEXT:    sbcs r0, r1
571c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
572c4d0509eSFilipp Zhinkin;
573c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_ne_zero_ashr_ri:
574c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
575c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    asrs r0, r0, #7
576c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    cmp r0, #0
577c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    it ne
578c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movne r0, #1
579c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
580c4d0509eSFilipp Zhinkin    %sh = ashr i32 %a, 7
581c4d0509eSFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
582c4d0509eSFilipp Zhinkin    ret i1 %cmp
583c4d0509eSFilipp Zhinkin}
584c4d0509eSFilipp Zhinkin
585c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_rr(i32 %a, i32 %b) {
586c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_rr:
587c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
588c4d0509eSFilipp Zhinkin; ARM-NEXT:    and r0, r0, r1
589c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
590c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
591c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
592c4d0509eSFilipp Zhinkin;
593c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_rr:
594c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
595c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
596c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
597c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
598c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
599c4d0509eSFilipp Zhinkin;
600c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_rr:
601c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
602c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    ands r0, r1
603c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
604c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
605c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
606c4d0509eSFilipp Zhinkin  %and = and i32 %a, %b
607c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
608c4d0509eSFilipp Zhinkin  ret i1 %res
609c4d0509eSFilipp Zhinkin}
610c4d0509eSFilipp Zhinkin
611c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_ri(i32 %a) {
612c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_ri:
613c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
614c4d0509eSFilipp Zhinkin; ARM-NEXT:    and r0, r0, #42
615c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
616c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
617c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
618c4d0509eSFilipp Zhinkin;
619c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_ri:
620c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
621c4d0509eSFilipp Zhinkin; THUMB-NEXT:    movs r1, #42
622c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
623c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
624c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
625c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
626c4d0509eSFilipp Zhinkin;
627c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_ri:
628c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
629c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    and r0, r0, #42
630c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
631c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
632c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
633c4d0509eSFilipp Zhinkin  %and = and i32 %a, 42
634c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
635c4d0509eSFilipp Zhinkin  ret i1 %res
636c4d0509eSFilipp Zhinkin}
637c4d0509eSFilipp Zhinkin
638c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_rsr(i32 %a, i32 %b, i32 %c) {
639c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_rsr:
640c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
641c4d0509eSFilipp Zhinkin; ARM-NEXT:    and r0, r0, r1, lsl r2
642c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
643c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
644c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
645c4d0509eSFilipp Zhinkin;
646c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_rsr:
647c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
648c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
649c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
650c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
651c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
652c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
653c4d0509eSFilipp Zhinkin;
654c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_rsr:
655c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
656c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
657c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    ands r0, r1
658c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
659c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
660c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
661c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
662c4d0509eSFilipp Zhinkin  %and = and i32 %sh, %a
663c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
664c4d0509eSFilipp Zhinkin  ret i1 %res
665c4d0509eSFilipp Zhinkin}
666c4d0509eSFilipp Zhinkin
667c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_rsi(i32 %a, i32 %b) {
668c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_rsi:
669c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
670c4d0509eSFilipp Zhinkin; ARM-NEXT:    and r0, r0, r1, lsr #17
671c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
672c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
673c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
674c4d0509eSFilipp Zhinkin;
675c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_rsi:
676c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
677c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
678c4d0509eSFilipp Zhinkin; THUMB-NEXT:    ands r0, r1
679c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
680c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
681c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
682c4d0509eSFilipp Zhinkin;
683c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_rsi:
684c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
685c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    and.w r0, r0, r1, lsr #17
686c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
687c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
688c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
689c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
690c4d0509eSFilipp Zhinkin  %and = and i32 %sh, %a
691c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
692c4d0509eSFilipp Zhinkin  ret i1 %res
693c4d0509eSFilipp Zhinkin}
694c4d0509eSFilipp Zhinkin
695c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_or_rr(i32 %a, i32 %b) {
696c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_or_rr:
697c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
698c4d0509eSFilipp Zhinkin; ARM-NEXT:    orr r0, r0, r1
699c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
700c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
701c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
702c4d0509eSFilipp Zhinkin;
703c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_or_rr:
704c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
705c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
706c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
707c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
708c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
709c4d0509eSFilipp Zhinkin;
710c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_or_rr:
711c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
712c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    orrs r0, r1
713c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
714c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
715c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
716c4d0509eSFilipp Zhinkin  %or = or i32 %a, %b
717c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %or, 0
718c4d0509eSFilipp Zhinkin  ret i1 %res
719c4d0509eSFilipp Zhinkin}
720c4d0509eSFilipp Zhinkin
721c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_or_ri(i32 %a) {
722c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_or_ri:
723c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
724c4d0509eSFilipp Zhinkin; ARM-NEXT:    mov r0, #0
725c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
726c4d0509eSFilipp Zhinkin;
727c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_or_ri:
728c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
729c4d0509eSFilipp Zhinkin; THUMB-NEXT:    movs r1, #42
730c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
731c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
732c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
733c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
734c4d0509eSFilipp Zhinkin;
735c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_or_ri:
736c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
737c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    movs r0, #0
738c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
739c4d0509eSFilipp Zhinkin  %or = or i32 %a, 42
740c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %or, 0
741c4d0509eSFilipp Zhinkin  ret i1 %res
742c4d0509eSFilipp Zhinkin}
743c4d0509eSFilipp Zhinkin
744c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_or_rsr(i32 %a, i32 %b, i32 %c) {
745c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_or_rsr:
746c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
747c4d0509eSFilipp Zhinkin; ARM-NEXT:    orr r0, r0, r1, lsl r2
748c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
749c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
750c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
751c4d0509eSFilipp Zhinkin;
752c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_or_rsr:
753c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
754c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
755c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
756c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
757c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
758c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
759c4d0509eSFilipp Zhinkin;
760c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_or_rsr:
761c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
762c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
763c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    orrs r0, r1
764c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
765c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
766c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
767c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
768c4d0509eSFilipp Zhinkin  %or = or i32 %sh, %a
769c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %or, 0
770c4d0509eSFilipp Zhinkin  ret i1 %res
771c4d0509eSFilipp Zhinkin}
772c4d0509eSFilipp Zhinkin
773c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_or_rsi(i32 %a, i32 %b) {
774c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_or_rsi:
775c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
776c4d0509eSFilipp Zhinkin; ARM-NEXT:    orr r0, r0, r1, lsr #17
777c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
778c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
779c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
780c4d0509eSFilipp Zhinkin;
781c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_or_rsi:
782c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
783c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
784c4d0509eSFilipp Zhinkin; THUMB-NEXT:    orrs r0, r1
785c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
786c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
787c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
788c4d0509eSFilipp Zhinkin;
789c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_or_rsi:
790c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
791c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    orr.w r0, r0, r1, lsr #17
792c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
793c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
794c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
795c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
796c4d0509eSFilipp Zhinkin  %or = or i32 %sh, %a
797c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %or, 0
798c4d0509eSFilipp Zhinkin  ret i1 %res
799c4d0509eSFilipp Zhinkin}
800c4d0509eSFilipp Zhinkin
801c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_xor_rr(i32 %a, i32 %b) {
802c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_xor_rr:
803c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
804c4d0509eSFilipp Zhinkin; ARM-NEXT:    eor r0, r0, r1
805c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
806c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
807c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
808c4d0509eSFilipp Zhinkin;
809c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_xor_rr:
810c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
811c4d0509eSFilipp Zhinkin; THUMB-NEXT:    eors r0, r1
812c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
813c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
814c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
815c4d0509eSFilipp Zhinkin;
816c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_xor_rr:
817c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
818c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    eors r0, r1
819c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
820c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
821c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
822c4d0509eSFilipp Zhinkin  %xor = xor i32 %a, %b
823c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %xor, 0
824c4d0509eSFilipp Zhinkin  ret i1 %res
825c4d0509eSFilipp Zhinkin}
826c4d0509eSFilipp Zhinkin
827c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_xor_ri(i32 %a) {
828c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_xor_ri:
829c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
830c4d0509eSFilipp Zhinkin; ARM-NEXT:    sub r0, r0, #42
831c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
832c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
833c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
834c4d0509eSFilipp Zhinkin;
835c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_xor_ri:
836c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
837c4d0509eSFilipp Zhinkin; THUMB-NEXT:    subs r0, #42
838c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
839c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
840c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
841c4d0509eSFilipp Zhinkin;
842c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_xor_ri:
843c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
844c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    subs r0, #42
845c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
846c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
847c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
848c4d0509eSFilipp Zhinkin  %xor = xor i32 %a, 42
849c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %xor, 0
850c4d0509eSFilipp Zhinkin  ret i1 %res
851c4d0509eSFilipp Zhinkin}
852c4d0509eSFilipp Zhinkin
853c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_xor_rsr(i32 %a, i32 %b, i32 %c) {
854c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_xor_rsr:
855c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
856c4d0509eSFilipp Zhinkin; ARM-NEXT:    eor r0, r0, r1, lsl r2
857c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
858c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
859c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
860c4d0509eSFilipp Zhinkin;
861c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_xor_rsr:
862c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
863c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
864c4d0509eSFilipp Zhinkin; THUMB-NEXT:    eors r0, r1
865c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
866c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
867c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
868c4d0509eSFilipp Zhinkin;
869c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_xor_rsr:
870c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
871c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
872c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    eors r0, r1
873c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
874c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
875c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
876c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
877c4d0509eSFilipp Zhinkin  %xor = xor i32 %sh, %a
878c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %xor, 0
879c4d0509eSFilipp Zhinkin  ret i1 %res
880c4d0509eSFilipp Zhinkin}
881c4d0509eSFilipp Zhinkin
882c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_xor_rsi(i32 %a, i32 %b) {
883c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_xor_rsi:
884c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
885c4d0509eSFilipp Zhinkin; ARM-NEXT:    eor r0, r0, r1, lsr #17
886c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
887c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
888c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
889c4d0509eSFilipp Zhinkin;
890c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_xor_rsi:
891c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
892c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
893c4d0509eSFilipp Zhinkin; THUMB-NEXT:    eors r0, r1
894c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
895c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
896c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
897c4d0509eSFilipp Zhinkin;
898c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_xor_rsi:
899c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
900c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    eor.w r0, r0, r1, lsr #17
901c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
902c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
903c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
904c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
905c4d0509eSFilipp Zhinkin  %xor = xor i32 %sh, %a
906c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %xor, 0
907c4d0509eSFilipp Zhinkin  ret i1 %res
908c4d0509eSFilipp Zhinkin}
909c4d0509eSFilipp Zhinkin
910c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_not_rr(i32 %a, i32 %b) {
911c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_not_rr:
912c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
913c4d0509eSFilipp Zhinkin; ARM-NEXT:    bic r0, r0, r1
914c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
915c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
916c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
917c4d0509eSFilipp Zhinkin;
918c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_not_rr:
919c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
920c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
921c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
922c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
923c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
924c4d0509eSFilipp Zhinkin;
925c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_not_rr:
926c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
927c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bics r0, r1
928c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
929c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
930c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
931c4d0509eSFilipp Zhinkin  %not = xor i32 %b, -1
932c4d0509eSFilipp Zhinkin  %and = and i32 %a, %not
933c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
934c4d0509eSFilipp Zhinkin  ret i1 %res
935c4d0509eSFilipp Zhinkin}
936c4d0509eSFilipp Zhinkin
937c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_not_ri(i32 %a) {
938c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_not_ri:
939c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
940c4d0509eSFilipp Zhinkin; ARM-NEXT:    bic r0, r0, #42
941c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
942c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
943c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
944c4d0509eSFilipp Zhinkin;
945c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_not_ri:
946c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
947c4d0509eSFilipp Zhinkin; THUMB-NEXT:    movs r1, #42
948c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
949c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
950c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
951c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
952c4d0509eSFilipp Zhinkin;
953c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_not_ri:
954c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
955c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bic r0, r0, #42
956c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
957c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
958c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
959c4d0509eSFilipp Zhinkin  %not = xor i32 42, -1
960c4d0509eSFilipp Zhinkin  %and = and i32 %a, %not
961c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
962c4d0509eSFilipp Zhinkin  ret i1 %res
963c4d0509eSFilipp Zhinkin}
964c4d0509eSFilipp Zhinkin
965c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) {
966c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_not_rsr:
967c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
968c4d0509eSFilipp Zhinkin; ARM-NEXT:    bic r0, r0, r1, lsl r2
969c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
970c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
971c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
972c4d0509eSFilipp Zhinkin;
973c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_not_rsr:
974c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
975c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r2
976c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
977c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
978c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
979c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
980c4d0509eSFilipp Zhinkin;
981c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_not_rsr:
982c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
983c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r1, r2
984c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bics r0, r1
985c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
986c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
987c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
988c4d0509eSFilipp Zhinkin  %sh = shl i32 %b, %c
989c4d0509eSFilipp Zhinkin  %not = xor i32 %sh, -1
990c4d0509eSFilipp Zhinkin  %and = and i32 %not, %a
991c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
992c4d0509eSFilipp Zhinkin  ret i1 %res
993c4d0509eSFilipp Zhinkin}
994c4d0509eSFilipp Zhinkin
995c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_and_not_rsi(i32 %a, i32 %b) {
996c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_and_not_rsi:
997c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
998c4d0509eSFilipp Zhinkin; ARM-NEXT:    bic r0, r0, r1, lsr #17
999c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1000c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1001c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1002c4d0509eSFilipp Zhinkin;
1003c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_and_not_rsi:
1004c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1005c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r1, #17
1006c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bics r0, r1
1007c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
1008c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1009c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1010c4d0509eSFilipp Zhinkin;
1011c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_and_not_rsi:
1012c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1013c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bic.w r0, r0, r1, lsr #17
1014c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1015c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1016c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1017c4d0509eSFilipp Zhinkin  %sh = lshr i32 %b, 17
1018c4d0509eSFilipp Zhinkin  %not = xor i32 %sh, -1
1019c4d0509eSFilipp Zhinkin  %and = and i32 %not, %a
1020c4d0509eSFilipp Zhinkin  %res = icmp eq i32 %and, 0
1021c4d0509eSFilipp Zhinkin  ret i1 %res
1022c4d0509eSFilipp Zhinkin}
1023c4d0509eSFilipp Zhinkin
1024c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_shl_rr(i32 %a, i32 %b) {
1025c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_shl_rr:
1026c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
1027c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsl r0, r0, r1
1028c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1029c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1030c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1031c4d0509eSFilipp Zhinkin;
1032c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_shl_rr:
1033c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1034c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r0, r1
1035c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
1036c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1037c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1038c4d0509eSFilipp Zhinkin;
1039c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_shl_rr:
1040c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1041c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r0, r1
1042c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1043c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1044c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1045c4d0509eSFilipp Zhinkin    %sh = shl i32 %a, %b
1046c4d0509eSFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1047c4d0509eSFilipp Zhinkin    ret i1 %cmp
1048c4d0509eSFilipp Zhinkin}
1049c4d0509eSFilipp Zhinkin
1050c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_shl_ri(i32 %a) {
1051c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_shl_ri:
1052c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
1053c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsl r0, r0, #7
1054c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1055c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1056c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1057c4d0509eSFilipp Zhinkin;
1058c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_shl_ri:
1059c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1060c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsls r1, r0, #7
1061c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r0, r1, #0
1062c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1063c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1064c4d0509eSFilipp Zhinkin;
1065c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_shl_ri:
1066c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1067c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsls r0, r0, #7
1068c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1069c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1070c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1071c4d0509eSFilipp Zhinkin    %sh = shl i32 %a, 7
1072c4d0509eSFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1073c4d0509eSFilipp Zhinkin    ret i1 %cmp
1074c4d0509eSFilipp Zhinkin}
1075c4d0509eSFilipp Zhinkin
1076c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_lshr_rr(i32 %a, i32 %b) {
1077c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_lshr_rr:
1078c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
1079c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, r1
1080c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1081c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1082c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1083c4d0509eSFilipp Zhinkin;
1084c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_lshr_rr:
1085c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1086c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r0, r1
1087c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
1088c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1089c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1090c4d0509eSFilipp Zhinkin;
1091c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_lshr_rr:
1092c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1093c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r1
1094c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1095c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1096c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1097c4d0509eSFilipp Zhinkin    %sh = lshr i32 %a, %b
1098c4d0509eSFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1099c4d0509eSFilipp Zhinkin    ret i1 %cmp
1100c4d0509eSFilipp Zhinkin}
1101c4d0509eSFilipp Zhinkin
1102c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_lshr_ri(i32 %a) {
1103c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_lshr_ri:
1104c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
1105c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #7
1106c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1107c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1108c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1109c4d0509eSFilipp Zhinkin;
1110c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_lshr_ri:
1111c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1112c4d0509eSFilipp Zhinkin; THUMB-NEXT:    lsrs r1, r0, #7
1113c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r0, r1, #0
1114c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1115c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1116c4d0509eSFilipp Zhinkin;
1117c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_lshr_ri:
1118c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1119c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #7
1120c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1121c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1122c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1123c4d0509eSFilipp Zhinkin    %sh = lshr i32 %a, 7
1124c4d0509eSFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1125c4d0509eSFilipp Zhinkin    ret i1 %cmp
1126c4d0509eSFilipp Zhinkin}
1127c4d0509eSFilipp Zhinkin
1128c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_ashr_rr(i32 %a, i32 %b) {
1129c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_ashr_rr:
1130c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
1131c4d0509eSFilipp Zhinkin; ARM-NEXT:    asr r0, r0, r1
1132c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1133c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1134c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1135c4d0509eSFilipp Zhinkin;
1136c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_ashr_rr:
1137c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1138c4d0509eSFilipp Zhinkin; THUMB-NEXT:    asrs r0, r1
1139c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r1, r0, #0
1140c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1141c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1142c4d0509eSFilipp Zhinkin;
1143c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_ashr_rr:
1144c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1145c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    asrs r0, r1
1146c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1147c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1148c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1149c4d0509eSFilipp Zhinkin    %sh = ashr i32 %a, %b
1150c4d0509eSFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1151c4d0509eSFilipp Zhinkin    ret i1 %cmp
1152c4d0509eSFilipp Zhinkin}
1153c4d0509eSFilipp Zhinkin
1154c4d0509eSFilipp Zhinkindefine i1 @cmp_eq_zero_ashr_ri(i32 %a) {
1155c4d0509eSFilipp Zhinkin; ARM-LABEL: cmp_eq_zero_ashr_ri:
1156c4d0509eSFilipp Zhinkin; ARM:       @ %bb.0:
1157c4d0509eSFilipp Zhinkin; ARM-NEXT:    asr r0, r0, #7
1158c4d0509eSFilipp Zhinkin; ARM-NEXT:    clz r0, r0
1159c4d0509eSFilipp Zhinkin; ARM-NEXT:    lsr r0, r0, #5
1160c4d0509eSFilipp Zhinkin; ARM-NEXT:    bx lr
1161c4d0509eSFilipp Zhinkin;
1162c4d0509eSFilipp Zhinkin; THUMB-LABEL: cmp_eq_zero_ashr_ri:
1163c4d0509eSFilipp Zhinkin; THUMB:       @ %bb.0:
1164c4d0509eSFilipp Zhinkin; THUMB-NEXT:    asrs r1, r0, #7
1165c4d0509eSFilipp Zhinkin; THUMB-NEXT:    rsbs r0, r1, #0
1166c4d0509eSFilipp Zhinkin; THUMB-NEXT:    adcs r0, r1
1167c4d0509eSFilipp Zhinkin; THUMB-NEXT:    bx lr
1168c4d0509eSFilipp Zhinkin;
1169c4d0509eSFilipp Zhinkin; THUMB2-LABEL: cmp_eq_zero_ashr_ri:
1170c4d0509eSFilipp Zhinkin; THUMB2:       @ %bb.0:
1171c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    asrs r0, r0, #7
1172c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    clz r0, r0
1173c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    lsrs r0, r0, #5
1174c4d0509eSFilipp Zhinkin; THUMB2-NEXT:    bx lr
1175c4d0509eSFilipp Zhinkin    %sh = ashr i32 %a, 7
1176c4d0509eSFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1177c4d0509eSFilipp Zhinkin    ret i1 %cmp
1178c4d0509eSFilipp Zhinkin}
1179fa67e281SFilipp Zhinkin
1180fa67e281SFilipp Zhinkindeclare void @consume(i32 %0);
1181fa67e281SFilipp Zhinkin
1182fa67e281SFilipp Zhinkindefine void @br_on_binop_eq_zero(i32 %a, i32 %b) {
1183fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_eq_zero:
1184fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1185fa67e281SFilipp Zhinkin; ARM-NEXT:    orrs r1, r0, r1
1186fa67e281SFilipp Zhinkin; ARM-NEXT:    bxne lr
1187fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB44_1: @ %true_br
1188fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1189fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1190fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1191fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1192fa67e281SFilipp Zhinkin;
1193fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_eq_zero:
1194fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1195fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1196fa67e281SFilipp Zhinkin; THUMB-NEXT:    orrs r1, r0
1197fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB44_2
1198fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %exit
1199fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1200fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB44_2: @ %true_br
1201fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1202fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1203fa67e281SFilipp Zhinkin;
1204fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_eq_zero:
1205fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1206fa67e281SFilipp Zhinkin; THUMB2-NEXT:    orrs r1, r0
1207fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it ne
1208fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxne lr
1209fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB44_1: @ %true_br
1210fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1211fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1212fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1213fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1214fa67e281SFilipp Zhinkin    %or = or i32 %a, %b
1215fa67e281SFilipp Zhinkin    %cmp = icmp eq i32 %or, 0
1216fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1217fa67e281SFilipp Zhinkintrue_br:
1218fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1219fa67e281SFilipp Zhinkin    br label %exit
1220fa67e281SFilipp Zhinkinexit:
1221fa67e281SFilipp Zhinkin    ret void
1222fa67e281SFilipp Zhinkin}
1223fa67e281SFilipp Zhinkin
1224fa67e281SFilipp Zhinkindefine void @br_on_binop_ne_zero(i32 %a, i32 %b) {
1225fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_ne_zero:
1226fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1227fa67e281SFilipp Zhinkin; ARM-NEXT:    orrs r1, r0, r1
1228fa67e281SFilipp Zhinkin; ARM-NEXT:    bxeq lr
1229fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB45_1: @ %true_br
1230fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1231fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1232fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1233fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1234fa67e281SFilipp Zhinkin;
1235fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_ne_zero:
1236fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1237fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1238fa67e281SFilipp Zhinkin; THUMB-NEXT:    orrs r1, r0
1239fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB45_2
1240fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1241fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1242fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB45_2: @ %exit
1243fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1244fa67e281SFilipp Zhinkin;
1245fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_ne_zero:
1246fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1247fa67e281SFilipp Zhinkin; THUMB2-NEXT:    orrs r1, r0
1248fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it eq
1249fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxeq lr
1250fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB45_1: @ %true_br
1251fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1252fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1253fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1254fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1255fa67e281SFilipp Zhinkin    %or = or i32 %a, %b
1256fa67e281SFilipp Zhinkin    %cmp = icmp ne i32 %or, 0
1257fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1258fa67e281SFilipp Zhinkintrue_br:
1259fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1260fa67e281SFilipp Zhinkin    br label %exit
1261fa67e281SFilipp Zhinkinexit:
1262fa67e281SFilipp Zhinkin    ret void
1263fa67e281SFilipp Zhinkin}
1264fa67e281SFilipp Zhinkin
1265fa67e281SFilipp Zhinkindefine void @br_on_binop_lt_zero(i32 %a, i32 %b) {
1266fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_lt_zero:
1267fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1268fa67e281SFilipp Zhinkin; ARM-NEXT:    orr r1, r0, r1
1269fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r1, #0
1270fa67e281SFilipp Zhinkin; ARM-NEXT:    bxhs lr
1271fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB46_1: @ %true_br
1272fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1273fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1274fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1275fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1276fa67e281SFilipp Zhinkin;
1277fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_lt_zero:
1278fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1279fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1280fa67e281SFilipp Zhinkin; THUMB-NEXT:    orrs r1, r0
1281fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r1, #0
1282fa67e281SFilipp Zhinkin; THUMB-NEXT:    bhs .LBB46_2
1283fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1284fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1285fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB46_2: @ %exit
1286fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1287fa67e281SFilipp Zhinkin;
1288fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_lt_zero:
1289fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1290fa67e281SFilipp Zhinkin; THUMB2-NEXT:    orrs r1, r0
1291fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, #0
1292fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it hs
1293fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxhs lr
1294fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB46_1: @ %true_br
1295fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1296fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1297fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1298fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1299fa67e281SFilipp Zhinkin    %or = or i32 %a, %b
1300fa67e281SFilipp Zhinkin    %cmp = icmp ult i32 %or, 0
1301fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1302fa67e281SFilipp Zhinkintrue_br:
1303fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1304fa67e281SFilipp Zhinkin    br label %exit
1305fa67e281SFilipp Zhinkinexit:
1306fa67e281SFilipp Zhinkin    ret void
1307fa67e281SFilipp Zhinkin}
1308fa67e281SFilipp Zhinkin
1309fa67e281SFilipp Zhinkindefine void @br_on_binop_eq_imm(i32 %a, i32 %b) {
1310fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_eq_imm:
1311fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1312fa67e281SFilipp Zhinkin; ARM-NEXT:    orr r1, r0, r1
1313fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r1, #42
1314fa67e281SFilipp Zhinkin; ARM-NEXT:    bxne lr
1315fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB47_1: @ %true_br
1316fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1317fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1318fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1319fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1320fa67e281SFilipp Zhinkin;
1321fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_eq_imm:
1322fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1323fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1324fa67e281SFilipp Zhinkin; THUMB-NEXT:    orrs r1, r0
1325fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r1, #42
1326fa67e281SFilipp Zhinkin; THUMB-NEXT:    bne .LBB47_2
1327fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1328fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1329fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB47_2: @ %exit
1330fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1331fa67e281SFilipp Zhinkin;
1332fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_eq_imm:
1333fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1334fa67e281SFilipp Zhinkin; THUMB2-NEXT:    orrs r1, r0
1335fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, #42
1336fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it ne
1337fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxne lr
1338fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB47_1: @ %true_br
1339fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1340fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1341fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1342fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1343fa67e281SFilipp Zhinkin    %or = or i32 %a, %b
1344fa67e281SFilipp Zhinkin    %cmp = icmp eq i32 %or, 42
1345fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1346fa67e281SFilipp Zhinkintrue_br:
1347fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1348fa67e281SFilipp Zhinkin    br label %exit
1349fa67e281SFilipp Zhinkinexit:
1350fa67e281SFilipp Zhinkin    ret void
1351fa67e281SFilipp Zhinkin}
1352fa67e281SFilipp Zhinkin
1353fa67e281SFilipp Zhinkindefine void @br_on_binop_ne_imm(i32 %a, i32 %b) {
1354fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_ne_imm:
1355fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1356fa67e281SFilipp Zhinkin; ARM-NEXT:    orr r1, r0, r1
1357fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r1, #42
1358fa67e281SFilipp Zhinkin; ARM-NEXT:    bxeq lr
1359fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB48_1: @ %true_br
1360fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1361fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1362fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1363fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1364fa67e281SFilipp Zhinkin;
1365fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_ne_imm:
1366fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1367fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1368fa67e281SFilipp Zhinkin; THUMB-NEXT:    orrs r1, r0
1369fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r1, #42
1370fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB48_2
1371fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1372fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1373fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB48_2: @ %exit
1374fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1375fa67e281SFilipp Zhinkin;
1376fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_ne_imm:
1377fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1378fa67e281SFilipp Zhinkin; THUMB2-NEXT:    orrs r1, r0
1379fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, #42
1380fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it eq
1381fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxeq lr
1382fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB48_1: @ %true_br
1383fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1384fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1385fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1386fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1387fa67e281SFilipp Zhinkin    %or = or i32 %a, %b
1388fa67e281SFilipp Zhinkin    %cmp = icmp ne i32 %or, 42
1389fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1390fa67e281SFilipp Zhinkintrue_br:
1391fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1392fa67e281SFilipp Zhinkin    br label %exit
1393fa67e281SFilipp Zhinkinexit:
1394fa67e281SFilipp Zhinkin    ret void
1395fa67e281SFilipp Zhinkin}
1396fa67e281SFilipp Zhinkin
1397fa67e281SFilipp Zhinkindefine void @br_on_binop_eq_reg(i32 %a, i32 %b, i32 %c) {
1398fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_eq_reg:
1399fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1400fa67e281SFilipp Zhinkin; ARM-NEXT:    eor r1, r0, r1
1401fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r1, r2
1402fa67e281SFilipp Zhinkin; ARM-NEXT:    bxne lr
1403fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB49_1: @ %true_br
1404fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1405fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1406fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1407fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1408fa67e281SFilipp Zhinkin;
1409fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_eq_reg:
1410fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1411fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1412fa67e281SFilipp Zhinkin; THUMB-NEXT:    eors r1, r0
1413fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r1, r2
1414fa67e281SFilipp Zhinkin; THUMB-NEXT:    bne .LBB49_2
1415fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1416fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1417fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB49_2: @ %exit
1418fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1419fa67e281SFilipp Zhinkin;
1420fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_eq_reg:
1421fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1422fa67e281SFilipp Zhinkin; THUMB2-NEXT:    eors r1, r0
1423fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, r2
1424fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it ne
1425fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxne lr
1426fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB49_1: @ %true_br
1427fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1428fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1429fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1430fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1431fa67e281SFilipp Zhinkin    %xor = xor i32 %a, %b
1432fa67e281SFilipp Zhinkin    %cmp = icmp eq i32 %xor, %c
1433fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1434fa67e281SFilipp Zhinkintrue_br:
1435fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1436fa67e281SFilipp Zhinkin    br label %exit
1437fa67e281SFilipp Zhinkinexit:
1438fa67e281SFilipp Zhinkin    ret void
1439fa67e281SFilipp Zhinkin}
1440fa67e281SFilipp Zhinkin
1441fa67e281SFilipp Zhinkindefine void @br_on_binop_ne_reg(i32 %a, i32 %b, i32 %c) {
1442fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_binop_ne_reg:
1443fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1444fa67e281SFilipp Zhinkin; ARM-NEXT:    and r1, r0, r1
1445fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r1, r2
1446fa67e281SFilipp Zhinkin; ARM-NEXT:    bxeq lr
1447fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB50_1: @ %true_br
1448fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1449fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1450fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1451fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1452fa67e281SFilipp Zhinkin;
1453fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_binop_ne_reg:
1454fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1455fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1456fa67e281SFilipp Zhinkin; THUMB-NEXT:    ands r1, r0
1457fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r1, r2
1458fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB50_2
1459fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1460fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1461fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB50_2: @ %exit
1462fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1463fa67e281SFilipp Zhinkin;
1464fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_binop_ne_reg:
1465fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1466fa67e281SFilipp Zhinkin; THUMB2-NEXT:    ands r1, r0
1467fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, r2
1468fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it eq
1469fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxeq lr
1470fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB50_1: @ %true_br
1471fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1472fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1473fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1474fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1475fa67e281SFilipp Zhinkin    %and = and i32 %a, %b
1476fa67e281SFilipp Zhinkin    %cmp = icmp ne i32 %and, %c
1477fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1478fa67e281SFilipp Zhinkintrue_br:
1479fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1480fa67e281SFilipp Zhinkin    br label %exit
1481fa67e281SFilipp Zhinkinexit:
1482fa67e281SFilipp Zhinkin    ret void
1483fa67e281SFilipp Zhinkin}
1484fa67e281SFilipp Zhinkin
1485fa67e281SFilipp Zhinkindefine void @br_on_shift_eq_zero(i32 %a, i32 %b) {
1486fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_eq_zero:
1487fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1488*945a1468SFilipp Zhinkin; ARM-NEXT:    lsls r1, r0, r1
1489fa67e281SFilipp Zhinkin; ARM-NEXT:    bxne lr
1490fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB51_1: @ %true_br
1491fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1492fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1493fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1494fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1495fa67e281SFilipp Zhinkin;
1496fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_eq_zero:
1497fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1498fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1499fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r2, r0
1500fa67e281SFilipp Zhinkin; THUMB-NEXT:    lsls r2, r1
1501fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB51_2
1502fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %exit
1503fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1504fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB51_2: @ %true_br
1505fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1506fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1507fa67e281SFilipp Zhinkin;
1508fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_eq_zero:
1509fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1510fa67e281SFilipp Zhinkin; THUMB2-NEXT:    lsls.w r1, r0, r1
1511fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it ne
1512fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxne lr
1513fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB51_1: @ %true_br
1514fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1515fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1516fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1517fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1518fa67e281SFilipp Zhinkin    %sh = shl i32 %a, %b
1519fa67e281SFilipp Zhinkin    %cmp = icmp eq i32 %sh, 0
1520fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1521fa67e281SFilipp Zhinkintrue_br:
1522fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1523fa67e281SFilipp Zhinkin    br label %exit
1524fa67e281SFilipp Zhinkinexit:
1525fa67e281SFilipp Zhinkin    ret void
1526fa67e281SFilipp Zhinkin}
1527fa67e281SFilipp Zhinkin
1528fa67e281SFilipp Zhinkindefine void @br_on_shift_ne_zero(i32 %a, i32 %b) {
1529fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_ne_zero:
1530fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1531*945a1468SFilipp Zhinkin; ARM-NEXT:    lsrs r1, r0, r1
1532fa67e281SFilipp Zhinkin; ARM-NEXT:    bxeq lr
1533fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB52_1: @ %true_br
1534fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1535fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1536fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1537fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1538fa67e281SFilipp Zhinkin;
1539fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_ne_zero:
1540fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1541fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1542fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r2, r0
1543fa67e281SFilipp Zhinkin; THUMB-NEXT:    lsrs r2, r1
1544fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB52_2
1545fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1546fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1547fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB52_2: @ %exit
1548fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1549fa67e281SFilipp Zhinkin;
1550fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_ne_zero:
1551fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1552fa67e281SFilipp Zhinkin; THUMB2-NEXT:    lsrs.w r1, r0, r1
1553fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it eq
1554fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxeq lr
1555fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB52_1: @ %true_br
1556fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1557fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1558fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1559fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1560fa67e281SFilipp Zhinkin    %sh = lshr i32 %a, %b
1561fa67e281SFilipp Zhinkin    %cmp = icmp ne i32 %sh, 0
1562fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1563fa67e281SFilipp Zhinkintrue_br:
1564fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1565fa67e281SFilipp Zhinkin    br label %exit
1566fa67e281SFilipp Zhinkinexit:
1567fa67e281SFilipp Zhinkin    ret void
1568fa67e281SFilipp Zhinkin}
1569fa67e281SFilipp Zhinkin
1570fa67e281SFilipp Zhinkindefine void @br_on_shift_lt_zero(i32 %a, i32 %b) {
1571fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_lt_zero:
1572fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1573fa67e281SFilipp Zhinkin; ARM-NEXT:    asr r1, r0, r1
1574fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r1, #0
1575fa67e281SFilipp Zhinkin; ARM-NEXT:    bxhs lr
1576fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB53_1: @ %true_br
1577fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1578fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1579fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1580fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1581fa67e281SFilipp Zhinkin;
1582fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_lt_zero:
1583fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1584fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1585fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r2, r0
1586fa67e281SFilipp Zhinkin; THUMB-NEXT:    asrs r2, r1
1587fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r2, #0
1588fa67e281SFilipp Zhinkin; THUMB-NEXT:    bhs .LBB53_2
1589fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1590fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1591fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB53_2: @ %exit
1592fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1593fa67e281SFilipp Zhinkin;
1594fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_lt_zero:
1595fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1596fa67e281SFilipp Zhinkin; THUMB2-NEXT:    asr.w r1, r0, r1
1597fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, #0
1598fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it hs
1599fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxhs lr
1600fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB53_1: @ %true_br
1601fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1602fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1603fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1604fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1605fa67e281SFilipp Zhinkin    %sh = ashr i32 %a, %b
1606fa67e281SFilipp Zhinkin    %cmp = icmp ult i32 %sh, 0
1607fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1608fa67e281SFilipp Zhinkintrue_br:
1609fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1610fa67e281SFilipp Zhinkin    br label %exit
1611fa67e281SFilipp Zhinkinexit:
1612fa67e281SFilipp Zhinkin    ret void
1613fa67e281SFilipp Zhinkin}
1614fa67e281SFilipp Zhinkin
1615fa67e281SFilipp Zhinkindefine void @br_on_shift_eq_imm(i32 %a, i32 %b) {
1616fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_eq_imm:
1617fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1618fa67e281SFilipp Zhinkin; ARM-NEXT:    mov r2, #42
1619fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r2, r0, lsl r1
1620fa67e281SFilipp Zhinkin; ARM-NEXT:    bxne lr
1621fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB54_1: @ %true_br
1622fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1623fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1624fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1625fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1626fa67e281SFilipp Zhinkin;
1627fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_eq_imm:
1628fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1629fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1630fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r2, r0
1631fa67e281SFilipp Zhinkin; THUMB-NEXT:    lsls r2, r1
1632fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r2, #42
1633fa67e281SFilipp Zhinkin; THUMB-NEXT:    bne .LBB54_2
1634fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1635fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1636fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB54_2: @ %exit
1637fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1638fa67e281SFilipp Zhinkin;
1639fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_eq_imm:
1640fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1641fa67e281SFilipp Zhinkin; THUMB2-NEXT:    lsl.w r1, r0, r1
1642fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, #42
1643fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it ne
1644fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxne lr
1645fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB54_1: @ %true_br
1646fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1647fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1648fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1649fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1650fa67e281SFilipp Zhinkin    %sh = shl i32 %a, %b
1651fa67e281SFilipp Zhinkin    %cmp = icmp eq i32 %sh, 42
1652fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1653fa67e281SFilipp Zhinkintrue_br:
1654fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1655fa67e281SFilipp Zhinkin    br label %exit
1656fa67e281SFilipp Zhinkinexit:
1657fa67e281SFilipp Zhinkin    ret void
1658fa67e281SFilipp Zhinkin}
1659fa67e281SFilipp Zhinkin
1660fa67e281SFilipp Zhinkindefine void @br_on_shift_ne_imm(i32 %a, i32 %b) {
1661fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_ne_imm:
1662fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1663fa67e281SFilipp Zhinkin; ARM-NEXT:    mov r2, #42
1664fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r2, r0, lsr r1
1665fa67e281SFilipp Zhinkin; ARM-NEXT:    bxeq lr
1666fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB55_1: @ %true_br
1667fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1668fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1669fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1670fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1671fa67e281SFilipp Zhinkin;
1672fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_ne_imm:
1673fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1674fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1675fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r2, r0
1676fa67e281SFilipp Zhinkin; THUMB-NEXT:    lsrs r2, r1
1677fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r2, #42
1678fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB55_2
1679fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1680fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1681fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB55_2: @ %exit
1682fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1683fa67e281SFilipp Zhinkin;
1684fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_ne_imm:
1685fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1686fa67e281SFilipp Zhinkin; THUMB2-NEXT:    lsr.w r1, r0, r1
1687fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r1, #42
1688fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it eq
1689fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxeq lr
1690fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB55_1: @ %true_br
1691fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1692fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1693fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1694fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1695fa67e281SFilipp Zhinkin    %sh = lshr i32 %a, %b
1696fa67e281SFilipp Zhinkin    %cmp = icmp ne i32 %sh, 42
1697fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1698fa67e281SFilipp Zhinkintrue_br:
1699fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1700fa67e281SFilipp Zhinkin    br label %exit
1701fa67e281SFilipp Zhinkinexit:
1702fa67e281SFilipp Zhinkin    ret void
1703fa67e281SFilipp Zhinkin}
1704fa67e281SFilipp Zhinkin
1705fa67e281SFilipp Zhinkindefine void @br_on_shift_eq_reg(i32 %a, i32 %b, i32 %c) {
1706fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_eq_reg:
1707fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1708fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r2, r0, asr r1
1709fa67e281SFilipp Zhinkin; ARM-NEXT:    bxne lr
1710fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB56_1: @ %true_br
1711fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1712fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1713fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1714fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1715fa67e281SFilipp Zhinkin;
1716fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_eq_reg:
1717fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1718fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1719fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r3, r0
1720fa67e281SFilipp Zhinkin; THUMB-NEXT:    asrs r3, r1
1721fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r2, r3
1722fa67e281SFilipp Zhinkin; THUMB-NEXT:    bne .LBB56_2
1723fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1724fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1725fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB56_2: @ %exit
1726fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1727fa67e281SFilipp Zhinkin;
1728fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_eq_reg:
1729fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1730fa67e281SFilipp Zhinkin; THUMB2-NEXT:    asr.w r1, r0, r1
1731fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r2, r1
1732fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it ne
1733fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxne lr
1734fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB56_1: @ %true_br
1735fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1736fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1737fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1738fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1739fa67e281SFilipp Zhinkin    %sh = ashr i32 %a, %b
1740fa67e281SFilipp Zhinkin    %cmp = icmp eq i32 %sh, %c
1741fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1742fa67e281SFilipp Zhinkintrue_br:
1743fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1744fa67e281SFilipp Zhinkin    br label %exit
1745fa67e281SFilipp Zhinkinexit:
1746fa67e281SFilipp Zhinkin    ret void
1747fa67e281SFilipp Zhinkin}
1748fa67e281SFilipp Zhinkin
1749fa67e281SFilipp Zhinkindefine void @br_on_shift_ne_reg(i32 %a, i32 %b, i32 %c) {
1750fa67e281SFilipp Zhinkin; ARM-LABEL: br_on_shift_ne_reg:
1751fa67e281SFilipp Zhinkin; ARM:       @ %bb.0:
1752fa67e281SFilipp Zhinkin; ARM-NEXT:    cmp r2, r0, lsl r1
1753fa67e281SFilipp Zhinkin; ARM-NEXT:    bxeq lr
1754fa67e281SFilipp Zhinkin; ARM-NEXT:  .LBB57_1: @ %true_br
1755fa67e281SFilipp Zhinkin; ARM-NEXT:    push {r11, lr}
1756fa67e281SFilipp Zhinkin; ARM-NEXT:    bl consume
1757fa67e281SFilipp Zhinkin; ARM-NEXT:    pop {r11, lr}
1758fa67e281SFilipp Zhinkin; ARM-NEXT:    bx lr
1759fa67e281SFilipp Zhinkin;
1760fa67e281SFilipp Zhinkin; THUMB-LABEL: br_on_shift_ne_reg:
1761fa67e281SFilipp Zhinkin; THUMB:       @ %bb.0:
1762fa67e281SFilipp Zhinkin; THUMB-NEXT:    push {r7, lr}
1763fa67e281SFilipp Zhinkin; THUMB-NEXT:    mov r3, r0
1764fa67e281SFilipp Zhinkin; THUMB-NEXT:    lsls r3, r1
1765fa67e281SFilipp Zhinkin; THUMB-NEXT:    cmp r2, r3
1766fa67e281SFilipp Zhinkin; THUMB-NEXT:    beq .LBB57_2
1767fa67e281SFilipp Zhinkin; THUMB-NEXT:  @ %bb.1: @ %true_br
1768fa67e281SFilipp Zhinkin; THUMB-NEXT:    bl consume
1769fa67e281SFilipp Zhinkin; THUMB-NEXT:  .LBB57_2: @ %exit
1770fa67e281SFilipp Zhinkin; THUMB-NEXT:    pop {r7, pc}
1771fa67e281SFilipp Zhinkin;
1772fa67e281SFilipp Zhinkin; THUMB2-LABEL: br_on_shift_ne_reg:
1773fa67e281SFilipp Zhinkin; THUMB2:       @ %bb.0:
1774fa67e281SFilipp Zhinkin; THUMB2-NEXT:    lsl.w r1, r0, r1
1775fa67e281SFilipp Zhinkin; THUMB2-NEXT:    cmp r2, r1
1776fa67e281SFilipp Zhinkin; THUMB2-NEXT:    it eq
1777fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bxeq lr
1778fa67e281SFilipp Zhinkin; THUMB2-NEXT:  .LBB57_1: @ %true_br
1779fa67e281SFilipp Zhinkin; THUMB2-NEXT:    push {r7, lr}
1780fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bl consume
1781fa67e281SFilipp Zhinkin; THUMB2-NEXT:    pop.w {r7, lr}
1782fa67e281SFilipp Zhinkin; THUMB2-NEXT:    bx lr
1783fa67e281SFilipp Zhinkin    %sh = shl i32 %a, %b
1784fa67e281SFilipp Zhinkin    %cmp = icmp ne i32 %sh, %c
1785fa67e281SFilipp Zhinkin    br i1 %cmp, label %true_br, label %exit
1786fa67e281SFilipp Zhinkintrue_br:
1787fa67e281SFilipp Zhinkin    call void @consume(i32 %a)
1788fa67e281SFilipp Zhinkin    br label %exit
1789fa67e281SFilipp Zhinkinexit:
1790fa67e281SFilipp Zhinkin    ret void
1791fa67e281SFilipp Zhinkin}
1792