[X86] Don't fail disassembly if REX.R/REX.B is used on an MMX register. Similar fix...
authorCraig Topper <craig.topper@gmail.com>
Fri, 26 Dec 2014 18:19:44 +0000 (18:19 +0000)
committerCraig Topper <craig.topper@gmail.com>
Fri, 26 Dec 2014 18:19:44 +0000 (18:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224861 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
test/MC/Disassembler/X86/prefixes.txt

index 770d406a180b507cb16d73caff674976e716f7a1..d9766f5c1574882d58e13577eb964d621d72100a 100644 (file)
@@ -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;                        \
     }                                                     \
   }
index 457b3820b461c060b8792cc2077dd5240acb8ff2..46a74ab4e5291a609e4664bdd50c2892a43538e9 100644 (file)
@@ -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      \
index b8830dc3f3b98ffaade8930f09b8c95bfd0ea5f6..5f0a58c74376aa99cd6d174b6bc6f552f510108b 100644 (file)
 # 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