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