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