@@ -126,6 +126,165 @@ define <4 x i32> @freeze_bitreverse_vec(<4 x i32> %a0) nounwind {
126126}
127127declare <4 x i32 > @llvm.bitreverse.v4i32 (<4 x i32 >)
128128
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+
129288; split parity pattern
130289define i8 @freeze_ctpop (i8 %a0 ) nounwind {
131290; X86-LABEL: freeze_ctpop:
0 commit comments