[PATCH] D57389: [X86] Improve use of SHLD/SHRD
Amaury SECHET via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 1 18:35:43 PST 2019
deadalnix updated this revision to Diff 189022.
deadalnix added a comment.
Rebase and add test cases taht do not depend on D57367 <https://reviews.llvm.org/D57367>
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D57389/new/
https://reviews.llvm.org/D57389
Files:
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/shift-double-x86_64.ll
test/CodeGen/X86/shift-double.ll
Index: test/CodeGen/X86/shift-double.ll
===================================================================
--- test/CodeGen/X86/shift-double.ll
+++ test/CodeGen/X86/shift-double.ll
@@ -462,30 +462,18 @@
define i32 @test18(i32 %hi, i32 %lo, i32 %bits) nounwind {
; X86-LABEL: test18:
; X86: # %bb.0:
-; X86-NEXT: pushl %esi
+; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
+; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
-; X86-NEXT: movb {{[0-9]+}}(%esp), %dl
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: andb $31, %cl
-; X86-NEXT: negb %cl
-; X86-NEXT: shrl %cl, %esi
-; X86-NEXT: movl %edx, %ecx
-; X86-NEXT: shll %cl, %eax
-; X86-NEXT: orl %esi, %eax
-; X86-NEXT: popl %esi
+; X86-NEXT: shldl %cl, %edx, %eax
; X86-NEXT: retl
;
; X64-LABEL: test18:
; X64: # %bb.0:
-; X64-NEXT: movl %edi, %eax
-; X64-NEXT: movl %edx, %ecx
-; X64-NEXT: andb $31, %cl
-; X64-NEXT: negb %cl
-; X64-NEXT: shrl %cl, %esi
; X64-NEXT: movl %edx, %ecx
-; X64-NEXT: shll %cl, %eax
-; X64-NEXT: orl %esi, %eax
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: # kill: def $cl killed $cl killed $ecx
+; X64-NEXT: shldl %cl, %esi, %eax
; X64-NEXT: retq
%tbits = trunc i32 %bits to i8
%tand = and i8 %tbits, 31
Index: test/CodeGen/X86/shift-double-x86_64.ll
===================================================================
--- test/CodeGen/X86/shift-double-x86_64.ll
+++ test/CodeGen/X86/shift-double-x86_64.ll
@@ -118,14 +118,10 @@
define i64 @test8(i64 %hi, i64 %lo, i64 %bits) nounwind {
; CHECK-LABEL: test8:
; CHECK: # %bb.0:
+; CHECK-NEXT: movq %rdx, %rcx
; CHECK-NEXT: movq %rdi, %rax
-; CHECK-NEXT: movl %edx, %ecx
-; CHECK-NEXT: andb $63, %cl
-; CHECK-NEXT: negb %cl
-; CHECK-NEXT: shrq %cl, %rsi
-; CHECK-NEXT: movl %edx, %ecx
-; CHECK-NEXT: shlq %cl, %rax
-; CHECK-NEXT: orq %rsi, %rax
+; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx
+; CHECK-NEXT: shldq %cl, %rsi, %rax
; CHECK-NEXT: retq
%tbits = trunc i64 %bits to i8
%tand = and i8 %tbits, 63
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp
+++ lib/Target/X86/X86ISelLowering.cpp
@@ -37425,6 +37425,12 @@
SDValue Sum = ShAmt1.getOperand(0);
if (auto *SumC = dyn_cast<ConstantSDNode>(Sum)) {
SDValue ShAmt1Op1 = ShAmt1.getOperand(1);
+ if (ShAmt1Op1.getOpcode() == ISD::AND &&
+ isa<ConstantSDNode>(ShAmt1Op1.getOperand(1)) &&
+ ShAmt1Op1.getConstantOperandVal(1) == (Bits - 1)) {
+ ShMsk1 = ShAmt1Op1;
+ ShAmt1Op1 = ShAmt1Op1.getOperand(0);
+ }
if (ShAmt1Op1.getOpcode() == ISD::TRUNCATE)
ShAmt1Op1 = ShAmt1Op1.getOperand(0);
if ((SumC->getAPIntValue() == Bits ||
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57389.189022.patch
Type: text/x-patch
Size: 2915 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190302/677bbabf/attachment-0001.bin>
More information about the llvm-commits
mailing list