[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()
{
if (m_OpCode.Hex == 0)
{
return true;
}
return false;
}
bool IsLoadStore() bool IsNOP()
{ {
return (m_OpCode.op >= R4300i_LDL && m_OpCode.op <= R4300i_SD && m_OpCode.op != R4300i_CACHE); if (m_OpCode.Hex == 0)
} {
return true;
}
return false;
}
bool IsStackShift() bool IsLoadStore()
{ {
return (m_OpCode.op == R4300i_ADDIU || m_OpCode.op == R4300i_ADDI) && m_OpCode.rt == 29; return (m_OpCode.op >= R4300i_LDL && m_OpCode.op <= R4300i_SD && m_OpCode.op != R4300i_CACHE);
} }
bool IsStackAlloc() bool IsStackShift()
{ {
if (!IsStackShift()) return (m_OpCode.op == R4300i_ADDIU || m_OpCode.op == R4300i_ADDI) && m_OpCode.rt == 29;
{ }
return false;
}
return (short)m_OpCode.immediate < 0; bool IsStackAlloc()
} {
if (!IsStackShift())
{
return false;
}
bool IsStackFree() return (short)m_OpCode.immediate < 0;
{ }
if (!IsStackShift())
{
return false;
}
return (short)m_OpCode.immediate > 0; bool IsStackFree()
} {
if (!IsStackShift())
{
return false;
}
bool ReadsGPR(int nReg) return (short)m_OpCode.immediate > 0;
{ }
uint32_t op = m_OpCode.op;
if (op >= R4300i_LDL && op <= R4300i_LWU || bool ReadsGPR(int nReg)
op >= R4300i_ADDI && op <= R4300i_XORI || {
op == R4300i_LD || uint32_t op = m_OpCode.op;
op == R4300i_BGTZ || op == R4300i_BGTZL ||
op == R4300i_BLEZ || op == R4300i_BLEZL)
{
if (m_OpCode.rs == nReg)
{
return true;
}
}
if (op >= R4300i_SB && op <= R4300i_SWR || if (op >= R4300i_LDL && op <= R4300i_LWU ||
op >= R4300i_SC && op <= R4300i_SD || op >= R4300i_ADDI && op <= R4300i_XORI ||
op == R4300i_BEQ || op == R4300i_BEQL || op == R4300i_LD ||
op == R4300i_BNE || op == R4300i_BNEL) op == R4300i_BGTZ || op == R4300i_BGTZL ||
{ op == R4300i_BLEZ || op == R4300i_BLEZL)
// stores read value and index {
if (m_OpCode.rs == nReg || m_OpCode.rt == nReg) if (m_OpCode.rs == nReg)
{ {
return true; return true;
} }
} }
if (op == R4300i_SPECIAL) if (op >= R4300i_SB && op <= R4300i_SWR ||
{ op >= R4300i_SC && op <= R4300i_SD ||
uint32_t fn = m_OpCode.funct; op == R4300i_BEQ || op == R4300i_BEQL ||
op == R4300i_BNE || op == R4300i_BNEL)
{
// stores read value and index
if (m_OpCode.rs == nReg || m_OpCode.rt == nReg)
{
return true;
}
}
switch (fn) if (op == R4300i_SPECIAL)
{ {
case R4300i_SPECIAL_MTLO: uint32_t fn = m_OpCode.funct;
case R4300i_SPECIAL_MTHI:
case R4300i_SPECIAL_JR:
case R4300i_SPECIAL_JALR:
if (m_OpCode.rs == nReg)
{
return true;
}
break;
case R4300i_SPECIAL_SLL:
case R4300i_SPECIAL_SRL:
case R4300i_SPECIAL_SRA:
if (m_OpCode.rt == nReg)
{
return true;
}
break;
}
if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV || switch (fn)
fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV || {
fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU) case R4300i_SPECIAL_MTLO:
{ case R4300i_SPECIAL_MTHI:
// two register operands case R4300i_SPECIAL_JR:
if (m_OpCode.rt == nReg || m_OpCode.rs == nReg) case R4300i_SPECIAL_JALR:
{ if (m_OpCode.rs == nReg)
return true; {
} return true;
} }
} break;
case R4300i_SPECIAL_SLL:
case R4300i_SPECIAL_SRL:
case R4300i_SPECIAL_SRA:
if (m_OpCode.rt == nReg)
{
return true;
}
break;
}
return false; if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV ||
} fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV ||
fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU)
{
// two register operands
if (m_OpCode.rt == nReg || m_OpCode.rs == nReg)
{
return true;
}
}
}
bool WritesGPR(int nReg) return false;
{ }
uint32_t op = m_OpCode.op;
if (op >= R4300i_LDL && op <= R4300i_LWU || bool WritesGPR(int nReg)
op >= R4300i_ADDI && op <= R4300i_XORI || {
op == R4300i_LUI || op == R4300i_LD) uint32_t op = m_OpCode.op;
{
// loads write value
if (m_OpCode.rt == nReg)
{
return true;
}
}
if (op == R4300i_JAL) if (op >= R4300i_LDL && op <= R4300i_LWU ||
{ op >= R4300i_ADDI && op <= R4300i_XORI ||
if (nReg == 31) // RA op == R4300i_LUI || op == R4300i_LD)
{ {
return true; // loads write value
} if (m_OpCode.rt == nReg)
} {
return true;
}
}
if (op == R4300i_SPECIAL) if (op == R4300i_JAL)
{ {
uint32_t fn = m_OpCode.funct; if (nReg == 31) // RA
{
return true;
}
}
switch (fn) if (op == R4300i_SPECIAL)
{ {
case R4300i_SPECIAL_MFLO: uint32_t fn = m_OpCode.funct;
case R4300i_SPECIAL_MFHI:
case R4300i_SPECIAL_SLL:
case R4300i_SPECIAL_SRL:
case R4300i_SPECIAL_SRA:
if (m_OpCode.rd == nReg)
{
return true;
}
break;
}
if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV || switch (fn)
fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV || {
fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU || case R4300i_SPECIAL_MFLO:
fn == R4300i_SPECIAL_JALR) case R4300i_SPECIAL_MFHI:
{ case R4300i_SPECIAL_SLL:
// result register case R4300i_SPECIAL_SRL:
if (m_OpCode.rd == nReg) case R4300i_SPECIAL_SRA:
{ if (m_OpCode.rd == nReg)
return true; {
} return true;
} }
} break;
}
return false; if (fn >= R4300i_SPECIAL_SLLV && fn <= R4300i_SPECIAL_SRAV ||
} fn >= R4300i_SPECIAL_DSLLV && fn <= R4300i_SPECIAL_DSRAV ||
fn >= R4300i_SPECIAL_DIVU && fn <= R4300i_SPECIAL_DSUBU ||
fn == R4300i_SPECIAL_JALR)
{
// result register
if (m_OpCode.rd == nReg)
{
return true;
}
}
}
bool ReadsLO() return false;
{ }
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFLO)
{
return true;
}
return false;
}
bool WritesLO() bool ReadsLO()
{ {
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTLO) if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFLO)
{ {
return true; return true;
} }
return false; return false;
} }
// todo add mult, div etc bool WritesLO()
{
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTLO)
{
return true;
}
return false;
}
bool ReadsHI() // todo add mult, div etc
{
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MFHI)
{
return true;
}
return false;
}
bool WritesHI() bool ReadsHI()
{ {
if (m_OpCode.op == R4300i_SPECIAL && m_OpCode.funct == R4300i_SPECIAL_MTHI) 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;
}
}; };