llejit - fix for flag generation code + dspspy jit workaround

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7459 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Marko Pusljar 2011-04-15 13:04:20 +00:00
parent 09042aa569
commit 12c38d3afa
9 changed files with 90 additions and 87 deletions

View File

@ -172,10 +172,7 @@ bool DSPCore_Init(const char *irom_filename, const char *coef_filename,
if(bUsingJIT)
dspjit = new DSPEmitter();
DSPAnalyzer::Analyze();
core_state = DSPCORE_RUNNING;
return true;
}
@ -202,6 +199,7 @@ void DSPCore_Reset()
g_dsp.r.wr[2] = 0xffff;
g_dsp.r.wr[3] = 0xffff;
DSPAnalyzer::Analyze();
}
void DSPCore_SetException(u8 level)

View File

@ -96,6 +96,14 @@ void DSPEmitter::checkExceptions(u32 retval)
SetJumpTarget(skipCheck);
}
bool DSPEmitter::FlagsNeeded()
{
if (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)
return true;
else
return false;
}
void DSPEmitter::Default(UDSPInstruction inst)
{
if (opTable[inst]->reads_pc)
@ -171,11 +179,6 @@ void DSPEmitter::EmitInstruction(UDSPInstruction inst)
}
}
void DSPEmitter::unknown_instruction(UDSPInstruction inst)
{
PanicAlert("unknown_instruction %04x - Fix me ;)", inst);
}
void DSPEmitter::Compile(u16 start_addr)
{
// Remember the current block address for later

View File

@ -40,7 +40,6 @@ public:
Block m_compiledCode;
void EmitInstruction(UDSPInstruction inst);
void unknown_instruction(UDSPInstruction inst);
void ClearIRAM();
void CompileDispatcher();
@ -48,6 +47,8 @@ public:
void Compile(u16 start_addr);
void ClearCallFlag();
bool FlagsNeeded();
void Default(UDSPInstruction inst);
// CC Util

View File

@ -72,9 +72,9 @@ void gdsp_mbox_write_l(u8 mbx, u16 val)
#if defined(_DEBUG) || defined(DEBUGFAST)
if (mbx == GDSP_MBOX_DSP)
{
NOTICE_LOG(DSP_MAIL, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
INFO_LOG(DSP_MAIL, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
} else {
NOTICE_LOG(DSP_MAIL, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
INFO_LOG(DSP_MAIL, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
}
#endif
}
@ -104,9 +104,9 @@ u16 gdsp_mbox_read_l(u8 mbx)
#if defined(_DEBUG) || defined(DEBUGFAST)
if (mbx == GDSP_MBOX_DSP)
{
NOTICE_LOG(DSP_MAIL, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
INFO_LOG(DSP_MAIL, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
} else {
NOTICE_LOG(DSP_MAIL, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
INFO_LOG(DSP_MAIL, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
}
#endif

View File

@ -185,10 +185,10 @@ const DSPOPCTemplate opcodes[] =
{"ILRRN", 0x021c, 0xfefc, DSPInterpreter::ilrrn, &DSPEmitter::ilrrn, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false, false, false, false, false},
// LOOPS
{"LOOP", 0x0040, 0xffe0, DSPInterpreter::loop, &DSPEmitter::loop, 1, 1, {{P_REG, 1, 0, 0, 0x001f}}, false, true, false, true, false},
{"BLOOP", 0x0060, 0xffe0, DSPInterpreter::bloop, &DSPEmitter::bloop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true, false},
{"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, &DSPEmitter::loopi, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false, true, false, true, false},
{"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, &DSPEmitter::bloopi, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true, false},
{"LOOP", 0x0040, 0xffe0, DSPInterpreter::loop, &DSPEmitter::loop, 1, 1, {{P_REG, 1, 0, 0, 0x001f}}, false, true, true, true, false},
{"BLOOP", 0x0060, 0xffe0, DSPInterpreter::bloop, &DSPEmitter::bloop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, true, true, false},
{"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, &DSPEmitter::loopi, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false, true, true, true, false},
{"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, &DSPEmitter::bloopi, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, true, true, false},
// load and store value pointed by indexing reg and increment; LRR/SRR variants
{"LRR", 0x1800, 0xff80, DSPInterpreter::lrr, &DSPEmitter::lrr, 1, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_PRG, 1, 0, 5, 0x0060}}, false, false, false, false, false},

View File

@ -41,7 +41,7 @@ void DSPEmitter::clr(const UDSPInstruction opc)
MOV(64, R(RAX), Imm64(0));
set_long_acc(reg);
// Update_SR_Register64(0);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -65,7 +65,7 @@ void DSPEmitter::clrl(const UDSPInstruction opc)
// dsp_set_long_acc(reg, acc);
set_long_acc(reg);
// Update_SR_Register64(acc);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -86,7 +86,7 @@ void DSPEmitter::clrl(const UDSPInstruction opc)
void DSPEmitter::andcf(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 reg = (opc >> 8) & 0x1;
// u16 imm = dsp_fetch_code();
@ -126,7 +126,7 @@ void DSPEmitter::andcf(const UDSPInstruction opc)
void DSPEmitter::andf(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 reg = (opc >> 8) & 0x1;
// u16 imm = dsp_fetch_code();
@ -164,7 +164,7 @@ void DSPEmitter::andf(const UDSPInstruction opc)
void DSPEmitter::tst(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 reg = (opc >> 11) & 0x1;
// s64 acc = dsp_get_long_acc(reg);
@ -185,7 +185,7 @@ void DSPEmitter::tst(const UDSPInstruction opc)
void DSPEmitter::tstaxh(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 reg = (opc >> 8) & 0x1;
// s16 val = dsp_get_ax_h(reg);
@ -208,7 +208,7 @@ void DSPEmitter::tstaxh(const UDSPInstruction opc)
void DSPEmitter::cmp(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
X64Reg tmp1;
gpr.getFreeXReg(tmp1);
@ -238,7 +238,7 @@ void DSPEmitter::cmp(const UDSPInstruction opc)
void DSPEmitter::cmpar(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 rreg = ((opc >> 12) & 0x1);
u8 sreg = (opc >> 11) & 0x1;
@ -274,7 +274,7 @@ void DSPEmitter::cmpar(const UDSPInstruction opc)
void DSPEmitter::cmpi(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 reg = (opc >> 8) & 0x1;
X64Reg tmp1;
@ -307,7 +307,7 @@ void DSPEmitter::cmpi(const UDSPInstruction opc)
void DSPEmitter::cmpis(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
u8 areg = (opc >> 8) & 0x1;
// s64 acc = dsp_get_long_acc(areg);
@ -351,7 +351,7 @@ void DSPEmitter::xorr(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -380,7 +380,7 @@ void DSPEmitter::andr(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -409,7 +409,7 @@ void DSPEmitter::orr(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -437,7 +437,7 @@ void DSPEmitter::andc(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -465,7 +465,7 @@ void DSPEmitter::orc(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -492,7 +492,7 @@ void DSPEmitter::xorc(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -518,7 +518,7 @@ void DSPEmitter::notc(const UDSPInstruction opc)
// g_dsp.r.acm[dreg] = accm;
set_acc_m(dreg);
// Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(dreg, RCX);
Update_SR_Register16_OverS32();
@ -546,7 +546,7 @@ void DSPEmitter::xori(const UDSPInstruction opc)
XOR(16, R(RAX), Imm16(imm));
set_acc_m(reg);
// Update_SR_Register16((s16)g_dsp.r.acm[reg], false, false, isOverS32(dsp_get_long_acc(reg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(reg, RCX);
Update_SR_Register16_OverS32();
@ -573,7 +573,7 @@ void DSPEmitter::andi(const UDSPInstruction opc)
AND(16, R(RAX), Imm16(imm));
set_acc_m(reg);
// Update_SR_Register16((s16)g_dsp.r.acm[reg], false, false, isOverS32(dsp_get_long_acc(reg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(reg, RCX);
Update_SR_Register16_OverS32();
@ -600,7 +600,7 @@ void DSPEmitter::ori(const UDSPInstruction opc)
OR(16, R(RAX), Imm16(imm));
set_acc_m(reg);
// Update_SR_Register16((s16)g_dsp.r.acm[reg], false, false, isOverS32(dsp_get_long_acc(reg)));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_acc(reg, RCX);
Update_SR_Register16_OverS32();
@ -636,7 +636,7 @@ void DSPEmitter::addr(const UDSPInstruction opc)
ADD(64, R(RAX), R(RDX));
// dsp_set_long_acc(dreg, res);
// Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, ax, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(dreg, RCX);
@ -675,7 +675,7 @@ void DSPEmitter::addax(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, ax, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(dreg, RCX);
@ -713,7 +713,7 @@ void DSPEmitter::add(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry(acc0, res), isOverflow(acc0, acc1, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(dreg, RCX);
@ -751,7 +751,7 @@ void DSPEmitter::addp(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, prod, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(dreg, RCX);
@ -792,7 +792,7 @@ void DSPEmitter::addaxl(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, (s64)res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64((s64)res, isCarry(acc, res), isOverflow((s64)acc, (s64)acx, (s64)res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(dreg, RCX);
@ -834,7 +834,7 @@ void DSPEmitter::addi(const UDSPInstruction opc)
// dsp_set_long_acc(areg, res);
// res = dsp_get_long_acc(areg);
// Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, imm, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(areg, RCX);
@ -875,7 +875,7 @@ void DSPEmitter::addis(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, imm, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RCX), R(RAX));
set_long_acc(dreg, RCX);
@ -911,7 +911,7 @@ void DSPEmitter::incm(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, subtract, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RDX), Imm32((u32)subtract));
MOV(64, R(RCX), R(RAX));
@ -947,7 +947,7 @@ void DSPEmitter::inc(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, 1, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RDX), Imm64(1));
MOV(64, R(RCX), R(RAX));
@ -992,7 +992,7 @@ void DSPEmitter::subr(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -ax, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
NEG(64, R(RDX));
MOV(64, R(RCX), R(RAX));
@ -1032,7 +1032,7 @@ void DSPEmitter::subax(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -acx, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
NEG(64, R(RDX));
MOV(64, R(RCX), R(RAX));
@ -1070,7 +1070,7 @@ void DSPEmitter::sub(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc1, res), isOverflow(acc1, -acc2, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
NEG(64, R(RDX));
MOV(64, R(RCX), R(RAX));
@ -1108,7 +1108,7 @@ void DSPEmitter::subp(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -prod, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
NEG(64, R(RDX));
MOV(64, R(RCX), R(RAX));
@ -1145,7 +1145,7 @@ void DSPEmitter::decm(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -subtract, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RDX), Imm64(-subtract));
MOV(64, R(RCX), R(RAX));
@ -1181,7 +1181,7 @@ void DSPEmitter::dec(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -1, res));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
MOV(64, R(RDX), Imm64(-1));
MOV(64, R(RCX), R(RAX));
@ -1216,7 +1216,7 @@ void DSPEmitter::neg(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(dsp_get_long_acc(dreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1246,7 +1246,7 @@ void DSPEmitter::abs(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(dsp_get_long_acc(dreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1276,7 +1276,7 @@ void DSPEmitter::movr(const UDSPInstruction opc)
// acc &= ~0xffff;
// dsp_set_long_acc(areg, acc);
set_long_acc(areg);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1301,7 +1301,7 @@ void DSPEmitter::movax(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acx);
set_long_acc(dreg);
// Update_SR_Register64(acx);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1324,7 +1324,7 @@ void DSPEmitter::mov(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(acc);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1351,7 +1351,7 @@ void DSPEmitter::lsl16(const UDSPInstruction opc)
// dsp_set_long_acc(areg, acc);
set_long_acc(areg);
// Update_SR_Register64(dsp_get_long_acc(areg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1379,7 +1379,7 @@ void DSPEmitter::lsr16(const UDSPInstruction opc)
// dsp_set_long_acc(areg, (s64)acc);
set_long_acc(areg);
// Update_SR_Register64(dsp_get_long_acc(areg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1405,7 +1405,7 @@ void DSPEmitter::asr16(const UDSPInstruction opc)
// dsp_set_long_acc(areg, acc);
set_long_acc(areg);
// Update_SR_Register64(dsp_get_long_acc(areg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1433,7 +1433,7 @@ void DSPEmitter::lsl(const UDSPInstruction opc)
// dsp_set_long_acc(rreg, acc);
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1472,7 +1472,7 @@ void DSPEmitter::lsr(const UDSPInstruction opc)
// dsp_set_long_acc(rreg, (s64)acc);
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1498,7 +1498,7 @@ void DSPEmitter::asl(const UDSPInstruction opc)
// dsp_set_long_acc(rreg, acc);
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1533,7 +1533,7 @@ void DSPEmitter::asr(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(dsp_get_long_acc(dreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -1594,7 +1594,7 @@ void DSPEmitter::lsrn(const UDSPInstruction opc)
set_long_acc(0, RDX);
SetJumpTarget(zero);
// Update_SR_Register64(dsp_get_long_acc(0));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}
@ -1652,7 +1652,7 @@ void DSPEmitter::asrn(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(0));
set_long_acc(0, RDX);
SetJumpTarget(zero);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}
@ -1716,7 +1716,7 @@ void DSPEmitter::lsrnrx(const UDSPInstruction opc)
// Update_SR_Register64(dsp_get_long_acc(dreg));
set_long_acc(dreg, RDX);
SetJumpTarget(zero);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}
@ -1777,7 +1777,7 @@ void DSPEmitter::asrnrx(const UDSPInstruction opc)
set_long_acc(dreg, RDX);
SetJumpTarget(zero);
// Update_SR_Register64(dsp_get_long_acc(dreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}
@ -1839,7 +1839,7 @@ void DSPEmitter::lsrnr(const UDSPInstruction opc)
set_long_acc(dreg, RDX);
SetJumpTarget(zero);
// Update_SR_Register64(dsp_get_long_acc(dreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}
@ -1898,7 +1898,7 @@ void DSPEmitter::asrnr(const UDSPInstruction opc)
set_long_acc(dreg, RDX);
SetJumpTarget(zero);
// Update_SR_Register64(dsp_get_long_acc(dreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}

View File

@ -194,7 +194,7 @@ void DSPEmitter::clrp(const UDSPInstruction opc)
void DSPEmitter::tstprod(const UDSPInstruction opc)
{
#ifdef _M_X64
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
// s64 prod = dsp_get_long_prod();
get_long_prod();
@ -223,7 +223,7 @@ void DSPEmitter::movp(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(acc);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -249,7 +249,7 @@ void DSPEmitter::movnp(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(acc);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -274,7 +274,7 @@ void DSPEmitter::movpz(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, acc);
set_long_acc(dreg);
// Update_SR_Register64(acc);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -311,7 +311,7 @@ void DSPEmitter::addpaxz(const UDSPInstruction opc)
// dsp_set_long_acc(dreg, res);
// res = dsp_get_long_acc(dreg);
// Update_SR_Register64(res, isCarry(oldprod, res), false);
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
get_long_prod(RDX);
MOV(64, R(RCX), R(RAX));
@ -402,7 +402,7 @@ void DSPEmitter::mulac(const UDSPInstruction opc)
POP(64, R(RAX));
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -431,7 +431,7 @@ void DSPEmitter::mulmv(const UDSPInstruction opc)
POP(64, R(RAX));
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -459,7 +459,7 @@ void DSPEmitter::mulmvz(const UDSPInstruction opc)
set_long_acc(rreg, RDX);
mul(opc);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(RDX);
}
@ -525,7 +525,7 @@ void DSPEmitter::mulxac(const UDSPInstruction opc)
// dsp_set_long_acc(rreg, acc);
set_long_acc(rreg, tmp1);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(tmp1);
}
@ -565,7 +565,7 @@ void DSPEmitter::mulxmv(const UDSPInstruction opc)
// dsp_set_long_acc(rreg, acc);
set_long_acc(rreg, tmp1);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(tmp1);
}
@ -606,7 +606,7 @@ void DSPEmitter::mulxmvz(const UDSPInstruction opc)
// dsp_set_long_acc(rreg, acc);
set_long_acc(rreg, tmp1);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64(tmp1);
}
@ -673,7 +673,7 @@ void DSPEmitter::mulcac(const UDSPInstruction opc)
POP(64, R(RAX));
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -712,7 +712,7 @@ void DSPEmitter::mulcmv(const UDSPInstruction opc)
POP(64, R(RAX));
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}
@ -752,7 +752,7 @@ void DSPEmitter::mulcmvz(const UDSPInstruction opc)
POP(64, R(RAX));
set_long_acc(rreg);
// Update_SR_Register64(dsp_get_long_acc(rreg));
if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR))
if (FlagsNeeded())
{
Update_SR_Register64();
}

View File

@ -41,9 +41,9 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
ifeq ($(HW_TYPE), gamecube)
LIBS := -lfat -lasnd -lmodplay -lz -ldb -logc -lm
LIBS := -lfat -lasnd -lmodplay -ldb -logc -lm
else
LIBS := -lfat -lasnd -lmodplay -lwiiuse -lbte -lz -logc -lm
LIBS := -lfat -lasnd -lmodplay -lwiiuse -lbte -logc -lm
endif
#---------------------------------------------------------------------------------

View File

@ -108,6 +108,7 @@ MEM_LO: equ 0x0f7F
; This is where we jump when we're done testing, see above.
; We just fall into a loop, playing dead until someone resets the DSP.
end_of_test:
nop
jmp end_of_test
; Utility function to do DMA.