Handle logical shift right (at least I hope so :) )
[llvm/msp430.git] / test / CodeGen / X86 / bt.ll
bloba76242c977cedfa48b58495d100a159f4d33902e
1 ; RUN: llvm-as < %s | llc -march=x86 | grep btl | count 28
2 ; RUN: llvm-as < %s | llc -march=x86 -mcpu=pentium4 | grep btl | not grep esp
3 ; RUN: llvm-as < %s | llc -march=x86 -mcpu=penryn   | grep btl | not grep esp
4 ; PR3253
6 ; The register+memory form of the BT instruction should be usable on
7 ; pentium4, however it is currently disabled due to the register+memory
8 ; form having different semantics than the register+register form.
10 ; Test these patterns:
11 ;    (X & (1 << N))  != 0  -->  BT(X, N).
12 ;    ((X >>u N) & 1) != 0  -->  BT(X, N).
13 ; as well as several variations:
14 ;    - The second form can use an arithmetic shift.
15 ;    - Either form can use == instead of !=.
16 ;    - Either form can compare with an operand of the &
17 ;      instead of with 0.
18 ;    - The comparison can be commuted (only cases where neither
19 ;      operand is constant are included).
20 ;    - The and can be commuted.
22 define void @test2(i32 %x, i32 %n) nounwind {
23 entry:
24         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
25         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
26         %tmp4 = icmp eq i32 %tmp3, 0            ; <i1> [#uses=1]
27         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
29 bb:             ; preds = %entry
30         call void @foo()
31         ret void
33 UnifiedReturnBlock:             ; preds = %entry
34         ret void
37 define void @test2b(i32 %x, i32 %n) nounwind {
38 entry:
39         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
40         %tmp3 = and i32 1, %tmp29
41         %tmp4 = icmp eq i32 %tmp3, 0            ; <i1> [#uses=1]
42         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
44 bb:             ; preds = %entry
45         call void @foo()
46         ret void
48 UnifiedReturnBlock:             ; preds = %entry
49         ret void
52 define void @atest2(i32 %x, i32 %n) nounwind {
53 entry:
54         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
55         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
56         %tmp4 = icmp eq i32 %tmp3, 0            ; <i1> [#uses=1]
57         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
59 bb:             ; preds = %entry
60         call void @foo()
61         ret void
63 UnifiedReturnBlock:             ; preds = %entry
64         ret void
67 define void @atest2b(i32 %x, i32 %n) nounwind {
68 entry:
69         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
70         %tmp3 = and i32 1, %tmp29
71         %tmp4 = icmp eq i32 %tmp3, 0            ; <i1> [#uses=1]
72         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
74 bb:             ; preds = %entry
75         call void @foo()
76         ret void
78 UnifiedReturnBlock:             ; preds = %entry
79         ret void
82 define void @test3(i32 %x, i32 %n) nounwind {
83 entry:
84         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
85         %tmp3 = and i32 %tmp29, %x              ; <i32> [#uses=1]
86         %tmp4 = icmp eq i32 %tmp3, 0            ; <i1> [#uses=1]
87         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
89 bb:             ; preds = %entry
90         call void @foo()
91         ret void
93 UnifiedReturnBlock:             ; preds = %entry
94         ret void
97 define void @test3b(i32 %x, i32 %n) nounwind {
98 entry:
99         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
100         %tmp3 = and i32 %x, %tmp29
101         %tmp4 = icmp eq i32 %tmp3, 0            ; <i1> [#uses=1]
102         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
104 bb:             ; preds = %entry
105         call void @foo()
106         ret void
108 UnifiedReturnBlock:             ; preds = %entry
109         ret void
112 define void @testne2(i32 %x, i32 %n) nounwind {
113 entry:
114         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
115         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
116         %tmp4 = icmp ne i32 %tmp3, 0            ; <i1> [#uses=1]
117         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
119 bb:             ; preds = %entry
120         call void @foo()
121         ret void
123 UnifiedReturnBlock:             ; preds = %entry
124         ret void
127 define void @testne2b(i32 %x, i32 %n) nounwind {
128 entry:
129         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
130         %tmp3 = and i32 1, %tmp29
131         %tmp4 = icmp ne i32 %tmp3, 0            ; <i1> [#uses=1]
132         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
134 bb:             ; preds = %entry
135         call void @foo()
136         ret void
138 UnifiedReturnBlock:             ; preds = %entry
139         ret void
142 define void @atestne2(i32 %x, i32 %n) nounwind {
143 entry:
144         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
145         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
146         %tmp4 = icmp ne i32 %tmp3, 0            ; <i1> [#uses=1]
147         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
149 bb:             ; preds = %entry
150         call void @foo()
151         ret void
153 UnifiedReturnBlock:             ; preds = %entry
154         ret void
157 define void @atestne2b(i32 %x, i32 %n) nounwind {
158 entry:
159         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
160         %tmp3 = and i32 1, %tmp29
161         %tmp4 = icmp ne i32 %tmp3, 0            ; <i1> [#uses=1]
162         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
164 bb:             ; preds = %entry
165         call void @foo()
166         ret void
168 UnifiedReturnBlock:             ; preds = %entry
169         ret void
172 define void @testne3(i32 %x, i32 %n) nounwind {
173 entry:
174         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
175         %tmp3 = and i32 %tmp29, %x              ; <i32> [#uses=1]
176         %tmp4 = icmp ne i32 %tmp3, 0            ; <i1> [#uses=1]
177         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
179 bb:             ; preds = %entry
180         call void @foo()
181         ret void
183 UnifiedReturnBlock:             ; preds = %entry
184         ret void
187 define void @testne3b(i32 %x, i32 %n) nounwind {
188 entry:
189         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
190         %tmp3 = and i32 %x, %tmp29
191         %tmp4 = icmp ne i32 %tmp3, 0            ; <i1> [#uses=1]
192         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
194 bb:             ; preds = %entry
195         call void @foo()
196         ret void
198 UnifiedReturnBlock:             ; preds = %entry
199         ret void
202 define void @query2(i32 %x, i32 %n) nounwind {
203 entry:
204         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
205         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
206         %tmp4 = icmp eq i32 %tmp3, 1            ; <i1> [#uses=1]
207         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
209 bb:             ; preds = %entry
210         call void @foo()
211         ret void
213 UnifiedReturnBlock:             ; preds = %entry
214         ret void
217 define void @query2b(i32 %x, i32 %n) nounwind {
218 entry:
219         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
220         %tmp3 = and i32 1, %tmp29
221         %tmp4 = icmp eq i32 %tmp3, 1            ; <i1> [#uses=1]
222         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
224 bb:             ; preds = %entry
225         call void @foo()
226         ret void
228 UnifiedReturnBlock:             ; preds = %entry
229         ret void
232 define void @aquery2(i32 %x, i32 %n) nounwind {
233 entry:
234         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
235         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
236         %tmp4 = icmp eq i32 %tmp3, 1            ; <i1> [#uses=1]
237         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
239 bb:             ; preds = %entry
240         call void @foo()
241         ret void
243 UnifiedReturnBlock:             ; preds = %entry
244         ret void
247 define void @aquery2b(i32 %x, i32 %n) nounwind {
248 entry:
249         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
250         %tmp3 = and i32 1, %tmp29
251         %tmp4 = icmp eq i32 %tmp3, 1            ; <i1> [#uses=1]
252         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
254 bb:             ; preds = %entry
255         call void @foo()
256         ret void
258 UnifiedReturnBlock:             ; preds = %entry
259         ret void
262 define void @query3(i32 %x, i32 %n) nounwind {
263 entry:
264         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
265         %tmp3 = and i32 %tmp29, %x              ; <i32> [#uses=1]
266         %tmp4 = icmp eq i32 %tmp3, %tmp29               ; <i1> [#uses=1]
267         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
269 bb:             ; preds = %entry
270         call void @foo()
271         ret void
273 UnifiedReturnBlock:             ; preds = %entry
274         ret void
277 define void @query3b(i32 %x, i32 %n) nounwind {
278 entry:
279         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
280         %tmp3 = and i32 %x, %tmp29
281         %tmp4 = icmp eq i32 %tmp3, %tmp29               ; <i1> [#uses=1]
282         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
284 bb:             ; preds = %entry
285         call void @foo()
286         ret void
288 UnifiedReturnBlock:             ; preds = %entry
289         ret void
292 define void @query3x(i32 %x, i32 %n) nounwind {
293 entry:
294         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
295         %tmp3 = and i32 %tmp29, %x              ; <i32> [#uses=1]
296         %tmp4 = icmp eq i32 %tmp29, %tmp3               ; <i1> [#uses=1]
297         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
299 bb:             ; preds = %entry
300         call void @foo()
301         ret void
303 UnifiedReturnBlock:             ; preds = %entry
304         ret void
307 define void @query3bx(i32 %x, i32 %n) nounwind {
308 entry:
309         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
310         %tmp3 = and i32 %x, %tmp29
311         %tmp4 = icmp eq i32 %tmp29, %tmp3               ; <i1> [#uses=1]
312         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
314 bb:             ; preds = %entry
315         call void @foo()
316         ret void
318 UnifiedReturnBlock:             ; preds = %entry
319         ret void
322 define void @queryne2(i32 %x, i32 %n) nounwind {
323 entry:
324         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
325         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
326         %tmp4 = icmp ne i32 %tmp3, 1            ; <i1> [#uses=1]
327         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
329 bb:             ; preds = %entry
330         call void @foo()
331         ret void
333 UnifiedReturnBlock:             ; preds = %entry
334         ret void
337 define void @queryne2b(i32 %x, i32 %n) nounwind {
338 entry:
339         %tmp29 = lshr i32 %x, %n                ; <i32> [#uses=1]
340         %tmp3 = and i32 1, %tmp29
341         %tmp4 = icmp ne i32 %tmp3, 1            ; <i1> [#uses=1]
342         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
344 bb:             ; preds = %entry
345         call void @foo()
346         ret void
348 UnifiedReturnBlock:             ; preds = %entry
349         ret void
352 define void @aqueryne2(i32 %x, i32 %n) nounwind {
353 entry:
354         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
355         %tmp3 = and i32 %tmp29, 1               ; <i32> [#uses=1]
356         %tmp4 = icmp ne i32 %tmp3, 1            ; <i1> [#uses=1]
357         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
359 bb:             ; preds = %entry
360         call void @foo()
361         ret void
363 UnifiedReturnBlock:             ; preds = %entry
364         ret void
367 define void @aqueryne2b(i32 %x, i32 %n) nounwind {
368 entry:
369         %tmp29 = ashr i32 %x, %n                ; <i32> [#uses=1]
370         %tmp3 = and i32 1, %tmp29
371         %tmp4 = icmp ne i32 %tmp3, 1            ; <i1> [#uses=1]
372         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
374 bb:             ; preds = %entry
375         call void @foo()
376         ret void
378 UnifiedReturnBlock:             ; preds = %entry
379         ret void
382 define void @queryne3(i32 %x, i32 %n) nounwind {
383 entry:
384         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
385         %tmp3 = and i32 %tmp29, %x              ; <i32> [#uses=1]
386         %tmp4 = icmp ne i32 %tmp3, %tmp29               ; <i1> [#uses=1]
387         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
389 bb:             ; preds = %entry
390         call void @foo()
391         ret void
393 UnifiedReturnBlock:             ; preds = %entry
394         ret void
397 define void @queryne3b(i32 %x, i32 %n) nounwind {
398 entry:
399         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
400         %tmp3 = and i32 %x, %tmp29
401         %tmp4 = icmp ne i32 %tmp3, %tmp29               ; <i1> [#uses=1]
402         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
404 bb:             ; preds = %entry
405         call void @foo()
406         ret void
408 UnifiedReturnBlock:             ; preds = %entry
409         ret void
412 define void @queryne3x(i32 %x, i32 %n) nounwind {
413 entry:
414         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
415         %tmp3 = and i32 %tmp29, %x              ; <i32> [#uses=1]
416         %tmp4 = icmp ne i32 %tmp29, %tmp3               ; <i1> [#uses=1]
417         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
419 bb:             ; preds = %entry
420         call void @foo()
421         ret void
423 UnifiedReturnBlock:             ; preds = %entry
424         ret void
427 define void @queryne3bx(i32 %x, i32 %n) nounwind {
428 entry:
429         %tmp29 = shl i32 1, %n          ; <i32> [#uses=1]
430         %tmp3 = and i32 %x, %tmp29
431         %tmp4 = icmp ne i32 %tmp29, %tmp3               ; <i1> [#uses=1]
432         br i1 %tmp4, label %bb, label %UnifiedReturnBlock
434 bb:             ; preds = %entry
435         call void @foo()
436         ret void
438 UnifiedReturnBlock:             ; preds = %entry
439         ret void
442 declare void @foo()