1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple arm-eabi -mattr=+v6t2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple arm-eabi -mattr=+v6t2 -mattr=+neon | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; This test checks the @llvm.cttz.* intrinsics for integers. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.cttz.i8(i8, i1) 7*9880d681SAndroid Build Coastguard Workerdeclare i16 @llvm.cttz.i16(i16, i1) 8*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.cttz.i32(i32, i1) 9*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.cttz.i64(i64, i1) 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker;------------------------------------------------------------------------------ 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i8 @test_i8(i8 %a) { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i8: 15*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[REG:r[0-9]+]], [[REG]], #256 16*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 17*9880d681SAndroid Build Coastguard Worker; CHECK: clz 18*9880d681SAndroid Build Coastguard Worker %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 false) 19*9880d681SAndroid Build Coastguard Worker ret i8 %tmp 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i16 @test_i16(i16 %a) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i16: 24*9880d681SAndroid Build Coastguard Worker; CHECK: orr [[REG:r[0-9]+]], [[REG]], #65536 25*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 26*9880d681SAndroid Build Coastguard Worker; CHECK: clz 27*9880d681SAndroid Build Coastguard Worker %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 false) 28*9880d681SAndroid Build Coastguard Worker ret i16 %tmp 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @test_i32(i32 %a) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32: 33*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 34*9880d681SAndroid Build Coastguard Worker; CHECK: clz 35*9880d681SAndroid Build Coastguard Worker %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 false) 36*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine i64 @test_i64(i64 %a) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64: 41*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 42*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 43*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 44*9880d681SAndroid Build Coastguard Worker; CHECK: clz 45*9880d681SAndroid Build Coastguard Worker; CHECK: add 46*9880d681SAndroid Build Coastguard Worker; CHECK: clzne 47*9880d681SAndroid Build Coastguard Worker %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 false) 48*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker;------------------------------------------------------------------------------ 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i8 @test_i8_zero_undef(i8 %a) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i8_zero_undef: 55*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: orr 56*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 57*9880d681SAndroid Build Coastguard Worker; CHECK: clz 58*9880d681SAndroid Build Coastguard Worker %tmp = call i8 @llvm.cttz.i8(i8 %a, i1 true) 59*9880d681SAndroid Build Coastguard Worker ret i8 %tmp 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine i16 @test_i16_zero_undef(i16 %a) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i16_zero_undef: 64*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: orr 65*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 66*9880d681SAndroid Build Coastguard Worker; CHECK: clz 67*9880d681SAndroid Build Coastguard Worker %tmp = call i16 @llvm.cttz.i16(i16 %a, i1 true) 68*9880d681SAndroid Build Coastguard Worker ret i16 %tmp 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @test_i32_zero_undef(i32 %a) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32_zero_undef: 74*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 75*9880d681SAndroid Build Coastguard Worker; CHECK: clz 76*9880d681SAndroid Build Coastguard Worker %tmp = call i32 @llvm.cttz.i32(i32 %a, i1 true) 77*9880d681SAndroid Build Coastguard Worker ret i32 %tmp 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine i64 @test_i64_zero_undef(i64 %a) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64_zero_undef: 82*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 83*9880d681SAndroid Build Coastguard Worker; CHECK: rbit 84*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 85*9880d681SAndroid Build Coastguard Worker; CHECK: clz 86*9880d681SAndroid Build Coastguard Worker; CHECK: add 87*9880d681SAndroid Build Coastguard Worker; CHECK: clzne 88*9880d681SAndroid Build Coastguard Worker %tmp = call i64 @llvm.cttz.i64(i64 %a, i1 true) 89*9880d681SAndroid Build Coastguard Worker ret i64 %tmp 90*9880d681SAndroid Build Coastguard Worker} 91