summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2014-12-26 18:19:44 +0000
committerCraig Topper <craig.topper@gmail.com>2014-12-26 18:19:44 +0000
commitd5b39237a1a57d49b9aeb0c349a9f335e6d38b11 (patch)
tree3c93743c2fc7b3d8cf1f2be4e17749d5fba13f86
parentb6fa52f27450e563a481d7d9ff852105072298f2 (diff)
downloadbcm5719-llvm-d5b39237a1a57d49b9aeb0c349a9f335e6d38b11.tar.gz
bcm5719-llvm-d5b39237a1a57d49b9aeb0c349a9f335e6d38b11.zip
[X86] Don't fail disassembly if REX.R/REX.B is used on an MMX register. Similar fix to not fail to disassembler CR9-CR15 references.
llvm-svn: 224861
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp6
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h9
-rw-r--r--llvm/test/MC/Disassembler/X86/prefixes.txt9
3 files changed, 18 insertions, 6 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
index 770d406a180..d9766f5c157 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
@@ -1447,9 +1447,7 @@ static int readModRM(struct InternalInstruction* insn) {
case TYPE_MM64: \
case TYPE_MM32: \
case TYPE_MM: \
- if (index > 7) \
- *valid = 0; \
- return prefix##_MM0 + index; \
+ return prefix##_MM0 + (index & 0x7); \
case TYPE_SEGMENTREG: \
if (index > 5) \
*valid = 0; \
@@ -1459,8 +1457,6 @@ static int readModRM(struct InternalInstruction* insn) {
*valid = 0; \
return prefix##_DR0 + index; \
case TYPE_CONTROLREG: \
- if (index > 8) \
- *valid = 0; \
return prefix##_CR0 + index; \
} \
}
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
index 457b3820b46..46a74ab4e52 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
@@ -352,7 +352,14 @@ namespace X86Disassembler {
ENTRY(CR5) \
ENTRY(CR6) \
ENTRY(CR7) \
- ENTRY(CR8)
+ ENTRY(CR8) \
+ ENTRY(CR9) \
+ ENTRY(CR10) \
+ ENTRY(CR11) \
+ ENTRY(CR12) \
+ ENTRY(CR13) \
+ ENTRY(CR14) \
+ ENTRY(CR15)
#define ALL_EA_BASES \
EA_BASES_16BIT \
diff --git a/llvm/test/MC/Disassembler/X86/prefixes.txt b/llvm/test/MC/Disassembler/X86/prefixes.txt
index b8830dc3f3b..5f0a58c7437 100644
--- a/llvm/test/MC/Disassembler/X86/prefixes.txt
+++ b/llvm/test/MC/Disassembler/X86/prefixes.txt
@@ -54,6 +54,15 @@
# CHECK-NEXT: stosq
0xf3 0xf3 0x48 0xab
+
+# Test that we can disassembler control registers above CR8
+# CHECK: movq %cr15, %rax
+0x44 0x0f 0x20 0xf8
+
+# Test that MMX ignore REX.R and REX.B.
+# CHECK: movq %mm0, %mm1
+0x46 0x0f 0x7f 0xc1
+
# Test that a prefix on it's own works. It's debatable as to if this is
# something that is considered valid, but however as LLVM's own disassembler
# has decided to disassemble prefixes as being separate opcodes, it therefore
OpenPOWER on IntegriCloud