diff options
author | Craig Topper <craig.topper@gmail.com> | 2014-02-17 10:03:43 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2014-02-17 10:03:43 +0000 |
commit | 3457506fb9e5256fcc3c51ea3fd5bbd0221dead0 (patch) | |
tree | 7e4fb0a5277fb95d070001008692cc1edb90ad4b /lib | |
parent | e139a1e0e42045990990b0ef4f110c05fcfeae78 (diff) | |
download | llvm-3457506fb9e5256fcc3c51ea3fd5bbd0221dead0.tar.gz llvm-3457506fb9e5256fcc3c51ea3fd5bbd0221dead0.tar.bz2 llvm-3457506fb9e5256fcc3c51ea3fd5bbd0221dead0.tar.xz |
Fix diassembler handling of rex.b when mod=00/01/10 and bbb=101. Mod=00 should ignore the base register entirely. Mod=01/10 should treat this as R13 plus displacment. Fixes PR18860.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201507 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c index 75d255fe7e..a2b5e63fd1 100644 --- a/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c +++ b/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c @@ -1167,6 +1167,7 @@ static int readSIB(struct InternalInstruction* insn) { switch (base) { case 0x5: + case 0xd: switch (modFromModRM(insn->modRM)) { case 0x0: insn->eaDisplacement = EA_DISP_32; @@ -1174,13 +1175,11 @@ static int readSIB(struct InternalInstruction* insn) { break; case 0x1: insn->eaDisplacement = EA_DISP_8; - insn->sibBase = (insn->addressSize == 4 ? - SIB_BASE_EBP : SIB_BASE_RBP); + insn->sibBase = (SIBBase)(sibBaseBase + base); break; case 0x2: insn->eaDisplacement = EA_DISP_32; - insn->sibBase = (insn->addressSize == 4 ? - SIB_BASE_EBP : SIB_BASE_RBP); + insn->sibBase = (SIBBase)(sibBaseBase + base); break; case 0x3: debug("Cannot have Mod = 0b11 and a SIB byte"); |