1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-- -mattr=-bmi | FileCheck %s --check-prefixes=X86,X86-NOBMI
3 ; RUN: llc < %s -mtriple=i686-- -mattr=+bmi | FileCheck %s --check-prefixes=X86,X86-BMI
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=-bmi | FileCheck %s --check-prefixes=X64,X64-NOBMI
5 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+bmi | FileCheck %s --check-prefixes=X64,X64-BMI
7 ; TODO - PR112425 - attempt to reconstruct andnot patterns through bitwise-agnostic operations
9 declare void @use_i64(i64)
10 declare void @use_i32(i32)
13 ; Fold (and X, (rotl (not Y), Z))) -> (and X, (not (rotl Y, Z)))
16 define i64 @andnot_rotl_i64(i64 %a0, i64 %a1, i64 %a2) nounwind {
17 ; X86-NOBMI-LABEL: andnot_rotl_i64:
19 ; X86-NOBMI-NEXT: pushl %esi
20 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
21 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
22 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
23 ; X86-NOBMI-NEXT: testb $32, %cl
24 ; X86-NOBMI-NEXT: jne .LBB0_1
25 ; X86-NOBMI-NEXT: # %bb.2:
26 ; X86-NOBMI-NEXT: movl %eax, %edx
27 ; X86-NOBMI-NEXT: jmp .LBB0_3
28 ; X86-NOBMI-NEXT: .LBB0_1:
29 ; X86-NOBMI-NEXT: movl %esi, %edx
30 ; X86-NOBMI-NEXT: movl %eax, %esi
31 ; X86-NOBMI-NEXT: .LBB0_3:
32 ; X86-NOBMI-NEXT: movl %esi, %eax
33 ; X86-NOBMI-NEXT: shldl %cl, %edx, %eax
34 ; X86-NOBMI-NEXT: notl %eax
35 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
36 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
37 ; X86-NOBMI-NEXT: shldl %cl, %esi, %edx
38 ; X86-NOBMI-NEXT: notl %edx
39 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
40 ; X86-NOBMI-NEXT: popl %esi
41 ; X86-NOBMI-NEXT: retl
43 ; X86-BMI-LABEL: andnot_rotl_i64:
45 ; X86-BMI-NEXT: pushl %esi
46 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %edx
47 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
48 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
49 ; X86-BMI-NEXT: testb $32, %cl
50 ; X86-BMI-NEXT: jne .LBB0_1
51 ; X86-BMI-NEXT: # %bb.2:
52 ; X86-BMI-NEXT: movl %eax, %esi
53 ; X86-BMI-NEXT: jmp .LBB0_3
54 ; X86-BMI-NEXT: .LBB0_1:
55 ; X86-BMI-NEXT: movl %edx, %esi
56 ; X86-BMI-NEXT: movl %eax, %edx
57 ; X86-BMI-NEXT: .LBB0_3:
58 ; X86-BMI-NEXT: movl %edx, %eax
59 ; X86-BMI-NEXT: shldl %cl, %esi, %eax
60 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
61 ; X86-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
62 ; X86-BMI-NEXT: shldl %cl, %edx, %esi
63 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %esi, %edx
64 ; X86-BMI-NEXT: popl %esi
67 ; X64-NOBMI-LABEL: andnot_rotl_i64:
69 ; X64-NOBMI-NEXT: movq %rdx, %rcx
70 ; X64-NOBMI-NEXT: movq %rsi, %rax
71 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
72 ; X64-NOBMI-NEXT: rolq %cl, %rax
73 ; X64-NOBMI-NEXT: notq %rax
74 ; X64-NOBMI-NEXT: andq %rdi, %rax
75 ; X64-NOBMI-NEXT: retq
77 ; X64-BMI-LABEL: andnot_rotl_i64:
79 ; X64-BMI-NEXT: movq %rdx, %rcx
80 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $rcx
81 ; X64-BMI-NEXT: rolq %cl, %rsi
82 ; X64-BMI-NEXT: andnq %rdi, %rsi, %rax
84 %not = xor i64 %a1, -1
85 %rot = tail call i64 @llvm.fshl.i64(i64 %not, i64 %not, i64 %a2)
86 %and = and i64 %rot, %a0
90 define i32 @andnot_rotl_i32(i32 %a0, i32 %a1, i32 %a2) nounwind {
91 ; X86-NOBMI-LABEL: andnot_rotl_i32:
93 ; X86-NOBMI-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
94 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
95 ; X86-NOBMI-NEXT: roll %cl, %eax
96 ; X86-NOBMI-NEXT: notl %eax
97 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
98 ; X86-NOBMI-NEXT: retl
100 ; X86-BMI-LABEL: andnot_rotl_i32:
102 ; X86-BMI-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
103 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
104 ; X86-BMI-NEXT: roll %cl, %eax
105 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
108 ; X64-NOBMI-LABEL: andnot_rotl_i32:
109 ; X64-NOBMI: # %bb.0:
110 ; X64-NOBMI-NEXT: movl %edx, %ecx
111 ; X64-NOBMI-NEXT: movl %esi, %eax
112 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
113 ; X64-NOBMI-NEXT: roll %cl, %eax
114 ; X64-NOBMI-NEXT: notl %eax
115 ; X64-NOBMI-NEXT: andl %edi, %eax
116 ; X64-NOBMI-NEXT: retq
118 ; X64-BMI-LABEL: andnot_rotl_i32:
120 ; X64-BMI-NEXT: movl %edx, %ecx
121 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
122 ; X64-BMI-NEXT: roll %cl, %esi
123 ; X64-BMI-NEXT: andnl %edi, %esi, %eax
125 %not = xor i32 %a1, -1
126 %rot = tail call i32 @llvm.fshl.i32(i32 %not, i32 %not, i32 %a2)
127 %and = and i32 %rot, %a0
131 define i16 @andnot_rotl_i16(i16 %a0, i16 %a1, i16 %a2) nounwind {
132 ; X86-LABEL: andnot_rotl_i16:
134 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
135 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
136 ; X86-NEXT: rolw %cl, %ax
137 ; X86-NEXT: notl %eax
138 ; X86-NEXT: andw {{[0-9]+}}(%esp), %ax
139 ; X86-NEXT: # kill: def $ax killed $ax killed $eax
142 ; X64-NOBMI-LABEL: andnot_rotl_i16:
143 ; X64-NOBMI: # %bb.0:
144 ; X64-NOBMI-NEXT: movl %edx, %ecx
145 ; X64-NOBMI-NEXT: movl %esi, %eax
146 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
147 ; X64-NOBMI-NEXT: rolw %cl, %ax
148 ; X64-NOBMI-NEXT: notl %eax
149 ; X64-NOBMI-NEXT: andl %edi, %eax
150 ; X64-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax
151 ; X64-NOBMI-NEXT: retq
153 ; X64-BMI-LABEL: andnot_rotl_i16:
155 ; X64-BMI-NEXT: movl %edx, %ecx
156 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
157 ; X64-BMI-NEXT: rolw %cl, %si
158 ; X64-BMI-NEXT: andnl %edi, %esi, %eax
159 ; X64-BMI-NEXT: # kill: def $ax killed $ax killed $eax
161 %not = xor i16 %a1, -1
162 %rot = tail call i16 @llvm.fshl.i16(i16 %not, i16 %not, i16 %a2)
163 %and = and i16 %rot, %a0
167 define i8 @andnot_rotl_i8(i8 %a0, i8 %a1, i8 %a2) nounwind {
168 ; X86-LABEL: andnot_rotl_i8:
170 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
171 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
172 ; X86-NEXT: rolb %cl, %al
174 ; X86-NEXT: andb {{[0-9]+}}(%esp), %al
177 ; X64-LABEL: andnot_rotl_i8:
179 ; X64-NEXT: movl %edx, %ecx
180 ; X64-NEXT: movl %esi, %eax
181 ; X64-NEXT: # kill: def $cl killed $cl killed $ecx
182 ; X64-NEXT: rolb %cl, %al
184 ; X64-NEXT: andb %dil, %al
185 ; X64-NEXT: # kill: def $al killed $al killed $eax
187 %not = xor i8 %a1, -1
188 %rot = tail call i8 @llvm.fshl.i8(i8 %not, i8 %not, i8 %a2)
189 %and = and i8 %rot, %a0
193 define i64 @andnot_rotl_i64_multiuse_rot(i64 %a0, i64 %a1, i64 %a2) nounwind {
194 ; X86-LABEL: andnot_rotl_i64_multiuse_rot:
196 ; X86-NEXT: pushl %ebx
197 ; X86-NEXT: pushl %edi
198 ; X86-NEXT: pushl %esi
199 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
200 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
201 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
202 ; X86-NEXT: notl %edx
203 ; X86-NEXT: notl %esi
204 ; X86-NEXT: testb $32, %cl
205 ; X86-NEXT: jne .LBB4_1
207 ; X86-NEXT: movl %esi, %eax
208 ; X86-NEXT: jmp .LBB4_3
210 ; X86-NEXT: movl %edx, %eax
211 ; X86-NEXT: movl %esi, %edx
213 ; X86-NEXT: movl %edx, %ebx
214 ; X86-NEXT: shldl %cl, %eax, %ebx
215 ; X86-NEXT: # kill: def $cl killed $cl killed $ecx
216 ; X86-NEXT: shldl %cl, %edx, %eax
217 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
218 ; X86-NEXT: andl %eax, %esi
219 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
220 ; X86-NEXT: andl %ebx, %edi
221 ; X86-NEXT: pushl %ebx
222 ; X86-NEXT: pushl %eax
223 ; X86-NEXT: calll use_i64@PLT
224 ; X86-NEXT: addl $8, %esp
225 ; X86-NEXT: movl %esi, %eax
226 ; X86-NEXT: movl %edi, %edx
227 ; X86-NEXT: popl %esi
228 ; X86-NEXT: popl %edi
229 ; X86-NEXT: popl %ebx
232 ; X64-LABEL: andnot_rotl_i64_multiuse_rot:
234 ; X64-NEXT: pushq %rbx
235 ; X64-NEXT: movq %rdx, %rcx
236 ; X64-NEXT: movq %rdi, %rbx
237 ; X64-NEXT: notq %rsi
238 ; X64-NEXT: # kill: def $cl killed $cl killed $rcx
239 ; X64-NEXT: rolq %cl, %rsi
240 ; X64-NEXT: andq %rsi, %rbx
241 ; X64-NEXT: movq %rsi, %rdi
242 ; X64-NEXT: callq use_i64@PLT
243 ; X64-NEXT: movq %rbx, %rax
244 ; X64-NEXT: popq %rbx
246 %not = xor i64 %a1, -1
247 %rot = tail call i64 @llvm.fshl.i64(i64 %not, i64 %not, i64 %a2)
248 %and = and i64 %rot, %a0
249 call void @use_i64(i64 %rot)
254 ; Fold (and X, (rotr (not Y), Z))) -> (and X, (not (rotr Y, Z)))
257 define i64 @andnot_rotr_i64(i64 %a0, i64 %a1, i64 %a2) nounwind {
258 ; X86-NOBMI-LABEL: andnot_rotr_i64:
259 ; X86-NOBMI: # %bb.0:
260 ; X86-NOBMI-NEXT: pushl %esi
261 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
262 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
263 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
264 ; X86-NOBMI-NEXT: testb $32, %cl
265 ; X86-NOBMI-NEXT: je .LBB5_1
266 ; X86-NOBMI-NEXT: # %bb.2:
267 ; X86-NOBMI-NEXT: movl %eax, %edx
268 ; X86-NOBMI-NEXT: jmp .LBB5_3
269 ; X86-NOBMI-NEXT: .LBB5_1:
270 ; X86-NOBMI-NEXT: movl %esi, %edx
271 ; X86-NOBMI-NEXT: movl %eax, %esi
272 ; X86-NOBMI-NEXT: .LBB5_3:
273 ; X86-NOBMI-NEXT: movl %esi, %eax
274 ; X86-NOBMI-NEXT: shrdl %cl, %edx, %eax
275 ; X86-NOBMI-NEXT: notl %eax
276 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
277 ; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
278 ; X86-NOBMI-NEXT: shrdl %cl, %esi, %edx
279 ; X86-NOBMI-NEXT: notl %edx
280 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
281 ; X86-NOBMI-NEXT: popl %esi
282 ; X86-NOBMI-NEXT: retl
284 ; X86-BMI-LABEL: andnot_rotr_i64:
286 ; X86-BMI-NEXT: pushl %esi
287 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
288 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %edx
289 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
290 ; X86-BMI-NEXT: testb $32, %cl
291 ; X86-BMI-NEXT: je .LBB5_1
292 ; X86-BMI-NEXT: # %bb.2:
293 ; X86-BMI-NEXT: movl %eax, %esi
294 ; X86-BMI-NEXT: jmp .LBB5_3
295 ; X86-BMI-NEXT: .LBB5_1:
296 ; X86-BMI-NEXT: movl %edx, %esi
297 ; X86-BMI-NEXT: movl %eax, %edx
298 ; X86-BMI-NEXT: .LBB5_3:
299 ; X86-BMI-NEXT: movl %edx, %eax
300 ; X86-BMI-NEXT: shrdl %cl, %esi, %eax
301 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
302 ; X86-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
303 ; X86-BMI-NEXT: shrdl %cl, %edx, %esi
304 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %esi, %edx
305 ; X86-BMI-NEXT: popl %esi
308 ; X64-NOBMI-LABEL: andnot_rotr_i64:
309 ; X64-NOBMI: # %bb.0:
310 ; X64-NOBMI-NEXT: movq %rdx, %rcx
311 ; X64-NOBMI-NEXT: movq %rsi, %rax
312 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
313 ; X64-NOBMI-NEXT: rorq %cl, %rax
314 ; X64-NOBMI-NEXT: notq %rax
315 ; X64-NOBMI-NEXT: andq %rdi, %rax
316 ; X64-NOBMI-NEXT: retq
318 ; X64-BMI-LABEL: andnot_rotr_i64:
320 ; X64-BMI-NEXT: movq %rdx, %rcx
321 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $rcx
322 ; X64-BMI-NEXT: rorq %cl, %rsi
323 ; X64-BMI-NEXT: andnq %rdi, %rsi, %rax
325 %not = xor i64 %a1, -1
326 %rot = tail call i64 @llvm.fshr.i64(i64 %not, i64 %not, i64 %a2)
327 %and = and i64 %rot, %a0
331 define i32 @andnot_rotr_i32(i32 %a0, i32 %a1, i32 %a2) nounwind {
332 ; X86-NOBMI-LABEL: andnot_rotr_i32:
333 ; X86-NOBMI: # %bb.0:
334 ; X86-NOBMI-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
335 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
336 ; X86-NOBMI-NEXT: rorl %cl, %eax
337 ; X86-NOBMI-NEXT: notl %eax
338 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
339 ; X86-NOBMI-NEXT: retl
341 ; X86-BMI-LABEL: andnot_rotr_i32:
343 ; X86-BMI-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
344 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
345 ; X86-BMI-NEXT: rorl %cl, %eax
346 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
349 ; X64-NOBMI-LABEL: andnot_rotr_i32:
350 ; X64-NOBMI: # %bb.0:
351 ; X64-NOBMI-NEXT: movl %edx, %ecx
352 ; X64-NOBMI-NEXT: movl %esi, %eax
353 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
354 ; X64-NOBMI-NEXT: rorl %cl, %eax
355 ; X64-NOBMI-NEXT: notl %eax
356 ; X64-NOBMI-NEXT: andl %edi, %eax
357 ; X64-NOBMI-NEXT: retq
359 ; X64-BMI-LABEL: andnot_rotr_i32:
361 ; X64-BMI-NEXT: movl %edx, %ecx
362 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
363 ; X64-BMI-NEXT: rorl %cl, %esi
364 ; X64-BMI-NEXT: andnl %edi, %esi, %eax
366 %not = xor i32 %a1, -1
367 %rot = tail call i32 @llvm.fshr.i32(i32 %not, i32 %not, i32 %a2)
368 %and = and i32 %rot, %a0
372 define i16 @andnot_rotr_i16(i16 %a0, i16 %a1, i16 %a2) nounwind {
373 ; X86-LABEL: andnot_rotr_i16:
375 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
376 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
377 ; X86-NEXT: rorw %cl, %ax
378 ; X86-NEXT: notl %eax
379 ; X86-NEXT: andw {{[0-9]+}}(%esp), %ax
380 ; X86-NEXT: # kill: def $ax killed $ax killed $eax
383 ; X64-NOBMI-LABEL: andnot_rotr_i16:
384 ; X64-NOBMI: # %bb.0:
385 ; X64-NOBMI-NEXT: movl %edx, %ecx
386 ; X64-NOBMI-NEXT: movl %esi, %eax
387 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
388 ; X64-NOBMI-NEXT: rorw %cl, %ax
389 ; X64-NOBMI-NEXT: notl %eax
390 ; X64-NOBMI-NEXT: andl %edi, %eax
391 ; X64-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax
392 ; X64-NOBMI-NEXT: retq
394 ; X64-BMI-LABEL: andnot_rotr_i16:
396 ; X64-BMI-NEXT: movl %edx, %ecx
397 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
398 ; X64-BMI-NEXT: rorw %cl, %si
399 ; X64-BMI-NEXT: andnl %edi, %esi, %eax
400 ; X64-BMI-NEXT: # kill: def $ax killed $ax killed $eax
402 %not = xor i16 %a1, -1
403 %rot = tail call i16 @llvm.fshr.i16(i16 %not, i16 %not, i16 %a2)
404 %and = and i16 %rot, %a0
408 define i8 @andnot_rotr_i8(i8 %a0, i8 %a1, i8 %a2) nounwind {
409 ; X86-LABEL: andnot_rotr_i8:
411 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
412 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
413 ; X86-NEXT: rorb %cl, %al
415 ; X86-NEXT: andb {{[0-9]+}}(%esp), %al
418 ; X64-LABEL: andnot_rotr_i8:
420 ; X64-NEXT: movl %edx, %ecx
421 ; X64-NEXT: movl %esi, %eax
422 ; X64-NEXT: # kill: def $cl killed $cl killed $ecx
423 ; X64-NEXT: rorb %cl, %al
425 ; X64-NEXT: andb %dil, %al
426 ; X64-NEXT: # kill: def $al killed $al killed $eax
428 %not = xor i8 %a1, -1
429 %rot = tail call i8 @llvm.fshr.i8(i8 %not, i8 %not, i8 %a2)
430 %and = and i8 %rot, %a0
434 define i32 @andnot_rotr_i32_multiuse_not(i32 %a0, i32 %a1, i32 %a2) nounwind {
435 ; X86-NOBMI-LABEL: andnot_rotr_i32_multiuse_not:
436 ; X86-NOBMI: # %bb.0:
437 ; X86-NOBMI-NEXT: pushl %esi
438 ; X86-NOBMI-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
439 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
440 ; X86-NOBMI-NEXT: notl %eax
441 ; X86-NOBMI-NEXT: movl %eax, %esi
442 ; X86-NOBMI-NEXT: rorl %cl, %esi
443 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
444 ; X86-NOBMI-NEXT: pushl %eax
445 ; X86-NOBMI-NEXT: calll use_i32@PLT
446 ; X86-NOBMI-NEXT: addl $4, %esp
447 ; X86-NOBMI-NEXT: movl %esi, %eax
448 ; X86-NOBMI-NEXT: popl %esi
449 ; X86-NOBMI-NEXT: retl
451 ; X86-BMI-LABEL: andnot_rotr_i32_multiuse_not:
453 ; X86-BMI-NEXT: pushl %esi
454 ; X86-BMI-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
455 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
456 ; X86-BMI-NEXT: movl %eax, %edx
457 ; X86-BMI-NEXT: notl %edx
458 ; X86-BMI-NEXT: rorl %cl, %eax
459 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %esi
460 ; X86-BMI-NEXT: pushl %edx
461 ; X86-BMI-NEXT: calll use_i32@PLT
462 ; X86-BMI-NEXT: addl $4, %esp
463 ; X86-BMI-NEXT: movl %esi, %eax
464 ; X86-BMI-NEXT: popl %esi
467 ; X64-NOBMI-LABEL: andnot_rotr_i32_multiuse_not:
468 ; X64-NOBMI: # %bb.0:
469 ; X64-NOBMI-NEXT: pushq %rbx
470 ; X64-NOBMI-NEXT: movl %edx, %ecx
471 ; X64-NOBMI-NEXT: notl %esi
472 ; X64-NOBMI-NEXT: movl %esi, %ebx
473 ; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
474 ; X64-NOBMI-NEXT: rorl %cl, %ebx
475 ; X64-NOBMI-NEXT: andl %edi, %ebx
476 ; X64-NOBMI-NEXT: movl %esi, %edi
477 ; X64-NOBMI-NEXT: callq use_i32@PLT
478 ; X64-NOBMI-NEXT: movl %ebx, %eax
479 ; X64-NOBMI-NEXT: popq %rbx
480 ; X64-NOBMI-NEXT: retq
482 ; X64-BMI-LABEL: andnot_rotr_i32_multiuse_not:
484 ; X64-BMI-NEXT: pushq %rbx
485 ; X64-BMI-NEXT: movl %edx, %ecx
486 ; X64-BMI-NEXT: movl %esi, %eax
487 ; X64-BMI-NEXT: notl %eax
488 ; X64-BMI-NEXT: # kill: def $cl killed $cl killed $ecx
489 ; X64-BMI-NEXT: rorl %cl, %esi
490 ; X64-BMI-NEXT: andnl %edi, %esi, %ebx
491 ; X64-BMI-NEXT: movl %eax, %edi
492 ; X64-BMI-NEXT: callq use_i32@PLT
493 ; X64-BMI-NEXT: movl %ebx, %eax
494 ; X64-BMI-NEXT: popq %rbx
496 %not = xor i32 %a1, -1
497 %rot = tail call i32 @llvm.fshr.i32(i32 %not, i32 %not, i32 %a2)
498 %and = and i32 %rot, %a0
499 call void @use_i32(i32 %not)
504 ; Fold (and X, (bswap (not Y)))) -> (and X, (not (bswap Y)))
507 define i64 @andnot_bswap_i64(i64 %a0, i64 %a1) nounwind {
508 ; X86-NOBMI-LABEL: andnot_bswap_i64:
509 ; X86-NOBMI: # %bb.0:
510 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
511 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
512 ; X86-NOBMI-NEXT: bswapl %eax
513 ; X86-NOBMI-NEXT: notl %eax
514 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
515 ; X86-NOBMI-NEXT: bswapl %edx
516 ; X86-NOBMI-NEXT: notl %edx
517 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
518 ; X86-NOBMI-NEXT: retl
520 ; X86-BMI-LABEL: andnot_bswap_i64:
522 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
523 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
524 ; X86-BMI-NEXT: bswapl %eax
525 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
526 ; X86-BMI-NEXT: bswapl %ecx
527 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %ecx, %edx
530 ; X64-NOBMI-LABEL: andnot_bswap_i64:
531 ; X64-NOBMI: # %bb.0:
532 ; X64-NOBMI-NEXT: movq %rsi, %rax
533 ; X64-NOBMI-NEXT: bswapq %rax
534 ; X64-NOBMI-NEXT: notq %rax
535 ; X64-NOBMI-NEXT: andq %rdi, %rax
536 ; X64-NOBMI-NEXT: retq
538 ; X64-BMI-LABEL: andnot_bswap_i64:
540 ; X64-BMI-NEXT: bswapq %rsi
541 ; X64-BMI-NEXT: andnq %rdi, %rsi, %rax
543 %not = xor i64 %a1, -1
544 %bswap = tail call i64 @llvm.bswap.i64(i64 %not)
545 %and = and i64 %bswap, %a0
549 define i32 @andnot_bswap_i32(i32 %a0, i32 %a1) nounwind {
550 ; X86-NOBMI-LABEL: andnot_bswap_i32:
551 ; X86-NOBMI: # %bb.0:
552 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
553 ; X86-NOBMI-NEXT: bswapl %eax
554 ; X86-NOBMI-NEXT: notl %eax
555 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
556 ; X86-NOBMI-NEXT: retl
558 ; X86-BMI-LABEL: andnot_bswap_i32:
560 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
561 ; X86-BMI-NEXT: bswapl %eax
562 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
565 ; X64-NOBMI-LABEL: andnot_bswap_i32:
566 ; X64-NOBMI: # %bb.0:
567 ; X64-NOBMI-NEXT: movl %esi, %eax
568 ; X64-NOBMI-NEXT: bswapl %eax
569 ; X64-NOBMI-NEXT: notl %eax
570 ; X64-NOBMI-NEXT: andl %edi, %eax
571 ; X64-NOBMI-NEXT: retq
573 ; X64-BMI-LABEL: andnot_bswap_i32:
575 ; X64-BMI-NEXT: bswapl %esi
576 ; X64-BMI-NEXT: andnl %edi, %esi, %eax
578 %not = xor i32 %a1, -1
579 %bswap = tail call i32 @llvm.bswap.i32(i32 %not)
580 %and = and i32 %bswap, %a0
584 define i16 @andnot_bswap_i16(i16 %a0, i16 %a1) nounwind {
585 ; X86-LABEL: andnot_bswap_i16:
587 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
588 ; X86-NEXT: rolw $8, %ax
589 ; X86-NEXT: notl %eax
590 ; X86-NEXT: andw {{[0-9]+}}(%esp), %ax
591 ; X86-NEXT: # kill: def $ax killed $ax killed $eax
594 ; X64-NOBMI-LABEL: andnot_bswap_i16:
595 ; X64-NOBMI: # %bb.0:
596 ; X64-NOBMI-NEXT: movl %esi, %eax
597 ; X64-NOBMI-NEXT: rolw $8, %ax
598 ; X64-NOBMI-NEXT: notl %eax
599 ; X64-NOBMI-NEXT: andl %edi, %eax
600 ; X64-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax
601 ; X64-NOBMI-NEXT: retq
603 ; X64-BMI-LABEL: andnot_bswap_i16:
605 ; X64-BMI-NEXT: rolw $8, %si
606 ; X64-BMI-NEXT: andnl %edi, %esi, %eax
607 ; X64-BMI-NEXT: # kill: def $ax killed $ax killed $eax
609 %not = xor i16 %a1, -1
610 %bswap = tail call i16 @llvm.bswap.i16(i16 %not)
611 %and = and i16 %bswap, %a0
615 define i32 @andnot_bswap_i32_multiuse_bswap(i32 %a0, i32 %a1) nounwind {
616 ; X86-LABEL: andnot_bswap_i32_multiuse_bswap:
618 ; X86-NEXT: pushl %esi
619 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
620 ; X86-NEXT: notl %eax
621 ; X86-NEXT: bswapl %eax
622 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
623 ; X86-NEXT: andl %eax, %esi
624 ; X86-NEXT: pushl %eax
625 ; X86-NEXT: calll use_i32@PLT
626 ; X86-NEXT: addl $4, %esp
627 ; X86-NEXT: movl %esi, %eax
628 ; X86-NEXT: popl %esi
631 ; X64-LABEL: andnot_bswap_i32_multiuse_bswap:
633 ; X64-NEXT: pushq %rbx
634 ; X64-NEXT: movl %edi, %ebx
635 ; X64-NEXT: notl %esi
636 ; X64-NEXT: bswapl %esi
637 ; X64-NEXT: andl %esi, %ebx
638 ; X64-NEXT: movl %esi, %edi
639 ; X64-NEXT: callq use_i32@PLT
640 ; X64-NEXT: movl %ebx, %eax
641 ; X64-NEXT: popq %rbx
643 %not = xor i32 %a1, -1
644 %bswap = tail call i32 @llvm.bswap.i32(i32 %not)
645 %and = and i32 %bswap, %a0
646 call void @use_i32(i32 %bswap)
650 define i32 @andnot_bswap_i32_multiuse_not(i32 %a0, i32 %a1) nounwind {
651 ; X86-NOBMI-LABEL: andnot_bswap_i32_multiuse_not:
652 ; X86-NOBMI: # %bb.0:
653 ; X86-NOBMI-NEXT: pushl %esi
654 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
655 ; X86-NOBMI-NEXT: notl %eax
656 ; X86-NOBMI-NEXT: movl %eax, %esi
657 ; X86-NOBMI-NEXT: bswapl %esi
658 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
659 ; X86-NOBMI-NEXT: pushl %eax
660 ; X86-NOBMI-NEXT: calll use_i32@PLT
661 ; X86-NOBMI-NEXT: addl $4, %esp
662 ; X86-NOBMI-NEXT: movl %esi, %eax
663 ; X86-NOBMI-NEXT: popl %esi
664 ; X86-NOBMI-NEXT: retl
666 ; X86-BMI-LABEL: andnot_bswap_i32_multiuse_not:
668 ; X86-BMI-NEXT: pushl %esi
669 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
670 ; X86-BMI-NEXT: movl %eax, %ecx
671 ; X86-BMI-NEXT: notl %ecx
672 ; X86-BMI-NEXT: bswapl %eax
673 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %esi
674 ; X86-BMI-NEXT: pushl %ecx
675 ; X86-BMI-NEXT: calll use_i32@PLT
676 ; X86-BMI-NEXT: addl $4, %esp
677 ; X86-BMI-NEXT: movl %esi, %eax
678 ; X86-BMI-NEXT: popl %esi
681 ; X64-NOBMI-LABEL: andnot_bswap_i32_multiuse_not:
682 ; X64-NOBMI: # %bb.0:
683 ; X64-NOBMI-NEXT: pushq %rbx
684 ; X64-NOBMI-NEXT: notl %esi
685 ; X64-NOBMI-NEXT: movl %esi, %ebx
686 ; X64-NOBMI-NEXT: bswapl %ebx
687 ; X64-NOBMI-NEXT: andl %edi, %ebx
688 ; X64-NOBMI-NEXT: movl %esi, %edi
689 ; X64-NOBMI-NEXT: callq use_i32@PLT
690 ; X64-NOBMI-NEXT: movl %ebx, %eax
691 ; X64-NOBMI-NEXT: popq %rbx
692 ; X64-NOBMI-NEXT: retq
694 ; X64-BMI-LABEL: andnot_bswap_i32_multiuse_not:
696 ; X64-BMI-NEXT: pushq %rbx
697 ; X64-BMI-NEXT: movl %esi, %eax
698 ; X64-BMI-NEXT: notl %eax
699 ; X64-BMI-NEXT: bswapl %esi
700 ; X64-BMI-NEXT: andnl %edi, %esi, %ebx
701 ; X64-BMI-NEXT: movl %eax, %edi
702 ; X64-BMI-NEXT: callq use_i32@PLT
703 ; X64-BMI-NEXT: movl %ebx, %eax
704 ; X64-BMI-NEXT: popq %rbx
706 %not = xor i32 %a1, -1
707 %bswap = tail call i32 @llvm.bswap.i32(i32 %not)
708 %and = and i32 %bswap, %a0
709 call void @use_i32(i32 %not)
714 ; Fold (and X, (bitreverse (not Y)))) -> (and X, (not (bitreverse Y)))
717 define i64 @andnot_bitreverse_i64(i64 %a0, i64 %a1) nounwind {
718 ; X86-NOBMI-LABEL: andnot_bitreverse_i64:
719 ; X86-NOBMI: # %bb.0:
720 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
721 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
722 ; X86-NOBMI-NEXT: bswapl %eax
723 ; X86-NOBMI-NEXT: movl %eax, %edx
724 ; X86-NOBMI-NEXT: andl $252645135, %edx # imm = 0xF0F0F0F
725 ; X86-NOBMI-NEXT: shll $4, %edx
726 ; X86-NOBMI-NEXT: shrl $4, %eax
727 ; X86-NOBMI-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
728 ; X86-NOBMI-NEXT: orl %edx, %eax
729 ; X86-NOBMI-NEXT: movl %eax, %edx
730 ; X86-NOBMI-NEXT: andl $858993459, %edx # imm = 0x33333333
731 ; X86-NOBMI-NEXT: shrl $2, %eax
732 ; X86-NOBMI-NEXT: andl $858993459, %eax # imm = 0x33333333
733 ; X86-NOBMI-NEXT: leal (%eax,%edx,4), %eax
734 ; X86-NOBMI-NEXT: movl %eax, %edx
735 ; X86-NOBMI-NEXT: andl $1431655765, %edx # imm = 0x55555555
736 ; X86-NOBMI-NEXT: shrl %eax
737 ; X86-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555
738 ; X86-NOBMI-NEXT: leal (%eax,%edx,2), %eax
739 ; X86-NOBMI-NEXT: notl %eax
740 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
741 ; X86-NOBMI-NEXT: bswapl %ecx
742 ; X86-NOBMI-NEXT: movl %ecx, %edx
743 ; X86-NOBMI-NEXT: andl $252645135, %edx # imm = 0xF0F0F0F
744 ; X86-NOBMI-NEXT: shll $4, %edx
745 ; X86-NOBMI-NEXT: shrl $4, %ecx
746 ; X86-NOBMI-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F
747 ; X86-NOBMI-NEXT: orl %edx, %ecx
748 ; X86-NOBMI-NEXT: movl %ecx, %edx
749 ; X86-NOBMI-NEXT: andl $858993459, %edx # imm = 0x33333333
750 ; X86-NOBMI-NEXT: shrl $2, %ecx
751 ; X86-NOBMI-NEXT: andl $858993459, %ecx # imm = 0x33333333
752 ; X86-NOBMI-NEXT: leal (%ecx,%edx,4), %ecx
753 ; X86-NOBMI-NEXT: movl %ecx, %edx
754 ; X86-NOBMI-NEXT: andl $1431655765, %edx # imm = 0x55555555
755 ; X86-NOBMI-NEXT: shrl %ecx
756 ; X86-NOBMI-NEXT: andl $1431655765, %ecx # imm = 0x55555555
757 ; X86-NOBMI-NEXT: leal (%ecx,%edx,2), %edx
758 ; X86-NOBMI-NEXT: notl %edx
759 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
760 ; X86-NOBMI-NEXT: retl
762 ; X86-BMI-LABEL: andnot_bitreverse_i64:
764 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
765 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
766 ; X86-BMI-NEXT: bswapl %eax
767 ; X86-BMI-NEXT: movl %eax, %edx
768 ; X86-BMI-NEXT: andl $252645135, %edx # imm = 0xF0F0F0F
769 ; X86-BMI-NEXT: shll $4, %edx
770 ; X86-BMI-NEXT: shrl $4, %eax
771 ; X86-BMI-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
772 ; X86-BMI-NEXT: orl %edx, %eax
773 ; X86-BMI-NEXT: movl %eax, %edx
774 ; X86-BMI-NEXT: andl $858993459, %edx # imm = 0x33333333
775 ; X86-BMI-NEXT: shrl $2, %eax
776 ; X86-BMI-NEXT: andl $858993459, %eax # imm = 0x33333333
777 ; X86-BMI-NEXT: leal (%eax,%edx,4), %eax
778 ; X86-BMI-NEXT: movl %eax, %edx
779 ; X86-BMI-NEXT: andl $1431655765, %edx # imm = 0x55555555
780 ; X86-BMI-NEXT: shrl %eax
781 ; X86-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555
782 ; X86-BMI-NEXT: leal (%eax,%edx,2), %eax
783 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
784 ; X86-BMI-NEXT: bswapl %ecx
785 ; X86-BMI-NEXT: movl %ecx, %edx
786 ; X86-BMI-NEXT: andl $252645135, %edx # imm = 0xF0F0F0F
787 ; X86-BMI-NEXT: shll $4, %edx
788 ; X86-BMI-NEXT: shrl $4, %ecx
789 ; X86-BMI-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F
790 ; X86-BMI-NEXT: orl %edx, %ecx
791 ; X86-BMI-NEXT: movl %ecx, %edx
792 ; X86-BMI-NEXT: andl $858993459, %edx # imm = 0x33333333
793 ; X86-BMI-NEXT: shrl $2, %ecx
794 ; X86-BMI-NEXT: andl $858993459, %ecx # imm = 0x33333333
795 ; X86-BMI-NEXT: leal (%ecx,%edx,4), %ecx
796 ; X86-BMI-NEXT: movl %ecx, %edx
797 ; X86-BMI-NEXT: andl $1431655765, %edx # imm = 0x55555555
798 ; X86-BMI-NEXT: shrl %ecx
799 ; X86-BMI-NEXT: andl $1431655765, %ecx # imm = 0x55555555
800 ; X86-BMI-NEXT: leal (%ecx,%edx,2), %ecx
801 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %ecx, %edx
804 ; X64-NOBMI-LABEL: andnot_bitreverse_i64:
805 ; X64-NOBMI: # %bb.0:
806 ; X64-NOBMI-NEXT: bswapq %rsi
807 ; X64-NOBMI-NEXT: movq %rsi, %rax
808 ; X64-NOBMI-NEXT: shrq $4, %rax
809 ; X64-NOBMI-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
810 ; X64-NOBMI-NEXT: andq %rcx, %rax
811 ; X64-NOBMI-NEXT: andq %rcx, %rsi
812 ; X64-NOBMI-NEXT: shlq $4, %rsi
813 ; X64-NOBMI-NEXT: orq %rax, %rsi
814 ; X64-NOBMI-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
815 ; X64-NOBMI-NEXT: movq %rsi, %rcx
816 ; X64-NOBMI-NEXT: andq %rax, %rcx
817 ; X64-NOBMI-NEXT: shrq $2, %rsi
818 ; X64-NOBMI-NEXT: andq %rax, %rsi
819 ; X64-NOBMI-NEXT: leaq (%rsi,%rcx,4), %rax
820 ; X64-NOBMI-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
821 ; X64-NOBMI-NEXT: movq %rax, %rdx
822 ; X64-NOBMI-NEXT: andq %rcx, %rdx
823 ; X64-NOBMI-NEXT: shrq %rax
824 ; X64-NOBMI-NEXT: andq %rcx, %rax
825 ; X64-NOBMI-NEXT: leaq (%rax,%rdx,2), %rax
826 ; X64-NOBMI-NEXT: notq %rax
827 ; X64-NOBMI-NEXT: andq %rdi, %rax
828 ; X64-NOBMI-NEXT: retq
830 ; X64-BMI-LABEL: andnot_bitreverse_i64:
832 ; X64-BMI-NEXT: bswapq %rsi
833 ; X64-BMI-NEXT: movq %rsi, %rax
834 ; X64-BMI-NEXT: shrq $4, %rax
835 ; X64-BMI-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F
836 ; X64-BMI-NEXT: andq %rcx, %rax
837 ; X64-BMI-NEXT: andq %rcx, %rsi
838 ; X64-BMI-NEXT: shlq $4, %rsi
839 ; X64-BMI-NEXT: orq %rax, %rsi
840 ; X64-BMI-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
841 ; X64-BMI-NEXT: movq %rsi, %rcx
842 ; X64-BMI-NEXT: andq %rax, %rcx
843 ; X64-BMI-NEXT: shrq $2, %rsi
844 ; X64-BMI-NEXT: andq %rax, %rsi
845 ; X64-BMI-NEXT: leaq (%rsi,%rcx,4), %rax
846 ; X64-BMI-NEXT: movabsq $6148914691236517205, %rcx # imm = 0x5555555555555555
847 ; X64-BMI-NEXT: movq %rax, %rdx
848 ; X64-BMI-NEXT: andq %rcx, %rdx
849 ; X64-BMI-NEXT: shrq %rax
850 ; X64-BMI-NEXT: andq %rcx, %rax
851 ; X64-BMI-NEXT: leaq (%rax,%rdx,2), %rax
852 ; X64-BMI-NEXT: andnq %rdi, %rax, %rax
854 %not = xor i64 %a1, -1
855 %bitrev = tail call i64 @llvm.bitreverse.i64(i64 %not)
856 %and = and i64 %bitrev, %a0
860 define i32 @andnot_bitreverse_i32(i32 %a0, i32 %a1) nounwind {
861 ; X86-NOBMI-LABEL: andnot_bitreverse_i32:
862 ; X86-NOBMI: # %bb.0:
863 ; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
864 ; X86-NOBMI-NEXT: bswapl %eax
865 ; X86-NOBMI-NEXT: movl %eax, %ecx
866 ; X86-NOBMI-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F
867 ; X86-NOBMI-NEXT: shll $4, %ecx
868 ; X86-NOBMI-NEXT: shrl $4, %eax
869 ; X86-NOBMI-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
870 ; X86-NOBMI-NEXT: orl %ecx, %eax
871 ; X86-NOBMI-NEXT: movl %eax, %ecx
872 ; X86-NOBMI-NEXT: andl $858993459, %ecx # imm = 0x33333333
873 ; X86-NOBMI-NEXT: shrl $2, %eax
874 ; X86-NOBMI-NEXT: andl $858993459, %eax # imm = 0x33333333
875 ; X86-NOBMI-NEXT: leal (%eax,%ecx,4), %eax
876 ; X86-NOBMI-NEXT: movl %eax, %ecx
877 ; X86-NOBMI-NEXT: andl $1431655765, %ecx # imm = 0x55555555
878 ; X86-NOBMI-NEXT: shrl %eax
879 ; X86-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555
880 ; X86-NOBMI-NEXT: leal (%eax,%ecx,2), %eax
881 ; X86-NOBMI-NEXT: notl %eax
882 ; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
883 ; X86-NOBMI-NEXT: retl
885 ; X86-BMI-LABEL: andnot_bitreverse_i32:
887 ; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %eax
888 ; X86-BMI-NEXT: bswapl %eax
889 ; X86-BMI-NEXT: movl %eax, %ecx
890 ; X86-BMI-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F
891 ; X86-BMI-NEXT: shll $4, %ecx
892 ; X86-BMI-NEXT: shrl $4, %eax
893 ; X86-BMI-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
894 ; X86-BMI-NEXT: orl %ecx, %eax
895 ; X86-BMI-NEXT: movl %eax, %ecx
896 ; X86-BMI-NEXT: andl $858993459, %ecx # imm = 0x33333333
897 ; X86-BMI-NEXT: shrl $2, %eax
898 ; X86-BMI-NEXT: andl $858993459, %eax # imm = 0x33333333
899 ; X86-BMI-NEXT: leal (%eax,%ecx,4), %eax
900 ; X86-BMI-NEXT: movl %eax, %ecx
901 ; X86-BMI-NEXT: andl $1431655765, %ecx # imm = 0x55555555
902 ; X86-BMI-NEXT: shrl %eax
903 ; X86-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555
904 ; X86-BMI-NEXT: leal (%eax,%ecx,2), %eax
905 ; X86-BMI-NEXT: andnl {{[0-9]+}}(%esp), %eax, %eax
908 ; X64-NOBMI-LABEL: andnot_bitreverse_i32:
909 ; X64-NOBMI: # %bb.0:
910 ; X64-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi
911 ; X64-NOBMI-NEXT: bswapl %esi
912 ; X64-NOBMI-NEXT: movl %esi, %eax
913 ; X64-NOBMI-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
914 ; X64-NOBMI-NEXT: shll $4, %eax
915 ; X64-NOBMI-NEXT: shrl $4, %esi
916 ; X64-NOBMI-NEXT: andl $252645135, %esi # imm = 0xF0F0F0F
917 ; X64-NOBMI-NEXT: orl %eax, %esi
918 ; X64-NOBMI-NEXT: movl %esi, %eax
919 ; X64-NOBMI-NEXT: andl $858993459, %eax # imm = 0x33333333
920 ; X64-NOBMI-NEXT: shrl $2, %esi
921 ; X64-NOBMI-NEXT: andl $858993459, %esi # imm = 0x33333333
922 ; X64-NOBMI-NEXT: leal (%rsi,%rax,4), %eax
923 ; X64-NOBMI-NEXT: movl %eax, %ecx
924 ; X64-NOBMI-NEXT: andl $1431655765, %ecx # imm = 0x55555555
925 ; X64-NOBMI-NEXT: shrl %eax
926 ; X64-NOBMI-NEXT: andl $1431655765, %eax # imm = 0x55555555
927 ; X64-NOBMI-NEXT: leal (%rax,%rcx,2), %eax
928 ; X64-NOBMI-NEXT: notl %eax
929 ; X64-NOBMI-NEXT: andl %edi, %eax
930 ; X64-NOBMI-NEXT: retq
932 ; X64-BMI-LABEL: andnot_bitreverse_i32:
934 ; X64-BMI-NEXT: # kill: def $esi killed $esi def $rsi
935 ; X64-BMI-NEXT: bswapl %esi
936 ; X64-BMI-NEXT: movl %esi, %eax
937 ; X64-BMI-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F
938 ; X64-BMI-NEXT: shll $4, %eax
939 ; X64-BMI-NEXT: shrl $4, %esi
940 ; X64-BMI-NEXT: andl $252645135, %esi # imm = 0xF0F0F0F
941 ; X64-BMI-NEXT: orl %eax, %esi
942 ; X64-BMI-NEXT: movl %esi, %eax
943 ; X64-BMI-NEXT: andl $858993459, %eax # imm = 0x33333333
944 ; X64-BMI-NEXT: shrl $2, %esi
945 ; X64-BMI-NEXT: andl $858993459, %esi # imm = 0x33333333
946 ; X64-BMI-NEXT: leal (%rsi,%rax,4), %eax
947 ; X64-BMI-NEXT: movl %eax, %ecx
948 ; X64-BMI-NEXT: andl $1431655765, %ecx # imm = 0x55555555
949 ; X64-BMI-NEXT: shrl %eax
950 ; X64-BMI-NEXT: andl $1431655765, %eax # imm = 0x55555555
951 ; X64-BMI-NEXT: leal (%rax,%rcx,2), %eax
952 ; X64-BMI-NEXT: andnl %edi, %eax, %eax
954 %not = xor i32 %a1, -1
955 %bitrev = tail call i32 @llvm.bitreverse.i32(i32 %not)
956 %and = and i32 %bitrev, %a0
960 define i16 @andnot_bitreverse_i16(i16 %a0, i16 %a1) nounwind {
961 ; X86-LABEL: andnot_bitreverse_i16:
963 ; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
964 ; X86-NEXT: rolw $8, %ax
965 ; X86-NEXT: movl %eax, %ecx
966 ; X86-NEXT: andl $3855, %ecx # imm = 0xF0F
967 ; X86-NEXT: shll $4, %ecx
968 ; X86-NEXT: shrl $4, %eax
969 ; X86-NEXT: andl $3855, %eax # imm = 0xF0F
970 ; X86-NEXT: orl %ecx, %eax
971 ; X86-NEXT: movl %eax, %ecx
972 ; X86-NEXT: andl $13107, %ecx # imm = 0x3333
973 ; X86-NEXT: shrl $2, %eax
974 ; X86-NEXT: andl $13107, %eax # imm = 0x3333
975 ; X86-NEXT: leal (%eax,%ecx,4), %eax
976 ; X86-NEXT: movl %eax, %ecx
977 ; X86-NEXT: andl $21845, %ecx # imm = 0x5555
978 ; X86-NEXT: shrl %eax
979 ; X86-NEXT: andl $21845, %eax # imm = 0x5555
980 ; X86-NEXT: leal (%eax,%ecx,2), %eax
981 ; X86-NEXT: notl %eax
982 ; X86-NEXT: andw {{[0-9]+}}(%esp), %ax
983 ; X86-NEXT: # kill: def $ax killed $ax killed $eax
986 ; X64-NOBMI-LABEL: andnot_bitreverse_i16:
987 ; X64-NOBMI: # %bb.0:
988 ; X64-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi
989 ; X64-NOBMI-NEXT: rolw $8, %si
990 ; X64-NOBMI-NEXT: movl %esi, %eax
991 ; X64-NOBMI-NEXT: andl $3855, %eax # imm = 0xF0F
992 ; X64-NOBMI-NEXT: shll $4, %eax
993 ; X64-NOBMI-NEXT: shrl $4, %esi
994 ; X64-NOBMI-NEXT: andl $3855, %esi # imm = 0xF0F
995 ; X64-NOBMI-NEXT: orl %eax, %esi
996 ; X64-NOBMI-NEXT: movl %esi, %eax
997 ; X64-NOBMI-NEXT: andl $13107, %eax # imm = 0x3333
998 ; X64-NOBMI-NEXT: shrl $2, %esi
999 ; X64-NOBMI-NEXT: andl $13107, %esi # imm = 0x3333
1000 ; X64-NOBMI-NEXT: leal (%rsi,%rax,4), %eax
1001 ; X64-NOBMI-NEXT: movl %eax, %ecx
1002 ; X64-NOBMI-NEXT: andl $21845, %ecx # imm = 0x5555
1003 ; X64-NOBMI-NEXT: shrl %eax
1004 ; X64-NOBMI-NEXT: andl $21845, %eax # imm = 0x5555
1005 ; X64-NOBMI-NEXT: leal (%rax,%rcx,2), %eax
1006 ; X64-NOBMI-NEXT: notl %eax
1007 ; X64-NOBMI-NEXT: andl %edi, %eax
1008 ; X64-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax
1009 ; X64-NOBMI-NEXT: retq
1011 ; X64-BMI-LABEL: andnot_bitreverse_i16:
1013 ; X64-BMI-NEXT: # kill: def $esi killed $esi def $rsi
1014 ; X64-BMI-NEXT: rolw $8, %si
1015 ; X64-BMI-NEXT: movl %esi, %eax
1016 ; X64-BMI-NEXT: andl $3855, %eax # imm = 0xF0F
1017 ; X64-BMI-NEXT: shll $4, %eax
1018 ; X64-BMI-NEXT: shrl $4, %esi
1019 ; X64-BMI-NEXT: andl $3855, %esi # imm = 0xF0F
1020 ; X64-BMI-NEXT: orl %eax, %esi
1021 ; X64-BMI-NEXT: movl %esi, %eax
1022 ; X64-BMI-NEXT: andl $13107, %eax # imm = 0x3333
1023 ; X64-BMI-NEXT: shrl $2, %esi
1024 ; X64-BMI-NEXT: andl $13107, %esi # imm = 0x3333
1025 ; X64-BMI-NEXT: leal (%rsi,%rax,4), %eax
1026 ; X64-BMI-NEXT: movl %eax, %ecx
1027 ; X64-BMI-NEXT: andl $21845, %ecx # imm = 0x5555
1028 ; X64-BMI-NEXT: shrl %eax
1029 ; X64-BMI-NEXT: andl $21845, %eax # imm = 0x5555
1030 ; X64-BMI-NEXT: leal (%rax,%rcx,2), %eax
1031 ; X64-BMI-NEXT: andnl %edi, %eax, %eax
1032 ; X64-BMI-NEXT: # kill: def $ax killed $ax killed $eax
1033 ; X64-BMI-NEXT: retq
1034 %not = xor i16 %a1, -1
1035 %bitrev = tail call i16 @llvm.bitreverse.i16(i16 %not)
1036 %and = and i16 %bitrev, %a0
1040 define i8 @andnot_bitreverse_i8(i8 %a0, i8 %a1) nounwind {
1041 ; X86-LABEL: andnot_bitreverse_i8:
1043 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
1044 ; X86-NEXT: rolb $4, %al
1045 ; X86-NEXT: movl %eax, %ecx
1046 ; X86-NEXT: andb $51, %cl
1047 ; X86-NEXT: shlb $2, %cl
1048 ; X86-NEXT: shrb $2, %al
1049 ; X86-NEXT: andb $51, %al
1050 ; X86-NEXT: orb %cl, %al
1051 ; X86-NEXT: movl %eax, %ecx
1052 ; X86-NEXT: andb $85, %cl
1053 ; X86-NEXT: addb %cl, %cl
1054 ; X86-NEXT: shrb %al
1055 ; X86-NEXT: andb $85, %al
1056 ; X86-NEXT: orb %cl, %al
1057 ; X86-NEXT: notb %al
1058 ; X86-NEXT: andb {{[0-9]+}}(%esp), %al
1061 ; X64-LABEL: andnot_bitreverse_i8:
1063 ; X64-NEXT: rolb $4, %sil
1064 ; X64-NEXT: movl %esi, %eax
1065 ; X64-NEXT: andb $51, %al
1066 ; X64-NEXT: shlb $2, %al
1067 ; X64-NEXT: shrb $2, %sil
1068 ; X64-NEXT: andb $51, %sil
1069 ; X64-NEXT: orb %sil, %al
1070 ; X64-NEXT: movl %eax, %ecx
1071 ; X64-NEXT: andb $85, %cl
1072 ; X64-NEXT: addb %cl, %cl
1073 ; X64-NEXT: shrb %al
1074 ; X64-NEXT: andb $85, %al
1075 ; X64-NEXT: orb %cl, %al
1076 ; X64-NEXT: notb %al
1077 ; X64-NEXT: andb %dil, %al
1079 %not = xor i8 %a1, -1
1080 %bitrev = tail call i8 @llvm.bitreverse.i8(i8 %not)
1081 %and = and i8 %bitrev, %a0