mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 22:23:10 +00:00
[X86] Fix PR23271 - RIP-relative decoding bug in disassembler.
Differential Revision: http://reviews.llvm.org/D9110 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237310 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1366,16 +1366,17 @@ static int readModRM(struct InternalInstruction* insn) {
|
||||
switch (mod) {
|
||||
case 0x0:
|
||||
insn->eaDisplacement = EA_DISP_NONE; /* readSIB may override this */
|
||||
switch (rm) {
|
||||
case 0x14:
|
||||
case 0x4:
|
||||
case 0xc: /* in case REXW.b is set */
|
||||
// In determining whether RIP-relative mode is used (rm=5),
|
||||
// or whether a SIB byte is present (rm=4),
|
||||
// the extension bits (REX.b and EVEX.x) are ignored.
|
||||
switch (rm & 7) {
|
||||
case 0x4: // SIB byte is present
|
||||
insn->eaBase = (insn->addressSize == 4 ?
|
||||
EA_BASE_sib : EA_BASE_sib64);
|
||||
if (readSIB(insn) || readDisplacement(insn))
|
||||
return -1;
|
||||
break;
|
||||
case 0x5:
|
||||
case 0x5: // RIP-relative
|
||||
insn->eaBase = EA_BASE_NONE;
|
||||
insn->eaDisplacement = EA_DISP_32;
|
||||
if (readDisplacement(insn))
|
||||
@@ -1391,10 +1392,8 @@ static int readModRM(struct InternalInstruction* insn) {
|
||||
/* FALLTHROUGH */
|
||||
case 0x2:
|
||||
insn->eaDisplacement = (mod == 0x1 ? EA_DISP_8 : EA_DISP_32);
|
||||
switch (rm) {
|
||||
case 0x14:
|
||||
case 0x4:
|
||||
case 0xc: /* in case REXW.b is set */
|
||||
switch (rm & 7) {
|
||||
case 0x4: // SIB byte is present
|
||||
insn->eaBase = EA_BASE_sib;
|
||||
if (readSIB(insn) || readDisplacement(insn))
|
||||
return -1;
|
||||
|
||||
Reference in New Issue
Block a user