670 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple arm-eabi -mattr=+v5t | FileCheck %s --check-prefix=CHECK-53; RUN: llc < %s -mtriple arm-eabi -mattr=+v6t2 | FileCheck %s4; RUN: llc < %s -mtriple arm-eabi -mattr=+v6t2 -mattr=+neon | FileCheck %s5; RUN: llc < %s -mtriple thumbv6m-none-eabi | FileCheck %s --check-prefix=CHECK-6M6; RUN: llc < %s -mtriple thumbv8m.base-none-eabi | FileCheck %s --check-prefix=CHECK-8MBASE7 8; This test checks the @llvm.cttz.* intrinsics for integers.9 10declare i8 @llvm.cttz.i8(i8, i1)11declare i16 @llvm.cttz.i16(i16, i1)12declare i32 @llvm.cttz.i32(i32, i1)13declare i64 @llvm.cttz.i64(i64, i1)14 15;------------------------------------------------------------------------------16 17define i8 @test_i8(i8 %a) {18; CHECK-5-LABEL: test_i8:19; CHECK-5: @ %bb.0:20; CHECK-5-NEXT: orr r0, r0, #25621; CHECK-5-NEXT: sub r1, r0, #122; CHECK-5-NEXT: bic r0, r1, r023; CHECK-5-NEXT: clz r0, r024; CHECK-5-NEXT: rsb r0, r0, #3225; CHECK-5-NEXT: bx lr26;27; CHECK-LABEL: test_i8:28; CHECK: @ %bb.0:29; CHECK-NEXT: orr r0, r0, #25630; CHECK-NEXT: rbit r0, r031; CHECK-NEXT: clz r0, r032; CHECK-NEXT: bx lr33;34; CHECK-6M-LABEL: test_i8:35; CHECK-6M: @ %bb.0:36; CHECK-6M-NEXT: lsls r1, r0, #2437; CHECK-6M-NEXT: beq .LBB0_338; CHECK-6M-NEXT: @ %bb.1: @ %cond.false39; CHECK-6M-NEXT: cmp r0, #040; CHECK-6M-NEXT: beq .LBB0_441; CHECK-6M-NEXT: @ %bb.2: @ %cond.false42; CHECK-6M-NEXT: rsbs r1, r0, #043; CHECK-6M-NEXT: ands r1, r044; CHECK-6M-NEXT: ldr r0, .LCPI0_045; CHECK-6M-NEXT: muls r0, r1, r046; CHECK-6M-NEXT: lsrs r0, r0, #2747; CHECK-6M-NEXT: adr r1, .LCPI0_148; CHECK-6M-NEXT: ldrb r0, [r1, r0]49; CHECK-6M-NEXT: bx lr50; CHECK-6M-NEXT: .LBB0_3:51; CHECK-6M-NEXT: movs r0, #852; CHECK-6M-NEXT: bx lr53; CHECK-6M-NEXT: .LBB0_4:54; CHECK-6M-NEXT: movs r0, #3255; CHECK-6M-NEXT: bx lr56; CHECK-6M-NEXT: .p2align 257; CHECK-6M-NEXT: @ %bb.5:58; CHECK-6M-NEXT: .LCPI0_0:59; CHECK-6M-NEXT: .long 125613361 @ 0x77cb53160; CHECK-6M-NEXT: .LCPI0_1:61; 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"62;63; CHECK-8MBASE-LABEL: test_i8:64; CHECK-8MBASE: @ %bb.0:65; CHECK-8MBASE-NEXT: lsls r1, r0, #2466; CHECK-8MBASE-NEXT: beq .LBB0_367; CHECK-8MBASE-NEXT: @ %bb.1: @ %cond.false68; CHECK-8MBASE-NEXT: cbz r0, .LBB0_469; CHECK-8MBASE-NEXT: @ %bb.2: @ %cond.false70; CHECK-8MBASE-NEXT: rsbs r1, r0, #071; CHECK-8MBASE-NEXT: ands r1, r072; CHECK-8MBASE-NEXT: movw r0, #4638573; CHECK-8MBASE-NEXT: movt r0, #191674; CHECK-8MBASE-NEXT: muls r0, r1, r075; CHECK-8MBASE-NEXT: lsrs r0, r0, #2776; CHECK-8MBASE-NEXT: adr r1, .LCPI0_077; CHECK-8MBASE-NEXT: ldrb r0, [r1, r0]78; CHECK-8MBASE-NEXT: bx lr79; CHECK-8MBASE-NEXT: .LBB0_3:80; CHECK-8MBASE-NEXT: movs r0, #881; CHECK-8MBASE-NEXT: bx lr82; CHECK-8MBASE-NEXT: .LBB0_4:83; CHECK-8MBASE-NEXT: movs r0, #3284; CHECK-8MBASE-NEXT: bx lr85; CHECK-8MBASE-NEXT: .p2align 286; CHECK-8MBASE-NEXT: @ %bb.5:87; CHECK-8MBASE-NEXT: .LCPI0_0:88; 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"89 %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false)90 ret i8 %tmp91}92 93define i16 @test_i16(i16 %a) {94; CHECK-5-LABEL: test_i16:95; CHECK-5: @ %bb.0:96; CHECK-5-NEXT: orr r0, r0, #6553697; CHECK-5-NEXT: sub r1, r0, #198; CHECK-5-NEXT: bic r0, r1, r099; CHECK-5-NEXT: clz r0, r0100; CHECK-5-NEXT: rsb r0, r0, #32101; CHECK-5-NEXT: bx lr102;103; CHECK-LABEL: test_i16:104; CHECK: @ %bb.0:105; CHECK-NEXT: orr r0, r0, #65536106; CHECK-NEXT: rbit r0, r0107; CHECK-NEXT: clz r0, r0108; CHECK-NEXT: bx lr109;110; CHECK-6M-LABEL: test_i16:111; CHECK-6M: @ %bb.0:112; CHECK-6M-NEXT: lsls r1, r0, #16113; CHECK-6M-NEXT: beq .LBB1_3114; CHECK-6M-NEXT: @ %bb.1: @ %cond.false115; CHECK-6M-NEXT: cmp r0, #0116; CHECK-6M-NEXT: beq .LBB1_4117; CHECK-6M-NEXT: @ %bb.2: @ %cond.false118; CHECK-6M-NEXT: rsbs r1, r0, #0119; CHECK-6M-NEXT: ands r1, r0120; CHECK-6M-NEXT: ldr r0, .LCPI1_0121; CHECK-6M-NEXT: muls r0, r1, r0122; CHECK-6M-NEXT: lsrs r0, r0, #27123; CHECK-6M-NEXT: adr r1, .LCPI1_1124; CHECK-6M-NEXT: ldrb r0, [r1, r0]125; CHECK-6M-NEXT: bx lr126; CHECK-6M-NEXT: .LBB1_3:127; CHECK-6M-NEXT: movs r0, #16128; CHECK-6M-NEXT: bx lr129; CHECK-6M-NEXT: .LBB1_4:130; CHECK-6M-NEXT: movs r0, #32131; CHECK-6M-NEXT: bx lr132; CHECK-6M-NEXT: .p2align 2133; CHECK-6M-NEXT: @ %bb.5:134; CHECK-6M-NEXT: .LCPI1_0:135; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531136; CHECK-6M-NEXT: .LCPI1_1:137; 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"138;139; CHECK-8MBASE-LABEL: test_i16:140; CHECK-8MBASE: @ %bb.0:141; CHECK-8MBASE-NEXT: lsls r1, r0, #16142; CHECK-8MBASE-NEXT: beq .LBB1_3143; CHECK-8MBASE-NEXT: @ %bb.1: @ %cond.false144; CHECK-8MBASE-NEXT: cbz r0, .LBB1_4145; CHECK-8MBASE-NEXT: @ %bb.2: @ %cond.false146; CHECK-8MBASE-NEXT: rsbs r1, r0, #0147; CHECK-8MBASE-NEXT: ands r1, r0148; CHECK-8MBASE-NEXT: movw r0, #46385149; CHECK-8MBASE-NEXT: movt r0, #1916150; CHECK-8MBASE-NEXT: muls r0, r1, r0151; CHECK-8MBASE-NEXT: lsrs r0, r0, #27152; CHECK-8MBASE-NEXT: adr r1, .LCPI1_0153; CHECK-8MBASE-NEXT: ldrb r0, [r1, r0]154; CHECK-8MBASE-NEXT: bx lr155; CHECK-8MBASE-NEXT: .LBB1_3:156; CHECK-8MBASE-NEXT: movs r0, #16157; CHECK-8MBASE-NEXT: bx lr158; CHECK-8MBASE-NEXT: .LBB1_4:159; CHECK-8MBASE-NEXT: movs r0, #32160; CHECK-8MBASE-NEXT: bx lr161; CHECK-8MBASE-NEXT: .p2align 2162; CHECK-8MBASE-NEXT: @ %bb.5:163; CHECK-8MBASE-NEXT: .LCPI1_0:164; 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"165 %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false)166 ret i16 %tmp167}168 169define i32 @test_i32(i32 %a) {170; CHECK-5-LABEL: test_i32:171; CHECK-5: @ %bb.0:172; CHECK-5-NEXT: sub r1, r0, #1173; CHECK-5-NEXT: bic r0, r1, r0174; CHECK-5-NEXT: clz r0, r0175; CHECK-5-NEXT: rsb r0, r0, #32176; CHECK-5-NEXT: bx lr177;178; CHECK-LABEL: test_i32:179; CHECK: @ %bb.0:180; CHECK-NEXT: rbit r0, r0181; CHECK-NEXT: clz r0, r0182; CHECK-NEXT: bx lr183;184; CHECK-6M-LABEL: test_i32:185; CHECK-6M: @ %bb.0:186; CHECK-6M-NEXT: cmp r0, #0187; CHECK-6M-NEXT: beq .LBB2_3188; CHECK-6M-NEXT: @ %bb.1: @ %cond.false189; CHECK-6M-NEXT: cmp r0, #0190; CHECK-6M-NEXT: beq .LBB2_3191; CHECK-6M-NEXT: @ %bb.2: @ %cond.false192; CHECK-6M-NEXT: rsbs r1, r0, #0193; CHECK-6M-NEXT: ands r1, r0194; CHECK-6M-NEXT: ldr r0, .LCPI2_0195; CHECK-6M-NEXT: muls r0, r1, r0196; CHECK-6M-NEXT: lsrs r0, r0, #27197; CHECK-6M-NEXT: adr r1, .LCPI2_1198; CHECK-6M-NEXT: ldrb r0, [r1, r0]199; CHECK-6M-NEXT: bx lr200; CHECK-6M-NEXT: .LBB2_3:201; CHECK-6M-NEXT: movs r0, #32202; CHECK-6M-NEXT: bx lr203; CHECK-6M-NEXT: .p2align 2204; CHECK-6M-NEXT: @ %bb.4:205; CHECK-6M-NEXT: .LCPI2_0:206; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531207; CHECK-6M-NEXT: .LCPI2_1:208; 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"209;210; CHECK-8MBASE-LABEL: test_i32:211; CHECK-8MBASE: @ %bb.0:212; CHECK-8MBASE-NEXT: cbz r0, .LBB2_3213; CHECK-8MBASE-NEXT: @ %bb.1: @ %cond.false214; CHECK-8MBASE-NEXT: cbz r0, .LBB2_3215; CHECK-8MBASE-NEXT: @ %bb.2: @ %cond.false216; CHECK-8MBASE-NEXT: rsbs r1, r0, #0217; CHECK-8MBASE-NEXT: ands r1, r0218; CHECK-8MBASE-NEXT: movw r0, #46385219; CHECK-8MBASE-NEXT: movt r0, #1916220; CHECK-8MBASE-NEXT: muls r0, r1, r0221; CHECK-8MBASE-NEXT: lsrs r0, r0, #27222; CHECK-8MBASE-NEXT: adr r1, .LCPI2_0223; CHECK-8MBASE-NEXT: ldrb r0, [r1, r0]224; CHECK-8MBASE-NEXT: bx lr225; CHECK-8MBASE-NEXT: .LBB2_3:226; CHECK-8MBASE-NEXT: movs r0, #32227; CHECK-8MBASE-NEXT: bx lr228; CHECK-8MBASE-NEXT: .p2align 2229; CHECK-8MBASE-NEXT: @ %bb.4:230; CHECK-8MBASE-NEXT: .LCPI2_0:231; 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"232 %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false)233 ret i32 %tmp234}235 236define i64 @test_i64(i64 %a) {237; CHECK-5-LABEL: test_i64:238; CHECK-5: @ %bb.0:239; CHECK-5-NEXT: sub r3, r1, #1240; CHECK-5-NEXT: sub r2, r0, #1241; CHECK-5-NEXT: bic r1, r3, r1242; CHECK-5-NEXT: bic r2, r2, r0243; CHECK-5-NEXT: clz r1, r1244; CHECK-5-NEXT: clz r2, r2245; CHECK-5-NEXT: rsb r1, r1, #64246; CHECK-5-NEXT: cmp r0, #0247; CHECK-5-NEXT: rsbne r1, r2, #32248; CHECK-5-NEXT: mov r0, r1249; CHECK-5-NEXT: mov r1, #0250; CHECK-5-NEXT: bx lr251;252; CHECK-LABEL: test_i64:253; CHECK: @ %bb.0:254; CHECK-NEXT: rbit r1, r1255; CHECK-NEXT: rbit r2, r0256; CHECK-NEXT: clz r1, r1257; CHECK-NEXT: cmp r0, #0258; CHECK-NEXT: add r1, r1, #32259; CHECK-NEXT: clzne r1, r2260; CHECK-NEXT: mov r0, r1261; CHECK-NEXT: mov r1, #0262; CHECK-NEXT: bx lr263;264; CHECK-6M-LABEL: test_i64:265; CHECK-6M: @ %bb.0:266; CHECK-6M-NEXT: .save {r4, r5, r6, lr}267; CHECK-6M-NEXT: push {r4, r5, r6, lr}268; CHECK-6M-NEXT: mov r3, r1269; CHECK-6M-NEXT: mov r2, r0270; CHECK-6M-NEXT: movs r1, #0271; CHECK-6M-NEXT: orrs r0, r3272; CHECK-6M-NEXT: beq .LBB3_6273; CHECK-6M-NEXT: @ %bb.1: @ %cond.false274; CHECK-6M-NEXT: ldr r6, .LCPI3_0275; CHECK-6M-NEXT: adr r4, .LCPI3_1276; CHECK-6M-NEXT: movs r0, #32277; CHECK-6M-NEXT: cmp r3, #0278; CHECK-6M-NEXT: mov r5, r0279; CHECK-6M-NEXT: beq .LBB3_3280; CHECK-6M-NEXT: @ %bb.2: @ %cond.false281; CHECK-6M-NEXT: rsbs r5, r3, #0282; CHECK-6M-NEXT: ands r5, r3283; CHECK-6M-NEXT: muls r5, r6, r5284; CHECK-6M-NEXT: lsrs r3, r5, #27285; CHECK-6M-NEXT: ldrb r5, [r4, r3]286; CHECK-6M-NEXT: .LBB3_3: @ %cond.false287; CHECK-6M-NEXT: adds r5, #32288; CHECK-6M-NEXT: rsbs r3, r2, #0289; CHECK-6M-NEXT: ands r3, r2290; CHECK-6M-NEXT: muls r6, r3, r6291; CHECK-6M-NEXT: lsrs r3, r6, #27292; CHECK-6M-NEXT: cmp r2, #0293; CHECK-6M-NEXT: bne .LBB3_7294; CHECK-6M-NEXT: @ %bb.4: @ %cond.false295; CHECK-6M-NEXT: beq .LBB3_8296; CHECK-6M-NEXT: .LBB3_5: @ %cond.end297; CHECK-6M-NEXT: pop {r4, r5, r6, pc}298; CHECK-6M-NEXT: .LBB3_6:299; CHECK-6M-NEXT: movs r0, #64300; CHECK-6M-NEXT: pop {r4, r5, r6, pc}301; CHECK-6M-NEXT: .LBB3_7: @ %cond.false302; CHECK-6M-NEXT: ldrb r0, [r4, r3]303; CHECK-6M-NEXT: bne .LBB3_5304; CHECK-6M-NEXT: .LBB3_8: @ %cond.false305; CHECK-6M-NEXT: mov r0, r5306; CHECK-6M-NEXT: pop {r4, r5, r6, pc}307; CHECK-6M-NEXT: .p2align 2308; CHECK-6M-NEXT: @ %bb.9:309; CHECK-6M-NEXT: .LCPI3_0:310; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531311; CHECK-6M-NEXT: .LCPI3_1:312; 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"313;314; CHECK-8MBASE-LABEL: test_i64:315; CHECK-8MBASE: @ %bb.0:316; CHECK-8MBASE-NEXT: .save {r4, r5, r6, lr}317; CHECK-8MBASE-NEXT: push {r4, r5, r6, lr}318; CHECK-8MBASE-NEXT: mov r3, r1319; CHECK-8MBASE-NEXT: mov r2, r0320; CHECK-8MBASE-NEXT: movs r1, #0321; CHECK-8MBASE-NEXT: orrs r0, r3322; CHECK-8MBASE-NEXT: beq .LBB3_6323; CHECK-8MBASE-NEXT: @ %bb.1: @ %cond.false324; CHECK-8MBASE-NEXT: movw r6, #46385325; CHECK-8MBASE-NEXT: movt r6, #1916326; CHECK-8MBASE-NEXT: adr r4, .LCPI3_0327; CHECK-8MBASE-NEXT: movs r0, #32328; CHECK-8MBASE-NEXT: mov r5, r0329; CHECK-8MBASE-NEXT: cbz r3, .LBB3_3330; CHECK-8MBASE-NEXT: @ %bb.2: @ %cond.false331; CHECK-8MBASE-NEXT: rsbs r5, r3, #0332; CHECK-8MBASE-NEXT: ands r5, r3333; CHECK-8MBASE-NEXT: muls r5, r6, r5334; CHECK-8MBASE-NEXT: lsrs r3, r5, #27335; CHECK-8MBASE-NEXT: ldrb r5, [r4, r3]336; CHECK-8MBASE-NEXT: .LBB3_3: @ %cond.false337; CHECK-8MBASE-NEXT: adds r5, #32338; CHECK-8MBASE-NEXT: rsbs r3, r2, #0339; CHECK-8MBASE-NEXT: ands r3, r2340; CHECK-8MBASE-NEXT: muls r6, r3, r6341; CHECK-8MBASE-NEXT: lsrs r3, r6, #27342; CHECK-8MBASE-NEXT: cmp r2, #0343; CHECK-8MBASE-NEXT: bne .LBB3_7344; CHECK-8MBASE-NEXT: @ %bb.4: @ %cond.false345; CHECK-8MBASE-NEXT: beq .LBB3_8346; CHECK-8MBASE-NEXT: .LBB3_5: @ %cond.end347; CHECK-8MBASE-NEXT: pop {r4, r5, r6, pc}348; CHECK-8MBASE-NEXT: .LBB3_6:349; CHECK-8MBASE-NEXT: movs r0, #64350; CHECK-8MBASE-NEXT: pop {r4, r5, r6, pc}351; CHECK-8MBASE-NEXT: .LBB3_7: @ %cond.false352; CHECK-8MBASE-NEXT: ldrb r0, [r4, r3]353; CHECK-8MBASE-NEXT: bne .LBB3_5354; CHECK-8MBASE-NEXT: .LBB3_8: @ %cond.false355; CHECK-8MBASE-NEXT: mov r0, r5356; CHECK-8MBASE-NEXT: pop {r4, r5, r6, pc}357; CHECK-8MBASE-NEXT: .p2align 2358; CHECK-8MBASE-NEXT: @ %bb.9:359; CHECK-8MBASE-NEXT: .LCPI3_0:360; 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"361 %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false)362 ret i64 %tmp363}364 365;------------------------------------------------------------------------------366 367define i8 @test_i8_zero_undef(i8 %a) {368; CHECK-5-LABEL: test_i8_zero_undef:369; CHECK-5: @ %bb.0:370; CHECK-5-NEXT: sub r1, r0, #1371; CHECK-5-NEXT: bic r0, r1, r0372; CHECK-5-NEXT: clz r0, r0373; CHECK-5-NEXT: rsb r0, r0, #32374; CHECK-5-NEXT: bx lr375;376; CHECK-LABEL: test_i8_zero_undef:377; CHECK: @ %bb.0:378; CHECK-NEXT: rbit r0, r0379; CHECK-NEXT: clz r0, r0380; CHECK-NEXT: bx lr381;382; CHECK-6M-LABEL: test_i8_zero_undef:383; CHECK-6M: @ %bb.0:384; CHECK-6M-NEXT: cmp r0, #0385; CHECK-6M-NEXT: beq .LBB4_2386; CHECK-6M-NEXT: @ %bb.1:387; CHECK-6M-NEXT: rsbs r1, r0, #0388; CHECK-6M-NEXT: ands r1, r0389; CHECK-6M-NEXT: ldr r0, .LCPI4_0390; CHECK-6M-NEXT: muls r0, r1, r0391; CHECK-6M-NEXT: lsrs r0, r0, #27392; CHECK-6M-NEXT: adr r1, .LCPI4_1393; CHECK-6M-NEXT: ldrb r0, [r1, r0]394; CHECK-6M-NEXT: bx lr395; CHECK-6M-NEXT: .LBB4_2:396; CHECK-6M-NEXT: movs r0, #32397; CHECK-6M-NEXT: bx lr398; CHECK-6M-NEXT: .p2align 2399; CHECK-6M-NEXT: @ %bb.3:400; CHECK-6M-NEXT: .LCPI4_0:401; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531402; CHECK-6M-NEXT: .LCPI4_1:403; 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"404;405; CHECK-8MBASE-LABEL: test_i8_zero_undef:406; CHECK-8MBASE: @ %bb.0:407; CHECK-8MBASE-NEXT: cbz r0, .LBB4_2408; CHECK-8MBASE-NEXT: @ %bb.1:409; CHECK-8MBASE-NEXT: rsbs r1, r0, #0410; CHECK-8MBASE-NEXT: ands r1, r0411; CHECK-8MBASE-NEXT: movw r0, #46385412; CHECK-8MBASE-NEXT: movt r0, #1916413; CHECK-8MBASE-NEXT: muls r0, r1, r0414; CHECK-8MBASE-NEXT: lsrs r0, r0, #27415; CHECK-8MBASE-NEXT: adr r1, .LCPI4_0416; CHECK-8MBASE-NEXT: ldrb r0, [r1, r0]417; CHECK-8MBASE-NEXT: bx lr418; CHECK-8MBASE-NEXT: .LBB4_2:419; CHECK-8MBASE-NEXT: movs r0, #32420; CHECK-8MBASE-NEXT: bx lr421; CHECK-8MBASE-NEXT: .p2align 2422; CHECK-8MBASE-NEXT: @ %bb.3:423; CHECK-8MBASE-NEXT: .LCPI4_0:424; 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"425 %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true)426 ret i8 %tmp427}428 429define i16 @test_i16_zero_undef(i16 %a) {430; CHECK-5-LABEL: test_i16_zero_undef:431; CHECK-5: @ %bb.0:432; CHECK-5-NEXT: sub r1, r0, #1433; CHECK-5-NEXT: bic r0, r1, r0434; CHECK-5-NEXT: clz r0, r0435; CHECK-5-NEXT: rsb r0, r0, #32436; CHECK-5-NEXT: bx lr437;438; CHECK-LABEL: test_i16_zero_undef:439; CHECK: @ %bb.0:440; CHECK-NEXT: rbit r0, r0441; CHECK-NEXT: clz r0, r0442; CHECK-NEXT: bx lr443;444; CHECK-6M-LABEL: test_i16_zero_undef:445; CHECK-6M: @ %bb.0:446; CHECK-6M-NEXT: cmp r0, #0447; CHECK-6M-NEXT: beq .LBB5_2448; CHECK-6M-NEXT: @ %bb.1:449; CHECK-6M-NEXT: rsbs r1, r0, #0450; CHECK-6M-NEXT: ands r1, r0451; CHECK-6M-NEXT: ldr r0, .LCPI5_0452; CHECK-6M-NEXT: muls r0, r1, r0453; CHECK-6M-NEXT: lsrs r0, r0, #27454; CHECK-6M-NEXT: adr r1, .LCPI5_1455; CHECK-6M-NEXT: ldrb r0, [r1, r0]456; CHECK-6M-NEXT: bx lr457; CHECK-6M-NEXT: .LBB5_2:458; CHECK-6M-NEXT: movs r0, #32459; CHECK-6M-NEXT: bx lr460; CHECK-6M-NEXT: .p2align 2461; CHECK-6M-NEXT: @ %bb.3:462; CHECK-6M-NEXT: .LCPI5_0:463; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531464; CHECK-6M-NEXT: .LCPI5_1:465; 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"466;467; CHECK-8MBASE-LABEL: test_i16_zero_undef:468; CHECK-8MBASE: @ %bb.0:469; CHECK-8MBASE-NEXT: cbz r0, .LBB5_2470; CHECK-8MBASE-NEXT: @ %bb.1:471; CHECK-8MBASE-NEXT: rsbs r1, r0, #0472; CHECK-8MBASE-NEXT: ands r1, r0473; CHECK-8MBASE-NEXT: movw r0, #46385474; CHECK-8MBASE-NEXT: movt r0, #1916475; CHECK-8MBASE-NEXT: muls r0, r1, r0476; CHECK-8MBASE-NEXT: lsrs r0, r0, #27477; CHECK-8MBASE-NEXT: adr r1, .LCPI5_0478; CHECK-8MBASE-NEXT: ldrb r0, [r1, r0]479; CHECK-8MBASE-NEXT: bx lr480; CHECK-8MBASE-NEXT: .LBB5_2:481; CHECK-8MBASE-NEXT: movs r0, #32482; CHECK-8MBASE-NEXT: bx lr483; CHECK-8MBASE-NEXT: .p2align 2484; CHECK-8MBASE-NEXT: @ %bb.3:485; CHECK-8MBASE-NEXT: .LCPI5_0:486; 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"487 %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true)488 ret i16 %tmp489}490 491 492define i32 @test_i32_zero_undef(i32 %a) {493; CHECK-5-LABEL: test_i32_zero_undef:494; CHECK-5: @ %bb.0:495; CHECK-5-NEXT: sub r1, r0, #1496; CHECK-5-NEXT: bic r0, r1, r0497; CHECK-5-NEXT: clz r0, r0498; CHECK-5-NEXT: rsb r0, r0, #32499; CHECK-5-NEXT: bx lr500;501; CHECK-LABEL: test_i32_zero_undef:502; CHECK: @ %bb.0:503; CHECK-NEXT: rbit r0, r0504; CHECK-NEXT: clz r0, r0505; CHECK-NEXT: bx lr506;507; CHECK-6M-LABEL: test_i32_zero_undef:508; CHECK-6M: @ %bb.0:509; CHECK-6M-NEXT: cmp r0, #0510; CHECK-6M-NEXT: beq .LBB6_2511; CHECK-6M-NEXT: @ %bb.1:512; CHECK-6M-NEXT: rsbs r1, r0, #0513; CHECK-6M-NEXT: ands r1, r0514; CHECK-6M-NEXT: ldr r0, .LCPI6_0515; CHECK-6M-NEXT: muls r0, r1, r0516; CHECK-6M-NEXT: lsrs r0, r0, #27517; CHECK-6M-NEXT: adr r1, .LCPI6_1518; CHECK-6M-NEXT: ldrb r0, [r1, r0]519; CHECK-6M-NEXT: bx lr520; CHECK-6M-NEXT: .LBB6_2:521; CHECK-6M-NEXT: movs r0, #32522; CHECK-6M-NEXT: bx lr523; CHECK-6M-NEXT: .p2align 2524; CHECK-6M-NEXT: @ %bb.3:525; CHECK-6M-NEXT: .LCPI6_0:526; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531527; CHECK-6M-NEXT: .LCPI6_1:528; 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"529;530; CHECK-8MBASE-LABEL: test_i32_zero_undef:531; CHECK-8MBASE: @ %bb.0:532; CHECK-8MBASE-NEXT: cbz r0, .LBB6_2533; CHECK-8MBASE-NEXT: @ %bb.1:534; CHECK-8MBASE-NEXT: rsbs r1, r0, #0535; CHECK-8MBASE-NEXT: ands r1, r0536; CHECK-8MBASE-NEXT: movw r0, #46385537; CHECK-8MBASE-NEXT: movt r0, #1916538; CHECK-8MBASE-NEXT: muls r0, r1, r0539; CHECK-8MBASE-NEXT: lsrs r0, r0, #27540; CHECK-8MBASE-NEXT: adr r1, .LCPI6_0541; CHECK-8MBASE-NEXT: ldrb r0, [r1, r0]542; CHECK-8MBASE-NEXT: bx lr543; CHECK-8MBASE-NEXT: .LBB6_2:544; CHECK-8MBASE-NEXT: movs r0, #32545; CHECK-8MBASE-NEXT: bx lr546; CHECK-8MBASE-NEXT: .p2align 2547; CHECK-8MBASE-NEXT: @ %bb.3:548; CHECK-8MBASE-NEXT: .LCPI6_0:549; 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"550 %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true)551 ret i32 %tmp552}553 554define i64 @test_i64_zero_undef(i64 %a) {555; CHECK-5-LABEL: test_i64_zero_undef:556; CHECK-5: @ %bb.0:557; CHECK-5-NEXT: sub r3, r1, #1558; CHECK-5-NEXT: sub r2, r0, #1559; CHECK-5-NEXT: bic r1, r3, r1560; CHECK-5-NEXT: bic r2, r2, r0561; CHECK-5-NEXT: clz r1, r1562; CHECK-5-NEXT: clz r2, r2563; CHECK-5-NEXT: rsb r1, r1, #64564; CHECK-5-NEXT: cmp r0, #0565; CHECK-5-NEXT: rsbne r1, r2, #32566; CHECK-5-NEXT: mov r0, r1567; CHECK-5-NEXT: mov r1, #0568; CHECK-5-NEXT: bx lr569;570; CHECK-LABEL: test_i64_zero_undef:571; CHECK: @ %bb.0:572; CHECK-NEXT: rbit r1, r1573; CHECK-NEXT: rbit r2, r0574; CHECK-NEXT: clz r1, r1575; CHECK-NEXT: cmp r0, #0576; CHECK-NEXT: add r1, r1, #32577; CHECK-NEXT: clzne r1, r2578; CHECK-NEXT: mov r0, r1579; CHECK-NEXT: mov r1, #0580; CHECK-NEXT: bx lr581;582; CHECK-6M-LABEL: test_i64_zero_undef:583; CHECK-6M: @ %bb.0:584; CHECK-6M-NEXT: .save {r4, r5, r7, lr}585; CHECK-6M-NEXT: push {r4, r5, r7, lr}586; CHECK-6M-NEXT: mov r2, r0587; CHECK-6M-NEXT: ldr r5, .LCPI7_0588; CHECK-6M-NEXT: adr r3, .LCPI7_1589; CHECK-6M-NEXT: movs r0, #32590; CHECK-6M-NEXT: cmp r1, #0591; CHECK-6M-NEXT: mov r4, r0592; CHECK-6M-NEXT: beq .LBB7_2593; CHECK-6M-NEXT: @ %bb.1:594; CHECK-6M-NEXT: rsbs r4, r1, #0595; CHECK-6M-NEXT: ands r4, r1596; CHECK-6M-NEXT: muls r4, r5, r4597; CHECK-6M-NEXT: lsrs r1, r4, #27598; CHECK-6M-NEXT: ldrb r4, [r3, r1]599; CHECK-6M-NEXT: .LBB7_2:600; CHECK-6M-NEXT: adds r4, #32601; CHECK-6M-NEXT: rsbs r1, r2, #0602; CHECK-6M-NEXT: ands r1, r2603; CHECK-6M-NEXT: muls r5, r1, r5604; CHECK-6M-NEXT: lsrs r1, r5, #27605; CHECK-6M-NEXT: cmp r2, #0606; CHECK-6M-NEXT: bne .LBB7_5607; CHECK-6M-NEXT: @ %bb.3:608; CHECK-6M-NEXT: beq .LBB7_6609; CHECK-6M-NEXT: .LBB7_4:610; CHECK-6M-NEXT: movs r1, #0611; CHECK-6M-NEXT: pop {r4, r5, r7, pc}612; CHECK-6M-NEXT: .LBB7_5:613; CHECK-6M-NEXT: ldrb r0, [r3, r1]614; CHECK-6M-NEXT: bne .LBB7_4615; CHECK-6M-NEXT: .LBB7_6:616; CHECK-6M-NEXT: mov r0, r4617; CHECK-6M-NEXT: movs r1, #0618; CHECK-6M-NEXT: pop {r4, r5, r7, pc}619; CHECK-6M-NEXT: .p2align 2620; CHECK-6M-NEXT: @ %bb.7:621; CHECK-6M-NEXT: .LCPI7_0:622; CHECK-6M-NEXT: .long 125613361 @ 0x77cb531623; CHECK-6M-NEXT: .LCPI7_1:624; 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"625;626; CHECK-8MBASE-LABEL: test_i64_zero_undef:627; CHECK-8MBASE: @ %bb.0:628; CHECK-8MBASE-NEXT: .save {r4, r5, r7, lr}629; CHECK-8MBASE-NEXT: push {r4, r5, r7, lr}630; CHECK-8MBASE-NEXT: mov r2, r0631; CHECK-8MBASE-NEXT: movw r5, #46385632; CHECK-8MBASE-NEXT: movt r5, #1916633; CHECK-8MBASE-NEXT: adr r3, .LCPI7_0634; CHECK-8MBASE-NEXT: movs r0, #32635; CHECK-8MBASE-NEXT: mov r4, r0636; CHECK-8MBASE-NEXT: cbz r1, .LBB7_2637; CHECK-8MBASE-NEXT: @ %bb.1:638; CHECK-8MBASE-NEXT: rsbs r4, r1, #0639; CHECK-8MBASE-NEXT: ands r4, r1640; CHECK-8MBASE-NEXT: muls r4, r5, r4641; CHECK-8MBASE-NEXT: lsrs r1, r4, #27642; CHECK-8MBASE-NEXT: ldrb r4, [r3, r1]643; CHECK-8MBASE-NEXT: .LBB7_2:644; CHECK-8MBASE-NEXT: adds r4, #32645; CHECK-8MBASE-NEXT: rsbs r1, r2, #0646; CHECK-8MBASE-NEXT: ands r1, r2647; CHECK-8MBASE-NEXT: muls r5, r1, r5648; CHECK-8MBASE-NEXT: lsrs r1, r5, #27649; CHECK-8MBASE-NEXT: cmp r2, #0650; CHECK-8MBASE-NEXT: bne .LBB7_5651; CHECK-8MBASE-NEXT: @ %bb.3:652; CHECK-8MBASE-NEXT: beq .LBB7_6653; CHECK-8MBASE-NEXT: .LBB7_4:654; CHECK-8MBASE-NEXT: movs r1, #0655; CHECK-8MBASE-NEXT: pop {r4, r5, r7, pc}656; CHECK-8MBASE-NEXT: .LBB7_5:657; CHECK-8MBASE-NEXT: ldrb r0, [r3, r1]658; CHECK-8MBASE-NEXT: bne .LBB7_4659; CHECK-8MBASE-NEXT: .LBB7_6:660; CHECK-8MBASE-NEXT: mov r0, r4661; CHECK-8MBASE-NEXT: movs r1, #0662; CHECK-8MBASE-NEXT: pop {r4, r5, r7, pc}663; CHECK-8MBASE-NEXT: .p2align 2664; CHECK-8MBASE-NEXT: @ %bb.7:665; CHECK-8MBASE-NEXT: .LCPI7_0:666; 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"667 %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true)668 ret i64 %tmp669}670