add two paths to addx in JIT that Crazy Taxi kept hitting, add 'add' and 'add.' tests to the ASM test, although I haven't tested it yet
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5261 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
c3df2e93d7
commit
47f6192004
|
@ -626,6 +626,31 @@ void Jit64::addx(UGeckoInstruction inst)
|
||||||
}
|
}
|
||||||
gpr.UnlockAll();
|
gpr.UnlockAll();
|
||||||
}
|
}
|
||||||
|
else if( a == b && b == d && a == d)
|
||||||
|
{
|
||||||
|
gpr.Lock(d);
|
||||||
|
gpr.LoadToX64(d, true);
|
||||||
|
ADD(32, gpr.R(d), gpr.R(d));
|
||||||
|
if (inst.Rc)
|
||||||
|
{
|
||||||
|
MOV(32, R(EAX), gpr.R(d));
|
||||||
|
CALL((u8*)asm_routines.computeRc);
|
||||||
|
}
|
||||||
|
gpr.UnlockAll();
|
||||||
|
}
|
||||||
|
else if( a == b && b != d)
|
||||||
|
{
|
||||||
|
gpr.Lock(a, d);
|
||||||
|
gpr.LoadToX64(d, false);
|
||||||
|
MOV(32, gpr.R(d), gpr.R(a));
|
||||||
|
ADD(32, gpr.R(d), gpr.R(d));
|
||||||
|
if (inst.Rc)
|
||||||
|
{
|
||||||
|
MOV(32, R(EAX), gpr.R(d));
|
||||||
|
CALL((u8*)asm_routines.computeRc);
|
||||||
|
}
|
||||||
|
gpr.UnlockAll();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Default(inst); return;
|
Default(inst); return;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
|
||||||
// Integer
|
// Integer
|
||||||
|
void add(u32 *a, u32 *b, u32 *c, u32 *d);
|
||||||
|
void addRC(u32 *a, u32 *b, u32 *c, u32 *d);
|
||||||
|
|
||||||
void subfc(u32 *a, u32 *b, u32 *c, u32 *d);
|
void subfc(u32 *a, u32 *b, u32 *c, u32 *d);
|
||||||
void subfcRC(u32 *a, u32 *b, u32 *c, u32 *d);
|
void subfcRC(u32 *a, u32 *b, u32 *c, u32 *d);
|
||||||
|
|
|
@ -1,5 +1,24 @@
|
||||||
#include "asm_tables.h"
|
#include "asm_tables.h"
|
||||||
#include "Defines.h"
|
#include "Defines.h"
|
||||||
|
|
||||||
|
void add(u32 *a, u32 *b, u32 *c, u32 *d)
|
||||||
|
{
|
||||||
|
asm(
|
||||||
|
"add %0,%1,%2"
|
||||||
|
: "=r"(*a)
|
||||||
|
: "r"(*b), "r"(*c)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
void addRC(u32 *a, u32 *b, u32 *c, u32 *d)
|
||||||
|
{
|
||||||
|
asm(
|
||||||
|
"add. %0,%1,%2"
|
||||||
|
: "=r"(*a)
|
||||||
|
: "r"(*b), "r"(*c)
|
||||||
|
: "cc"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
void subfc(u32 *a, u32 *b, u32 *c, u32 *d)
|
void subfc(u32 *a, u32 *b, u32 *c, u32 *d)
|
||||||
{
|
{
|
||||||
asm(
|
asm(
|
||||||
|
|
|
@ -36,6 +36,8 @@ struct inst
|
||||||
};
|
};
|
||||||
|
|
||||||
static inst instructions[] = {
|
static inst instructions[] = {
|
||||||
|
{ "add", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, add},
|
||||||
|
{ "add.", MOD_CR0, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, add},
|
||||||
{ "subfc", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, subfc},
|
{ "subfc", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, subfc},
|
||||||
{ "subfc.", MOD_CR0, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, subfcRC},
|
{ "subfc.", MOD_CR0, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1,TYPE_INTEGER, subfcRC},
|
||||||
{ "divw", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1, TYPE_INTEGER, divw},
|
{ "divw", NULL, 3, IO_ARG1 | IO_ARG2 | IO_ARG3, IO_ARG1, TYPE_INTEGER, divw},
|
||||||
|
|
Loading…
Reference in New Issue