diff options
| author | Andrew V. Tischenko <andrew.v.tischenko@gmail.com> | 2017-10-23 09:36:33 +0000 |
|---|---|---|
| committer | Andrew V. Tischenko <andrew.v.tischenko@gmail.com> | 2017-10-23 09:36:33 +0000 |
| commit | eff4fc0d411ed8b5ca4c2dc410feb8659c998afb (patch) | |
| tree | fb2991dc5396ef21a21c0fbf87ce0caaf90e9f65 | |
| parent | 32fefef7fc8c89738fc5589e48f9935d56b0b590 (diff) | |
| download | bcm5719-llvm-eff4fc0d411ed8b5ca4c2dc410feb8659c998afb.tar.gz bcm5719-llvm-eff4fc0d411ed8b5ca4c2dc410feb8659c998afb.zip | |
Fix for Bug 30718 - Failure to disassemble certain MOV with rex.R. The issue was in illegal segment register index.
Differential Revision: https://reviews.llvm.org/D38786
llvm-svn: 316319
| -rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/MC/Disassembler/X86/x86-64.txt | 3 |
2 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp index 80acff22f7b..709fc630633 100644 --- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp +++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp @@ -1453,9 +1453,9 @@ static int readModRM(struct InternalInstruction* insn) { case TYPE_MM64: \ return prefix##_MM0 + (index & 0x7); \ case TYPE_SEGMENTREG: \ - if (index > 5) \ + if ((index & 7) > 5) \ *valid = 0; \ - return prefix##_ES + index; \ + return prefix##_ES + (index & 7); \ case TYPE_DEBUGREG: \ return prefix##_DR0 + index; \ case TYPE_CONTROLREG: \ diff --git a/llvm/test/MC/Disassembler/X86/x86-64.txt b/llvm/test/MC/Disassembler/X86/x86-64.txt index 965d713e824..93026680e2a 100644 --- a/llvm/test/MC/Disassembler/X86/x86-64.txt +++ b/llvm/test/MC/Disassembler/X86/x86-64.txt @@ -482,6 +482,9 @@ # CHECK: xchgw %di, %ax 0x66 0x3e 0x97 +# CHECK: movq %rdx, %cs +0x4c 0x8e 0xca + # CHECK: movw %bx, %cs:(%rsi,%rbp) 0x2e 0x66 0x89 0x1c 0x2e # CHECK: movl %ebx, %cs:(%esi,%ebp) |

