mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-26 15:49:50 -06:00
DSPLLE: jit increment/decrement_addr_reg to match int (TODO: increase/decrease).
revert the OR back to MOV, since it never happens (according to nakee) git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5737 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -531,8 +531,15 @@ void DSPEmitter::pushExtValueFromMem(u16 dreg, u16 sreg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DSPEmitter::popExtValueToReg() {
|
void DSPEmitter::popExtValueToReg() {
|
||||||
|
// in practise, we rarely ever have a non-NX main op
|
||||||
|
// with an extended op, so the OR here is either
|
||||||
|
// not run (storeIndex == -1) or ends up OR'ing
|
||||||
|
// EBX with 0 (becoming the MOV we have here)
|
||||||
|
// nakee wants to keep it clean, so lets do that.
|
||||||
|
// [nakeee] the or case never happens in real
|
||||||
|
// [nakeee] it's just how the hardware works so we added it
|
||||||
if (storeIndex != -1)
|
if (storeIndex != -1)
|
||||||
OR(16, M(&g_dsp.r[storeIndex]), R(EBX));
|
MOV(16, M(&g_dsp.r[storeIndex]), R(EBX));
|
||||||
|
|
||||||
storeIndex = -1;
|
storeIndex = -1;
|
||||||
// TODO handle commands such as 'l
|
// TODO handle commands such as 'l
|
||||||
|
@ -53,7 +53,7 @@ void DSPEmitter::increment_addr_reg(int reg)
|
|||||||
MOV(16, R(EAX), M(&g_dsp.r[reg]));
|
MOV(16, R(EAX), M(&g_dsp.r[reg]));
|
||||||
MOV(16, R(EDX), M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
MOV(16, R(EDX), M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
||||||
|
|
||||||
//ToMask(WR0), calculating it into EDI
|
// ToMask(WR0), calculating it into EDI
|
||||||
MOV(16, R(EDI), R(EDX));
|
MOV(16, R(EDI), R(EDX));
|
||||||
ToMask(EDI);
|
ToMask(EDI);
|
||||||
|
|
||||||
@ -63,8 +63,8 @@ void DSPEmitter::increment_addr_reg(int reg)
|
|||||||
CMP(16, R(ESI), R(EDI));
|
CMP(16, R(ESI), R(EDI));
|
||||||
FixupBranch not_equal = J_CC(CC_NE);
|
FixupBranch not_equal = J_CC(CC_NE);
|
||||||
|
|
||||||
// tmp ^= wr_reg
|
// tmp -= wr_reg
|
||||||
XOR(16, R(EAX), R(EDX));
|
SUB(16, R(EAX), R(EDX));
|
||||||
|
|
||||||
FixupBranch end = J();
|
FixupBranch end = J();
|
||||||
SetJumpTarget(not_equal);
|
SetJumpTarget(not_equal);
|
||||||
@ -77,27 +77,40 @@ void DSPEmitter::increment_addr_reg(int reg)
|
|||||||
MOV(16, M(&g_dsp.r[reg]), R(EAX));
|
MOV(16, M(&g_dsp.r[reg]), R(EAX));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// See http://code.google.com/p/dolphin-emu/source/detail?r=3125
|
// See http://code.google.com/p/dolphin-emu/source/detail?r=3125
|
||||||
// EAX = g_dsp.r[reg]
|
// EAX = g_dsp.r[reg]
|
||||||
// EDX = g_dsp.r[DSP_REG_WR0 + reg]
|
// EDX = g_dsp.r[DSP_REG_WR0 + reg]
|
||||||
void DSPEmitter::decrement_addr_reg(int reg)
|
void DSPEmitter::decrement_addr_reg(int reg)
|
||||||
{
|
{
|
||||||
// s16 tmp = g_dsp.r[reg];
|
// s16 ar = g_dsp.r[reg];
|
||||||
MOV(16, R(EAX), M(&g_dsp.r[reg]));
|
MOV(16, R(EAX), M(&g_dsp.r[reg]));
|
||||||
MOV(16, R(EDX), M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
MOV(16, R(EDX), M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
||||||
|
|
||||||
// if ((tmp & g_dsp.r[DSP_REG_WR0 + reg]) == 0)
|
// ToMask(WR0), calculating it into EDI
|
||||||
TEST(16, R(EAX), R(EDX));
|
MOV(16, R(EDI), R(EDX));
|
||||||
FixupBranch not_equal = J_CC(CC_NZ);
|
ToMask(EDI);
|
||||||
|
|
||||||
// tmp |= g_dsp.r[DSP_REG_WR0 + reg];
|
//compute min from EDI and EAX
|
||||||
OR(16, R(EAX), R(EDX));
|
// min = (tmb+1-ar)&tmb;
|
||||||
|
LEA(16, ESI, MDisp(EDI, 1));
|
||||||
|
SUB(16, R(ESI), R(EAX));
|
||||||
|
AND(16, R(ESI), R(EDI));
|
||||||
|
|
||||||
FixupBranch end = J();
|
// wr < min
|
||||||
SetJumpTarget(not_equal);
|
CMP(16, R(EDX), R(ESI));
|
||||||
// tmp--;
|
FixupBranch wr_lt_min = J_CC(CC_B);
|
||||||
|
// !min
|
||||||
|
TEST(16, R(ESI), R(ESI));
|
||||||
|
FixupBranch min_zero = J_CC(CC_Z);
|
||||||
|
|
||||||
|
// ar--;
|
||||||
SUB(16, R(EAX), Imm16(1));
|
SUB(16, R(EAX), Imm16(1));
|
||||||
|
FixupBranch end = J();
|
||||||
|
|
||||||
|
// ar += wr;
|
||||||
|
SetJumpTarget(wr_lt_min);
|
||||||
|
SetJumpTarget(min_zero);
|
||||||
|
ADD(16, R(EAX), R(EDX));
|
||||||
|
|
||||||
SetJumpTarget(end);
|
SetJumpTarget(end);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user