1 # RUN: llc -O0 -mtriple arm-linux-gnueabi -mattr=+v5t -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,CLZ
2 # RUN: llc -O0 -mtriple arm-linux-gnueabi -mattr=-v5t -run-pass=legalizer %s -o - | FileCheck %s -check-prefixes=CHECK,LIBCALLS
4 define void @test_ctlz_s32() { ret void }
5 define void @test_ctlz_zero_undef_s32() { ret void }
7 ; same as above but with extensions
8 define void @test_ctlz_s16() { ret void }
9 define void @test_ctlz_zero_undef_s8() { ret void }
13 # CHECK-LABEL: name: test_ctlz_s32
15 # CHECK: legalized: true
16 regBankSelected: false
18 tracksRegLiveness: true
26 ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
29 ; CLZ: [[R:%[0-9]+]]:_(s32) = G_CTLZ [[X]]
30 ; LIBCALLS-NOT: G_CTLZ
31 ; LIBCALLS: ADJCALLSTACKDOWN
32 ; LIBCALLS: $r0 = COPY [[X]]
33 ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
34 ; LIBCALLS: [[COUNT:%[0-9]+]]:_(s32) = COPY $r0
35 ; LIBCALLS: ADJCALLSTACKUP
36 ; LIBCALLS-NOT: G_CTLZ
37 ; LIBCALLS: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
38 ; LIBCALLS: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
39 ; LIBCALLS: [[CMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[X]](s32), [[ZERO]]
40 ; LIBCALLS: [[R:%[0-9]+]]:_(s32) = G_SELECT [[CMP]](s1), [[BITS]], [[COUNT]]
41 ; LIBCALLS-NOT: G_CTLZ
44 ; CHECK: $r0 = COPY [[R]]
46 BX_RET 14, $noreg, implicit $r0
49 name: test_ctlz_zero_undef_s32
50 # CHECK-LABEL: name: test_ctlz_zero_undef_s32
52 # CHECK: legalized: true
53 regBankSelected: false
55 tracksRegLiveness: true
63 ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
66 ; CLZ: [[R:%[0-9]+]]:_(s32) = G_CTLZ [[X]]
67 ; LIBCALLS-NOT: G_CTLZ
68 ; LIBCALLS: ADJCALLSTACKDOWN
69 ; LIBCALLS: $r0 = COPY [[X]]
70 ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
71 ; LIBCALLS: [[R:%[0-9]+]]:_(s32) = COPY $r0
72 ; LIBCALLS: ADJCALLSTACKUP
73 ; LIBCALLS-NOT: G_CTLZ
74 %1(s32) = G_CTLZ_ZERO_UNDEF %0
76 ; CHECK: $r0 = COPY [[R]]
78 BX_RET 14, $noreg, implicit $r0
82 # CHECK-LABEL: name: test_ctlz_s16
84 # CHECK: legalized: true
85 regBankSelected: false
87 tracksRegLiveness: true
97 ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
98 ; CHECK: [[BITMASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
99 ; CHECK: [[XAGAIN:%[0-9]+]]:_(s32) = COPY [[X]]
100 ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[XAGAIN]], [[BITMASK]]
102 %1(s16) = G_TRUNC %0(s32)
104 ; Check that the operation is performed for 32 bits
105 ; CLZ: [[COUNT:%[0-9]+]]:_(s32) = G_CTLZ [[X32]]
106 ; LIBCALLS-NOT: G_CTLZ
107 ; LIBCALLS: ADJCALLSTACKDOWN
108 ; LIBCALLS: $r0 = COPY [[X32]]
109 ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
110 ; LIBCALLS: [[UNDEFCOUNT:%[0-9]+]]:_(s32) = COPY $r0
111 ; LIBCALLS: ADJCALLSTACKUP
112 ; LIBCALLS-NOT: G_CTLZ
113 ; LIBCALLS: [[ZERO:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
114 ; LIBCALLS: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
115 ; LIBCALLS: [[CMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), {{%[0-9]+}}(s32), [[ZERO]]
116 ; LIBCALLS: [[COUNT:%[0-9]+]]:_(s32) = G_SELECT [[CMP]](s1), [[BITS]], [[UNDEFCOUNT]]
117 ; LIBCALLS-NOT: G_CTLZ
118 ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
119 ; CHECK: [[R32:%[0-9]+]]:_(s32) = G_SUB [[COUNT]], [[BITDIFF]]
122 ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
123 ; CHECK: [[RAGAIN:%[0-9]+]]:_(s32) = COPY [[R32]]
124 ; CHECK: [[SHIFTEDR:%[0-9]+]]:_(s32) = G_SHL [[RAGAIN]], [[BITDIFF]]
125 ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDR]], [[BITDIFF]]
126 ; CHECK: $r0 = COPY [[R]]
127 %3(s32) = G_SEXT %2(s16)
129 BX_RET 14, $noreg, implicit $r0
132 name: test_ctlz_zero_undef_s8
133 # CHECK-LABEL: name: test_ctlz_zero_undef_s8
135 # CHECK: legalized: true
136 regBankSelected: false
138 tracksRegLiveness: true
140 - { id: 0, class: _ }
141 - { id: 1, class: _ }
142 - { id: 2, class: _ }
143 - { id: 3, class: _ }
148 ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY $r0
149 ; CHECK: [[BITMASK:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
150 ; CHECK: [[XAGAIN:%[0-9]+]]:_(s32) = COPY [[X]]
151 ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_AND [[XAGAIN]], [[BITMASK]]
153 %1(s8) = G_TRUNC %0(s32)
155 ; Check that the operation is performed for 32 bits
156 ; CLZ: [[COUNT:%[0-9]+]]:_(s32) = G_CTLZ
157 ; CLZ-NOT: G_CTLZ_ZERO_UNDEF
158 ; LIBCALLS-NOT: G_CTLZ
159 ; LIBCALLS: ADJCALLSTACKDOWN
160 ; LIBCALLS: $r0 = COPY [[X32]]
161 ; LIBCALLS: BL &__clzsi2, {{.*}}, implicit $r0, implicit-def $r0
162 ; LIBCALLS: [[COUNT:%[0-9]+]]:_(s32) = COPY $r0
163 ; LIBCALLS: ADJCALLSTACKUP
164 ; LIBCALLS-NOT: G_CTLZ
165 ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
166 ; CHECK: [[R32:%[0-9]+]]:_(s32) = G_SUB [[COUNT]], [[BITDIFF]]
167 %2(s8) = G_CTLZ_ZERO_UNDEF %1
169 ; CHECK: [[BITDIFF:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
170 ; CHECK: [[RAGAIN:%[0-9]+]]:_(s32) = COPY [[R32]]
171 ; CHECK: [[SHIFTEDR:%[0-9]+]]:_(s32) = G_SHL [[RAGAIN]], [[BITDIFF]]
172 ; CHECK: [[R:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDR]], [[BITDIFF]]
173 ; CHECK: $r0 = COPY [[R]]
174 %3(s32) = G_SEXT %2(s8)
176 BX_RET 14, $noreg, implicit $r0