1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple arm-eabi -mattr=+v6t2 | FileCheck %s
3; RUN: llc < %s -mtriple arm-eabi -mattr=+v6t2 -mattr=+neon | FileCheck %s
4; RUN: llc < %s -mtriple thumbv6m-none-eabi | FileCheck %s --check-prefix=CHECK-THUMB
5
6; This test checks the @llvm.cttz.* intrinsics for integers.
7
8declare i8 @llvm.cttz.i8(i8, i1)
9declare i16 @llvm.cttz.i16(i16, i1)
10declare i32 @llvm.cttz.i32(i32, i1)
11declare i64 @llvm.cttz.i64(i64, i1)
12
13;------------------------------------------------------------------------------
14
15define i8 @test_i8(i8 %a) {
16; CHECK-LABEL: test_i8:
17; CHECK:       @ %bb.0:
18; CHECK-NEXT:    orr r0, r0, #256
19; CHECK-NEXT:    rbit r0, r0
20; CHECK-NEXT:    clz r0, r0
21; CHECK-NEXT:    bx lr
22;
23; CHECK-THUMB-LABEL: test_i8:
24; CHECK-THUMB:       @ %bb.0:
25; CHECK-THUMB-NEXT:    lsls r1, r0, #24
26; CHECK-THUMB-NEXT:    beq .LBB0_2
27; CHECK-THUMB-NEXT:  @ %bb.1: @ %cond.false
28; CHECK-THUMB-NEXT:    subs r1, r0, #1
29; CHECK-THUMB-NEXT:    bics r1, r0
30; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
31; CHECK-THUMB-NEXT:    ldr r2, .LCPI0_0
32; CHECK-THUMB-NEXT:    ands r2, r0
33; CHECK-THUMB-NEXT:    subs r0, r1, r2
34; CHECK-THUMB-NEXT:    ldr r1, .LCPI0_1
35; CHECK-THUMB-NEXT:    lsrs r2, r0, #2
36; CHECK-THUMB-NEXT:    ands r0, r1
37; CHECK-THUMB-NEXT:    ands r2, r1
38; CHECK-THUMB-NEXT:    adds r0, r0, r2
39; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
40; CHECK-THUMB-NEXT:    adds r0, r0, r1
41; CHECK-THUMB-NEXT:    ldr r1, .LCPI0_2
42; CHECK-THUMB-NEXT:    ands r1, r0
43; CHECK-THUMB-NEXT:    ldr r0, .LCPI0_3
44; CHECK-THUMB-NEXT:    muls r0, r1, r0
45; CHECK-THUMB-NEXT:    lsrs r0, r0, #24
46; CHECK-THUMB-NEXT:    bx lr
47; CHECK-THUMB-NEXT:  .LBB0_2:
48; CHECK-THUMB-NEXT:    movs r0, #8
49; CHECK-THUMB-NEXT:    bx lr
50; CHECK-THUMB-NEXT:    .p2align 2
51; CHECK-THUMB-NEXT:  @ %bb.3:
52; CHECK-THUMB-NEXT:  .LCPI0_0:
53; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
54; CHECK-THUMB-NEXT:  .LCPI0_1:
55; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
56; CHECK-THUMB-NEXT:  .LCPI0_2:
57; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
58; CHECK-THUMB-NEXT:  .LCPI0_3:
59; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
60  %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false)
61  ret i8 %tmp
62}
63
64define i16 @test_i16(i16 %a) {
65; CHECK-LABEL: test_i16:
66; CHECK:       @ %bb.0:
67; CHECK-NEXT:    orr r0, r0, #65536
68; CHECK-NEXT:    rbit r0, r0
69; CHECK-NEXT:    clz r0, r0
70; CHECK-NEXT:    bx lr
71;
72; CHECK-THUMB-LABEL: test_i16:
73; CHECK-THUMB:       @ %bb.0:
74; CHECK-THUMB-NEXT:    lsls r1, r0, #16
75; CHECK-THUMB-NEXT:    beq .LBB1_2
76; CHECK-THUMB-NEXT:  @ %bb.1: @ %cond.false
77; CHECK-THUMB-NEXT:    subs r1, r0, #1
78; CHECK-THUMB-NEXT:    bics r1, r0
79; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
80; CHECK-THUMB-NEXT:    ldr r2, .LCPI1_0
81; CHECK-THUMB-NEXT:    ands r2, r0
82; CHECK-THUMB-NEXT:    subs r0, r1, r2
83; CHECK-THUMB-NEXT:    ldr r1, .LCPI1_1
84; CHECK-THUMB-NEXT:    lsrs r2, r0, #2
85; CHECK-THUMB-NEXT:    ands r0, r1
86; CHECK-THUMB-NEXT:    ands r2, r1
87; CHECK-THUMB-NEXT:    adds r0, r0, r2
88; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
89; CHECK-THUMB-NEXT:    adds r0, r0, r1
90; CHECK-THUMB-NEXT:    ldr r1, .LCPI1_2
91; CHECK-THUMB-NEXT:    ands r1, r0
92; CHECK-THUMB-NEXT:    ldr r0, .LCPI1_3
93; CHECK-THUMB-NEXT:    muls r0, r1, r0
94; CHECK-THUMB-NEXT:    lsrs r0, r0, #24
95; CHECK-THUMB-NEXT:    bx lr
96; CHECK-THUMB-NEXT:  .LBB1_2:
97; CHECK-THUMB-NEXT:    movs r0, #16
98; CHECK-THUMB-NEXT:    bx lr
99; CHECK-THUMB-NEXT:    .p2align 2
100; CHECK-THUMB-NEXT:  @ %bb.3:
101; CHECK-THUMB-NEXT:  .LCPI1_0:
102; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
103; CHECK-THUMB-NEXT:  .LCPI1_1:
104; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
105; CHECK-THUMB-NEXT:  .LCPI1_2:
106; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
107; CHECK-THUMB-NEXT:  .LCPI1_3:
108; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
109  %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false)
110  ret i16 %tmp
111}
112
113define i32 @test_i32(i32 %a) {
114; CHECK-LABEL: test_i32:
115; CHECK:       @ %bb.0:
116; CHECK-NEXT:    rbit r0, r0
117; CHECK-NEXT:    clz r0, r0
118; CHECK-NEXT:    bx lr
119;
120; CHECK-THUMB-LABEL: test_i32:
121; CHECK-THUMB:       @ %bb.0:
122; CHECK-THUMB-NEXT:    cmp r0, #0
123; CHECK-THUMB-NEXT:    beq .LBB2_2
124; CHECK-THUMB-NEXT:  @ %bb.1: @ %cond.false
125; CHECK-THUMB-NEXT:    subs r1, r0, #1
126; CHECK-THUMB-NEXT:    bics r1, r0
127; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
128; CHECK-THUMB-NEXT:    ldr r2, .LCPI2_0
129; CHECK-THUMB-NEXT:    ands r2, r0
130; CHECK-THUMB-NEXT:    subs r0, r1, r2
131; CHECK-THUMB-NEXT:    ldr r1, .LCPI2_1
132; CHECK-THUMB-NEXT:    lsrs r2, r0, #2
133; CHECK-THUMB-NEXT:    ands r0, r1
134; CHECK-THUMB-NEXT:    ands r2, r1
135; CHECK-THUMB-NEXT:    adds r0, r0, r2
136; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
137; CHECK-THUMB-NEXT:    adds r0, r0, r1
138; CHECK-THUMB-NEXT:    ldr r1, .LCPI2_2
139; CHECK-THUMB-NEXT:    ands r1, r0
140; CHECK-THUMB-NEXT:    ldr r0, .LCPI2_3
141; CHECK-THUMB-NEXT:    muls r0, r1, r0
142; CHECK-THUMB-NEXT:    lsrs r0, r0, #24
143; CHECK-THUMB-NEXT:    bx lr
144; CHECK-THUMB-NEXT:  .LBB2_2:
145; CHECK-THUMB-NEXT:    movs r0, #32
146; CHECK-THUMB-NEXT:    bx lr
147; CHECK-THUMB-NEXT:    .p2align 2
148; CHECK-THUMB-NEXT:  @ %bb.3:
149; CHECK-THUMB-NEXT:  .LCPI2_0:
150; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
151; CHECK-THUMB-NEXT:  .LCPI2_1:
152; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
153; CHECK-THUMB-NEXT:  .LCPI2_2:
154; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
155; CHECK-THUMB-NEXT:  .LCPI2_3:
156; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
157  %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false)
158  ret i32 %tmp
159}
160
161define i64 @test_i64(i64 %a) {
162; CHECK-LABEL: test_i64:
163; CHECK:       @ %bb.0:
164; CHECK-NEXT:    rbit r1, r1
165; CHECK-NEXT:    rbit r2, r0
166; CHECK-NEXT:    clz r1, r1
167; CHECK-NEXT:    cmp r0, #0
168; CHECK-NEXT:    add r1, r1, #32
169; CHECK-NEXT:    clzne r1, r2
170; CHECK-NEXT:    mov r0, r1
171; CHECK-NEXT:    mov r1, #0
172; CHECK-NEXT:    bx lr
173;
174; CHECK-THUMB-LABEL: test_i64:
175; CHECK-THUMB:       @ %bb.0:
176; CHECK-THUMB-NEXT:    .save {r4, r5, r7, lr}
177; CHECK-THUMB-NEXT:    push {r4, r5, r7, lr}
178; CHECK-THUMB-NEXT:    ldr r5, .LCPI3_0
179; CHECK-THUMB-NEXT:    ldr r4, .LCPI3_1
180; CHECK-THUMB-NEXT:    ldr r3, .LCPI3_2
181; CHECK-THUMB-NEXT:    ldr r2, .LCPI3_3
182; CHECK-THUMB-NEXT:    cmp r0, #0
183; CHECK-THUMB-NEXT:    bne .LBB3_2
184; CHECK-THUMB-NEXT:  @ %bb.1:
185; CHECK-THUMB-NEXT:    subs r0, r1, #1
186; CHECK-THUMB-NEXT:    bics r0, r1
187; CHECK-THUMB-NEXT:    lsrs r1, r0, #1
188; CHECK-THUMB-NEXT:    ands r1, r5
189; CHECK-THUMB-NEXT:    subs r0, r0, r1
190; CHECK-THUMB-NEXT:    lsrs r1, r0, #2
191; CHECK-THUMB-NEXT:    ands r0, r4
192; CHECK-THUMB-NEXT:    ands r1, r4
193; CHECK-THUMB-NEXT:    adds r0, r0, r1
194; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
195; CHECK-THUMB-NEXT:    adds r0, r0, r1
196; CHECK-THUMB-NEXT:    ands r0, r3
197; CHECK-THUMB-NEXT:    muls r2, r0, r2
198; CHECK-THUMB-NEXT:    lsrs r0, r2, #24
199; CHECK-THUMB-NEXT:    adds r0, #32
200; CHECK-THUMB-NEXT:    movs r1, #0
201; CHECK-THUMB-NEXT:    pop {r4, r5, r7, pc}
202; CHECK-THUMB-NEXT:  .LBB3_2:
203; CHECK-THUMB-NEXT:    subs r1, r0, #1
204; CHECK-THUMB-NEXT:    bics r1, r0
205; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
206; CHECK-THUMB-NEXT:    ands r0, r5
207; CHECK-THUMB-NEXT:    subs r0, r1, r0
208; CHECK-THUMB-NEXT:    lsrs r1, r0, #2
209; CHECK-THUMB-NEXT:    ands r0, r4
210; CHECK-THUMB-NEXT:    ands r1, r4
211; CHECK-THUMB-NEXT:    adds r0, r0, r1
212; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
213; CHECK-THUMB-NEXT:    adds r0, r0, r1
214; CHECK-THUMB-NEXT:    ands r0, r3
215; CHECK-THUMB-NEXT:    muls r2, r0, r2
216; CHECK-THUMB-NEXT:    lsrs r0, r2, #24
217; CHECK-THUMB-NEXT:    movs r1, #0
218; CHECK-THUMB-NEXT:    pop {r4, r5, r7, pc}
219; CHECK-THUMB-NEXT:    .p2align 2
220; CHECK-THUMB-NEXT:  @ %bb.3:
221; CHECK-THUMB-NEXT:  .LCPI3_0:
222; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
223; CHECK-THUMB-NEXT:  .LCPI3_1:
224; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
225; CHECK-THUMB-NEXT:  .LCPI3_2:
226; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
227; CHECK-THUMB-NEXT:  .LCPI3_3:
228; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
229  %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false)
230  ret i64 %tmp
231}
232
233;------------------------------------------------------------------------------
234
235define i8 @test_i8_zero_undef(i8 %a) {
236; CHECK-LABEL: test_i8_zero_undef:
237; CHECK:       @ %bb.0:
238; CHECK-NEXT:    rbit r0, r0
239; CHECK-NEXT:    clz r0, r0
240; CHECK-NEXT:    bx lr
241;
242; CHECK-THUMB-LABEL: test_i8_zero_undef:
243; CHECK-THUMB:       @ %bb.0:
244; CHECK-THUMB-NEXT:    subs r1, r0, #1
245; CHECK-THUMB-NEXT:    bics r1, r0
246; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
247; CHECK-THUMB-NEXT:    ldr r2, .LCPI4_0
248; CHECK-THUMB-NEXT:    ands r2, r0
249; CHECK-THUMB-NEXT:    subs r0, r1, r2
250; CHECK-THUMB-NEXT:    ldr r1, .LCPI4_1
251; CHECK-THUMB-NEXT:    lsrs r2, r0, #2
252; CHECK-THUMB-NEXT:    ands r0, r1
253; CHECK-THUMB-NEXT:    ands r2, r1
254; CHECK-THUMB-NEXT:    adds r0, r0, r2
255; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
256; CHECK-THUMB-NEXT:    adds r0, r0, r1
257; CHECK-THUMB-NEXT:    ldr r1, .LCPI4_2
258; CHECK-THUMB-NEXT:    ands r1, r0
259; CHECK-THUMB-NEXT:    ldr r0, .LCPI4_3
260; CHECK-THUMB-NEXT:    muls r0, r1, r0
261; CHECK-THUMB-NEXT:    lsrs r0, r0, #24
262; CHECK-THUMB-NEXT:    bx lr
263; CHECK-THUMB-NEXT:    .p2align 2
264; CHECK-THUMB-NEXT:  @ %bb.1:
265; CHECK-THUMB-NEXT:  .LCPI4_0:
266; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
267; CHECK-THUMB-NEXT:  .LCPI4_1:
268; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
269; CHECK-THUMB-NEXT:  .LCPI4_2:
270; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
271; CHECK-THUMB-NEXT:  .LCPI4_3:
272; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
273  %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true)
274  ret i8 %tmp
275}
276
277define i16 @test_i16_zero_undef(i16 %a) {
278; CHECK-LABEL: test_i16_zero_undef:
279; CHECK:       @ %bb.0:
280; CHECK-NEXT:    rbit r0, r0
281; CHECK-NEXT:    clz r0, r0
282; CHECK-NEXT:    bx lr
283;
284; CHECK-THUMB-LABEL: test_i16_zero_undef:
285; CHECK-THUMB:       @ %bb.0:
286; CHECK-THUMB-NEXT:    subs r1, r0, #1
287; CHECK-THUMB-NEXT:    bics r1, r0
288; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
289; CHECK-THUMB-NEXT:    ldr r2, .LCPI5_0
290; CHECK-THUMB-NEXT:    ands r2, r0
291; CHECK-THUMB-NEXT:    subs r0, r1, r2
292; CHECK-THUMB-NEXT:    ldr r1, .LCPI5_1
293; CHECK-THUMB-NEXT:    lsrs r2, r0, #2
294; CHECK-THUMB-NEXT:    ands r0, r1
295; CHECK-THUMB-NEXT:    ands r2, r1
296; CHECK-THUMB-NEXT:    adds r0, r0, r2
297; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
298; CHECK-THUMB-NEXT:    adds r0, r0, r1
299; CHECK-THUMB-NEXT:    ldr r1, .LCPI5_2
300; CHECK-THUMB-NEXT:    ands r1, r0
301; CHECK-THUMB-NEXT:    ldr r0, .LCPI5_3
302; CHECK-THUMB-NEXT:    muls r0, r1, r0
303; CHECK-THUMB-NEXT:    lsrs r0, r0, #24
304; CHECK-THUMB-NEXT:    bx lr
305; CHECK-THUMB-NEXT:    .p2align 2
306; CHECK-THUMB-NEXT:  @ %bb.1:
307; CHECK-THUMB-NEXT:  .LCPI5_0:
308; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
309; CHECK-THUMB-NEXT:  .LCPI5_1:
310; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
311; CHECK-THUMB-NEXT:  .LCPI5_2:
312; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
313; CHECK-THUMB-NEXT:  .LCPI5_3:
314; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
315  %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true)
316  ret i16 %tmp
317}
318
319
320define i32 @test_i32_zero_undef(i32 %a) {
321; CHECK-LABEL: test_i32_zero_undef:
322; CHECK:       @ %bb.0:
323; CHECK-NEXT:    rbit r0, r0
324; CHECK-NEXT:    clz r0, r0
325; CHECK-NEXT:    bx lr
326;
327; CHECK-THUMB-LABEL: test_i32_zero_undef:
328; CHECK-THUMB:       @ %bb.0:
329; CHECK-THUMB-NEXT:    subs r1, r0, #1
330; CHECK-THUMB-NEXT:    bics r1, r0
331; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
332; CHECK-THUMB-NEXT:    ldr r2, .LCPI6_0
333; CHECK-THUMB-NEXT:    ands r2, r0
334; CHECK-THUMB-NEXT:    subs r0, r1, r2
335; CHECK-THUMB-NEXT:    ldr r1, .LCPI6_1
336; CHECK-THUMB-NEXT:    lsrs r2, r0, #2
337; CHECK-THUMB-NEXT:    ands r0, r1
338; CHECK-THUMB-NEXT:    ands r2, r1
339; CHECK-THUMB-NEXT:    adds r0, r0, r2
340; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
341; CHECK-THUMB-NEXT:    adds r0, r0, r1
342; CHECK-THUMB-NEXT:    ldr r1, .LCPI6_2
343; CHECK-THUMB-NEXT:    ands r1, r0
344; CHECK-THUMB-NEXT:    ldr r0, .LCPI6_3
345; CHECK-THUMB-NEXT:    muls r0, r1, r0
346; CHECK-THUMB-NEXT:    lsrs r0, r0, #24
347; CHECK-THUMB-NEXT:    bx lr
348; CHECK-THUMB-NEXT:    .p2align 2
349; CHECK-THUMB-NEXT:  @ %bb.1:
350; CHECK-THUMB-NEXT:  .LCPI6_0:
351; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
352; CHECK-THUMB-NEXT:  .LCPI6_1:
353; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
354; CHECK-THUMB-NEXT:  .LCPI6_2:
355; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
356; CHECK-THUMB-NEXT:  .LCPI6_3:
357; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
358  %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true)
359  ret i32 %tmp
360}
361
362define i64 @test_i64_zero_undef(i64 %a) {
363; CHECK-LABEL: test_i64_zero_undef:
364; CHECK:       @ %bb.0:
365; CHECK-NEXT:    rbit r1, r1
366; CHECK-NEXT:    rbit r2, r0
367; CHECK-NEXT:    clz r1, r1
368; CHECK-NEXT:    cmp r0, #0
369; CHECK-NEXT:    add r1, r1, #32
370; CHECK-NEXT:    clzne r1, r2
371; CHECK-NEXT:    mov r0, r1
372; CHECK-NEXT:    mov r1, #0
373; CHECK-NEXT:    bx lr
374;
375; CHECK-THUMB-LABEL: test_i64_zero_undef:
376; CHECK-THUMB:       @ %bb.0:
377; CHECK-THUMB-NEXT:    .save {r4, r5, r7, lr}
378; CHECK-THUMB-NEXT:    push {r4, r5, r7, lr}
379; CHECK-THUMB-NEXT:    ldr r5, .LCPI7_0
380; CHECK-THUMB-NEXT:    ldr r4, .LCPI7_1
381; CHECK-THUMB-NEXT:    ldr r3, .LCPI7_2
382; CHECK-THUMB-NEXT:    ldr r2, .LCPI7_3
383; CHECK-THUMB-NEXT:    cmp r0, #0
384; CHECK-THUMB-NEXT:    bne .LBB7_2
385; CHECK-THUMB-NEXT:  @ %bb.1:
386; CHECK-THUMB-NEXT:    subs r0, r1, #1
387; CHECK-THUMB-NEXT:    bics r0, r1
388; CHECK-THUMB-NEXT:    lsrs r1, r0, #1
389; CHECK-THUMB-NEXT:    ands r1, r5
390; CHECK-THUMB-NEXT:    subs r0, r0, r1
391; CHECK-THUMB-NEXT:    lsrs r1, r0, #2
392; CHECK-THUMB-NEXT:    ands r0, r4
393; CHECK-THUMB-NEXT:    ands r1, r4
394; CHECK-THUMB-NEXT:    adds r0, r0, r1
395; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
396; CHECK-THUMB-NEXT:    adds r0, r0, r1
397; CHECK-THUMB-NEXT:    ands r0, r3
398; CHECK-THUMB-NEXT:    muls r2, r0, r2
399; CHECK-THUMB-NEXT:    lsrs r0, r2, #24
400; CHECK-THUMB-NEXT:    adds r0, #32
401; CHECK-THUMB-NEXT:    movs r1, #0
402; CHECK-THUMB-NEXT:    pop {r4, r5, r7, pc}
403; CHECK-THUMB-NEXT:  .LBB7_2:
404; CHECK-THUMB-NEXT:    subs r1, r0, #1
405; CHECK-THUMB-NEXT:    bics r1, r0
406; CHECK-THUMB-NEXT:    lsrs r0, r1, #1
407; CHECK-THUMB-NEXT:    ands r0, r5
408; CHECK-THUMB-NEXT:    subs r0, r1, r0
409; CHECK-THUMB-NEXT:    lsrs r1, r0, #2
410; CHECK-THUMB-NEXT:    ands r0, r4
411; CHECK-THUMB-NEXT:    ands r1, r4
412; CHECK-THUMB-NEXT:    adds r0, r0, r1
413; CHECK-THUMB-NEXT:    lsrs r1, r0, #4
414; CHECK-THUMB-NEXT:    adds r0, r0, r1
415; CHECK-THUMB-NEXT:    ands r0, r3
416; CHECK-THUMB-NEXT:    muls r2, r0, r2
417; CHECK-THUMB-NEXT:    lsrs r0, r2, #24
418; CHECK-THUMB-NEXT:    movs r1, #0
419; CHECK-THUMB-NEXT:    pop {r4, r5, r7, pc}
420; CHECK-THUMB-NEXT:    .p2align 2
421; CHECK-THUMB-NEXT:  @ %bb.3:
422; CHECK-THUMB-NEXT:  .LCPI7_0:
423; CHECK-THUMB-NEXT:    .long 1431655765 @ 0x55555555
424; CHECK-THUMB-NEXT:  .LCPI7_1:
425; CHECK-THUMB-NEXT:    .long 858993459 @ 0x33333333
426; CHECK-THUMB-NEXT:  .LCPI7_2:
427; CHECK-THUMB-NEXT:    .long 252645135 @ 0xf0f0f0f
428; CHECK-THUMB-NEXT:  .LCPI7_3:
429; CHECK-THUMB-NEXT:    .long 16843009 @ 0x1010101
430  %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true)
431  ret i64 %tmp
432}
433