xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/cttz.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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