mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 14:49:42 -06:00
Merge pull request #2223 from phire/imm
Cleanup OpArg, make immediates more explicit.
This commit is contained in:
@ -223,7 +223,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg,
|
||||
// Oh, no memory, Just a reg.
|
||||
mod = 3; //11
|
||||
}
|
||||
else if (scale >= 1)
|
||||
else
|
||||
{
|
||||
//Ah good, no scaling.
|
||||
if (scale == SCALE_ATREG && !((_offsetOrBaseReg & 7) == 4 || (_offsetOrBaseReg & 7) == 5))
|
||||
@ -249,7 +249,7 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg,
|
||||
mod = 0;
|
||||
_offsetOrBaseReg = 5;
|
||||
}
|
||||
else //if (scale != SCALE_ATREG)
|
||||
else
|
||||
{
|
||||
if ((_offsetOrBaseReg & 7) == 4) //this would occupy the SIB encoding :(
|
||||
{
|
||||
@ -288,10 +288,6 @@ void OpArg::WriteRest(XEmitter *emit, int extraBytes, X64Reg _operandReg,
|
||||
if (SIB)
|
||||
oreg = 4;
|
||||
|
||||
// TODO(ector): WTF is this if about? I don't remember writing it :-)
|
||||
//if (RIP)
|
||||
// oreg = 5;
|
||||
|
||||
emit->WriteModRM(mod, _operandReg&7, oreg&7);
|
||||
|
||||
if (SIB)
|
||||
|
@ -128,6 +128,8 @@ class XEmitter;
|
||||
// RIP addressing does not benefit from micro op fusion on Core arch
|
||||
struct OpArg
|
||||
{
|
||||
friend class XEmitter; // For accessing offset and operandReg
|
||||
|
||||
OpArg() {} // dummy op arg, used for storage
|
||||
OpArg(u64 _offset, int _scale, X64Reg rmReg = RAX, X64Reg scaledReg = RAX)
|
||||
{
|
||||
@ -148,9 +150,16 @@ struct OpArg
|
||||
void WriteRest(XEmitter *emit, int extraBytes=0, X64Reg operandReg=INVALID_REG, bool warn_64bit_offset = true) const;
|
||||
void WriteFloatModRM(XEmitter *emit, FloatOp op);
|
||||
void WriteSingleByteOp(XEmitter *emit, u8 op, X64Reg operandReg, int bits);
|
||||
// This one is public - must be written to
|
||||
u64 offset; // use RIP-relative as much as possible - 64-bit immediates are not available.
|
||||
u16 operandReg;
|
||||
|
||||
u64 Imm64() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM64); return (u64)offset; }
|
||||
u32 Imm32() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM32); return (u32)offset; }
|
||||
u16 Imm16() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM16); return (u16)offset; }
|
||||
u8 Imm8() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM8); return (u8)offset; }
|
||||
|
||||
s64 SImm64() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM64); return (s64)offset; }
|
||||
s32 SImm32() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM32); return (s32)offset; }
|
||||
s16 SImm16() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM16); return (s16)offset; }
|
||||
s8 SImm8() const { _dbg_assert_(DYNA_REC, scale == SCALE_IMM8); return (s8)offset; }
|
||||
|
||||
void WriteNormalOp(XEmitter *emit, bool toRM, NormalOp op, const OpArg &operand, int bits) const;
|
||||
bool IsImm() const {return scale == SCALE_IMM8 || scale == SCALE_IMM16 || scale == SCALE_IMM32 || scale == SCALE_IMM64;}
|
||||
@ -188,10 +197,20 @@ struct OpArg
|
||||
else
|
||||
return INVALID_REG;
|
||||
}
|
||||
|
||||
void AddMemOffset(int val)
|
||||
{
|
||||
_dbg_assert_msg_(DYNA_REC, scale == SCALE_RIP || (scale <= SCALE_ATREG && scale > SCALE_NONE),
|
||||
"Tried to increment an OpArg which doesn't have an offset");
|
||||
offset += val;
|
||||
}
|
||||
|
||||
private:
|
||||
u8 scale;
|
||||
u16 offsetOrBaseReg;
|
||||
u16 indexReg;
|
||||
u64 offset; // Also used to store immediates.
|
||||
u16 operandReg;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
Reference in New Issue
Block a user