summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86InstrCompiler.td
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-10-05 06:47:35 +0000
committerChris Lattner <sabre@nondot.org>2010-10-05 06:47:35 +0000
commitd8cc2722a46c65db1ea2f4c77d2a04a5a0378edb (patch)
treecbccf301095cdc87f7139d3e55b48ad9cc6817ac /lib/Target/X86/X86InstrCompiler.td
parent5673e1d3140e8460bf62e6fe98ebcd7e0dc142df (diff)
downloadllvm-d8cc2722a46c65db1ea2f4c77d2a04a5a0378edb.tar.gz
llvm-d8cc2722a46c65db1ea2f4c77d2a04a5a0378edb.tar.bz2
llvm-d8cc2722a46c65db1ea2f4c77d2a04a5a0378edb.tar.xz
move some instructions from Instr64Bit -> InstrInfo.
bswap32 doesn't read eflags. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115604 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86InstrCompiler.td')
-rw-r--r--lib/Target/X86/X86InstrCompiler.td18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/Target/X86/X86InstrCompiler.td b/lib/Target/X86/X86InstrCompiler.td
index d1610b92ee..db6e5a490d 100644
--- a/lib/Target/X86/X86InstrCompiler.td
+++ b/lib/Target/X86/X86InstrCompiler.td
@@ -981,6 +981,24 @@ def : Pat<(i64 (anyext GR16:$src)), (MOVZX64rr16 GR16 :$src)>;
def : Pat<(i64 (anyext GR32:$src)),
(SUBREG_TO_REG (i64 0), GR32:$src, sub_32bit)>;
+
+// Any instruction that defines a 32-bit result leaves the high half of the
+// register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may
+// be copying from a truncate. And x86's cmov doesn't do anything if the
+// condition is false. But any other 32-bit operation will zero-extend
+// up to 64 bits.
+def def32 : PatLeaf<(i32 GR32:$src), [{
+ return N->getOpcode() != ISD::TRUNCATE &&
+ N->getOpcode() != TargetOpcode::EXTRACT_SUBREG &&
+ N->getOpcode() != ISD::CopyFromReg &&
+ N->getOpcode() != X86ISD::CMOV;
+}]>;
+
+// In the case of a 32-bit def that is known to implicitly zero-extend,
+// we can use a SUBREG_TO_REG.
+def : Pat<(i64 (zext def32:$src)),
+ (SUBREG_TO_REG (i64 0), GR32:$src, sub_32bit)>;
+
//===----------------------------------------------------------------------===//
// Some peepholes
//===----------------------------------------------------------------------===//