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