[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / test-vs-bittest.ll
blob0998a0f1d6ba9db98f9569d1994fd5e17032c21e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
4 define void @test64(i64 inreg %x) {
5 ; CHECK-LABEL: test64:
6 ; CHECK:       # %bb.0:
7 ; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
8 ; CHECK-NEXT:    jne .LBB0_2
9 ; CHECK-NEXT:  # %bb.1: # %yes
10 ; CHECK-NEXT:    pushq %rax
11 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
12 ; CHECK-NEXT:    callq bar@PLT
13 ; CHECK-NEXT:    popq %rax
14 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
15 ; CHECK-NEXT:  .LBB0_2: # %no
16 ; CHECK-NEXT:    retq
17   %t = and i64 %x, 2048
18   %s = icmp eq i64 %t, 0
19   br i1 %s, label %yes, label %no
21 yes:
22   call void @bar()
23   ret void
24 no:
25   ret void
28 define void @test64_optsize(i64 inreg %x) optsize {
29 ; CHECK-LABEL: test64_optsize:
30 ; CHECK:       # %bb.0:
31 ; CHECK-NEXT:    btl $11, %edi
32 ; CHECK-NEXT:    jb .LBB1_2
33 ; CHECK-NEXT:  # %bb.1: # %yes
34 ; CHECK-NEXT:    pushq %rax
35 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
36 ; CHECK-NEXT:    callq bar@PLT
37 ; CHECK-NEXT:    popq %rax
38 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
39 ; CHECK-NEXT:  .LBB1_2: # %no
40 ; CHECK-NEXT:    retq
41   %t = and i64 %x, 2048
42   %s = icmp eq i64 %t, 0
43   br i1 %s, label %yes, label %no
45 yes:
46   call void @bar()
47   ret void
48 no:
49   ret void
52 define void @test64_pgso(i64 inreg %x) !prof !14 {
53 ; CHECK-LABEL: test64_pgso:
54 ; CHECK:       # %bb.0:
55 ; CHECK-NEXT:    btl $11, %edi
56 ; CHECK-NEXT:    jb .LBB2_2
57 ; CHECK-NEXT:  # %bb.1: # %yes
58 ; CHECK-NEXT:    pushq %rax
59 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
60 ; CHECK-NEXT:    callq bar@PLT
61 ; CHECK-NEXT:    popq %rax
62 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
63 ; CHECK-NEXT:  .LBB2_2: # %no
64 ; CHECK-NEXT:    retq
65   %t = and i64 %x, 2048
66   %s = icmp eq i64 %t, 0
67   br i1 %s, label %yes, label %no
69 yes:
70   call void @bar()
71   ret void
72 no:
73   ret void
76 ; This test is identical to test64 above with only the destination of the br
77 ; reversed. This somehow causes the two functions to get slightly different
78 ; initial IR. One has an extra invert of the setcc. This previous caused one
79 ; the functions to use a BT while the other used a TEST due to another DAG
80 ; combine messing with an expected canonical form.
81 define void @test64_2(i64 inreg %x) {
82 ; CHECK-LABEL: test64_2:
83 ; CHECK:       # %bb.0:
84 ; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
85 ; CHECK-NEXT:    je .LBB3_2
86 ; CHECK-NEXT:  # %bb.1: # %yes
87 ; CHECK-NEXT:    pushq %rax
88 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
89 ; CHECK-NEXT:    callq bar@PLT
90 ; CHECK-NEXT:    popq %rax
91 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
92 ; CHECK-NEXT:  .LBB3_2: # %no
93 ; CHECK-NEXT:    retq
94   %t = and i64 %x, 2048
95   %s = icmp eq i64 %t, 0
96   br i1 %s, label %no, label %yes
98 yes:
99   call void @bar()
100   ret void
102   ret void
105 define void @test64_optsize_2(i64 inreg %x) optsize {
106 ; CHECK-LABEL: test64_optsize_2:
107 ; CHECK:       # %bb.0:
108 ; CHECK-NEXT:    btl $11, %edi
109 ; CHECK-NEXT:    jae .LBB4_2
110 ; CHECK-NEXT:  # %bb.1: # %yes
111 ; CHECK-NEXT:    pushq %rax
112 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
113 ; CHECK-NEXT:    callq bar@PLT
114 ; CHECK-NEXT:    popq %rax
115 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
116 ; CHECK-NEXT:  .LBB4_2: # %no
117 ; CHECK-NEXT:    retq
118   %t = and i64 %x, 2048
119   %s = icmp eq i64 %t, 0
120   br i1 %s, label %no, label %yes
122 yes:
123   call void @bar()
124   ret void
126   ret void
129 define void @test64_pgso_2(i64 inreg %x) !prof !14 {
130 ; CHECK-LABEL: test64_pgso_2:
131 ; CHECK:       # %bb.0:
132 ; CHECK-NEXT:    btl $11, %edi
133 ; CHECK-NEXT:    jae .LBB5_2
134 ; CHECK-NEXT:  # %bb.1: # %yes
135 ; CHECK-NEXT:    pushq %rax
136 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
137 ; CHECK-NEXT:    callq bar@PLT
138 ; CHECK-NEXT:    popq %rax
139 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
140 ; CHECK-NEXT:  .LBB5_2: # %no
141 ; CHECK-NEXT:    retq
142   %t = and i64 %x, 2048
143   %s = icmp eq i64 %t, 0
144   br i1 %s, label %no, label %yes
146 yes:
147   call void @bar()
148   ret void
150   ret void
153 define void @test64_3(i64 inreg %x) {
154 ; CHECK-LABEL: test64_3:
155 ; CHECK:       # %bb.0:
156 ; CHECK-NEXT:    btq $32, %rdi
157 ; CHECK-NEXT:    jb .LBB6_2
158 ; CHECK-NEXT:  # %bb.1: # %yes
159 ; CHECK-NEXT:    pushq %rax
160 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
161 ; CHECK-NEXT:    callq bar@PLT
162 ; CHECK-NEXT:    popq %rax
163 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
164 ; CHECK-NEXT:  .LBB6_2: # %no
165 ; CHECK-NEXT:    retq
166   %t = and i64 %x, 4294967296
167   %s = icmp eq i64 %t, 0
168   br i1 %s, label %yes, label %no
170 yes:
171   call void @bar()
172   ret void
174   ret void
177 define void @test64_optsize_3(i64 inreg %x) optsize {
178 ; CHECK-LABEL: test64_optsize_3:
179 ; CHECK:       # %bb.0:
180 ; CHECK-NEXT:    btq $32, %rdi
181 ; CHECK-NEXT:    jb .LBB7_2
182 ; CHECK-NEXT:  # %bb.1: # %yes
183 ; CHECK-NEXT:    pushq %rax
184 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
185 ; CHECK-NEXT:    callq bar@PLT
186 ; CHECK-NEXT:    popq %rax
187 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
188 ; CHECK-NEXT:  .LBB7_2: # %no
189 ; CHECK-NEXT:    retq
190   %t = and i64 %x, 4294967296
191   %s = icmp eq i64 %t, 0
192   br i1 %s, label %yes, label %no
194 yes:
195   call void @bar()
196   ret void
198   ret void
201 define void @test64_pgso_3(i64 inreg %x) !prof !14 {
202 ; CHECK-LABEL: test64_pgso_3:
203 ; CHECK:       # %bb.0:
204 ; CHECK-NEXT:    btq $32, %rdi
205 ; CHECK-NEXT:    jb .LBB8_2
206 ; CHECK-NEXT:  # %bb.1: # %yes
207 ; CHECK-NEXT:    pushq %rax
208 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
209 ; CHECK-NEXT:    callq bar@PLT
210 ; CHECK-NEXT:    popq %rax
211 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
212 ; CHECK-NEXT:  .LBB8_2: # %no
213 ; CHECK-NEXT:    retq
214   %t = and i64 %x, 4294967296
215   %s = icmp eq i64 %t, 0
216   br i1 %s, label %yes, label %no
218 yes:
219   call void @bar()
220   ret void
222   ret void
225 define void @test64_4(i64 inreg %x) {
226 ; CHECK-LABEL: test64_4:
227 ; CHECK:       # %bb.0:
228 ; CHECK-NEXT:    btq $32, %rdi
229 ; CHECK-NEXT:    jae .LBB9_2
230 ; CHECK-NEXT:  # %bb.1: # %yes
231 ; CHECK-NEXT:    pushq %rax
232 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
233 ; CHECK-NEXT:    callq bar@PLT
234 ; CHECK-NEXT:    popq %rax
235 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
236 ; CHECK-NEXT:  .LBB9_2: # %no
237 ; CHECK-NEXT:    retq
238   %t = and i64 %x, 4294967296
239   %s = icmp eq i64 %t, 0
240   br i1 %s, label %no, label %yes
242 yes:
243   call void @bar()
244   ret void
246   ret void
249 define void @test64_optsize_4(i64 inreg %x) optsize {
250 ; CHECK-LABEL: test64_optsize_4:
251 ; CHECK:       # %bb.0:
252 ; CHECK-NEXT:    btq $32, %rdi
253 ; CHECK-NEXT:    jae .LBB10_2
254 ; CHECK-NEXT:  # %bb.1: # %yes
255 ; CHECK-NEXT:    pushq %rax
256 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
257 ; CHECK-NEXT:    callq bar@PLT
258 ; CHECK-NEXT:    popq %rax
259 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
260 ; CHECK-NEXT:  .LBB10_2: # %no
261 ; CHECK-NEXT:    retq
262   %t = and i64 %x, 4294967296
263   %s = icmp eq i64 %t, 0
264   br i1 %s, label %no, label %yes
266 yes:
267   call void @bar()
268   ret void
270   ret void
273 define void @test64_pgso_4(i64 inreg %x) !prof !14 {
274 ; CHECK-LABEL: test64_pgso_4:
275 ; CHECK:       # %bb.0:
276 ; CHECK-NEXT:    btq $32, %rdi
277 ; CHECK-NEXT:    jae .LBB11_2
278 ; CHECK-NEXT:  # %bb.1: # %yes
279 ; CHECK-NEXT:    pushq %rax
280 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
281 ; CHECK-NEXT:    callq bar@PLT
282 ; CHECK-NEXT:    popq %rax
283 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
284 ; CHECK-NEXT:  .LBB11_2: # %no
285 ; CHECK-NEXT:    retq
286   %t = and i64 %x, 4294967296
287   %s = icmp eq i64 %t, 0
288   br i1 %s, label %no, label %yes
290 yes:
291   call void @bar()
292   ret void
294   ret void
297 define void @test32(i32 inreg %x) {
298 ; CHECK-LABEL: test32:
299 ; CHECK:       # %bb.0:
300 ; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
301 ; CHECK-NEXT:    jne .LBB12_2
302 ; CHECK-NEXT:  # %bb.1: # %yes
303 ; CHECK-NEXT:    pushq %rax
304 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
305 ; CHECK-NEXT:    callq bar@PLT
306 ; CHECK-NEXT:    popq %rax
307 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
308 ; CHECK-NEXT:  .LBB12_2: # %no
309 ; CHECK-NEXT:    retq
310   %t = and i32 %x, 2048
311   %s = icmp eq i32 %t, 0
312   br i1 %s, label %yes, label %no
314 yes:
315   call void @bar()
316   ret void
318   ret void
321 define void @test32_optsize(i32 inreg %x) optsize {
322 ; CHECK-LABEL: test32_optsize:
323 ; CHECK:       # %bb.0:
324 ; CHECK-NEXT:    btl $11, %edi
325 ; CHECK-NEXT:    jb .LBB13_2
326 ; CHECK-NEXT:  # %bb.1: # %yes
327 ; CHECK-NEXT:    pushq %rax
328 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
329 ; CHECK-NEXT:    callq bar@PLT
330 ; CHECK-NEXT:    popq %rax
331 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
332 ; CHECK-NEXT:  .LBB13_2: # %no
333 ; CHECK-NEXT:    retq
334   %t = and i32 %x, 2048
335   %s = icmp eq i32 %t, 0
336   br i1 %s, label %yes, label %no
338 yes:
339   call void @bar()
340   ret void
342   ret void
345 define void @test32_2(i32 inreg %x) {
346 ; CHECK-LABEL: test32_2:
347 ; CHECK:       # %bb.0:
348 ; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
349 ; CHECK-NEXT:    je .LBB14_2
350 ; CHECK-NEXT:  # %bb.1: # %yes
351 ; CHECK-NEXT:    pushq %rax
352 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
353 ; CHECK-NEXT:    callq bar@PLT
354 ; CHECK-NEXT:    popq %rax
355 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
356 ; CHECK-NEXT:  .LBB14_2: # %no
357 ; CHECK-NEXT:    retq
358   %t = and i32 %x, 2048
359   %s = icmp eq i32 %t, 0
360   br i1 %s, label %no, label %yes
362 yes:
363   call void @bar()
364   ret void
366   ret void
369 define void @test32_optsize_2(i32 inreg %x) optsize {
370 ; CHECK-LABEL: test32_optsize_2:
371 ; CHECK:       # %bb.0:
372 ; CHECK-NEXT:    btl $11, %edi
373 ; CHECK-NEXT:    jae .LBB15_2
374 ; CHECK-NEXT:  # %bb.1: # %yes
375 ; CHECK-NEXT:    pushq %rax
376 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
377 ; CHECK-NEXT:    callq bar@PLT
378 ; CHECK-NEXT:    popq %rax
379 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
380 ; CHECK-NEXT:  .LBB15_2: # %no
381 ; CHECK-NEXT:    retq
382   %t = and i32 %x, 2048
383   %s = icmp eq i32 %t, 0
384   br i1 %s, label %no, label %yes
386 yes:
387   call void @bar()
388   ret void
390   ret void
393 define void @test32_pgso_2(i32 inreg %x) !prof !14 {
394 ; CHECK-LABEL: test32_pgso_2:
395 ; CHECK:       # %bb.0:
396 ; CHECK-NEXT:    btl $11, %edi
397 ; CHECK-NEXT:    jae .LBB16_2
398 ; CHECK-NEXT:  # %bb.1: # %yes
399 ; CHECK-NEXT:    pushq %rax
400 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
401 ; CHECK-NEXT:    callq bar@PLT
402 ; CHECK-NEXT:    popq %rax
403 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
404 ; CHECK-NEXT:  .LBB16_2: # %no
405 ; CHECK-NEXT:    retq
406   %t = and i32 %x, 2048
407   %s = icmp eq i32 %t, 0
408   br i1 %s, label %no, label %yes
410 yes:
411   call void @bar()
412   ret void
414   ret void
417 define void @test16(i16 inreg %x) {
418 ; CHECK-LABEL: test16:
419 ; CHECK:       # %bb.0:
420 ; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
421 ; CHECK-NEXT:    jne .LBB17_2
422 ; CHECK-NEXT:  # %bb.1: # %yes
423 ; CHECK-NEXT:    pushq %rax
424 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
425 ; CHECK-NEXT:    callq bar@PLT
426 ; CHECK-NEXT:    popq %rax
427 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
428 ; CHECK-NEXT:  .LBB17_2: # %no
429 ; CHECK-NEXT:    retq
430   %t = and i16 %x, 2048
431   %s = icmp eq i16 %t, 0
432   br i1 %s, label %yes, label %no
434 yes:
435   call void @bar()
436   ret void
438   ret void
441 define void @test16_optsize(i16 inreg %x) optsize {
442 ; CHECK-LABEL: test16_optsize:
443 ; CHECK:       # %bb.0:
444 ; CHECK-NEXT:    btl $11, %edi
445 ; CHECK-NEXT:    jb .LBB18_2
446 ; CHECK-NEXT:  # %bb.1: # %yes
447 ; CHECK-NEXT:    pushq %rax
448 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
449 ; CHECK-NEXT:    callq bar@PLT
450 ; CHECK-NEXT:    popq %rax
451 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
452 ; CHECK-NEXT:  .LBB18_2: # %no
453 ; CHECK-NEXT:    retq
454   %t = and i16 %x, 2048
455   %s = icmp eq i16 %t, 0
456   br i1 %s, label %yes, label %no
458 yes:
459   call void @bar()
460   ret void
462   ret void
465 define void @test16_pgso(i16 inreg %x) !prof !14 {
466 ; CHECK-LABEL: test16_pgso:
467 ; CHECK:       # %bb.0:
468 ; CHECK-NEXT:    btl $11, %edi
469 ; CHECK-NEXT:    jb .LBB19_2
470 ; CHECK-NEXT:  # %bb.1: # %yes
471 ; CHECK-NEXT:    pushq %rax
472 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
473 ; CHECK-NEXT:    callq bar@PLT
474 ; CHECK-NEXT:    popq %rax
475 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
476 ; CHECK-NEXT:  .LBB19_2: # %no
477 ; CHECK-NEXT:    retq
478   %t = and i16 %x, 2048
479   %s = icmp eq i16 %t, 0
480   br i1 %s, label %yes, label %no
482 yes:
483   call void @bar()
484   ret void
486   ret void
489 define void @test16_2(i16 inreg %x) {
490 ; CHECK-LABEL: test16_2:
491 ; CHECK:       # %bb.0:
492 ; CHECK-NEXT:    testl $2048, %edi # imm = 0x800
493 ; CHECK-NEXT:    je .LBB20_2
494 ; CHECK-NEXT:  # %bb.1: # %yes
495 ; CHECK-NEXT:    pushq %rax
496 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
497 ; CHECK-NEXT:    callq bar@PLT
498 ; CHECK-NEXT:    popq %rax
499 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
500 ; CHECK-NEXT:  .LBB20_2: # %no
501 ; CHECK-NEXT:    retq
502   %t = and i16 %x, 2048
503   %s = icmp eq i16 %t, 0
504   br i1 %s, label %no, label %yes
506 yes:
507   call void @bar()
508   ret void
510   ret void
513 define void @test16_optsize_2(i16 inreg %x) optsize {
514 ; CHECK-LABEL: test16_optsize_2:
515 ; CHECK:       # %bb.0:
516 ; CHECK-NEXT:    btl $11, %edi
517 ; CHECK-NEXT:    jae .LBB21_2
518 ; CHECK-NEXT:  # %bb.1: # %yes
519 ; CHECK-NEXT:    pushq %rax
520 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
521 ; CHECK-NEXT:    callq bar@PLT
522 ; CHECK-NEXT:    popq %rax
523 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
524 ; CHECK-NEXT:  .LBB21_2: # %no
525 ; CHECK-NEXT:    retq
526   %t = and i16 %x, 2048
527   %s = icmp eq i16 %t, 0
528   br i1 %s, label %no, label %yes
530 yes:
531   call void @bar()
532   ret void
534   ret void
537 define void @test16_pgso_2(i16 inreg %x) !prof !14 {
538 ; CHECK-LABEL: test16_pgso_2:
539 ; CHECK:       # %bb.0:
540 ; CHECK-NEXT:    btl $11, %edi
541 ; CHECK-NEXT:    jae .LBB22_2
542 ; CHECK-NEXT:  # %bb.1: # %yes
543 ; CHECK-NEXT:    pushq %rax
544 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
545 ; CHECK-NEXT:    callq bar@PLT
546 ; CHECK-NEXT:    popq %rax
547 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
548 ; CHECK-NEXT:  .LBB22_2: # %no
549 ; CHECK-NEXT:    retq
550   %t = and i16 %x, 2048
551   %s = icmp eq i16 %t, 0
552   br i1 %s, label %no, label %yes
554 yes:
555   call void @bar()
556   ret void
558   ret void
561 define i64 @is_upper_bit_clear_i64(i64 %x) {
562 ; CHECK-LABEL: is_upper_bit_clear_i64:
563 ; CHECK:       # %bb.0:
564 ; CHECK-NEXT:    xorl %eax, %eax
565 ; CHECK-NEXT:    btq $37, %rdi
566 ; CHECK-NEXT:    setae %al
567 ; CHECK-NEXT:    retq
568   %sh = lshr i64 %x, 37
569   %m = and i64 %sh, 1
570   %r = xor i64 %m, 1
571   ret i64 %r
574 define i32 @is_upper_bit_clear_i64_trunc(i64 %x) {
575 ; CHECK-LABEL: is_upper_bit_clear_i64_trunc:
576 ; CHECK:       # %bb.0:
577 ; CHECK-NEXT:    xorl %eax, %eax
578 ; CHECK-NEXT:    btq $42, %rdi
579 ; CHECK-NEXT:    setae %al
580 ; CHECK-NEXT:    retq
581   %sh = lshr i64 %x, 42
582   %t = trunc i64 %sh to i32
583   %m = and i32 %t, 1
584   %r = xor i32 %m, 1
585   ret i32 %r
588 define i64 @is_upper_bit_clear_i64_not(i64 %x) {
589 ; CHECK-LABEL: is_upper_bit_clear_i64_not:
590 ; CHECK:       # %bb.0:
591 ; CHECK-NEXT:    xorl %eax, %eax
592 ; CHECK-NEXT:    btq $39, %rdi
593 ; CHECK-NEXT:    setae %al
594 ; CHECK-NEXT:    retq
595   %n = xor i64 %x, -1
596   %sh = lshr i64 %n, 39
597   %r = and i64 %sh, 1
598   ret i64 %r
601 define i64 @is_lower_bit_clear_i64(i64 %x) {
602 ; CHECK-LABEL: is_lower_bit_clear_i64:
603 ; CHECK:       # %bb.0:
604 ; CHECK-NEXT:    xorl %eax, %eax
605 ; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000
606 ; CHECK-NEXT:    sete %al
607 ; CHECK-NEXT:    retq
608   %sh = lshr i64 %x, 27
609   %m = and i64 %sh, 1
610   %r = xor i64 %m, 1
611   ret i64 %r
614 define i64 @is_lower_bit_clear_i64_not(i64 %x) {
615 ; CHECK-LABEL: is_lower_bit_clear_i64_not:
616 ; CHECK:       # %bb.0:
617 ; CHECK-NEXT:    xorl %eax, %eax
618 ; CHECK-NEXT:    testl $65536, %edi # imm = 0x10000
619 ; CHECK-NEXT:    sete %al
620 ; CHECK-NEXT:    retq
621   %n = xor i64 %x, -1
622   %sh = lshr i64 %n, 16
623   %r = and i64 %sh, 1
624   ret i64 %r
627 define i32 @is_bit_clear_i32(i32 %x) {
628 ; CHECK-LABEL: is_bit_clear_i32:
629 ; CHECK:       # %bb.0:
630 ; CHECK-NEXT:    xorl %eax, %eax
631 ; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000
632 ; CHECK-NEXT:    sete %al
633 ; CHECK-NEXT:    retq
634   %sh = lshr i32 %x, 27
635   %n = xor i32 %sh, -1
636   %r = and i32 %n, 1
637   ret i32 %r
640 define i32 @is_bit_clear_i32_not(i32 %x) {
641 ; CHECK-LABEL: is_bit_clear_i32_not:
642 ; CHECK:       # %bb.0:
643 ; CHECK-NEXT:    xorl %eax, %eax
644 ; CHECK-NEXT:    testl $134217728, %edi # imm = 0x8000000
645 ; CHECK-NEXT:    sete %al
646 ; CHECK-NEXT:    retq
647   %n = xor i32 %x, -1
648   %sh = lshr i32 %n, 27
649   %r = and i32 %sh, 1
650   ret i32 %r
653 define i16 @is_bit_clear_i16(i16 %x) {
654 ; CHECK-LABEL: is_bit_clear_i16:
655 ; CHECK:       # %bb.0:
656 ; CHECK-NEXT:    xorl %eax, %eax
657 ; CHECK-NEXT:    testb %dil, %dil
658 ; CHECK-NEXT:    setns %al
659 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
660 ; CHECK-NEXT:    retq
661   %sh = lshr i16 %x, 7
662   %m = and i16 %sh, 1
663   %r = xor i16 %m, 1
664   ret i16 %r
667 define i16 @is_bit_clear_i16_not(i16 %x) {
668 ; CHECK-LABEL: is_bit_clear_i16_not:
669 ; CHECK:       # %bb.0:
670 ; CHECK-NEXT:    xorl %eax, %eax
671 ; CHECK-NEXT:    testb $4, %dil
672 ; CHECK-NEXT:    sete %al
673 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
674 ; CHECK-NEXT:    retq
675   %n = xor i16 %x, -1
676   %sh = lshr i16 %n, 2
677   %r = and i16 %sh, 1
678   ret i16 %r
681 define i8 @is_bit_clear_i8(i8 %x) {
682 ; CHECK-LABEL: is_bit_clear_i8:
683 ; CHECK:       # %bb.0:
684 ; CHECK-NEXT:    testb $8, %dil
685 ; CHECK-NEXT:    sete %al
686 ; CHECK-NEXT:    retq
687   %sh = lshr i8 %x, 3
688   %m = and i8 %sh, 1
689   %r = xor i8 %m, 1
690   ret i8 %r
693 define i8 @is_bit_clear_i8_not(i8 %x) {
694 ; CHECK-LABEL: is_bit_clear_i8_not:
695 ; CHECK:       # %bb.0:
696 ; CHECK-NEXT:    testb $4, %dil
697 ; CHECK-NEXT:    sete %al
698 ; CHECK-NEXT:    retq
699   %n = xor i8 %x, -1
700   %sh = lshr i8 %n, 2
701   %r = and i8 %sh, 1
702   ret i8 %r
705 ; Use bt/test on the 64-bit value and truncate result.
707 define i8 @overshift(i64 %x) {
708 ; CHECK-LABEL: overshift:
709 ; CHECK:       # %bb.0:
710 ; CHECK-NEXT:    btq $42, %rdi
711 ; CHECK-NEXT:    setae %al
712 ; CHECK-NEXT:    retq
713   %a = lshr i64 %x, 42
714   %t = trunc i64 %a to i8
715   %n = xor i8 %t, -1
716   %r = and i8 %n, 1
717   ret i8 %r
720 define i32 @setcc_is_bit_clear(i32 %x) {
721 ; CHECK-LABEL: setcc_is_bit_clear:
722 ; CHECK:       # %bb.0:
723 ; CHECK-NEXT:    xorl %eax, %eax
724 ; CHECK-NEXT:    testl $1024, %edi # imm = 0x400
725 ; CHECK-NEXT:    sete %al
726 ; CHECK-NEXT:    retq
727   %a1 = and i32 %x, 1024
728   %b1 = icmp eq i32 %a1, 0
729   %r = zext i1 %b1 to i32
730   ret i32 %r
733 define i32 @is_bit_set(i32 %x) {
734 ; CHECK-LABEL: is_bit_set:
735 ; CHECK:       # %bb.0:
736 ; CHECK-NEXT:    movl %edi, %eax
737 ; CHECK-NEXT:    shrl $10, %eax
738 ; CHECK-NEXT:    andl $1, %eax
739 ; CHECK-NEXT:    retq
740   %sh = lshr i32 %x, 10
741   %m = and i32 %sh, 1
742   ret i32 %m
745 define i32 @setcc_is_bit_set(i32 %x) {
746 ; CHECK-LABEL: setcc_is_bit_set:
747 ; CHECK:       # %bb.0:
748 ; CHECK-NEXT:    movl %edi, %eax
749 ; CHECK-NEXT:    shrl $10, %eax
750 ; CHECK-NEXT:    andl $1, %eax
751 ; CHECK-NEXT:    retq
752   %a1 = and i32 %x, 1024
753   %b1 = icmp ne i32 %a1, 0
754   %r = zext i1 %b1 to i32
755   ret i32 %r
758 declare void @bar()
760 !llvm.module.flags = !{!0}
761 !0 = !{i32 1, !"ProfileSummary", !1}
762 !1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
763 !2 = !{!"ProfileFormat", !"InstrProf"}
764 !3 = !{!"TotalCount", i64 10000}
765 !4 = !{!"MaxCount", i64 10}
766 !5 = !{!"MaxInternalCount", i64 1}
767 !6 = !{!"MaxFunctionCount", i64 1000}
768 !7 = !{!"NumCounts", i64 3}
769 !8 = !{!"NumFunctions", i64 3}
770 !9 = !{!"DetailedSummary", !10}
771 !10 = !{!11, !12, !13}
772 !11 = !{i32 10000, i64 100, i32 1}
773 !12 = !{i32 999000, i64 100, i32 1}
774 !13 = !{i32 999999, i64 1, i32 2}
775 !14 = !{!"function_entry_count", i64 0}