1; RUN: llc -mtriple=thumbv7m-linux-gnu < %s | FileCheck %s --check-prefix=CHECK --check-prefix=T2
2; RUN: llc -mtriple=thumbv6m-linux-gnu < %s | FileCheck %s --check-prefix=CHECK --check-prefix=T1
3
4; CHECK-LABEL: single_bit:
5; CHECK: lsls r0, r0, #23
6; T2-NEXT: mov
7; T2-NEXT: it
8; T1-NEXT: bmi
9define i32 @single_bit(i32 %p) {
10  %a = and i32 %p, 256
11  %b = icmp eq i32 %a, 0
12  br i1 %b, label %true, label %false
13
14true:
15  ret i32 1
16
17false:
18  ret i32 2
19}
20
21; CHECK-LABEL: multi_bit_lsb_ubfx:
22; CHECK: lsls r0, r0, #24
23; T2-NEXT: mov
24; T2-NEXT: it
25; T1-NEXT: beq
26define i32 @multi_bit_lsb_ubfx(i32 %p) {
27  %a = and i32 %p, 255
28  %b = icmp eq i32 %a, 0
29  br i1 %b, label %true, label %false
30
31true:
32  ret i32 1
33
34false:
35  ret i32 2
36}
37
38; CHECK-LABEL: multi_bit_msb:
39; CHECK: lsrs r0, r0, #24
40; T2-NEXT: mov
41; T2-NEXT: it
42; T1-NEXT: beq
43define i32 @multi_bit_msb(i32 %p) {
44  %a = and i32 %p, 4278190080  ; 0xff000000
45  %b = icmp eq i32 %a, 0
46  br i1 %b, label %true, label %false
47
48true:
49  ret i32 1
50
51false:
52  ret i32 2
53}
54
55; CHECK-LABEL: multi_bit_nosb:
56; T1: lsls r0, r0, #8
57; T1-NEXT: lsrs r0, r0, #24
58; T2: tst.w
59; T2-NEXT: it
60; T1-NEXT: beq
61define i32 @multi_bit_nosb(i32 %p) {
62  %a = and i32 %p, 16711680 ; 0x00ff0000
63  %b = icmp eq i32 %a, 0
64  br i1 %b, label %true, label %false
65
66true:
67  ret i32 1
68
69false:
70  ret i32 2
71}
72