Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[ARM] lfdu and stfsu implementations.
  • Loading branch information
Sonicadvance1 committed Sep 14, 2013
1 parent 0ae8fa9 commit 4512813
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 2 deletions.
2 changes: 2 additions & 0 deletions Source/Core/Core/Src/PowerPC/JitArm32/Jit.h
Expand Up @@ -201,7 +201,9 @@ class JitArm : public JitBase, public ArmGen::ARMXCodeBlock
void lfsu(UGeckoInstruction _inst);
void lfsx(UGeckoInstruction _inst);
void lfd(UGeckoInstruction _inst);
void lfdu(UGeckoInstruction _inst);
void stfs(UGeckoInstruction _inst);
void stfsu(UGeckoInstruction _inst);

// Paired Singles
void ps_add(UGeckoInstruction _inst);
Expand Down
71 changes: 71 additions & 0 deletions Source/Core/Core/Src/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
Expand Up @@ -183,6 +183,43 @@ void JitArm::lfd(UGeckoInstruction inst)
SetJumpTarget(DoNotLoad);
}

void JitArm::lfdu(UGeckoInstruction inst)
{
INSTRUCTION_START
JITDISABLE(bJITLoadStoreFloatingOff)

ARMReg RA = gpr.R(inst.RA);
ARMReg rA = gpr.GetReg();
ARMReg rB = gpr.GetReg();

ARMReg v0 = fpr.R0(inst.FD);

MOVI2R(rB, inst.SIMM_16);
ADD(rB, rB, RA);

LDR(rA, R9, PPCSTATE_OFF(Exceptions));
CMP(rA, EXCEPTION_DSI);
FixupBranch DoNotLoad = B_CC(CC_EQ);

MOVI2R(rA, (u32)&Memory::Read_F64);
MOV(RA, rB);

PUSH(4, R0, R1, R2, R3);
MOV(R0, rB);
BL(rA);

#if !defined(__ARM_PCS_VFP) // SoftFP returns in R0 and R1
VMOV(v0, R0);
#else
VMOV(v0, D0);
#endif

POP(4, R0, R1, R2, R3);

gpr.Unlock(rA, rB);
SetJumpTarget(DoNotLoad);
}

void JitArm::stfs(UGeckoInstruction inst)
{
INSTRUCTION_START
Expand Down Expand Up @@ -215,3 +252,37 @@ void JitArm::stfs(UGeckoInstruction inst)
gpr.Unlock(rA, rB);
}

void JitArm::stfsu(UGeckoInstruction inst)
{
INSTRUCTION_START
JITDISABLE(bJITLoadStoreFloatingOff)

ARMReg RA = gpr.R(inst.RA);

ARMReg rA = gpr.GetReg();
ARMReg rB = gpr.GetReg();
ARMReg v0 = fpr.R0(inst.FS);
VCVT(S0, v0, 0);

MOVI2R(rB, inst.SIMM_16);
ADD(rB, rB, RA);

LDR(rA, R9, PPCSTATE_OFF(Exceptions));
CMP(rA, EXCEPTION_DSI);

SetCC(CC_NEQ);
MOV(RA, rB);
SetCC();

MOVI2R(rA, (u32)&Memory::Write_U32);
PUSH(4, R0, R1, R2, R3);
VMOV(R0, S0);
MOV(R1, rB);

BL(rA);

POP(4, R0, R1, R2, R3);

gpr.Unlock(rA, rB);
}

4 changes: 2 additions & 2 deletions Source/Core/Core/Src/PowerPC/JitArm32/JitArm_Tables.cpp
Expand Up @@ -100,10 +100,10 @@ static GekkoOPTemplate primarytable[] =
{48, &JitArm::lfs}, //"lfs", OPTYPE_LOADFP, FL_IN_A}},
{49, &JitArm::lfsu}, //"lfsu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}},
{50, &JitArm::lfd}, //"lfd", OPTYPE_LOADFP, FL_IN_A}},
{51, &JitArm::Default}, //"lfdu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}},
{51, &JitArm::lfdu}, //"lfdu", OPTYPE_LOADFP, FL_OUT_A | FL_IN_A}},

{52, &JitArm::stfs}, //"stfs", OPTYPE_STOREFP, FL_IN_A}},
{53, &JitArm::Default}, //"stfsu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}},
{53, &JitArm::stfsu}, //"stfsu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}},
{54, &JitArm::Default}, //"stfd", OPTYPE_STOREFP, FL_IN_A}},
{55, &JitArm::Default}, //"stfdu", OPTYPE_STOREFP, FL_OUT_A | FL_IN_A}},

Expand Down

0 comments on commit 4512813

Please sign in to comment.