mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 02:24:22 +00:00
[x86] Allow segment and address-size overrides for LODS[BWLQ] (PR9385)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199803 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -233,6 +233,29 @@ static const uint8_t segmentRegnums[SEG_OVERRIDE_max] = {
|
||||
X86::GS
|
||||
};
|
||||
|
||||
/// translateSrcIndex - Appends a source index operand to an MCInst.
|
||||
///
|
||||
/// @param mcInst - The MCInst to append to.
|
||||
/// @param operand - The operand, as stored in the descriptor table.
|
||||
/// @param insn - The internal instruction.
|
||||
static bool translateSrcIndex(MCInst &mcInst, InternalInstruction &insn) {
|
||||
unsigned baseRegNo;
|
||||
|
||||
if (insn.mode == MODE_64BIT)
|
||||
baseRegNo = insn.prefixPresent[0x67] ? X86::ESI : X86::RSI;
|
||||
else if (insn.mode == MODE_32BIT)
|
||||
baseRegNo = insn.prefixPresent[0x67] ? X86::SI : X86::ESI;
|
||||
else if (insn.mode == MODE_16BIT)
|
||||
baseRegNo = insn.prefixPresent[0x67] ? X86::ESI : X86::SI;
|
||||
MCOperand baseReg = MCOperand::CreateReg(baseRegNo);
|
||||
mcInst.addOperand(baseReg);
|
||||
|
||||
MCOperand segmentReg;
|
||||
segmentReg = MCOperand::CreateReg(segmentRegnums[insn.segmentOverride]);
|
||||
mcInst.addOperand(segmentReg);
|
||||
return false;
|
||||
}
|
||||
|
||||
/// translateImmediate - Appends an immediate operand to an MCInst.
|
||||
///
|
||||
/// @param mcInst - The MCInst to append to.
|
||||
@ -694,6 +717,8 @@ static bool translateOperand(MCInst &mcInst, const OperandSpecifier &operand,
|
||||
insn,
|
||||
Dis);
|
||||
return false;
|
||||
case ENCODING_SI:
|
||||
return translateSrcIndex(mcInst, insn);
|
||||
case ENCODING_RB:
|
||||
case ENCODING_RW:
|
||||
case ENCODING_RD:
|
||||
|
Reference in New Issue
Block a user