DSP Jit code cleanup
Unit Test nr/dr/ir need AR0 not ACC0 git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5364 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
0dc924efef
commit
26b082d384
|
@ -31,9 +31,6 @@ using namespace Gen;
|
|||
// See http://code.google.com/p/dolphin-emu/source/detail?r=3125
|
||||
void DSPEmitter::increment_addr_reg(int reg)
|
||||
{
|
||||
// PUSH(EAX);
|
||||
// PUSH(ECX);
|
||||
|
||||
// u16 tmb = g_dsp.r[DSP_REG_WR0 + reg];
|
||||
MOVZX(32, 16, EAX, M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
||||
|
||||
|
@ -80,24 +77,17 @@ void DSPEmitter::increment_addr_reg(int reg)
|
|||
|
||||
// g_dsp.r[reg] = tmp;
|
||||
MOV(16, M(&g_dsp.r[reg]), R(ECX));
|
||||
|
||||
// POP(ECX);
|
||||
// POP(EAX);
|
||||
}
|
||||
|
||||
|
||||
// See http://code.google.com/p/dolphin-emu/source/detail?r=3125
|
||||
void DSPEmitter::decrement_addr_reg(int reg)
|
||||
{
|
||||
// PUSH(EAX);
|
||||
// PUSH(ECX);
|
||||
|
||||
// s16 tmp = g_dsp.r[reg];
|
||||
MOVZX(32, 16, EAX, M(&g_dsp.r[reg]));
|
||||
MOV(16, R(EAX), M(&g_dsp.r[reg]));
|
||||
|
||||
// if ((tmp & g_dsp.r[DSP_REG_WR0 + reg]) == 0)
|
||||
MOV(16, R(ECX), R(EAX));
|
||||
AND(16, R(ECX), M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
||||
// CMP(16, R(ECX), Imm8(0));
|
||||
TEST(16, R(EAX), M(&g_dsp.r[DSP_REG_WR0 + reg]));
|
||||
FixupBranch not_equal = J_CC(CC_NZ);
|
||||
|
||||
// tmp |= g_dsp.r[DSP_REG_WR0 + reg];
|
||||
|
@ -106,15 +96,12 @@ void DSPEmitter::decrement_addr_reg(int reg)
|
|||
FixupBranch end = J();
|
||||
SetJumpTarget(not_equal);
|
||||
// tmp--;
|
||||
SUB(16, R(EAX), Imm8(1));
|
||||
SUB(16, R(EAX), Imm16(1));
|
||||
|
||||
SetJumpTarget(end);
|
||||
|
||||
// g_dsp.r[reg] = tmp;
|
||||
MOV(16, M(&g_dsp.r[reg]), R(EAX));
|
||||
|
||||
// POP(ECX);
|
||||
// POP(EAX);
|
||||
}
|
||||
|
||||
// Increase addr register according to the correspond ix register
|
||||
|
@ -122,35 +109,30 @@ void DSPEmitter::increase_addr_reg(int reg)
|
|||
{
|
||||
// s16 value = (s16)g_dsp.r[DSP_REG_IX0 + reg];
|
||||
MOVSX(32, 16, EDX, M(&g_dsp.r[DSP_REG_IX0 + reg]));
|
||||
XOR(32, R(ESI), R(ESI)); // i = 0
|
||||
|
||||
// if (value > 0)
|
||||
CMP(16, R(EDX), Imm16(0));
|
||||
CMP(32, R(EDX), Imm32(0));
|
||||
//end is further away than 0x7f, needs a 6-byte jz
|
||||
FixupBranch end = J_CC(CC_Z, true);
|
||||
FixupBranch negValue = J_CC(CC_L);
|
||||
FixupBranch end = J_CC(CC_Z, true);
|
||||
|
||||
// for (int i = 0; i < value; i++)
|
||||
// for (; value == 0; value--)
|
||||
JumpTarget loop_pos = GetCodePtr();
|
||||
increment_addr_reg(reg);
|
||||
|
||||
ADD(32, R(ESI), Imm32(1)); // i++
|
||||
CMP(32, R(ESI), R(EDX)); // i < value
|
||||
SUB(32, R(EDX), Imm32(1)); // value--
|
||||
CMP(32, R(EDX), Imm32(0)); // value == 0
|
||||
J_CC(CC_NE, loop_pos);
|
||||
FixupBranch posValue = J();
|
||||
|
||||
SetJumpTarget(negValue);
|
||||
//abs == cdq; xor eax, edx; sub eax, edx
|
||||
//we know its negative, and in that case edx is -1
|
||||
XOR(32, R(EDX), Imm32(-1));
|
||||
SUB(32, R(EDX), Imm32(-1));
|
||||
|
||||
// for (int i = 0; i < (int)(-value); i++)
|
||||
// for (; value == 0; value++)
|
||||
JumpTarget loop_neg = GetCodePtr();
|
||||
decrement_addr_reg(reg);
|
||||
|
||||
ADD(32, R(ESI), Imm32(1)); // i++
|
||||
CMP(32, R(ESI), R(EDX)); // i < -value
|
||||
ADD(32, R(EDX), Imm32(1)); // value++
|
||||
CMP(32, R(EDX), Imm32(0)); // value == 0
|
||||
J_CC(CC_NE, loop_neg);
|
||||
|
||||
SetJumpTarget(posValue);
|
||||
|
@ -162,34 +144,30 @@ void DSPEmitter::decrease_addr_reg(int reg)
|
|||
{
|
||||
// s16 value = (s16)g_dsp.r[DSP_REG_IX0 + reg];
|
||||
MOVSX(32, 16, EDX, M(&g_dsp.r[DSP_REG_IX0 + reg]));
|
||||
XOR(32, R(ESI), R(ESI)); // i = 0
|
||||
|
||||
// if (value > 0)
|
||||
CMP(32, R(EDX), Imm32(0));
|
||||
//end is further away than 0x7f, needs a 6-byte jz
|
||||
FixupBranch end = J_CC(CC_Z, true);
|
||||
FixupBranch negValue = J_CC(CC_L);
|
||||
|
||||
// for (int i = 0; i < value; i++)
|
||||
// for (; value == 0; value--)
|
||||
JumpTarget loop_pos = GetCodePtr();
|
||||
decrement_addr_reg(reg);
|
||||
|
||||
ADD(32, R(ESI), Imm32(1)); // i++
|
||||
CMP(32, R(ESI), R(EDX)); // i < value
|
||||
SUB(32, R(EDX), Imm32(1)); // value--
|
||||
CMP(32, R(EDX), Imm32(0)); // value == 0
|
||||
J_CC(CC_NE, loop_pos);
|
||||
FixupBranch posValue = J();
|
||||
|
||||
SetJumpTarget(negValue);
|
||||
//abs == cdq; xor eax, edx; sub eax, edx
|
||||
//we know its negative, and in that case edx is -1
|
||||
XOR(32, R(EDX), Imm32(-1));
|
||||
SUB(32, R(EDX), Imm32(-1));
|
||||
|
||||
// for (int i = 0; i < (int)(-value); i++)
|
||||
// for (; value == 0; value++)
|
||||
JumpTarget loop_neg = GetCodePtr();
|
||||
increment_addr_reg(reg);
|
||||
|
||||
ADD(32, R(ESI), Imm32(1)); // i++
|
||||
CMP(32, R(ESI), R(EDX)); // i < -value
|
||||
ADD(32, R(EDX), Imm32(1)); // value++
|
||||
CMP(32, R(EDX), Imm32(0)); // value == 0
|
||||
J_CC(CC_NE, loop_neg);
|
||||
|
||||
SetJumpTarget(posValue);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
void nx_dr()
|
||||
{
|
||||
DSPJitTester tester(0x8000, 0x0004);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.TestAll();
|
||||
tester.Report();
|
||||
|
@ -12,7 +12,7 @@ void nx_dr()
|
|||
void nx_ir()
|
||||
{
|
||||
DSPJitTester tester(0x8000, 0x0008);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.TestAll();
|
||||
tester.Report();
|
||||
|
@ -21,7 +21,7 @@ void nx_ir()
|
|||
void nx_nr()
|
||||
{
|
||||
DSPJitTester tester(0x8000, 0x000c);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.AddTestData(DSP_REG_IX0);
|
||||
tester.TestAll(true);
|
||||
|
@ -31,7 +31,7 @@ void nx_nr()
|
|||
void dar()
|
||||
{
|
||||
DSPJitTester tester(0x0004);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.TestAll();
|
||||
tester.Report();
|
||||
|
@ -39,7 +39,7 @@ void dar()
|
|||
void iar()
|
||||
{
|
||||
DSPJitTester tester(0x0008);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.TestAll();
|
||||
tester.Report();
|
||||
|
@ -47,7 +47,7 @@ void iar()
|
|||
void subarn()
|
||||
{
|
||||
DSPJitTester tester(0x000c);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.AddTestData(DSP_REG_IX0);
|
||||
tester.TestAll();
|
||||
|
@ -56,7 +56,7 @@ void subarn()
|
|||
void addarn()
|
||||
{
|
||||
DSPJitTester tester(0x0010);
|
||||
tester.AddTestData(DSP_REG_ACC0);
|
||||
tester.AddTestData(DSP_REG_AR0);
|
||||
tester.AddTestData(DSP_REG_WR0);
|
||||
tester.AddTestData(DSP_REG_IX0);
|
||||
tester.TestAll();
|
||||
|
|
Loading…
Reference in New Issue