summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/extract-lowbits.ll
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2018-10-30 11:12:29 +0000
committerRoman Lebedev <lebedev.ri@gmail.com>2018-10-30 11:12:29 +0000
commit9ffca9b83c191d5fa190f52e275e7e4019668d65 (patch)
treeb889b48406e9d36d8efa56aa63922d4b376bd698 /llvm/test/CodeGen/X86/extract-lowbits.ll
parent4f343547bae133bae0003889f9453e6c4db881ab (diff)
downloadbcm5719-llvm-9ffca9b83c191d5fa190f52e275e7e4019668d65.tar.gz
bcm5719-llvm-9ffca9b83c191d5fa190f52e275e7e4019668d65.zip
[X86] Add extra-uses on the mask of pattern c of extract-{low,}bits.ll tests
Summary: Because of the D48768, that pattern is always unfolded into pattern d, thus we had no test coverage. Reviewers: RKSimon, craig.topper Reviewed By: craig.topper Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D53574 llvm-svn: 345583
Diffstat (limited to 'llvm/test/CodeGen/X86/extract-lowbits.ll')
-rw-r--r--llvm/test/CodeGen/X86/extract-lowbits.ll1083
1 files changed, 873 insertions, 210 deletions
diff --git a/llvm/test/CodeGen/X86/extract-lowbits.ll b/llvm/test/CodeGen/X86/extract-lowbits.ll
index 59865538585..8d18f29d332 100644
--- a/llvm/test/CodeGen/X86/extract-lowbits.ll
+++ b/llvm/test/CodeGen/X86/extract-lowbits.ll
@@ -1428,52 +1428,119 @@ define i64 @bzhi64_b4_commutative(i64 %val, i64 %numlowbits) nounwind {
; Pattern c. 32-bit
; ---------------------------------------------------------------------------- ;
+declare void @use32(i32)
+
define i32 @bzhi32_c0(i32 %val, i32 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi32_c0:
; X86-NOBMI: # %bb.0:
-; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: subl $8, %esp
; X86-NOBMI-NEXT: xorl %ecx, %ecx
; X86-NOBMI-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-NOBMI-NEXT: shll %cl, %eax
+; X86-NOBMI-NEXT: movl $-1, %esi
; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NOBMI-NEXT: shrl %cl, %eax
+; X86-NOBMI-NEXT: shrl %cl, %esi
+; X86-NOBMI-NEXT: movl %esi, (%esp)
+; X86-NOBMI-NEXT: calll use32
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: addl $8, %esp
+; X86-NOBMI-NEXT: popl %esi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi32_c0:
; X86-BMI1NOTBM: # %bb.0:
-; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: shll $8, %eax
-; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
+; X86-BMI1NOTBM-NEXT: subl {{[0-9]+}}(%esp), %ecx
+; X86-BMI1NOTBM-NEXT: movl $-1, %esi
+; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
+; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
+; X86-BMI1NOTBM-NEXT: calll use32
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: addl $8, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi32_c0:
; X86-BMI1BMI2: # %bb.0:
-; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-BMI1BMI2-NEXT: bzhil %eax, {{[0-9]+}}(%esp), %eax
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: negl %eax
+; X86-BMI1BMI2-NEXT: movl $-1, %ecx
+; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
+; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
+; X86-BMI1BMI2-NEXT: calll use32
+; X86-BMI1BMI2-NEXT: bzhil %esi, {{[0-9]+}}(%esp), %eax
+; X86-BMI1BMI2-NEXT: addl $8, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi32_c0:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbp
+; X64-NOBMI-NEXT: pushq %rbx
+; X64-NOBMI-NEXT: pushq %rax
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movl %edi, %eax
+; X64-NOBMI-NEXT: movl %edi, %ebx
; X64-NOBMI-NEXT: negl %ecx
-; X64-NOBMI-NEXT: shll %cl, %eax
+; X64-NOBMI-NEXT: movl $-1, %ebp
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X64-NOBMI-NEXT: shrl %cl, %eax
+; X64-NOBMI-NEXT: shrl %cl, %ebp
+; X64-NOBMI-NEXT: movl %ebp, %edi
+; X64-NOBMI-NEXT: callq use32
+; X64-NOBMI-NEXT: andl %ebx, %ebp
+; X64-NOBMI-NEXT: movl %ebp, %eax
+; X64-NOBMI-NEXT: addq $8, %rsp
+; X64-NOBMI-NEXT: popq %rbx
+; X64-NOBMI-NEXT: popq %rbp
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi32_c0:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shll $8, %esi
-; X64-BMI1NOTBM-NEXT: bextrl %esi, %edi, %eax
+; X64-BMI1NOTBM-NEXT: pushq %rbp
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: pushq %rax
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: movl %edi, %ebx
+; X64-BMI1NOTBM-NEXT: negl %ecx
+; X64-BMI1NOTBM-NEXT: movl $-1, %ebp
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
+; X64-BMI1NOTBM-NEXT: movl %ebp, %edi
+; X64-BMI1NOTBM-NEXT: callq use32
+; X64-BMI1NOTBM-NEXT: andl %ebx, %ebp
+; X64-BMI1NOTBM-NEXT: movl %ebp, %eax
+; X64-BMI1NOTBM-NEXT: addq $8, %rsp
+; X64-BMI1NOTBM-NEXT: popq %rbx
+; X64-BMI1NOTBM-NEXT: popq %rbp
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi32_c0:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhil %esi, %edi, %eax
+; X64-BMI1BMI2-NEXT: pushq %rbp
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: pushq %rax
+; X64-BMI1BMI2-NEXT: movl %esi, %ebx
+; X64-BMI1BMI2-NEXT: movl %edi, %ebp
+; X64-BMI1BMI2-NEXT: movl %esi, %eax
+; X64-BMI1BMI2-NEXT: negl %eax
+; X64-BMI1BMI2-NEXT: movl $-1, %ecx
+; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
+; X64-BMI1BMI2-NEXT: callq use32
+; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
+; X64-BMI1BMI2-NEXT: addq $8, %rsp
+; X64-BMI1BMI2-NEXT: popq %rbx
+; X64-BMI1BMI2-NEXT: popq %rbp
; X64-BMI1BMI2-NEXT: retq
%numhighbits = sub i32 32, %numlowbits
%mask = lshr i32 -1, %numhighbits
+ call void @use32(i32 %mask)
%masked = and i32 %mask, %val
ret i32 %masked
}
@@ -1481,50 +1548,115 @@ define i32 @bzhi32_c0(i32 %val, i32 %numlowbits) nounwind {
define i32 @bzhi32_c1_indexzext(i32 %val, i8 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi32_c1_indexzext:
; X86-NOBMI: # %bb.0:
-; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: subl $8, %esp
; X86-NOBMI-NEXT: xorl %ecx, %ecx
; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
-; X86-NOBMI-NEXT: shll %cl, %eax
+; X86-NOBMI-NEXT: movl $-1, %esi
; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NOBMI-NEXT: shrl %cl, %eax
+; X86-NOBMI-NEXT: shrl %cl, %esi
+; X86-NOBMI-NEXT: movl %esi, (%esp)
+; X86-NOBMI-NEXT: calll use32
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: addl $8, %esp
+; X86-NOBMI-NEXT: popl %esi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi32_c1_indexzext:
; X86-BMI1NOTBM: # %bb.0:
-; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al
-; X86-BMI1NOTBM-NEXT: shll $8, %eax
-; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
+; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
+; X86-BMI1NOTBM-NEXT: movl $-1, %esi
+; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
+; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
+; X86-BMI1NOTBM-NEXT: calll use32
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: addl $8, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi32_c1_indexzext:
; X86-BMI1BMI2: # %bb.0:
-; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %al
-; X86-BMI1BMI2-NEXT: bzhil %eax, {{[0-9]+}}(%esp), %eax
+; X86-BMI1BMI2-NEXT: pushl %ebx
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %bl
+; X86-BMI1BMI2-NEXT: movl %ebx, %eax
+; X86-BMI1BMI2-NEXT: negb %al
+; X86-BMI1BMI2-NEXT: movl $-1, %ecx
+; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
+; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
+; X86-BMI1BMI2-NEXT: calll use32
+; X86-BMI1BMI2-NEXT: bzhil %ebx, {{[0-9]+}}(%esp), %eax
+; X86-BMI1BMI2-NEXT: addl $8, %esp
+; X86-BMI1BMI2-NEXT: popl %ebx
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi32_c1_indexzext:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbp
+; X64-NOBMI-NEXT: pushq %rbx
+; X64-NOBMI-NEXT: pushq %rax
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movl %edi, %eax
+; X64-NOBMI-NEXT: movl %edi, %ebx
; X64-NOBMI-NEXT: negb %cl
-; X64-NOBMI-NEXT: shll %cl, %eax
+; X64-NOBMI-NEXT: movl $-1, %ebp
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X64-NOBMI-NEXT: shrl %cl, %eax
+; X64-NOBMI-NEXT: shrl %cl, %ebp
+; X64-NOBMI-NEXT: movl %ebp, %edi
+; X64-NOBMI-NEXT: callq use32
+; X64-NOBMI-NEXT: andl %ebx, %ebp
+; X64-NOBMI-NEXT: movl %ebp, %eax
+; X64-NOBMI-NEXT: addq $8, %rsp
+; X64-NOBMI-NEXT: popq %rbx
+; X64-NOBMI-NEXT: popq %rbp
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi32_c1_indexzext:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shll $8, %esi
-; X64-BMI1NOTBM-NEXT: bextrl %esi, %edi, %eax
+; X64-BMI1NOTBM-NEXT: pushq %rbp
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: pushq %rax
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: movl %edi, %ebx
+; X64-BMI1NOTBM-NEXT: negb %cl
+; X64-BMI1NOTBM-NEXT: movl $-1, %ebp
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
+; X64-BMI1NOTBM-NEXT: movl %ebp, %edi
+; X64-BMI1NOTBM-NEXT: callq use32
+; X64-BMI1NOTBM-NEXT: andl %ebx, %ebp
+; X64-BMI1NOTBM-NEXT: movl %ebp, %eax
+; X64-BMI1NOTBM-NEXT: addq $8, %rsp
+; X64-BMI1NOTBM-NEXT: popq %rbx
+; X64-BMI1NOTBM-NEXT: popq %rbp
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi32_c1_indexzext:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhil %esi, %edi, %eax
+; X64-BMI1BMI2-NEXT: pushq %rbp
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: pushq %rax
+; X64-BMI1BMI2-NEXT: movl %esi, %ebx
+; X64-BMI1BMI2-NEXT: movl %edi, %ebp
+; X64-BMI1BMI2-NEXT: movl %ebx, %eax
+; X64-BMI1BMI2-NEXT: negb %al
+; X64-BMI1BMI2-NEXT: movl $-1, %ecx
+; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
+; X64-BMI1BMI2-NEXT: callq use32
+; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
+; X64-BMI1BMI2-NEXT: addq $8, %rsp
+; X64-BMI1BMI2-NEXT: popq %rbx
+; X64-BMI1BMI2-NEXT: popq %rbp
; X64-BMI1BMI2-NEXT: retq
%numhighbits = sub i8 32, %numlowbits
%sh_prom = zext i8 %numhighbits to i32
%mask = lshr i32 -1, %sh_prom
+ call void @use32(i32 %mask)
%masked = and i32 %mask, %val
ret i32 %masked
}
@@ -1532,53 +1664,106 @@ define i32 @bzhi32_c1_indexzext(i32 %val, i8 %numlowbits) nounwind {
define i32 @bzhi32_c2_load(i32* %w, i32 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi32_c2_load:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: subl $8, %esp
; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NOBMI-NEXT: movl (%eax), %eax
; X86-NOBMI-NEXT: xorl %ecx, %ecx
; X86-NOBMI-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-NOBMI-NEXT: shll %cl, %eax
+; X86-NOBMI-NEXT: movl $-1, %edx
; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NOBMI-NEXT: shrl %cl, %eax
+; X86-NOBMI-NEXT: shrl %cl, %edx
+; X86-NOBMI-NEXT: movl (%eax), %esi
+; X86-NOBMI-NEXT: andl %edx, %esi
+; X86-NOBMI-NEXT: movl %edx, (%esp)
+; X86-NOBMI-NEXT: calll use32
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: addl $8, %esp
+; X86-NOBMI-NEXT: popl %esi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi32_c2_load:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1NOTBM-NEXT: shll $8, %ecx
-; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax
+; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
+; X86-BMI1NOTBM-NEXT: subl {{[0-9]+}}(%esp), %ecx
+; X86-BMI1NOTBM-NEXT: movl $-1, %edx
+; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
+; X86-BMI1NOTBM-NEXT: movl (%eax), %esi
+; X86-BMI1NOTBM-NEXT: andl %edx, %esi
+; X86-BMI1NOTBM-NEXT: movl %edx, (%esp)
+; X86-BMI1NOTBM-NEXT: calll use32
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: addl $8, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi32_c2_load:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: subl $8, %esp
; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1BMI2-NEXT: bzhil %eax, (%ecx), %eax
+; X86-BMI1BMI2-NEXT: bzhil %ecx, (%eax), %esi
+; X86-BMI1BMI2-NEXT: negl %ecx
+; X86-BMI1BMI2-NEXT: movl $-1, %eax
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %eax
+; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
+; X86-BMI1BMI2-NEXT: calll use32
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: addl $8, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi32_c2_load:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbx
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movl (%rdi), %eax
; X64-NOBMI-NEXT: negl %ecx
-; X64-NOBMI-NEXT: shll %cl, %eax
+; X64-NOBMI-NEXT: movl $-1, %eax
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
; X64-NOBMI-NEXT: shrl %cl, %eax
+; X64-NOBMI-NEXT: movl (%rdi), %ebx
+; X64-NOBMI-NEXT: andl %eax, %ebx
+; X64-NOBMI-NEXT: movl %eax, %edi
+; X64-NOBMI-NEXT: callq use32
+; X64-NOBMI-NEXT: movl %ebx, %eax
+; X64-NOBMI-NEXT: popq %rbx
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi32_c2_load:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shll $8, %esi
-; X64-BMI1NOTBM-NEXT: bextrl %esi, (%rdi), %eax
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: negl %ecx
+; X64-BMI1NOTBM-NEXT: movl $-1, %eax
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrl %cl, %eax
+; X64-BMI1NOTBM-NEXT: movl (%rdi), %ebx
+; X64-BMI1NOTBM-NEXT: andl %eax, %ebx
+; X64-BMI1NOTBM-NEXT: movl %eax, %edi
+; X64-BMI1NOTBM-NEXT: callq use32
+; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
+; X64-BMI1NOTBM-NEXT: popq %rbx
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi32_c2_load:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhil %esi, (%rdi), %eax
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: bzhil %esi, (%rdi), %ebx
+; X64-BMI1BMI2-NEXT: negl %esi
+; X64-BMI1BMI2-NEXT: movl $-1, %eax
+; X64-BMI1BMI2-NEXT: shrxl %esi, %eax, %edi
+; X64-BMI1BMI2-NEXT: callq use32
+; X64-BMI1BMI2-NEXT: movl %ebx, %eax
+; X64-BMI1BMI2-NEXT: popq %rbx
; X64-BMI1BMI2-NEXT: retq
%val = load i32, i32* %w
%numhighbits = sub i32 32, %numlowbits
%mask = lshr i32 -1, %numhighbits
+ call void @use32(i32 %mask)
%masked = and i32 %mask, %val
ret i32 %masked
}
@@ -1586,54 +1771,109 @@ define i32 @bzhi32_c2_load(i32* %w, i32 %numlowbits) nounwind {
define i32 @bzhi32_c3_load_indexzext(i32* %w, i8 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi32_c3_load_indexzext:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: subl $8, %esp
; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NOBMI-NEXT: movl (%eax), %eax
; X86-NOBMI-NEXT: xorl %ecx, %ecx
; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
-; X86-NOBMI-NEXT: shll %cl, %eax
+; X86-NOBMI-NEXT: movl $-1, %edx
; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NOBMI-NEXT: shrl %cl, %eax
+; X86-NOBMI-NEXT: shrl %cl, %edx
+; X86-NOBMI-NEXT: movl (%eax), %esi
+; X86-NOBMI-NEXT: andl %edx, %esi
+; X86-NOBMI-NEXT: movl %edx, (%esp)
+; X86-NOBMI-NEXT: calll use32
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: addl $8, %esp
+; X86-NOBMI-NEXT: popl %esi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi32_c3_load_indexzext:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl
-; X86-BMI1NOTBM-NEXT: shll $8, %ecx
-; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax
+; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
+; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
+; X86-BMI1NOTBM-NEXT: movl $-1, %edx
+; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
+; X86-BMI1NOTBM-NEXT: movl (%eax), %esi
+; X86-BMI1NOTBM-NEXT: andl %edx, %esi
+; X86-BMI1NOTBM-NEXT: movl %edx, (%esp)
+; X86-BMI1NOTBM-NEXT: calll use32
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: addl $8, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi32_c3_load_indexzext:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: subl $8, %esp
; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-BMI1BMI2-NEXT: movb {{[0-9]+}}(%esp), %cl
-; X86-BMI1BMI2-NEXT: bzhil %ecx, (%eax), %eax
+; X86-BMI1BMI2-NEXT: bzhil %ecx, (%eax), %esi
+; X86-BMI1BMI2-NEXT: # kill: def $cl killed $cl killed $ecx def $ecx
+; X86-BMI1BMI2-NEXT: negb %cl
+; X86-BMI1BMI2-NEXT: movl $-1, %eax
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %eax
+; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
+; X86-BMI1BMI2-NEXT: calll use32
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: addl $8, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi32_c3_load_indexzext:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbx
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movl (%rdi), %eax
; X64-NOBMI-NEXT: negb %cl
-; X64-NOBMI-NEXT: shll %cl, %eax
+; X64-NOBMI-NEXT: movl $-1, %eax
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
; X64-NOBMI-NEXT: shrl %cl, %eax
+; X64-NOBMI-NEXT: movl (%rdi), %ebx
+; X64-NOBMI-NEXT: andl %eax, %ebx
+; X64-NOBMI-NEXT: movl %eax, %edi
+; X64-NOBMI-NEXT: callq use32
+; X64-NOBMI-NEXT: movl %ebx, %eax
+; X64-NOBMI-NEXT: popq %rbx
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi32_c3_load_indexzext:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shll $8, %esi
-; X64-BMI1NOTBM-NEXT: bextrl %esi, (%rdi), %eax
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: negb %cl
+; X64-BMI1NOTBM-NEXT: movl $-1, %eax
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrl %cl, %eax
+; X64-BMI1NOTBM-NEXT: movl (%rdi), %ebx
+; X64-BMI1NOTBM-NEXT: andl %eax, %ebx
+; X64-BMI1NOTBM-NEXT: movl %eax, %edi
+; X64-BMI1NOTBM-NEXT: callq use32
+; X64-BMI1NOTBM-NEXT: movl %ebx, %eax
+; X64-BMI1NOTBM-NEXT: popq %rbx
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi32_c3_load_indexzext:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhil %esi, (%rdi), %eax
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: bzhil %esi, (%rdi), %ebx
+; X64-BMI1BMI2-NEXT: # kill: def $sil killed $sil killed $esi def $esi
+; X64-BMI1BMI2-NEXT: negb %sil
+; X64-BMI1BMI2-NEXT: movl $-1, %eax
+; X64-BMI1BMI2-NEXT: shrxl %esi, %eax, %edi
+; X64-BMI1BMI2-NEXT: callq use32
+; X64-BMI1BMI2-NEXT: movl %ebx, %eax
+; X64-BMI1BMI2-NEXT: popq %rbx
; X64-BMI1BMI2-NEXT: retq
%val = load i32, i32* %w
%numhighbits = sub i8 32, %numlowbits
%sh_prom = zext i8 %numhighbits to i32
%mask = lshr i32 -1, %sh_prom
+ call void @use32(i32 %mask)
%masked = and i32 %mask, %val
ret i32 %masked
}
@@ -1641,131 +1881,275 @@ define i32 @bzhi32_c3_load_indexzext(i32* %w, i8 %numlowbits) nounwind {
define i32 @bzhi32_c4_commutative(i32 %val, i32 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi32_c4_commutative:
; X86-NOBMI: # %bb.0:
-; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: subl $8, %esp
; X86-NOBMI-NEXT: xorl %ecx, %ecx
; X86-NOBMI-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-NOBMI-NEXT: shll %cl, %eax
+; X86-NOBMI-NEXT: movl $-1, %esi
; X86-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X86-NOBMI-NEXT: shrl %cl, %eax
+; X86-NOBMI-NEXT: shrl %cl, %esi
+; X86-NOBMI-NEXT: movl %esi, (%esp)
+; X86-NOBMI-NEXT: calll use32
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: addl $8, %esp
+; X86-NOBMI-NEXT: popl %esi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi32_c4_commutative:
; X86-BMI1NOTBM: # %bb.0:
-; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: shll $8, %eax
-; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: xorl %ecx, %ecx
+; X86-BMI1NOTBM-NEXT: subl {{[0-9]+}}(%esp), %ecx
+; X86-BMI1NOTBM-NEXT: movl $-1, %esi
+; X86-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %esi
+; X86-BMI1NOTBM-NEXT: movl %esi, (%esp)
+; X86-BMI1NOTBM-NEXT: calll use32
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: addl $8, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi32_c4_commutative:
; X86-BMI1BMI2: # %bb.0:
-; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-BMI1BMI2-NEXT: bzhil %eax, {{[0-9]+}}(%esp), %eax
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: negl %eax
+; X86-BMI1BMI2-NEXT: movl $-1, %ecx
+; X86-BMI1BMI2-NEXT: shrxl %eax, %ecx, %eax
+; X86-BMI1BMI2-NEXT: movl %eax, (%esp)
+; X86-BMI1BMI2-NEXT: calll use32
+; X86-BMI1BMI2-NEXT: bzhil %esi, {{[0-9]+}}(%esp), %eax
+; X86-BMI1BMI2-NEXT: addl $8, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi32_c4_commutative:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbp
+; X64-NOBMI-NEXT: pushq %rbx
+; X64-NOBMI-NEXT: pushq %rax
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movl %edi, %eax
+; X64-NOBMI-NEXT: movl %edi, %ebx
; X64-NOBMI-NEXT: negl %ecx
-; X64-NOBMI-NEXT: shll %cl, %eax
+; X64-NOBMI-NEXT: movl $-1, %ebp
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X64-NOBMI-NEXT: shrl %cl, %eax
+; X64-NOBMI-NEXT: shrl %cl, %ebp
+; X64-NOBMI-NEXT: movl %ebp, %edi
+; X64-NOBMI-NEXT: callq use32
+; X64-NOBMI-NEXT: andl %ebx, %ebp
+; X64-NOBMI-NEXT: movl %ebp, %eax
+; X64-NOBMI-NEXT: addq $8, %rsp
+; X64-NOBMI-NEXT: popq %rbx
+; X64-NOBMI-NEXT: popq %rbp
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi32_c4_commutative:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shll $8, %esi
-; X64-BMI1NOTBM-NEXT: bextrl %esi, %edi, %eax
+; X64-BMI1NOTBM-NEXT: pushq %rbp
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: pushq %rax
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: movl %edi, %ebx
+; X64-BMI1NOTBM-NEXT: negl %ecx
+; X64-BMI1NOTBM-NEXT: movl $-1, %ebp
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrl %cl, %ebp
+; X64-BMI1NOTBM-NEXT: movl %ebp, %edi
+; X64-BMI1NOTBM-NEXT: callq use32
+; X64-BMI1NOTBM-NEXT: andl %ebx, %ebp
+; X64-BMI1NOTBM-NEXT: movl %ebp, %eax
+; X64-BMI1NOTBM-NEXT: addq $8, %rsp
+; X64-BMI1NOTBM-NEXT: popq %rbx
+; X64-BMI1NOTBM-NEXT: popq %rbp
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi32_c4_commutative:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhil %esi, %edi, %eax
+; X64-BMI1BMI2-NEXT: pushq %rbp
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: pushq %rax
+; X64-BMI1BMI2-NEXT: movl %esi, %ebx
+; X64-BMI1BMI2-NEXT: movl %edi, %ebp
+; X64-BMI1BMI2-NEXT: movl %esi, %eax
+; X64-BMI1BMI2-NEXT: negl %eax
+; X64-BMI1BMI2-NEXT: movl $-1, %ecx
+; X64-BMI1BMI2-NEXT: shrxl %eax, %ecx, %edi
+; X64-BMI1BMI2-NEXT: callq use32
+; X64-BMI1BMI2-NEXT: bzhil %ebx, %ebp, %eax
+; X64-BMI1BMI2-NEXT: addq $8, %rsp
+; X64-BMI1BMI2-NEXT: popq %rbx
+; X64-BMI1BMI2-NEXT: popq %rbp
; X64-BMI1BMI2-NEXT: retq
%numhighbits = sub i32 32, %numlowbits
%mask = lshr i32 -1, %numhighbits
+ call void @use32(i32 %mask)
%masked = and i32 %val, %mask ; swapped order
ret i32 %masked
}
; 64-bit
+declare void @use64(i64)
+
define i64 @bzhi64_c0(i64 %val, i64 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi64_c0:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %edi
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: pushl %eax
; X86-NOBMI-NEXT: movl $64, %ecx
; X86-NOBMI-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-NOBMI-NEXT: movl $-1, %eax
-; X86-NOBMI-NEXT: movl $-1, %edx
-; X86-NOBMI-NEXT: shrl %cl, %edx
-; X86-NOBMI-NEXT: shrdl %cl, %eax, %eax
+; X86-NOBMI-NEXT: movl $-1, %esi
+; X86-NOBMI-NEXT: movl $-1, %edi
+; X86-NOBMI-NEXT: shrl %cl, %edi
+; X86-NOBMI-NEXT: shrdl %cl, %esi, %esi
; X86-NOBMI-NEXT: testb $32, %cl
; X86-NOBMI-NEXT: je .LBB25_2
; X86-NOBMI-NEXT: # %bb.1:
-; X86-NOBMI-NEXT: movl %edx, %eax
-; X86-NOBMI-NEXT: xorl %edx, %edx
+; X86-NOBMI-NEXT: movl %edi, %esi
+; X86-NOBMI-NEXT: xorl %edi, %edi
; X86-NOBMI-NEXT: .LBB25_2:
-; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-NOBMI-NEXT: subl $8, %esp
+; X86-NOBMI-NEXT: pushl %edi
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: calll use64
+; X86-NOBMI-NEXT: addl $16, %esp
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: movl %edi, %edx
+; X86-NOBMI-NEXT: addl $4, %esp
+; X86-NOBMI-NEXT: popl %esi
+; X86-NOBMI-NEXT: popl %edi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi64_c0:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %edi
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: pushl %eax
; X86-BMI1NOTBM-NEXT: movl $64, %ecx
; X86-BMI1NOTBM-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1NOTBM-NEXT: movl $-1, %eax
-; X86-BMI1NOTBM-NEXT: movl $-1, %edx
-; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
-; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1NOTBM-NEXT: movl $-1, %esi
+; X86-BMI1NOTBM-NEXT: movl $-1, %edi
+; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
+; X86-BMI1NOTBM-NEXT: shrdl %cl, %esi, %esi
; X86-BMI1NOTBM-NEXT: testb $32, %cl
; X86-BMI1NOTBM-NEXT: je .LBB25_2
; X86-BMI1NOTBM-NEXT: # %bb.1:
-; X86-BMI1NOTBM-NEXT: movl %edx, %eax
-; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
+; X86-BMI1NOTBM-NEXT: movl %edi, %esi
+; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
; X86-BMI1NOTBM-NEXT: .LBB25_2:
-; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: pushl %edi
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: calll use64
+; X86-BMI1NOTBM-NEXT: addl $16, %esp
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: movl %edi, %edx
+; X86-BMI1NOTBM-NEXT: addl $4, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
+; X86-BMI1NOTBM-NEXT: popl %edi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi64_c0:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %edi
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: pushl %eax
; X86-BMI1BMI2-NEXT: movl $64, %ecx
; X86-BMI1BMI2-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1BMI2-NEXT: movl $-1, %eax
-; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edx
-; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1BMI2-NEXT: movl $-1, %esi
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edi
+; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %esi
; X86-BMI1BMI2-NEXT: testb $32, %cl
; X86-BMI1BMI2-NEXT: je .LBB25_2
; X86-BMI1BMI2-NEXT: # %bb.1:
-; X86-BMI1BMI2-NEXT: movl %edx, %eax
-; X86-BMI1BMI2-NEXT: xorl %edx, %edx
+; X86-BMI1BMI2-NEXT: movl %edi, %esi
+; X86-BMI1BMI2-NEXT: xorl %edi, %edi
; X86-BMI1BMI2-NEXT: .LBB25_2:
-; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: pushl %edi
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: calll use64
+; X86-BMI1BMI2-NEXT: addl $16, %esp
+; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: movl %edi, %edx
+; X86-BMI1BMI2-NEXT: addl $4, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
+; X86-BMI1BMI2-NEXT: popl %edi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi64_c0:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %r14
+; X64-NOBMI-NEXT: pushq %rbx
+; X64-NOBMI-NEXT: pushq %rax
; X64-NOBMI-NEXT: movq %rsi, %rcx
-; X64-NOBMI-NEXT: movq %rdi, %rax
+; X64-NOBMI-NEXT: movq %rdi, %r14
; X64-NOBMI-NEXT: negl %ecx
-; X64-NOBMI-NEXT: shlq %cl, %rax
+; X64-NOBMI-NEXT: movq $-1, %rbx
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
-; X64-NOBMI-NEXT: shrq %cl, %rax
+; X64-NOBMI-NEXT: shrq %cl, %rbx
+; X64-NOBMI-NEXT: movq %rbx, %rdi
+; X64-NOBMI-NEXT: callq use64
+; X64-NOBMI-NEXT: andq %r14, %rbx
+; X64-NOBMI-NEXT: movq %rbx, %rax
+; X64-NOBMI-NEXT: addq $8, %rsp
+; X64-NOBMI-NEXT: popq %rbx
+; X64-NOBMI-NEXT: popq %r14
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi64_c0:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shlq $8, %rsi
-; X64-BMI1NOTBM-NEXT: bextrq %rsi, %rdi, %rax
+; X64-BMI1NOTBM-NEXT: pushq %r14
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: pushq %rax
+; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
+; X64-BMI1NOTBM-NEXT: movq %rdi, %r14
+; X64-BMI1NOTBM-NEXT: negl %ecx
+; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
+; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
+; X64-BMI1NOTBM-NEXT: callq use64
+; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
+; X64-BMI1NOTBM-NEXT: addq $8, %rsp
+; X64-BMI1NOTBM-NEXT: popq %rbx
+; X64-BMI1NOTBM-NEXT: popq %r14
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi64_c0:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhiq %rsi, %rdi, %rax
+; X64-BMI1BMI2-NEXT: pushq %r14
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: pushq %rax
+; X64-BMI1BMI2-NEXT: movq %rsi, %rbx
+; X64-BMI1BMI2-NEXT: movq %rdi, %r14
+; X64-BMI1BMI2-NEXT: movl %ebx, %eax
+; X64-BMI1BMI2-NEXT: negl %eax
+; X64-BMI1BMI2-NEXT: movq $-1, %rcx
+; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
+; X64-BMI1BMI2-NEXT: callq use64
+; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
+; X64-BMI1BMI2-NEXT: addq $8, %rsp
+; X64-BMI1BMI2-NEXT: popq %rbx
+; X64-BMI1BMI2-NEXT: popq %r14
; X64-BMI1BMI2-NEXT: retq
%numhighbits = sub i64 64, %numlowbits
%mask = lshr i64 -1, %numhighbits
+ call void @use64(i64 %mask)
%masked = and i64 %mask, %val
ret i64 %masked
}
@@ -1773,82 +2157,157 @@ define i64 @bzhi64_c0(i64 %val, i64 %numlowbits) nounwind {
define i64 @bzhi64_c1_indexzext(i64 %val, i8 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi64_c1_indexzext:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %edi
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: pushl %eax
; X86-NOBMI-NEXT: movb $64, %cl
; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
-; X86-NOBMI-NEXT: movl $-1, %eax
-; X86-NOBMI-NEXT: movl $-1, %edx
-; X86-NOBMI-NEXT: shrl %cl, %edx
-; X86-NOBMI-NEXT: shrdl %cl, %eax, %eax
+; X86-NOBMI-NEXT: movl $-1, %esi
+; X86-NOBMI-NEXT: movl $-1, %edi
+; X86-NOBMI-NEXT: shrl %cl, %edi
+; X86-NOBMI-NEXT: shrdl %cl, %esi, %esi
; X86-NOBMI-NEXT: testb $32, %cl
; X86-NOBMI-NEXT: je .LBB26_2
; X86-NOBMI-NEXT: # %bb.1:
-; X86-NOBMI-NEXT: movl %edx, %eax
-; X86-NOBMI-NEXT: xorl %edx, %edx
+; X86-NOBMI-NEXT: movl %edi, %esi
+; X86-NOBMI-NEXT: xorl %edi, %edi
; X86-NOBMI-NEXT: .LBB26_2:
-; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-NOBMI-NEXT: subl $8, %esp
+; X86-NOBMI-NEXT: pushl %edi
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: calll use64
+; X86-NOBMI-NEXT: addl $16, %esp
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: movl %edi, %edx
+; X86-NOBMI-NEXT: addl $4, %esp
+; X86-NOBMI-NEXT: popl %esi
+; X86-NOBMI-NEXT: popl %edi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi64_c1_indexzext:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %edi
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: pushl %eax
; X86-BMI1NOTBM-NEXT: movb $64, %cl
; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
-; X86-BMI1NOTBM-NEXT: movl $-1, %eax
-; X86-BMI1NOTBM-NEXT: movl $-1, %edx
-; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
-; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1NOTBM-NEXT: movl $-1, %esi
+; X86-BMI1NOTBM-NEXT: movl $-1, %edi
+; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
+; X86-BMI1NOTBM-NEXT: shrdl %cl, %esi, %esi
; X86-BMI1NOTBM-NEXT: testb $32, %cl
; X86-BMI1NOTBM-NEXT: je .LBB26_2
; X86-BMI1NOTBM-NEXT: # %bb.1:
-; X86-BMI1NOTBM-NEXT: movl %edx, %eax
-; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
+; X86-BMI1NOTBM-NEXT: movl %edi, %esi
+; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
; X86-BMI1NOTBM-NEXT: .LBB26_2:
-; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: pushl %edi
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: calll use64
+; X86-BMI1NOTBM-NEXT: addl $16, %esp
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: movl %edi, %edx
+; X86-BMI1NOTBM-NEXT: addl $4, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
+; X86-BMI1NOTBM-NEXT: popl %edi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi64_c1_indexzext:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %edi
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: pushl %eax
; X86-BMI1BMI2-NEXT: movb $64, %cl
; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
-; X86-BMI1BMI2-NEXT: movl $-1, %eax
-; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edx
-; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1BMI2-NEXT: movl $-1, %esi
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edi
+; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %esi
; X86-BMI1BMI2-NEXT: testb $32, %cl
; X86-BMI1BMI2-NEXT: je .LBB26_2
; X86-BMI1BMI2-NEXT: # %bb.1:
-; X86-BMI1BMI2-NEXT: movl %edx, %eax
-; X86-BMI1BMI2-NEXT: xorl %edx, %edx
+; X86-BMI1BMI2-NEXT: movl %edi, %esi
+; X86-BMI1BMI2-NEXT: xorl %edi, %edi
; X86-BMI1BMI2-NEXT: .LBB26_2:
-; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: pushl %edi
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: calll use64
+; X86-BMI1BMI2-NEXT: addl $16, %esp
+; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: movl %edi, %edx
+; X86-BMI1BMI2-NEXT: addl $4, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
+; X86-BMI1BMI2-NEXT: popl %edi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi64_c1_indexzext:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %r14
+; X64-NOBMI-NEXT: pushq %rbx
+; X64-NOBMI-NEXT: pushq %rax
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movq %rdi, %rax
+; X64-NOBMI-NEXT: movq %rdi, %r14
; X64-NOBMI-NEXT: negb %cl
-; X64-NOBMI-NEXT: shlq %cl, %rax
+; X64-NOBMI-NEXT: movq $-1, %rbx
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
-; X64-NOBMI-NEXT: shrq %cl, %rax
+; X64-NOBMI-NEXT: shrq %cl, %rbx
+; X64-NOBMI-NEXT: movq %rbx, %rdi
+; X64-NOBMI-NEXT: callq use64
+; X64-NOBMI-NEXT: andq %r14, %rbx
+; X64-NOBMI-NEXT: movq %rbx, %rax
+; X64-NOBMI-NEXT: addq $8, %rsp
+; X64-NOBMI-NEXT: popq %rbx
+; X64-NOBMI-NEXT: popq %r14
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi64_c1_indexzext:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi
-; X64-BMI1NOTBM-NEXT: shlq $8, %rsi
-; X64-BMI1NOTBM-NEXT: bextrq %rsi, %rdi, %rax
+; X64-BMI1NOTBM-NEXT: pushq %r14
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: pushq %rax
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: movq %rdi, %r14
+; X64-BMI1NOTBM-NEXT: negb %cl
+; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
+; X64-BMI1NOTBM-NEXT: callq use64
+; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
+; X64-BMI1NOTBM-NEXT: addq $8, %rsp
+; X64-BMI1NOTBM-NEXT: popq %rbx
+; X64-BMI1NOTBM-NEXT: popq %r14
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi64_c1_indexzext:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
-; X64-BMI1BMI2-NEXT: bzhiq %rsi, %rdi, %rax
+; X64-BMI1BMI2-NEXT: pushq %r14
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: pushq %rax
+; X64-BMI1BMI2-NEXT: movl %esi, %ebx
+; X64-BMI1BMI2-NEXT: movq %rdi, %r14
+; X64-BMI1BMI2-NEXT: movl %ebx, %eax
+; X64-BMI1BMI2-NEXT: negb %al
+; X64-BMI1BMI2-NEXT: movq $-1, %rcx
+; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
+; X64-BMI1BMI2-NEXT: callq use64
+; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
+; X64-BMI1BMI2-NEXT: addq $8, %rsp
+; X64-BMI1BMI2-NEXT: popq %rbx
+; X64-BMI1BMI2-NEXT: popq %r14
; X64-BMI1BMI2-NEXT: retq
%numhighbits = sub i8 64, %numlowbits
%sh_prom = zext i8 %numhighbits to i64
%mask = lshr i64 -1, %sh_prom
+ call void @use64(i64 %mask)
%masked = and i64 %mask, %val
ret i64 %masked
}
@@ -1856,89 +2315,153 @@ define i64 @bzhi64_c1_indexzext(i64 %val, i8 %numlowbits) nounwind {
define i64 @bzhi64_c2_load(i64* %w, i64 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi64_c2_load:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %ebx
+; X86-NOBMI-NEXT: pushl %edi
; X86-NOBMI-NEXT: pushl %esi
-; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-NOBMI-NEXT: movl $64, %ecx
; X86-NOBMI-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-NOBMI-NEXT: movl $-1, %eax
; X86-NOBMI-NEXT: movl $-1, %edx
-; X86-NOBMI-NEXT: shrl %cl, %edx
-; X86-NOBMI-NEXT: shrdl %cl, %eax, %eax
+; X86-NOBMI-NEXT: movl $-1, %ebx
+; X86-NOBMI-NEXT: shrl %cl, %ebx
+; X86-NOBMI-NEXT: shrdl %cl, %edx, %edx
; X86-NOBMI-NEXT: testb $32, %cl
; X86-NOBMI-NEXT: je .LBB27_2
; X86-NOBMI-NEXT: # %bb.1:
-; X86-NOBMI-NEXT: movl %edx, %eax
-; X86-NOBMI-NEXT: xorl %edx, %edx
+; X86-NOBMI-NEXT: movl %ebx, %edx
+; X86-NOBMI-NEXT: xorl %ebx, %ebx
; X86-NOBMI-NEXT: .LBB27_2:
-; X86-NOBMI-NEXT: andl (%esi), %eax
-; X86-NOBMI-NEXT: andl 4(%esi), %edx
+; X86-NOBMI-NEXT: movl (%eax), %esi
+; X86-NOBMI-NEXT: andl %edx, %esi
+; X86-NOBMI-NEXT: movl 4(%eax), %edi
+; X86-NOBMI-NEXT: andl %ebx, %edi
+; X86-NOBMI-NEXT: subl $8, %esp
+; X86-NOBMI-NEXT: pushl %ebx
+; X86-NOBMI-NEXT: pushl %edx
+; X86-NOBMI-NEXT: calll use64
+; X86-NOBMI-NEXT: addl $16, %esp
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: movl %edi, %edx
; X86-NOBMI-NEXT: popl %esi
+; X86-NOBMI-NEXT: popl %edi
+; X86-NOBMI-NEXT: popl %ebx
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi64_c2_load:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %ebx
+; X86-BMI1NOTBM-NEXT: pushl %edi
; X86-BMI1NOTBM-NEXT: pushl %esi
-; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-BMI1NOTBM-NEXT: movl $64, %ecx
; X86-BMI1NOTBM-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1NOTBM-NEXT: movl $-1, %eax
; X86-BMI1NOTBM-NEXT: movl $-1, %edx
-; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
-; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
+; X86-BMI1NOTBM-NEXT: shrdl %cl, %edx, %edx
; X86-BMI1NOTBM-NEXT: testb $32, %cl
; X86-BMI1NOTBM-NEXT: je .LBB27_2
; X86-BMI1NOTBM-NEXT: # %bb.1:
-; X86-BMI1NOTBM-NEXT: movl %edx, %eax
-; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
+; X86-BMI1NOTBM-NEXT: movl %ebx, %edx
+; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
; X86-BMI1NOTBM-NEXT: .LBB27_2:
-; X86-BMI1NOTBM-NEXT: andl (%esi), %eax
-; X86-BMI1NOTBM-NEXT: andl 4(%esi), %edx
+; X86-BMI1NOTBM-NEXT: movl (%eax), %esi
+; X86-BMI1NOTBM-NEXT: andl %edx, %esi
+; X86-BMI1NOTBM-NEXT: movl 4(%eax), %edi
+; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: pushl %ebx
+; X86-BMI1NOTBM-NEXT: pushl %edx
+; X86-BMI1NOTBM-NEXT: calll use64
+; X86-BMI1NOTBM-NEXT: addl $16, %esp
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: movl %edi, %edx
; X86-BMI1NOTBM-NEXT: popl %esi
+; X86-BMI1NOTBM-NEXT: popl %edi
+; X86-BMI1NOTBM-NEXT: popl %ebx
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi64_c2_load:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %ebx
+; X86-BMI1BMI2-NEXT: pushl %edi
; X86-BMI1BMI2-NEXT: pushl %esi
-; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax
; X86-BMI1BMI2-NEXT: movl $64, %ecx
; X86-BMI1BMI2-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1BMI2-NEXT: movl $-1, %eax
-; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edx
-; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1BMI2-NEXT: movl $-1, %edx
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %edx, %ebx
+; X86-BMI1BMI2-NEXT: shrdl %cl, %edx, %edx
; X86-BMI1BMI2-NEXT: testb $32, %cl
; X86-BMI1BMI2-NEXT: je .LBB27_2
; X86-BMI1BMI2-NEXT: # %bb.1:
-; X86-BMI1BMI2-NEXT: movl %edx, %eax
-; X86-BMI1BMI2-NEXT: xorl %edx, %edx
+; X86-BMI1BMI2-NEXT: movl %ebx, %edx
+; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
; X86-BMI1BMI2-NEXT: .LBB27_2:
-; X86-BMI1BMI2-NEXT: andl (%esi), %eax
-; X86-BMI1BMI2-NEXT: andl 4(%esi), %edx
+; X86-BMI1BMI2-NEXT: movl (%eax), %esi
+; X86-BMI1BMI2-NEXT: andl %edx, %esi
+; X86-BMI1BMI2-NEXT: movl 4(%eax), %edi
+; X86-BMI1BMI2-NEXT: andl %ebx, %edi
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: pushl %ebx
+; X86-BMI1BMI2-NEXT: pushl %edx
+; X86-BMI1BMI2-NEXT: calll use64
+; X86-BMI1BMI2-NEXT: addl $16, %esp
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: movl %edi, %edx
; X86-BMI1BMI2-NEXT: popl %esi
+; X86-BMI1BMI2-NEXT: popl %edi
+; X86-BMI1BMI2-NEXT: popl %ebx
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi64_c2_load:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbx
; X64-NOBMI-NEXT: movq %rsi, %rcx
-; X64-NOBMI-NEXT: movq (%rdi), %rax
; X64-NOBMI-NEXT: negl %ecx
-; X64-NOBMI-NEXT: shlq %cl, %rax
+; X64-NOBMI-NEXT: movq $-1, %rax
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
; X64-NOBMI-NEXT: shrq %cl, %rax
+; X64-NOBMI-NEXT: movq (%rdi), %rbx
+; X64-NOBMI-NEXT: andq %rax, %rbx
+; X64-NOBMI-NEXT: movq %rax, %rdi
+; X64-NOBMI-NEXT: callq use64
+; X64-NOBMI-NEXT: movq %rbx, %rax
+; X64-NOBMI-NEXT: popq %rbx
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi64_c2_load:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shlq $8, %rsi
-; X64-BMI1NOTBM-NEXT: bextrq %rsi, (%rdi), %rax
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
+; X64-BMI1NOTBM-NEXT: negl %ecx
+; X64-BMI1NOTBM-NEXT: movq $-1, %rax
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
+; X64-BMI1NOTBM-NEXT: shrq %cl, %rax
+; X64-BMI1NOTBM-NEXT: movq (%rdi), %rbx
+; X64-BMI1NOTBM-NEXT: andq %rax, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rax, %rdi
+; X64-BMI1NOTBM-NEXT: callq use64
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
+; X64-BMI1NOTBM-NEXT: popq %rbx
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi64_c2_load:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhiq %rsi, (%rdi), %rax
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: bzhiq %rsi, (%rdi), %rbx
+; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi killed $rsi def $rsi
+; X64-BMI1BMI2-NEXT: negl %esi
+; X64-BMI1BMI2-NEXT: movq $-1, %rax
+; X64-BMI1BMI2-NEXT: shrxq %rsi, %rax, %rdi
+; X64-BMI1BMI2-NEXT: callq use64
+; X64-BMI1BMI2-NEXT: movq %rbx, %rax
+; X64-BMI1BMI2-NEXT: popq %rbx
; X64-BMI1BMI2-NEXT: retq
%val = load i64, i64* %w
%numhighbits = sub i64 64, %numlowbits
%mask = lshr i64 -1, %numhighbits
+ call void @use64(i64 %mask)
%masked = and i64 %mask, %val
ret i64 %masked
}
@@ -1946,92 +2469,155 @@ define i64 @bzhi64_c2_load(i64* %w, i64 %numlowbits) nounwind {
define i64 @bzhi64_c3_load_indexzext(i64* %w, i8 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi64_c3_load_indexzext:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %ebx
+; X86-NOBMI-NEXT: pushl %edi
; X86-NOBMI-NEXT: pushl %esi
-; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-NOBMI-NEXT: movb $64, %cl
; X86-NOBMI-NEXT: subb {{[0-9]+}}(%esp), %cl
; X86-NOBMI-NEXT: movl $-1, %eax
-; X86-NOBMI-NEXT: movl $-1, %edx
-; X86-NOBMI-NEXT: shrl %cl, %edx
+; X86-NOBMI-NEXT: movl $-1, %ebx
+; X86-NOBMI-NEXT: shrl %cl, %ebx
; X86-NOBMI-NEXT: shrdl %cl, %eax, %eax
; X86-NOBMI-NEXT: testb $32, %cl
; X86-NOBMI-NEXT: je .LBB28_2
; X86-NOBMI-NEXT: # %bb.1:
-; X86-NOBMI-NEXT: movl %edx, %eax
-; X86-NOBMI-NEXT: xorl %edx, %edx
+; X86-NOBMI-NEXT: movl %ebx, %eax
+; X86-NOBMI-NEXT: xorl %ebx, %ebx
; X86-NOBMI-NEXT: .LBB28_2:
-; X86-NOBMI-NEXT: andl (%esi), %eax
-; X86-NOBMI-NEXT: andl 4(%esi), %edx
+; X86-NOBMI-NEXT: movl (%edx), %esi
+; X86-NOBMI-NEXT: andl %eax, %esi
+; X86-NOBMI-NEXT: movl 4(%edx), %edi
+; X86-NOBMI-NEXT: andl %ebx, %edi
+; X86-NOBMI-NEXT: subl $8, %esp
+; X86-NOBMI-NEXT: pushl %ebx
+; X86-NOBMI-NEXT: pushl %eax
+; X86-NOBMI-NEXT: calll use64
+; X86-NOBMI-NEXT: addl $16, %esp
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: movl %edi, %edx
; X86-NOBMI-NEXT: popl %esi
+; X86-NOBMI-NEXT: popl %edi
+; X86-NOBMI-NEXT: popl %ebx
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi64_c3_load_indexzext:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %ebx
+; X86-BMI1NOTBM-NEXT: pushl %edi
; X86-BMI1NOTBM-NEXT: pushl %esi
-; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-BMI1NOTBM-NEXT: movb $64, %cl
; X86-BMI1NOTBM-NEXT: subb {{[0-9]+}}(%esp), %cl
; X86-BMI1NOTBM-NEXT: movl $-1, %eax
-; X86-BMI1NOTBM-NEXT: movl $-1, %edx
-; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
+; X86-BMI1NOTBM-NEXT: movl $-1, %ebx
+; X86-BMI1NOTBM-NEXT: shrl %cl, %ebx
; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %eax
; X86-BMI1NOTBM-NEXT: testb $32, %cl
; X86-BMI1NOTBM-NEXT: je .LBB28_2
; X86-BMI1NOTBM-NEXT: # %bb.1:
-; X86-BMI1NOTBM-NEXT: movl %edx, %eax
-; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
+; X86-BMI1NOTBM-NEXT: movl %ebx, %eax
+; X86-BMI1NOTBM-NEXT: xorl %ebx, %ebx
; X86-BMI1NOTBM-NEXT: .LBB28_2:
-; X86-BMI1NOTBM-NEXT: andl (%esi), %eax
-; X86-BMI1NOTBM-NEXT: andl 4(%esi), %edx
+; X86-BMI1NOTBM-NEXT: movl (%edx), %esi
+; X86-BMI1NOTBM-NEXT: andl %eax, %esi
+; X86-BMI1NOTBM-NEXT: movl 4(%edx), %edi
+; X86-BMI1NOTBM-NEXT: andl %ebx, %edi
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: pushl %ebx
+; X86-BMI1NOTBM-NEXT: pushl %eax
+; X86-BMI1NOTBM-NEXT: calll use64
+; X86-BMI1NOTBM-NEXT: addl $16, %esp
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: movl %edi, %edx
; X86-BMI1NOTBM-NEXT: popl %esi
+; X86-BMI1NOTBM-NEXT: popl %edi
+; X86-BMI1NOTBM-NEXT: popl %ebx
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi64_c3_load_indexzext:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %ebx
+; X86-BMI1BMI2-NEXT: pushl %edi
; X86-BMI1BMI2-NEXT: pushl %esi
-; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-BMI1BMI2-NEXT: movb $64, %cl
; X86-BMI1BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl
; X86-BMI1BMI2-NEXT: movl $-1, %eax
-; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edx
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %ebx
; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %eax
; X86-BMI1BMI2-NEXT: testb $32, %cl
; X86-BMI1BMI2-NEXT: je .LBB28_2
; X86-BMI1BMI2-NEXT: # %bb.1:
-; X86-BMI1BMI2-NEXT: movl %edx, %eax
-; X86-BMI1BMI2-NEXT: xorl %edx, %edx
+; X86-BMI1BMI2-NEXT: movl %ebx, %eax
+; X86-BMI1BMI2-NEXT: xorl %ebx, %ebx
; X86-BMI1BMI2-NEXT: .LBB28_2:
-; X86-BMI1BMI2-NEXT: andl (%esi), %eax
-; X86-BMI1BMI2-NEXT: andl 4(%esi), %edx
+; X86-BMI1BMI2-NEXT: movl (%edx), %esi
+; X86-BMI1BMI2-NEXT: andl %eax, %esi
+; X86-BMI1BMI2-NEXT: movl 4(%edx), %edi
+; X86-BMI1BMI2-NEXT: andl %ebx, %edi
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: pushl %ebx
+; X86-BMI1BMI2-NEXT: pushl %eax
+; X86-BMI1BMI2-NEXT: calll use64
+; X86-BMI1BMI2-NEXT: addl $16, %esp
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: movl %edi, %edx
; X86-BMI1BMI2-NEXT: popl %esi
+; X86-BMI1BMI2-NEXT: popl %edi
+; X86-BMI1BMI2-NEXT: popl %ebx
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi64_c3_load_indexzext:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %rbx
; X64-NOBMI-NEXT: movl %esi, %ecx
-; X64-NOBMI-NEXT: movq (%rdi), %rax
; X64-NOBMI-NEXT: negb %cl
-; X64-NOBMI-NEXT: shlq %cl, %rax
+; X64-NOBMI-NEXT: movq $-1, %rax
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $ecx
; X64-NOBMI-NEXT: shrq %cl, %rax
+; X64-NOBMI-NEXT: movq (%rdi), %rbx
+; X64-NOBMI-NEXT: andq %rax, %rbx
+; X64-NOBMI-NEXT: movq %rax, %rdi
+; X64-NOBMI-NEXT: callq use64
+; X64-NOBMI-NEXT: movq %rbx, %rax
+; X64-NOBMI-NEXT: popq %rbx
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi64_c3_load_indexzext:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi
-; X64-BMI1NOTBM-NEXT: shlq $8, %rsi
-; X64-BMI1NOTBM-NEXT: bextrq %rsi, (%rdi), %rax
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: movl %esi, %ecx
+; X64-BMI1NOTBM-NEXT: negb %cl
+; X64-BMI1NOTBM-NEXT: movq $-1, %rax
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-BMI1NOTBM-NEXT: shrq %cl, %rax
+; X64-BMI1NOTBM-NEXT: movq (%rdi), %rbx
+; X64-BMI1NOTBM-NEXT: andq %rax, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rax, %rdi
+; X64-BMI1NOTBM-NEXT: callq use64
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
+; X64-BMI1NOTBM-NEXT: popq %rbx
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi64_c3_load_indexzext:
; X64-BMI1BMI2: # %bb.0:
+; X64-BMI1BMI2-NEXT: pushq %rbx
; X64-BMI1BMI2-NEXT: # kill: def $esi killed $esi def $rsi
-; X64-BMI1BMI2-NEXT: bzhiq %rsi, (%rdi), %rax
+; X64-BMI1BMI2-NEXT: bzhiq %rsi, (%rdi), %rbx
+; X64-BMI1BMI2-NEXT: # kill: def $sil killed $sil killed $rsi def $rsi
+; X64-BMI1BMI2-NEXT: negb %sil
+; X64-BMI1BMI2-NEXT: movq $-1, %rax
+; X64-BMI1BMI2-NEXT: shrxq %rsi, %rax, %rdi
+; X64-BMI1BMI2-NEXT: callq use64
+; X64-BMI1BMI2-NEXT: movq %rbx, %rax
+; X64-BMI1BMI2-NEXT: popq %rbx
; X64-BMI1BMI2-NEXT: retq
%val = load i64, i64* %w
%numhighbits = sub i8 64, %numlowbits
%sh_prom = zext i8 %numhighbits to i64
%mask = lshr i64 -1, %sh_prom
+ call void @use64(i64 %mask)
%masked = and i64 %mask, %val
ret i64 %masked
}
@@ -2039,79 +2625,156 @@ define i64 @bzhi64_c3_load_indexzext(i64* %w, i8 %numlowbits) nounwind {
define i64 @bzhi64_c4_commutative(i64 %val, i64 %numlowbits) nounwind {
; X86-NOBMI-LABEL: bzhi64_c4_commutative:
; X86-NOBMI: # %bb.0:
+; X86-NOBMI-NEXT: pushl %edi
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: pushl %eax
; X86-NOBMI-NEXT: movl $64, %ecx
; X86-NOBMI-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-NOBMI-NEXT: movl $-1, %eax
-; X86-NOBMI-NEXT: movl $-1, %edx
-; X86-NOBMI-NEXT: shrl %cl, %edx
-; X86-NOBMI-NEXT: shrdl %cl, %eax, %eax
+; X86-NOBMI-NEXT: movl $-1, %esi
+; X86-NOBMI-NEXT: movl $-1, %edi
+; X86-NOBMI-NEXT: shrl %cl, %edi
+; X86-NOBMI-NEXT: shrdl %cl, %esi, %esi
; X86-NOBMI-NEXT: testb $32, %cl
; X86-NOBMI-NEXT: je .LBB29_2
; X86-NOBMI-NEXT: # %bb.1:
-; X86-NOBMI-NEXT: movl %edx, %eax
-; X86-NOBMI-NEXT: xorl %edx, %edx
+; X86-NOBMI-NEXT: movl %edi, %esi
+; X86-NOBMI-NEXT: xorl %edi, %edi
; X86-NOBMI-NEXT: .LBB29_2:
-; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-NOBMI-NEXT: subl $8, %esp
+; X86-NOBMI-NEXT: pushl %edi
+; X86-NOBMI-NEXT: pushl %esi
+; X86-NOBMI-NEXT: calll use64
+; X86-NOBMI-NEXT: addl $16, %esp
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-NOBMI-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-NOBMI-NEXT: movl %esi, %eax
+; X86-NOBMI-NEXT: movl %edi, %edx
+; X86-NOBMI-NEXT: addl $4, %esp
+; X86-NOBMI-NEXT: popl %esi
+; X86-NOBMI-NEXT: popl %edi
; X86-NOBMI-NEXT: retl
;
; X86-BMI1NOTBM-LABEL: bzhi64_c4_commutative:
; X86-BMI1NOTBM: # %bb.0:
+; X86-BMI1NOTBM-NEXT: pushl %edi
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: pushl %eax
; X86-BMI1NOTBM-NEXT: movl $64, %ecx
; X86-BMI1NOTBM-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1NOTBM-NEXT: movl $-1, %eax
-; X86-BMI1NOTBM-NEXT: movl $-1, %edx
-; X86-BMI1NOTBM-NEXT: shrl %cl, %edx
-; X86-BMI1NOTBM-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1NOTBM-NEXT: movl $-1, %esi
+; X86-BMI1NOTBM-NEXT: movl $-1, %edi
+; X86-BMI1NOTBM-NEXT: shrl %cl, %edi
+; X86-BMI1NOTBM-NEXT: shrdl %cl, %esi, %esi
; X86-BMI1NOTBM-NEXT: testb $32, %cl
; X86-BMI1NOTBM-NEXT: je .LBB29_2
; X86-BMI1NOTBM-NEXT: # %bb.1:
-; X86-BMI1NOTBM-NEXT: movl %edx, %eax
-; X86-BMI1NOTBM-NEXT: xorl %edx, %edx
+; X86-BMI1NOTBM-NEXT: movl %edi, %esi
+; X86-BMI1NOTBM-NEXT: xorl %edi, %edi
; X86-BMI1NOTBM-NEXT: .LBB29_2:
-; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-BMI1NOTBM-NEXT: subl $8, %esp
+; X86-BMI1NOTBM-NEXT: pushl %edi
+; X86-BMI1NOTBM-NEXT: pushl %esi
+; X86-BMI1NOTBM-NEXT: calll use64
+; X86-BMI1NOTBM-NEXT: addl $16, %esp
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1NOTBM-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-BMI1NOTBM-NEXT: movl %esi, %eax
+; X86-BMI1NOTBM-NEXT: movl %edi, %edx
+; X86-BMI1NOTBM-NEXT: addl $4, %esp
+; X86-BMI1NOTBM-NEXT: popl %esi
+; X86-BMI1NOTBM-NEXT: popl %edi
; X86-BMI1NOTBM-NEXT: retl
;
; X86-BMI1BMI2-LABEL: bzhi64_c4_commutative:
; X86-BMI1BMI2: # %bb.0:
+; X86-BMI1BMI2-NEXT: pushl %edi
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: pushl %eax
; X86-BMI1BMI2-NEXT: movl $64, %ecx
; X86-BMI1BMI2-NEXT: subl {{[0-9]+}}(%esp), %ecx
-; X86-BMI1BMI2-NEXT: movl $-1, %eax
-; X86-BMI1BMI2-NEXT: shrxl %ecx, %eax, %edx
-; X86-BMI1BMI2-NEXT: shrdl %cl, %eax, %eax
+; X86-BMI1BMI2-NEXT: movl $-1, %esi
+; X86-BMI1BMI2-NEXT: shrxl %ecx, %esi, %edi
+; X86-BMI1BMI2-NEXT: shrdl %cl, %esi, %esi
; X86-BMI1BMI2-NEXT: testb $32, %cl
; X86-BMI1BMI2-NEXT: je .LBB29_2
; X86-BMI1BMI2-NEXT: # %bb.1:
-; X86-BMI1BMI2-NEXT: movl %edx, %eax
-; X86-BMI1BMI2-NEXT: xorl %edx, %edx
+; X86-BMI1BMI2-NEXT: movl %edi, %esi
+; X86-BMI1BMI2-NEXT: xorl %edi, %edi
; X86-BMI1BMI2-NEXT: .LBB29_2:
-; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %eax
-; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %edx
+; X86-BMI1BMI2-NEXT: subl $8, %esp
+; X86-BMI1BMI2-NEXT: pushl %edi
+; X86-BMI1BMI2-NEXT: pushl %esi
+; X86-BMI1BMI2-NEXT: calll use64
+; X86-BMI1BMI2-NEXT: addl $16, %esp
+; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %esi
+; X86-BMI1BMI2-NEXT: andl {{[0-9]+}}(%esp), %edi
+; X86-BMI1BMI2-NEXT: movl %esi, %eax
+; X86-BMI1BMI2-NEXT: movl %edi, %edx
+; X86-BMI1BMI2-NEXT: addl $4, %esp
+; X86-BMI1BMI2-NEXT: popl %esi
+; X86-BMI1BMI2-NEXT: popl %edi
; X86-BMI1BMI2-NEXT: retl
;
; X64-NOBMI-LABEL: bzhi64_c4_commutative:
; X64-NOBMI: # %bb.0:
+; X64-NOBMI-NEXT: pushq %r14
+; X64-NOBMI-NEXT: pushq %rbx
+; X64-NOBMI-NEXT: pushq %rax
; X64-NOBMI-NEXT: movq %rsi, %rcx
-; X64-NOBMI-NEXT: movq %rdi, %rax
+; X64-NOBMI-NEXT: movq %rdi, %r14
; X64-NOBMI-NEXT: negl %ecx
-; X64-NOBMI-NEXT: shlq %cl, %rax
+; X64-NOBMI-NEXT: movq $-1, %rbx
; X64-NOBMI-NEXT: # kill: def $cl killed $cl killed $rcx
-; X64-NOBMI-NEXT: shrq %cl, %rax
+; X64-NOBMI-NEXT: shrq %cl, %rbx
+; X64-NOBMI-NEXT: movq %rbx, %rdi
+; X64-NOBMI-NEXT: callq use64
+; X64-NOBMI-NEXT: andq %r14, %rbx
+; X64-NOBMI-NEXT: movq %rbx, %rax
+; X64-NOBMI-NEXT: addq $8, %rsp
+; X64-NOBMI-NEXT: popq %rbx
+; X64-NOBMI-NEXT: popq %r14
; X64-NOBMI-NEXT: retq
;
; X64-BMI1NOTBM-LABEL: bzhi64_c4_commutative:
; X64-BMI1NOTBM: # %bb.0:
-; X64-BMI1NOTBM-NEXT: shlq $8, %rsi
-; X64-BMI1NOTBM-NEXT: bextrq %rsi, %rdi, %rax
+; X64-BMI1NOTBM-NEXT: pushq %r14
+; X64-BMI1NOTBM-NEXT: pushq %rbx
+; X64-BMI1NOTBM-NEXT: pushq %rax
+; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx
+; X64-BMI1NOTBM-NEXT: movq %rdi, %r14
+; X64-BMI1NOTBM-NEXT: negl %ecx
+; X64-BMI1NOTBM-NEXT: movq $-1, %rbx
+; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx
+; X64-BMI1NOTBM-NEXT: shrq %cl, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rdi
+; X64-BMI1NOTBM-NEXT: callq use64
+; X64-BMI1NOTBM-NEXT: andq %r14, %rbx
+; X64-BMI1NOTBM-NEXT: movq %rbx, %rax
+; X64-BMI1NOTBM-NEXT: addq $8, %rsp
+; X64-BMI1NOTBM-NEXT: popq %rbx
+; X64-BMI1NOTBM-NEXT: popq %r14
; X64-BMI1NOTBM-NEXT: retq
;
; X64-BMI1BMI2-LABEL: bzhi64_c4_commutative:
; X64-BMI1BMI2: # %bb.0:
-; X64-BMI1BMI2-NEXT: bzhiq %rsi, %rdi, %rax
+; X64-BMI1BMI2-NEXT: pushq %r14
+; X64-BMI1BMI2-NEXT: pushq %rbx
+; X64-BMI1BMI2-NEXT: pushq %rax
+; X64-BMI1BMI2-NEXT: movq %rsi, %rbx
+; X64-BMI1BMI2-NEXT: movq %rdi, %r14
+; X64-BMI1BMI2-NEXT: movl %ebx, %eax
+; X64-BMI1BMI2-NEXT: negl %eax
+; X64-BMI1BMI2-NEXT: movq $-1, %rcx
+; X64-BMI1BMI2-NEXT: shrxq %rax, %rcx, %rdi
+; X64-BMI1BMI2-NEXT: callq use64
+; X64-BMI1BMI2-NEXT: bzhiq %rbx, %r14, %rax
+; X64-BMI1BMI2-NEXT: addq $8, %rsp
+; X64-BMI1BMI2-NEXT: popq %rbx
+; X64-BMI1BMI2-NEXT: popq %r14
; X64-BMI1BMI2-NEXT: retq
%numhighbits = sub i64 64, %numlowbits
%mask = lshr i64 -1, %numhighbits
+ call void @use64(i64 %mask)
%masked = and i64 %val, %mask ; swapped order
ret i64 %masked
}
OpenPOWER on IntegriCloud