summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorSonicadvance1 <sonicadvance1@gmail.com>2010-03-24 22:51:06 +0000
committerSonicadvance1 <sonicadvance1@gmail.com>2010-03-24 22:51:06 +0000
commit4173cd587659d08dc2900546149cdf4f5ffcd7f8 (patch)
tree7440fbe0bb9e711469e6a63a4742a23be5d7efad /Source/Core
parent5ff07aace65f852620e6cba6dce8ce9d8a8470e6 (diff)
Disable divwux until we find out what's wrong with it, enable subfcx, and also JIT64 now sets cr[0] correctly.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5233 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp21
-rw-r--r--Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp6
2 files changed, 20 insertions, 7 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp
index 7d525a5c6d..98f258dfcb 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/JitAsm.cpp
@@ -217,12 +217,29 @@ void Jit64AsmRoutineManager::GenerateCommon()
FixupBranch pLesser = J_CC(CC_L);
FixupBranch pGreater = J_CC(CC_G);
MOV(8, M(&PowerPC::ppcState.cr_fast[0]), Imm8(0x2)); // _x86Reg == 0
- RET();
+ FixupBranch continue1 = J();
+
SetJumpTarget(pGreater);
MOV(8, M(&PowerPC::ppcState.cr_fast[0]), Imm8(0x4)); // _x86Reg > 0
- RET();
+ FixupBranch continue2 = J();
+
SetJumpTarget(pLesser);
MOV(8, M(&PowerPC::ppcState.cr_fast[0]), Imm8(0x8)); // _x86Reg < 0
+
+ SetJumpTarget(continue1);
+ SetJumpTarget(continue2);
+
+ // cr[0] |= SPR_XER & ~(0xFFFFFFFE)
+
+ MOV(32, R(EAX), M(&PowerPC::ppcState.spr[SPR_XER]));
+
+ AND(32, R(ECX), Imm32(0xFFFFFFFE));
+ NOT(32, R(ECX));
+ AND(32, R(EAX), R(ECX));
+
+ MOVSX(32, 8, ECX, M(&PowerPC::ppcState.cr_fast[0]));
+ OR(32, R(ECX), R(EAX));
+ MOV(8, M(&PowerPC::ppcState.cr_fast[0]), R(ECX));
RET();
fifoDirectWrite8 = AlignCode4();
diff --git a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
index a84ec60c48..682bd54d1f 100644
--- a/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
+++ b/Source/Core/Core/Src/PowerPC/Jit64/Jit_Integer.cpp
@@ -389,8 +389,6 @@ void Jit64::subfcx(UGeckoInstruction inst)
{
INSTRUCTION_START;
JITDISABLE(Integer)
- Default(inst);
- return;
int a = inst.RA, b = inst.RB, d = inst.RD;
gpr.FlushLockX(ECX);
gpr.Lock(a, b, d);
@@ -449,9 +447,6 @@ void Jit64::subfcx(UGeckoInstruction inst)
if (inst.Rc) {
MOV(32, R(EAX), gpr.R(d));
CALL((u8*)asm_routines.computeRc);
-
- // Doesn't yet work for 64bit machines
- //CALL((u8*)asm_routines.computeCr);
}
}
@@ -561,6 +556,7 @@ void Jit64::divwux(UGeckoInstruction inst)
{
INSTRUCTION_START
JITDISABLE(Integer)
+ Default(inst); return;
int a = inst.RA, b = inst.RB, d = inst.RD;
gpr.FlushLockX(EDX);
gpr.Lock(a, b, d);