@@ -126,6 +126,165 @@ define <4 x i32> @freeze_bitreverse_vec(<4 x i32> %a0) nounwind {
126
126
}
127
127
declare <4 x i32 > @llvm.bitreverse.v4i32 (<4 x i32 >)
128
128
129
+ define i32 @freeze_ctlz (i32 %a0 ) nounwind {
130
+ ; X86-LABEL: freeze_ctlz:
131
+ ; X86: # %bb.0:
132
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
133
+ ; X86-NEXT: bsrl %eax, %ecx
134
+ ; X86-NEXT: movl $63, %edx
135
+ ; X86-NEXT: cmovnel %ecx, %edx
136
+ ; X86-NEXT: xorl $31, %edx
137
+ ; X86-NEXT: testl %eax, %eax
138
+ ; X86-NEXT: movl $32, %eax
139
+ ; X86-NEXT: cmovnel %edx, %eax
140
+ ; X86-NEXT: retl
141
+ ;
142
+ ; X64-LABEL: freeze_ctlz:
143
+ ; X64: # %bb.0:
144
+ ; X64-NEXT: movl $63, %ecx
145
+ ; X64-NEXT: bsrl %edi, %ecx
146
+ ; X64-NEXT: xorl $31, %ecx
147
+ ; X64-NEXT: testl %edi, %edi
148
+ ; X64-NEXT: movl $32, %eax
149
+ ; X64-NEXT: cmovnel %ecx, %eax
150
+ ; X64-NEXT: retq
151
+ %x = call i32 @llvm.ctlz.i32 (i32 %a0 , i1 0 )
152
+ %f = freeze i32 %x
153
+ %c = icmp eq i32 %a0 , 0
154
+ %r = select i1 %c , i32 32 , i32 %f
155
+ ret i32 %r
156
+ }
157
+
158
+ define i32 @freeze_ctlz_undef (i32 %a0 ) nounwind {
159
+ ; X86-LABEL: freeze_ctlz_undef:
160
+ ; X86: # %bb.0:
161
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
162
+ ; X86-NEXT: bsrl %eax, %ecx
163
+ ; X86-NEXT: xorl $31, %ecx
164
+ ; X86-NEXT: testl %eax, %eax
165
+ ; X86-NEXT: movl $32, %eax
166
+ ; X86-NEXT: cmovnel %ecx, %eax
167
+ ; X86-NEXT: retl
168
+ ;
169
+ ; X64-LABEL: freeze_ctlz_undef:
170
+ ; X64: # %bb.0:
171
+ ; X64-NEXT: bsrl %edi, %ecx
172
+ ; X64-NEXT: xorl $31, %ecx
173
+ ; X64-NEXT: testl %edi, %edi
174
+ ; X64-NEXT: movl $32, %eax
175
+ ; X64-NEXT: cmovnel %ecx, %eax
176
+ ; X64-NEXT: retq
177
+ %f0 = freeze i32 %a0
178
+ %x = call i32 @llvm.ctlz.i32 (i32 %f0 , i1 -1 )
179
+ %f = freeze i32 %x
180
+ %c = icmp eq i32 %a0 , 0
181
+ %r = select i1 %c , i32 32 , i32 %f
182
+ ret i32 %r
183
+ }
184
+
185
+ define i32 @freeze_ctlz_undef_nonzero (i32 %a0 ) nounwind {
186
+ ; X86-LABEL: freeze_ctlz_undef_nonzero:
187
+ ; X86: # %bb.0:
188
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
189
+ ; X86-NEXT: orl $1, %eax
190
+ ; X86-NEXT: bsrl %eax, %ecx
191
+ ; X86-NEXT: xorl $31, %ecx
192
+ ; X86-NEXT: testl %eax, %eax
193
+ ; X86-NEXT: movl $32, %eax
194
+ ; X86-NEXT: cmovnel %ecx, %eax
195
+ ; X86-NEXT: retl
196
+ ;
197
+ ; X64-LABEL: freeze_ctlz_undef_nonzero:
198
+ ; X64: # %bb.0:
199
+ ; X64-NEXT: orl $1, %edi
200
+ ; X64-NEXT: bsrl %edi, %ecx
201
+ ; X64-NEXT: xorl $31, %ecx
202
+ ; X64-NEXT: testl %edi, %edi
203
+ ; X64-NEXT: movl $32, %eax
204
+ ; X64-NEXT: cmovnel %ecx, %eax
205
+ ; X64-NEXT: retq
206
+ %f0 = freeze i32 %a0
207
+ %y = or i32 %f0 , 1
208
+ %x = call i32 @llvm.ctlz.i32 (i32 %y , i1 -1 )
209
+ %f = freeze i32 %x
210
+ %c = icmp eq i32 %y , 0
211
+ %r = select i1 %c , i32 32 , i32 %f
212
+ ret i32 %r
213
+ }
214
+
215
+ define i32 @freeze_cttz (i32 %a0 ) nounwind {
216
+ ; X86-LABEL: freeze_cttz:
217
+ ; X86: # %bb.0:
218
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
219
+ ; X86-NEXT: bsfl %eax, %eax
220
+ ; X86-NEXT: movl $32, %ecx
221
+ ; X86-NEXT: cmovel %ecx, %eax
222
+ ; X86-NEXT: cmovel %ecx, %eax
223
+ ; X86-NEXT: retl
224
+ ;
225
+ ; X64-LABEL: freeze_cttz:
226
+ ; X64: # %bb.0:
227
+ ; X64-NEXT: movl $32, %ecx
228
+ ; X64-NEXT: movl $32, %eax
229
+ ; X64-NEXT: bsfl %edi, %eax
230
+ ; X64-NEXT: cmovel %ecx, %eax
231
+ ; X64-NEXT: retq
232
+ %x = call i32 @llvm.cttz.i32 (i32 %a0 , i1 0 )
233
+ %f = freeze i32 %x
234
+ %c = icmp eq i32 %a0 , 0
235
+ %r = select i1 %c , i32 32 , i32 %f
236
+ ret i32 %r
237
+ }
238
+
239
+ define i32 @freeze_cttz_undef (i32 %a0 ) nounwind {
240
+ ; X86-LABEL: freeze_cttz_undef:
241
+ ; X86: # %bb.0:
242
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
243
+ ; X86-NEXT: bsfl %eax, %ecx
244
+ ; X86-NEXT: movl $32, %eax
245
+ ; X86-NEXT: cmovnel %ecx, %eax
246
+ ; X86-NEXT: retl
247
+ ;
248
+ ; X64-LABEL: freeze_cttz_undef:
249
+ ; X64: # %bb.0:
250
+ ; X64-NEXT: bsfl %edi, %ecx
251
+ ; X64-NEXT: movl $32, %eax
252
+ ; X64-NEXT: cmovnel %ecx, %eax
253
+ ; X64-NEXT: retq
254
+ %f0 = freeze i32 %a0
255
+ %x = call i32 @llvm.cttz.i32 (i32 %f0 , i1 -1 )
256
+ %f = freeze i32 %x
257
+ %c = icmp eq i32 %a0 , 0
258
+ %r = select i1 %c , i32 32 , i32 %f
259
+ ret i32 %r
260
+ }
261
+
262
+ define i32 @freeze_cttz_undef_nonzero (i32 %a0 ) nounwind {
263
+ ; X86-LABEL: freeze_cttz_undef_nonzero:
264
+ ; X86: # %bb.0:
265
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
266
+ ; X86-NEXT: orl $1, %eax
267
+ ; X86-NEXT: bsfl %eax, %ecx
268
+ ; X86-NEXT: movl $32, %eax
269
+ ; X86-NEXT: cmovnel %ecx, %eax
270
+ ; X86-NEXT: retl
271
+ ;
272
+ ; X64-LABEL: freeze_cttz_undef_nonzero:
273
+ ; X64: # %bb.0:
274
+ ; X64-NEXT: orl $1, %edi
275
+ ; X64-NEXT: bsfl %edi, %ecx
276
+ ; X64-NEXT: movl $32, %eax
277
+ ; X64-NEXT: cmovnel %ecx, %eax
278
+ ; X64-NEXT: retq
279
+ %f0 = freeze i32 %a0
280
+ %y = or i32 %f0 , 1
281
+ %x = call i32 @llvm.cttz.i32 (i32 %y , i1 -1 )
282
+ %f = freeze i32 %x
283
+ %c = icmp eq i32 %y , 0
284
+ %r = select i1 %c , i32 32 , i32 %f
285
+ ret i32 %r
286
+ }
287
+
129
288
; split parity pattern
130
289
define i8 @freeze_ctpop (i8 %a0 ) nounwind {
131
290
; X86-LABEL: freeze_ctpop:
0 commit comments