xref: /llvm-project/llvm/test/CodeGen/ARM/cttz.ll (revision e0ed0333f0fed2e73f805afd58b61176a87aa3ad)
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-6M
5; RUN: llc < %s -mtriple thumbv8m.base-none-eabi | FileCheck %s --check-prefix=CHECK-8MBASE
6
7; This test checks the @llvm.cttz.* intrinsics for integers.
8
9declare i8 @llvm.cttz.i8(i8, i1)
10declare i16 @llvm.cttz.i16(i16, i1)
11declare i32 @llvm.cttz.i32(i32, i1)
12declare i64 @llvm.cttz.i64(i64, i1)
13
14;------------------------------------------------------------------------------
15
16define i8 @test_i8(i8 %a) {
17; CHECK-LABEL: test_i8:
18; CHECK:       @ %bb.0:
19; CHECK-NEXT:    orr r0, r0, #256
20; CHECK-NEXT:    rbit r0, r0
21; CHECK-NEXT:    clz r0, r0
22; CHECK-NEXT:    bx lr
23;
24; CHECK-6M-LABEL: test_i8:
25; CHECK-6M:       @ %bb.0:
26; CHECK-6M-NEXT:    lsls r1, r0, #24
27; CHECK-6M-NEXT:    beq .LBB0_3
28; CHECK-6M-NEXT:  @ %bb.1: @ %cond.false
29; CHECK-6M-NEXT:    cmp r0, #0
30; CHECK-6M-NEXT:    beq .LBB0_4
31; CHECK-6M-NEXT:  @ %bb.2: @ %cond.false
32; CHECK-6M-NEXT:    rsbs r1, r0, #0
33; CHECK-6M-NEXT:    ands r1, r0
34; CHECK-6M-NEXT:    ldr r0, .LCPI0_0
35; CHECK-6M-NEXT:    muls r0, r1, r0
36; CHECK-6M-NEXT:    lsrs r0, r0, #27
37; CHECK-6M-NEXT:    adr r1, .LCPI0_1
38; CHECK-6M-NEXT:    ldrb r0, [r1, r0]
39; CHECK-6M-NEXT:    bx lr
40; CHECK-6M-NEXT:  .LBB0_3:
41; CHECK-6M-NEXT:    movs r0, #8
42; CHECK-6M-NEXT:    bx lr
43; CHECK-6M-NEXT:  .LBB0_4:
44; CHECK-6M-NEXT:    movs r0, #32
45; CHECK-6M-NEXT:    bx lr
46; CHECK-6M-NEXT:    .p2align 2
47; CHECK-6M-NEXT:  @ %bb.5:
48; CHECK-6M-NEXT:  .LCPI0_0:
49; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
50; CHECK-6M-NEXT:  .LCPI0_1:
51; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
52;
53; CHECK-8MBASE-LABEL: test_i8:
54; CHECK-8MBASE:       @ %bb.0:
55; CHECK-8MBASE-NEXT:    lsls r1, r0, #24
56; CHECK-8MBASE-NEXT:    beq .LBB0_3
57; CHECK-8MBASE-NEXT:  @ %bb.1: @ %cond.false
58; CHECK-8MBASE-NEXT:    cbz r0, .LBB0_4
59; CHECK-8MBASE-NEXT:  @ %bb.2: @ %cond.false
60; CHECK-8MBASE-NEXT:    rsbs r1, r0, #0
61; CHECK-8MBASE-NEXT:    ands r1, r0
62; CHECK-8MBASE-NEXT:    movw r0, #46385
63; CHECK-8MBASE-NEXT:    movt r0, #1916
64; CHECK-8MBASE-NEXT:    muls r0, r1, r0
65; CHECK-8MBASE-NEXT:    lsrs r0, r0, #27
66; CHECK-8MBASE-NEXT:    adr r1, .LCPI0_0
67; CHECK-8MBASE-NEXT:    ldrb r0, [r1, r0]
68; CHECK-8MBASE-NEXT:    bx lr
69; CHECK-8MBASE-NEXT:  .LBB0_3:
70; CHECK-8MBASE-NEXT:    movs r0, #8
71; CHECK-8MBASE-NEXT:    bx lr
72; CHECK-8MBASE-NEXT:  .LBB0_4:
73; CHECK-8MBASE-NEXT:    movs r0, #32
74; CHECK-8MBASE-NEXT:    bx lr
75; CHECK-8MBASE-NEXT:    .p2align 2
76; CHECK-8MBASE-NEXT:  @ %bb.5:
77; CHECK-8MBASE-NEXT:  .LCPI0_0:
78; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
79  %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false)
80  ret i8 %tmp
81}
82
83define i16 @test_i16(i16 %a) {
84; CHECK-LABEL: test_i16:
85; CHECK:       @ %bb.0:
86; CHECK-NEXT:    orr r0, r0, #65536
87; CHECK-NEXT:    rbit r0, r0
88; CHECK-NEXT:    clz r0, r0
89; CHECK-NEXT:    bx lr
90;
91; CHECK-6M-LABEL: test_i16:
92; CHECK-6M:       @ %bb.0:
93; CHECK-6M-NEXT:    lsls r1, r0, #16
94; CHECK-6M-NEXT:    beq .LBB1_3
95; CHECK-6M-NEXT:  @ %bb.1: @ %cond.false
96; CHECK-6M-NEXT:    cmp r0, #0
97; CHECK-6M-NEXT:    beq .LBB1_4
98; CHECK-6M-NEXT:  @ %bb.2: @ %cond.false
99; CHECK-6M-NEXT:    rsbs r1, r0, #0
100; CHECK-6M-NEXT:    ands r1, r0
101; CHECK-6M-NEXT:    ldr r0, .LCPI1_0
102; CHECK-6M-NEXT:    muls r0, r1, r0
103; CHECK-6M-NEXT:    lsrs r0, r0, #27
104; CHECK-6M-NEXT:    adr r1, .LCPI1_1
105; CHECK-6M-NEXT:    ldrb r0, [r1, r0]
106; CHECK-6M-NEXT:    bx lr
107; CHECK-6M-NEXT:  .LBB1_3:
108; CHECK-6M-NEXT:    movs r0, #16
109; CHECK-6M-NEXT:    bx lr
110; CHECK-6M-NEXT:  .LBB1_4:
111; CHECK-6M-NEXT:    movs r0, #32
112; CHECK-6M-NEXT:    bx lr
113; CHECK-6M-NEXT:    .p2align 2
114; CHECK-6M-NEXT:  @ %bb.5:
115; CHECK-6M-NEXT:  .LCPI1_0:
116; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
117; CHECK-6M-NEXT:  .LCPI1_1:
118; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
119;
120; CHECK-8MBASE-LABEL: test_i16:
121; CHECK-8MBASE:       @ %bb.0:
122; CHECK-8MBASE-NEXT:    lsls r1, r0, #16
123; CHECK-8MBASE-NEXT:    beq .LBB1_3
124; CHECK-8MBASE-NEXT:  @ %bb.1: @ %cond.false
125; CHECK-8MBASE-NEXT:    cbz r0, .LBB1_4
126; CHECK-8MBASE-NEXT:  @ %bb.2: @ %cond.false
127; CHECK-8MBASE-NEXT:    rsbs r1, r0, #0
128; CHECK-8MBASE-NEXT:    ands r1, r0
129; CHECK-8MBASE-NEXT:    movw r0, #46385
130; CHECK-8MBASE-NEXT:    movt r0, #1916
131; CHECK-8MBASE-NEXT:    muls r0, r1, r0
132; CHECK-8MBASE-NEXT:    lsrs r0, r0, #27
133; CHECK-8MBASE-NEXT:    adr r1, .LCPI1_0
134; CHECK-8MBASE-NEXT:    ldrb r0, [r1, r0]
135; CHECK-8MBASE-NEXT:    bx lr
136; CHECK-8MBASE-NEXT:  .LBB1_3:
137; CHECK-8MBASE-NEXT:    movs r0, #16
138; CHECK-8MBASE-NEXT:    bx lr
139; CHECK-8MBASE-NEXT:  .LBB1_4:
140; CHECK-8MBASE-NEXT:    movs r0, #32
141; CHECK-8MBASE-NEXT:    bx lr
142; CHECK-8MBASE-NEXT:    .p2align 2
143; CHECK-8MBASE-NEXT:  @ %bb.5:
144; CHECK-8MBASE-NEXT:  .LCPI1_0:
145; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
146  %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false)
147  ret i16 %tmp
148}
149
150define i32 @test_i32(i32 %a) {
151; CHECK-LABEL: test_i32:
152; CHECK:       @ %bb.0:
153; CHECK-NEXT:    rbit r0, r0
154; CHECK-NEXT:    clz r0, r0
155; CHECK-NEXT:    bx lr
156;
157; CHECK-6M-LABEL: test_i32:
158; CHECK-6M:       @ %bb.0:
159; CHECK-6M-NEXT:    cmp r0, #0
160; CHECK-6M-NEXT:    beq .LBB2_3
161; CHECK-6M-NEXT:  @ %bb.1: @ %cond.false
162; CHECK-6M-NEXT:    cmp r0, #0
163; CHECK-6M-NEXT:    beq .LBB2_3
164; CHECK-6M-NEXT:  @ %bb.2: @ %cond.false
165; CHECK-6M-NEXT:    rsbs r1, r0, #0
166; CHECK-6M-NEXT:    ands r1, r0
167; CHECK-6M-NEXT:    ldr r0, .LCPI2_0
168; CHECK-6M-NEXT:    muls r0, r1, r0
169; CHECK-6M-NEXT:    lsrs r0, r0, #27
170; CHECK-6M-NEXT:    adr r1, .LCPI2_1
171; CHECK-6M-NEXT:    ldrb r0, [r1, r0]
172; CHECK-6M-NEXT:    bx lr
173; CHECK-6M-NEXT:  .LBB2_3:
174; CHECK-6M-NEXT:    movs r0, #32
175; CHECK-6M-NEXT:    bx lr
176; CHECK-6M-NEXT:    .p2align 2
177; CHECK-6M-NEXT:  @ %bb.4:
178; CHECK-6M-NEXT:  .LCPI2_0:
179; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
180; CHECK-6M-NEXT:  .LCPI2_1:
181; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
182;
183; CHECK-8MBASE-LABEL: test_i32:
184; CHECK-8MBASE:       @ %bb.0:
185; CHECK-8MBASE-NEXT:    cbz r0, .LBB2_3
186; CHECK-8MBASE-NEXT:  @ %bb.1: @ %cond.false
187; CHECK-8MBASE-NEXT:    cbz r0, .LBB2_3
188; CHECK-8MBASE-NEXT:  @ %bb.2: @ %cond.false
189; CHECK-8MBASE-NEXT:    rsbs r1, r0, #0
190; CHECK-8MBASE-NEXT:    ands r1, r0
191; CHECK-8MBASE-NEXT:    movw r0, #46385
192; CHECK-8MBASE-NEXT:    movt r0, #1916
193; CHECK-8MBASE-NEXT:    muls r0, r1, r0
194; CHECK-8MBASE-NEXT:    lsrs r0, r0, #27
195; CHECK-8MBASE-NEXT:    adr r1, .LCPI2_0
196; CHECK-8MBASE-NEXT:    ldrb r0, [r1, r0]
197; CHECK-8MBASE-NEXT:    bx lr
198; CHECK-8MBASE-NEXT:  .LBB2_3:
199; CHECK-8MBASE-NEXT:    movs r0, #32
200; CHECK-8MBASE-NEXT:    bx lr
201; CHECK-8MBASE-NEXT:    .p2align 2
202; CHECK-8MBASE-NEXT:  @ %bb.4:
203; CHECK-8MBASE-NEXT:  .LCPI2_0:
204; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
205  %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false)
206  ret i32 %tmp
207}
208
209define i64 @test_i64(i64 %a) {
210; CHECK-LABEL: test_i64:
211; CHECK:       @ %bb.0:
212; CHECK-NEXT:    rbit r1, r1
213; CHECK-NEXT:    rbit r2, r0
214; CHECK-NEXT:    clz r1, r1
215; CHECK-NEXT:    cmp r0, #0
216; CHECK-NEXT:    add r1, r1, #32
217; CHECK-NEXT:    clzne r1, r2
218; CHECK-NEXT:    mov r0, r1
219; CHECK-NEXT:    mov r1, #0
220; CHECK-NEXT:    bx lr
221;
222; CHECK-6M-LABEL: test_i64:
223; CHECK-6M:       @ %bb.0:
224; CHECK-6M-NEXT:    .save {r4, r5, r7, lr}
225; CHECK-6M-NEXT:    push {r4, r5, r7, lr}
226; CHECK-6M-NEXT:    mov r2, r0
227; CHECK-6M-NEXT:    ldr r5, .LCPI3_0
228; CHECK-6M-NEXT:    adr r3, .LCPI3_1
229; CHECK-6M-NEXT:    movs r0, #32
230; CHECK-6M-NEXT:    cmp r1, #0
231; CHECK-6M-NEXT:    mov r4, r0
232; CHECK-6M-NEXT:    beq .LBB3_2
233; CHECK-6M-NEXT:  @ %bb.1:
234; CHECK-6M-NEXT:    rsbs r4, r1, #0
235; CHECK-6M-NEXT:    ands r4, r1
236; CHECK-6M-NEXT:    muls r4, r5, r4
237; CHECK-6M-NEXT:    lsrs r1, r4, #27
238; CHECK-6M-NEXT:    ldrb r4, [r3, r1]
239; CHECK-6M-NEXT:  .LBB3_2:
240; CHECK-6M-NEXT:    adds r4, #32
241; CHECK-6M-NEXT:    rsbs r1, r2, #0
242; CHECK-6M-NEXT:    ands r1, r2
243; CHECK-6M-NEXT:    muls r5, r1, r5
244; CHECK-6M-NEXT:    lsrs r1, r5, #27
245; CHECK-6M-NEXT:    cmp r2, #0
246; CHECK-6M-NEXT:    bne .LBB3_5
247; CHECK-6M-NEXT:  @ %bb.3:
248; CHECK-6M-NEXT:    beq .LBB3_6
249; CHECK-6M-NEXT:  .LBB3_4:
250; CHECK-6M-NEXT:    movs r1, #0
251; CHECK-6M-NEXT:    pop {r4, r5, r7, pc}
252; CHECK-6M-NEXT:  .LBB3_5:
253; CHECK-6M-NEXT:    ldrb r0, [r3, r1]
254; CHECK-6M-NEXT:    bne .LBB3_4
255; CHECK-6M-NEXT:  .LBB3_6:
256; CHECK-6M-NEXT:    mov r0, r4
257; CHECK-6M-NEXT:    movs r1, #0
258; CHECK-6M-NEXT:    pop {r4, r5, r7, pc}
259; CHECK-6M-NEXT:    .p2align 2
260; CHECK-6M-NEXT:  @ %bb.7:
261; CHECK-6M-NEXT:  .LCPI3_0:
262; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
263; CHECK-6M-NEXT:  .LCPI3_1:
264; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
265;
266; CHECK-8MBASE-LABEL: test_i64:
267; CHECK-8MBASE:       @ %bb.0:
268; CHECK-8MBASE-NEXT:    .save {r4, r5, r7, lr}
269; CHECK-8MBASE-NEXT:    push {r4, r5, r7, lr}
270; CHECK-8MBASE-NEXT:    mov r2, r0
271; CHECK-8MBASE-NEXT:    movw r5, #46385
272; CHECK-8MBASE-NEXT:    movt r5, #1916
273; CHECK-8MBASE-NEXT:    adr r3, .LCPI3_0
274; CHECK-8MBASE-NEXT:    movs r0, #32
275; CHECK-8MBASE-NEXT:    mov r4, r0
276; CHECK-8MBASE-NEXT:    cbz r1, .LBB3_2
277; CHECK-8MBASE-NEXT:  @ %bb.1:
278; CHECK-8MBASE-NEXT:    rsbs r4, r1, #0
279; CHECK-8MBASE-NEXT:    ands r4, r1
280; CHECK-8MBASE-NEXT:    muls r4, r5, r4
281; CHECK-8MBASE-NEXT:    lsrs r1, r4, #27
282; CHECK-8MBASE-NEXT:    ldrb r4, [r3, r1]
283; CHECK-8MBASE-NEXT:  .LBB3_2:
284; CHECK-8MBASE-NEXT:    adds r4, #32
285; CHECK-8MBASE-NEXT:    rsbs r1, r2, #0
286; CHECK-8MBASE-NEXT:    ands r1, r2
287; CHECK-8MBASE-NEXT:    muls r5, r1, r5
288; CHECK-8MBASE-NEXT:    lsrs r1, r5, #27
289; CHECK-8MBASE-NEXT:    cmp r2, #0
290; CHECK-8MBASE-NEXT:    bne .LBB3_5
291; CHECK-8MBASE-NEXT:  @ %bb.3:
292; CHECK-8MBASE-NEXT:    beq .LBB3_6
293; CHECK-8MBASE-NEXT:  .LBB3_4:
294; CHECK-8MBASE-NEXT:    movs r1, #0
295; CHECK-8MBASE-NEXT:    pop {r4, r5, r7, pc}
296; CHECK-8MBASE-NEXT:  .LBB3_5:
297; CHECK-8MBASE-NEXT:    ldrb r0, [r3, r1]
298; CHECK-8MBASE-NEXT:    bne .LBB3_4
299; CHECK-8MBASE-NEXT:  .LBB3_6:
300; CHECK-8MBASE-NEXT:    mov r0, r4
301; CHECK-8MBASE-NEXT:    movs r1, #0
302; CHECK-8MBASE-NEXT:    pop {r4, r5, r7, pc}
303; CHECK-8MBASE-NEXT:    .p2align 2
304; CHECK-8MBASE-NEXT:  @ %bb.7:
305; CHECK-8MBASE-NEXT:  .LCPI3_0:
306; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
307  %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false)
308  ret i64 %tmp
309}
310
311;------------------------------------------------------------------------------
312
313define i8 @test_i8_zero_undef(i8 %a) {
314; CHECK-LABEL: test_i8_zero_undef:
315; CHECK:       @ %bb.0:
316; CHECK-NEXT:    rbit r0, r0
317; CHECK-NEXT:    clz r0, r0
318; CHECK-NEXT:    bx lr
319;
320; CHECK-6M-LABEL: test_i8_zero_undef:
321; CHECK-6M:       @ %bb.0:
322; CHECK-6M-NEXT:    cmp r0, #0
323; CHECK-6M-NEXT:    beq .LBB4_2
324; CHECK-6M-NEXT:  @ %bb.1:
325; CHECK-6M-NEXT:    rsbs r1, r0, #0
326; CHECK-6M-NEXT:    ands r1, r0
327; CHECK-6M-NEXT:    ldr r0, .LCPI4_0
328; CHECK-6M-NEXT:    muls r0, r1, r0
329; CHECK-6M-NEXT:    lsrs r0, r0, #27
330; CHECK-6M-NEXT:    adr r1, .LCPI4_1
331; CHECK-6M-NEXT:    ldrb r0, [r1, r0]
332; CHECK-6M-NEXT:    bx lr
333; CHECK-6M-NEXT:  .LBB4_2:
334; CHECK-6M-NEXT:    movs r0, #32
335; CHECK-6M-NEXT:    bx lr
336; CHECK-6M-NEXT:    .p2align 2
337; CHECK-6M-NEXT:  @ %bb.3:
338; CHECK-6M-NEXT:  .LCPI4_0:
339; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
340; CHECK-6M-NEXT:  .LCPI4_1:
341; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
342;
343; CHECK-8MBASE-LABEL: test_i8_zero_undef:
344; CHECK-8MBASE:       @ %bb.0:
345; CHECK-8MBASE-NEXT:    cbz r0, .LBB4_2
346; CHECK-8MBASE-NEXT:  @ %bb.1:
347; CHECK-8MBASE-NEXT:    rsbs r1, r0, #0
348; CHECK-8MBASE-NEXT:    ands r1, r0
349; CHECK-8MBASE-NEXT:    movw r0, #46385
350; CHECK-8MBASE-NEXT:    movt r0, #1916
351; CHECK-8MBASE-NEXT:    muls r0, r1, r0
352; CHECK-8MBASE-NEXT:    lsrs r0, r0, #27
353; CHECK-8MBASE-NEXT:    adr r1, .LCPI4_0
354; CHECK-8MBASE-NEXT:    ldrb r0, [r1, r0]
355; CHECK-8MBASE-NEXT:    bx lr
356; CHECK-8MBASE-NEXT:  .LBB4_2:
357; CHECK-8MBASE-NEXT:    movs r0, #32
358; CHECK-8MBASE-NEXT:    bx lr
359; CHECK-8MBASE-NEXT:    .p2align 2
360; CHECK-8MBASE-NEXT:  @ %bb.3:
361; CHECK-8MBASE-NEXT:  .LCPI4_0:
362; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
363  %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true)
364  ret i8 %tmp
365}
366
367define i16 @test_i16_zero_undef(i16 %a) {
368; CHECK-LABEL: test_i16_zero_undef:
369; CHECK:       @ %bb.0:
370; CHECK-NEXT:    rbit r0, r0
371; CHECK-NEXT:    clz r0, r0
372; CHECK-NEXT:    bx lr
373;
374; CHECK-6M-LABEL: test_i16_zero_undef:
375; CHECK-6M:       @ %bb.0:
376; CHECK-6M-NEXT:    cmp r0, #0
377; CHECK-6M-NEXT:    beq .LBB5_2
378; CHECK-6M-NEXT:  @ %bb.1:
379; CHECK-6M-NEXT:    rsbs r1, r0, #0
380; CHECK-6M-NEXT:    ands r1, r0
381; CHECK-6M-NEXT:    ldr r0, .LCPI5_0
382; CHECK-6M-NEXT:    muls r0, r1, r0
383; CHECK-6M-NEXT:    lsrs r0, r0, #27
384; CHECK-6M-NEXT:    adr r1, .LCPI5_1
385; CHECK-6M-NEXT:    ldrb r0, [r1, r0]
386; CHECK-6M-NEXT:    bx lr
387; CHECK-6M-NEXT:  .LBB5_2:
388; CHECK-6M-NEXT:    movs r0, #32
389; CHECK-6M-NEXT:    bx lr
390; CHECK-6M-NEXT:    .p2align 2
391; CHECK-6M-NEXT:  @ %bb.3:
392; CHECK-6M-NEXT:  .LCPI5_0:
393; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
394; CHECK-6M-NEXT:  .LCPI5_1:
395; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
396;
397; CHECK-8MBASE-LABEL: test_i16_zero_undef:
398; CHECK-8MBASE:       @ %bb.0:
399; CHECK-8MBASE-NEXT:    cbz r0, .LBB5_2
400; CHECK-8MBASE-NEXT:  @ %bb.1:
401; CHECK-8MBASE-NEXT:    rsbs r1, r0, #0
402; CHECK-8MBASE-NEXT:    ands r1, r0
403; CHECK-8MBASE-NEXT:    movw r0, #46385
404; CHECK-8MBASE-NEXT:    movt r0, #1916
405; CHECK-8MBASE-NEXT:    muls r0, r1, r0
406; CHECK-8MBASE-NEXT:    lsrs r0, r0, #27
407; CHECK-8MBASE-NEXT:    adr r1, .LCPI5_0
408; CHECK-8MBASE-NEXT:    ldrb r0, [r1, r0]
409; CHECK-8MBASE-NEXT:    bx lr
410; CHECK-8MBASE-NEXT:  .LBB5_2:
411; CHECK-8MBASE-NEXT:    movs r0, #32
412; CHECK-8MBASE-NEXT:    bx lr
413; CHECK-8MBASE-NEXT:    .p2align 2
414; CHECK-8MBASE-NEXT:  @ %bb.3:
415; CHECK-8MBASE-NEXT:  .LCPI5_0:
416; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
417  %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true)
418  ret i16 %tmp
419}
420
421
422define i32 @test_i32_zero_undef(i32 %a) {
423; CHECK-LABEL: test_i32_zero_undef:
424; CHECK:       @ %bb.0:
425; CHECK-NEXT:    rbit r0, r0
426; CHECK-NEXT:    clz r0, r0
427; CHECK-NEXT:    bx lr
428;
429; CHECK-6M-LABEL: test_i32_zero_undef:
430; CHECK-6M:       @ %bb.0:
431; CHECK-6M-NEXT:    cmp r0, #0
432; CHECK-6M-NEXT:    beq .LBB6_2
433; CHECK-6M-NEXT:  @ %bb.1:
434; CHECK-6M-NEXT:    rsbs r1, r0, #0
435; CHECK-6M-NEXT:    ands r1, r0
436; CHECK-6M-NEXT:    ldr r0, .LCPI6_0
437; CHECK-6M-NEXT:    muls r0, r1, r0
438; CHECK-6M-NEXT:    lsrs r0, r0, #27
439; CHECK-6M-NEXT:    adr r1, .LCPI6_1
440; CHECK-6M-NEXT:    ldrb r0, [r1, r0]
441; CHECK-6M-NEXT:    bx lr
442; CHECK-6M-NEXT:  .LBB6_2:
443; CHECK-6M-NEXT:    movs r0, #32
444; CHECK-6M-NEXT:    bx lr
445; CHECK-6M-NEXT:    .p2align 2
446; CHECK-6M-NEXT:  @ %bb.3:
447; CHECK-6M-NEXT:  .LCPI6_0:
448; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
449; CHECK-6M-NEXT:  .LCPI6_1:
450; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
451;
452; CHECK-8MBASE-LABEL: test_i32_zero_undef:
453; CHECK-8MBASE:       @ %bb.0:
454; CHECK-8MBASE-NEXT:    cbz r0, .LBB6_2
455; CHECK-8MBASE-NEXT:  @ %bb.1:
456; CHECK-8MBASE-NEXT:    rsbs r1, r0, #0
457; CHECK-8MBASE-NEXT:    ands r1, r0
458; CHECK-8MBASE-NEXT:    movw r0, #46385
459; CHECK-8MBASE-NEXT:    movt r0, #1916
460; CHECK-8MBASE-NEXT:    muls r0, r1, r0
461; CHECK-8MBASE-NEXT:    lsrs r0, r0, #27
462; CHECK-8MBASE-NEXT:    adr r1, .LCPI6_0
463; CHECK-8MBASE-NEXT:    ldrb r0, [r1, r0]
464; CHECK-8MBASE-NEXT:    bx lr
465; CHECK-8MBASE-NEXT:  .LBB6_2:
466; CHECK-8MBASE-NEXT:    movs r0, #32
467; CHECK-8MBASE-NEXT:    bx lr
468; CHECK-8MBASE-NEXT:    .p2align 2
469; CHECK-8MBASE-NEXT:  @ %bb.3:
470; CHECK-8MBASE-NEXT:  .LCPI6_0:
471; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
472  %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true)
473  ret i32 %tmp
474}
475
476define i64 @test_i64_zero_undef(i64 %a) {
477; CHECK-LABEL: test_i64_zero_undef:
478; CHECK:       @ %bb.0:
479; CHECK-NEXT:    rbit r1, r1
480; CHECK-NEXT:    rbit r2, r0
481; CHECK-NEXT:    clz r1, r1
482; CHECK-NEXT:    cmp r0, #0
483; CHECK-NEXT:    add r1, r1, #32
484; CHECK-NEXT:    clzne r1, r2
485; CHECK-NEXT:    mov r0, r1
486; CHECK-NEXT:    mov r1, #0
487; CHECK-NEXT:    bx lr
488;
489; CHECK-6M-LABEL: test_i64_zero_undef:
490; CHECK-6M:       @ %bb.0:
491; CHECK-6M-NEXT:    .save {r4, r5, r7, lr}
492; CHECK-6M-NEXT:    push {r4, r5, r7, lr}
493; CHECK-6M-NEXT:    mov r2, r0
494; CHECK-6M-NEXT:    ldr r5, .LCPI7_0
495; CHECK-6M-NEXT:    adr r3, .LCPI7_1
496; CHECK-6M-NEXT:    movs r0, #32
497; CHECK-6M-NEXT:    cmp r1, #0
498; CHECK-6M-NEXT:    mov r4, r0
499; CHECK-6M-NEXT:    beq .LBB7_2
500; CHECK-6M-NEXT:  @ %bb.1:
501; CHECK-6M-NEXT:    rsbs r4, r1, #0
502; CHECK-6M-NEXT:    ands r4, r1
503; CHECK-6M-NEXT:    muls r4, r5, r4
504; CHECK-6M-NEXT:    lsrs r1, r4, #27
505; CHECK-6M-NEXT:    ldrb r4, [r3, r1]
506; CHECK-6M-NEXT:  .LBB7_2:
507; CHECK-6M-NEXT:    adds r4, #32
508; CHECK-6M-NEXT:    rsbs r1, r2, #0
509; CHECK-6M-NEXT:    ands r1, r2
510; CHECK-6M-NEXT:    muls r5, r1, r5
511; CHECK-6M-NEXT:    lsrs r1, r5, #27
512; CHECK-6M-NEXT:    cmp r2, #0
513; CHECK-6M-NEXT:    bne .LBB7_5
514; CHECK-6M-NEXT:  @ %bb.3:
515; CHECK-6M-NEXT:    beq .LBB7_6
516; CHECK-6M-NEXT:  .LBB7_4:
517; CHECK-6M-NEXT:    movs r1, #0
518; CHECK-6M-NEXT:    pop {r4, r5, r7, pc}
519; CHECK-6M-NEXT:  .LBB7_5:
520; CHECK-6M-NEXT:    ldrb r0, [r3, r1]
521; CHECK-6M-NEXT:    bne .LBB7_4
522; CHECK-6M-NEXT:  .LBB7_6:
523; CHECK-6M-NEXT:    mov r0, r4
524; CHECK-6M-NEXT:    movs r1, #0
525; CHECK-6M-NEXT:    pop {r4, r5, r7, pc}
526; CHECK-6M-NEXT:    .p2align 2
527; CHECK-6M-NEXT:  @ %bb.7:
528; CHECK-6M-NEXT:  .LCPI7_0:
529; CHECK-6M-NEXT:    .long 125613361 @ 0x77cb531
530; CHECK-6M-NEXT:  .LCPI7_1:
531; CHECK-6M-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
532;
533; CHECK-8MBASE-LABEL: test_i64_zero_undef:
534; CHECK-8MBASE:       @ %bb.0:
535; CHECK-8MBASE-NEXT:    .save {r4, r5, r7, lr}
536; CHECK-8MBASE-NEXT:    push {r4, r5, r7, lr}
537; CHECK-8MBASE-NEXT:    mov r2, r0
538; CHECK-8MBASE-NEXT:    movw r5, #46385
539; CHECK-8MBASE-NEXT:    movt r5, #1916
540; CHECK-8MBASE-NEXT:    adr r3, .LCPI7_0
541; CHECK-8MBASE-NEXT:    movs r0, #32
542; CHECK-8MBASE-NEXT:    mov r4, r0
543; CHECK-8MBASE-NEXT:    cbz r1, .LBB7_2
544; CHECK-8MBASE-NEXT:  @ %bb.1:
545; CHECK-8MBASE-NEXT:    rsbs r4, r1, #0
546; CHECK-8MBASE-NEXT:    ands r4, r1
547; CHECK-8MBASE-NEXT:    muls r4, r5, r4
548; CHECK-8MBASE-NEXT:    lsrs r1, r4, #27
549; CHECK-8MBASE-NEXT:    ldrb r4, [r3, r1]
550; CHECK-8MBASE-NEXT:  .LBB7_2:
551; CHECK-8MBASE-NEXT:    adds r4, #32
552; CHECK-8MBASE-NEXT:    rsbs r1, r2, #0
553; CHECK-8MBASE-NEXT:    ands r1, r2
554; CHECK-8MBASE-NEXT:    muls r5, r1, r5
555; CHECK-8MBASE-NEXT:    lsrs r1, r5, #27
556; CHECK-8MBASE-NEXT:    cmp r2, #0
557; CHECK-8MBASE-NEXT:    bne .LBB7_5
558; CHECK-8MBASE-NEXT:  @ %bb.3:
559; CHECK-8MBASE-NEXT:    beq .LBB7_6
560; CHECK-8MBASE-NEXT:  .LBB7_4:
561; CHECK-8MBASE-NEXT:    movs r1, #0
562; CHECK-8MBASE-NEXT:    pop {r4, r5, r7, pc}
563; CHECK-8MBASE-NEXT:  .LBB7_5:
564; CHECK-8MBASE-NEXT:    ldrb r0, [r3, r1]
565; CHECK-8MBASE-NEXT:    bne .LBB7_4
566; CHECK-8MBASE-NEXT:  .LBB7_6:
567; CHECK-8MBASE-NEXT:    mov r0, r4
568; CHECK-8MBASE-NEXT:    movs r1, #0
569; CHECK-8MBASE-NEXT:    pop {r4, r5, r7, pc}
570; CHECK-8MBASE-NEXT:    .p2align 2
571; CHECK-8MBASE-NEXT:  @ %bb.7:
572; CHECK-8MBASE-NEXT:  .LCPI7_0:
573; CHECK-8MBASE-NEXT:    .ascii "\000\001\034\002\035\016\030\003\036\026\024\017\031\021\004\b\037\033\r\027\025\023\020\007\032\f\022\006\013\005\n\t"
574  %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true)
575  ret i64 %tmp
576}
577