[Project64] Clean up OpInfo.h

This commit is contained in:
zilmar 2017-09-13 20:17:17 +10:00
parent 5d66d688b3
commit d98eab7dcc
1 changed files with 253 additions and 254 deletions

View File

@ -18,305 +18,304 @@ class COpInfo
{ {
public: public:
OPCODE m_OpCode; OPCODE m_OpCode;
bool IsStaticJump() bool IsStaticJump()
{ {
// j, jal // j, jal
uint32_t op = m_OpCode.op; uint32_t op = m_OpCode.op;
if (op == R4300i_J || op == R4300i_JAL) if (op == R4300i_J || op == R4300i_JAL)
{ {
return true; return true;
} }
return false; return false;
} }
bool IsJump() bool IsJump()
{ {
// j, jal, jr, jalr, exception // j, jal, jr, jalr, exception
uint32_t op = m_OpCode.op; uint32_t op = m_OpCode.op;
if (op == R4300i_J || op == R4300i_JAL) if (op == R4300i_J || op == R4300i_JAL)
{ {
return true; return true;
} }
if (op == R4300i_SPECIAL) if (op == R4300i_SPECIAL)
{ {
uint32_t fn = m_OpCode.funct; uint32_t fn = m_OpCode.funct;
if (fn >= R4300i_SPECIAL_JR && fn <= R4300i_SPECIAL_BREAK) if (fn >= R4300i_SPECIAL_JR && fn <= R4300i_SPECIAL_BREAK)
{ {
return true; return true;
} }
} }
if (op == R4300i_REGIMM) if (op == R4300i_REGIMM)
{ {
uint32_t rt = m_OpCode.rt; uint32_t rt = m_OpCode.rt;
if (rt >= R4300i_REGIMM_TGEI && rt <= R4300i_REGIMM_TNEI) if (rt >= R4300i_REGIMM_TGEI && rt <= R4300i_REGIMM_TNEI)
{ {
return true; return true;
} }
} }
if (op == R4300i_CP0) if (op == R4300i_CP0)
{ {
if ((m_OpCode.rs & 0x10) != 0) if ((m_OpCode.rs & 0x10) != 0)
{ {
uint32_t fn = m_OpCode.funct; uint32_t fn = m_OpCode.funct;
if (fn == R4300i_COP0_CO_ERET) if (fn == R4300i_COP0_CO_ERET)
{ {
return true; return true;
} }
} }
} }
return false; return false;
} }
bool IsBranch() bool IsBranch()
{ {
uint32_t op = m_OpCode.op; uint32_t op = m_OpCode.op;
if (op >= R4300i_BEQ && op <= R4300i_BGTZ) if (op >= R4300i_BEQ && op <= R4300i_BGTZ)
{ {
return true; return true;
} }
if (op >= R4300i_BEQL && op <= R4300i_BGTZL) if (op >= R4300i_BEQL && op <= R4300i_BGTZL)
{ {
return true; return true;
} }
if (op == R4300i_REGIMM) if (op == R4300i_REGIMM)
{ {
uint32_t rt = m_OpCode.rt; uint32_t rt = m_OpCode.rt;
if (rt >= R4300i_REGIMM_BLTZ && rt <= R4300i_REGIMM_BGEZL) if (rt >= R4300i_REGIMM_BLTZ && rt <= R4300i_REGIMM_BGEZL)
{ {
return true; return true;
} }
if (rt >= R4300i_REGIMM_BLTZAL && rt <= R4300i_REGIMM_BGEZALL) if (rt >= R4300i_REGIMM_BLTZAL && rt <= R4300i_REGIMM_BGEZALL)
{ {
return true; return true;
} }
} }
if (op == R4300i_CP1 && m_OpCode.fmt == R4300i_COP1_BC) if (op == R4300i_CP1 && m_OpCode.fmt == R4300i_COP1_BC)
{ {
return true; return true;
} }
return false; return false;
} }
bool IsNOP() bool IsNOP()
{ {
if (m_OpCode.Hex == 0) if (m_OpCode.Hex == 0)
{ {
return true; return true;
} }
return false; return false;
} }
bool IsLoadStore() bool IsLoadStore()
{ {
return (m_OpCode.op >= R4300i_LDL && m_OpCode.op <= R4300i_SD && m_OpCode.op != R4300i_CACHE); return (m_OpCode.op >= R4300i_LDL && m_OpCode.op <= R4300i_SD && m_OpCode.op != R4300i_CACHE);
} }
bool IsStackShift() bool IsStackShift()
{ {
return (m_OpCode.op == R4300i_ADDIU || m_OpCode.op == R4300i_ADDI) && m_OpCode.rt == 29; return (m_OpCode.op == R4300i_ADDIU || m_OpCode.op == R4300i_ADDI) && m_OpCode.rt == 29;
} }
bool IsStackAlloc() bool IsStackAlloc()
{ {
if (!IsStackShift()) if (!IsStackShift())
{ {
return false; return false;
} }
return (short)m_OpCode.immediate < 0; return (short)m_OpCode.immediate < 0;
} }
bool IsStackFree() bool IsStackFree()
{ {
if (!IsStackShift()) if (!IsStackShift())
{ {
return false; return false;
} }
return (short)m_OpCode.immediate > 0; return (short)m_OpCode.immediate > 0;
} }
bool ReadsGPR(int nReg) bool ReadsGPR(int nReg)
{ {
uint32_t op = m_OpCode.op; uint32_t op = m_OpCode.op;
if (op >= R4300i_LDL && op <= R4300i_LWU || if (op >= R4300i_LDL && op <= R4300i_LWU ||
op >= R4300i_ADDI && op <= R4300i_XORI || op >= R4300i_ADDI && op <= R4300i_XORI ||
op == R4300i_LD || op == R4300i_LD ||
op == R4300i_BGTZ || op == R4300i_BGTZL || op == R4300i_BGTZ || op == R4300i_BGTZL ||
op == R4300i_BLEZ || op == R4300i_BLEZL) op == R4300i_BLEZ || op == R4300i_BLEZL)
{ {
if (m_OpCode.rs == nReg) if (m_OpCode.rs == nReg)
{ {
return true; return true;
} }
} }
if (op >= R4300i_SB && op <= R4300i_SWR || if (op >= R4300i_SB && op <= R4300i_SWR ||
op >= R4300i_SC && op <= R4300i_SD || op >= R4300i_SC && op <= R4300i_SD ||
op == R4300i_BEQ || op == R4300i_BEQL || op == R4300i_BEQ || op == R4300i_BEQL ||
op == R4300i_BNE || op == R4300i_BNEL) op == R4300i_BNE || op == R4300i_BNEL)
{ {
// stores read value and index // stores read value and index
if (m_OpCode.rs == nReg || m_OpCode.rt == nReg) if (m_OpCode.rs == nReg || m_OpCode.rt == nReg)
{ {
return true; return true;
} }
} }
if (op == R4300i_SPECIAL) if (op == R4300i_SPECIAL)
{ {
uint32_t fn = m_OpCode.funct; uint32_t fn = m_OpCode.funct;
switch (fn) switch (fn)
{ {
case R4300i_SPECIAL_MTLO: case R4300i_SPECIAL_MTLO:
case R4300i_SPECIAL_MTHI: case R4300i_SPECIAL_MTHI:
case R4300i_SPECIAL_JR: case R4300i_SPECIAL_JR:
case R4300i_SPECIAL_JALR: case R4300i_SPECIAL_JALR:
if (m_OpCode.rs == nReg) if (m_OpCode.rs == nReg)
{ {
return true; return true;
} }
break; break;
case R4300i_SPECIAL_SLL: case R4300i_SPECIAL_SLL:
case R4300i_SPECIAL_SRL: case R4300i_SPECIAL_SRL:
case R4300i_SPECIAL_SRA: case R4300i_SPECIAL_SRA:
if (m_OpCode.rt == nReg) if (m_OpCode.rt == nReg)
{ {
return true; return true;
} }
break; break;
} }
if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV || if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV ||
fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV || fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV ||
fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU) fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU)
{ {
// two register operands // two register operands
if (m_OpCode.rt == nReg || m_OpCode.rs == nReg) if (m_OpCode.rt == nReg || m_OpCode.rs == nReg)
{ {
return true; return true;
} }
} }
} }
return false; return false;
} }
bool WritesGPR(int nReg) bool WritesGPR(int nReg)
{ {
uint32_t op = m_OpCode.op; uint32_t op = m_OpCode.op;
if (op >= R4300i_LDL && op <= R4300i_LWU || if (op >= R4300i_LDL && op <= R4300i_LWU ||
op >= R4300i_ADDI && op <= R4300i_XORI || op >= R4300i_ADDI && op <= R4300i_XORI ||
op == R4300i_LUI || op == R4300i_LD) op == R4300i_LUI || op == R4300i_LD)
{ {
// loads write value // loads write value
if (m_OpCode.rt == nReg) if (m_OpCode.rt == nReg)
{ {
return true; return true;
} }
} }
if (op == R4300i_JAL) if (op == R4300i_JAL)
{ {
if (nReg == 31) // RA if (nReg == 31) // RA
{ {
return true; return true;
} }
} }
if (op == R4300i_SPECIAL) if (op == R4300i_SPECIAL)
{ {
uint32_t fn = m_OpCode.funct; uint32_t fn = m_OpCode.funct;
switch (fn) switch (fn)
{ {
case R4300i_SPECIAL_MFLO: case R4300i_SPECIAL_MFLO:
case R4300i_SPECIAL_MFHI: case R4300i_SPECIAL_MFHI:
case R4300i_SPECIAL_SLL: case R4300i_SPECIAL_SLL:
case R4300i_SPECIAL_SRL: case R4300i_SPECIAL_SRL:
case R4300i_SPECIAL_SRA: case R4300i_SPECIAL_SRA:
if (m_OpCode.rd == nReg) if (m_OpCode.rd == nReg)
{ {
return true; return true;
} }
break; break;
} }
if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV || if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV ||
fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV || fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV ||
fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU || fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU ||
fn == R4300i_SPECIAL_JALR) fn == R4300i_SPECIAL_JALR)
{ {
// result register // result register
if (m_OpCode.rd == nReg) if (m_OpCode.rd == nReg)
{ {
return true; return true;
} }
} }
} }
return false; return false;
} }
bool ReadsLO() bool ReadsLO()
{ {
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFLO) if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFLO)
{ {
return true; return true;
} }
return false; return false;
} }
bool WritesLO() bool WritesLO()
{ {
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTLO) if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTLO)
{ {
return true; return true;
} }
return false; return false;
} }
// todo add mult, div etc // todo add mult, div etc
bool ReadsHI() bool ReadsHI()
{ {
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFHI) if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFHI)
{ {
return true; return true;
} }
return false; return false;
} }
bool WritesHI()
{
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTHI)
{
return true;
}
return false;
}
bool WritesHI()
{
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTHI)
{
return true;
}
return false;
}
}; };