summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-02-23 06:09:57 +0000
committerChris Lattner <sabre@nondot.org>2010-02-23 06:09:57 +0000
commit48370e14e744f6d65f7018fbe925362bebe9e8e7 (patch)
tree10ae6e8e45b7e904d66f16ab803ce20885c04a77 /llvm/lib/Target
parent552eeaa93e432761e982e29a19e410952e0190ef (diff)
downloadbcm5719-llvm-48370e14e744f6d65f7018fbe925362bebe9e8e7.tar.gz
bcm5719-llvm-48370e14e744f6d65f7018fbe925362bebe9e8e7.zip
fix a type mismatch in this pattern, where we were using an i64 imm in a
place where an i32 imm was required, the old isel just got lucky. This fixes CodeGen/X86/x86-64-and-mask.ll llvm-svn: 96894
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86Instr64bit.td8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86Instr64bit.td b/llvm/lib/Target/X86/X86Instr64bit.td
index 4ea3739629a..ebaff10fb05 100644
--- a/llvm/lib/Target/X86/X86Instr64bit.td
+++ b/llvm/lib/Target/X86/X86Instr64bit.td
@@ -65,12 +65,18 @@ def i64immSExt8 : PatLeaf<(i64 imm), [{
return (int64_t)N->getZExtValue() == (int8_t)N->getZExtValue();
}]>;
+def GetLo32XForm : SDNodeXForm<imm, [{
+ // Transformation function: get the low 32 bits.
+ return getI32Imm((unsigned)N->getZExtValue());
+}]>;
+
def i64immSExt32 : PatLeaf<(i64 imm), [{
// i64immSExt32 predicate - True if the 64-bit immediate fits in a 32-bit
// sign extended field.
return (int64_t)N->getZExtValue() == (int32_t)N->getZExtValue();
}]>;
+
def i64immZExt32 : PatLeaf<(i64 imm), [{
// i64immZExt32 predicate - True if the 64-bit immediate fits in a 32-bit
// unsignedsign extended field.
@@ -1981,7 +1987,7 @@ def : Pat<(and GR64:$src, i64immZExt32:$imm),
(i64 0),
(AND32ri
(EXTRACT_SUBREG GR64:$src, x86_subreg_32bit),
- imm:$imm),
+ (i32 (GetLo32XForm imm:$imm))),
x86_subreg_32bit)>;
// r & (2^32-1) ==> movz
OpenPOWER on IntegriCloud