Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[ARM] Clean up FPR cache. Rapid fire floating point instruction imple…
…mentations. Adds 13 new instructions.
  • Loading branch information
Sonicadvance1 committed Sep 7, 2013
1 parent cd7b97f commit ef05a14
Show file tree
Hide file tree
Showing 8 changed files with 409 additions and 115 deletions.
13 changes: 13 additions & 0 deletions Source/Core/Core/Src/PowerPC/JitArm32/Jit.h
Expand Up @@ -186,6 +186,8 @@ class JitArm : public JitBase, public ArmGen::ARMXCodeBlock

// Floating point
void fabsx(UGeckoInstruction _inst);
void fnabsx(UGeckoInstruction _inst);
void fnegx(UGeckoInstruction _inst);
void faddsx(UGeckoInstruction _inst);
void faddx(UGeckoInstruction _inst);
void fsubsx(UGeckoInstruction _inst);
Expand All @@ -202,9 +204,20 @@ class JitArm : public JitBase, public ArmGen::ARMXCodeBlock
// Paired Singles
void ps_add(UGeckoInstruction _inst);
void ps_sum0(UGeckoInstruction _inst);
void ps_sum1(UGeckoInstruction _inst);
void ps_madd(UGeckoInstruction _inst);
void ps_sub(UGeckoInstruction _inst);
void ps_mul(UGeckoInstruction _inst);
void ps_muls0(UGeckoInstruction _inst);
void ps_muls1(UGeckoInstruction _inst);
void ps_merge00(UGeckoInstruction _inst);
void ps_merge01(UGeckoInstruction _inst);
void ps_merge10(UGeckoInstruction _inst);
void ps_merge11(UGeckoInstruction _inst);
void ps_mr(UGeckoInstruction _inst);
void ps_neg(UGeckoInstruction _inst);
void ps_abs(UGeckoInstruction _inst);
void ps_nabs(UGeckoInstruction _inst);
};

#endif // _JIT64_H
54 changes: 43 additions & 11 deletions Source/Core/Core/Src/PowerPC/JitArm32/JitArm_FloatingPoint.cpp
Expand Up @@ -43,23 +43,55 @@ void JitArm::fabsx(UGeckoInstruction inst)
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vD = fpr.R0(inst.FD);
ARMReg vB = fpr.R0(inst.FB);
ARMReg vD = fpr.R0(inst.FD, false);

VABS(vD, vB);

if (inst.Rc) Helper_UpdateCR1(vD);
}

void JitArm::fnabsx(UGeckoInstruction inst)
{
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vB = fpr.R0(inst.FB);
ARMReg vD = fpr.R0(inst.FD, false);
ARMReg V0 = fpr.GetReg();

// XXX: Could be done quicker
VABS(vD, vB);
VMOV(V0, vD);
VSUB(vD, vD, V0);
VSUB(vD, vD, V0);

fpr.Unlock(V0);
if (inst.Rc) Helper_UpdateCR1(vD);
}

void JitArm::fnegx(UGeckoInstruction inst)
{
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vB = fpr.R0(inst.FB);
ARMReg vD = fpr.R0(inst.FD, false);

VNEG(vD, vB);

if (inst.Rc) Helper_UpdateCR1(vD);
}

void JitArm::faddsx(UGeckoInstruction inst)
{
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vA = fpr.R0(inst.FA);
ARMReg vB = fpr.R0(inst.FB);
ARMReg vD0 = fpr.R0(inst.FD);
ARMReg vD1 = fpr.R1(inst.FD);
ARMReg vD0 = fpr.R0(inst.FD, false);
ARMReg vD1 = fpr.R1(inst.FD, false);

VADD(vD0, vA, vB);
VMOV(vD1, vD0);
Expand All @@ -71,9 +103,9 @@ void JitArm::faddx(UGeckoInstruction inst)
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vD = fpr.R0(inst.FD);
ARMReg vA = fpr.R0(inst.FA);
ARMReg vB = fpr.R0(inst.FB);
ARMReg vD = fpr.R0(inst.FD, false);

VADD(vD, vA, vB);
if (inst.Rc) Helper_UpdateCR1(vD);
Expand All @@ -86,8 +118,8 @@ void JitArm::fsubsx(UGeckoInstruction inst)

ARMReg vA = fpr.R0(inst.FA);
ARMReg vB = fpr.R0(inst.FB);
ARMReg vD0 = fpr.R0(inst.FD);
ARMReg vD1 = fpr.R1(inst.FD);
ARMReg vD0 = fpr.R0(inst.FD, false);
ARMReg vD1 = fpr.R1(inst.FD, false);

VSUB(vD0, vA, vB);
VMOV(vD1, vD0);
Expand All @@ -99,9 +131,9 @@ void JitArm::fsubx(UGeckoInstruction inst)
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vD = fpr.R0(inst.FD);
ARMReg vA = fpr.R0(inst.FA);
ARMReg vB = fpr.R0(inst.FB);
ARMReg vD = fpr.R0(inst.FD, false);

VSUB(vD, vA, vB);
if (inst.Rc) Helper_UpdateCR1(vD);
Expand All @@ -114,8 +146,8 @@ void JitArm::fmulsx(UGeckoInstruction inst)

ARMReg vA = fpr.R0(inst.FA);
ARMReg vC = fpr.R0(inst.FC);
ARMReg vD0 = fpr.R0(inst.FD);
ARMReg vD1 = fpr.R1(inst.FD);
ARMReg vD0 = fpr.R0(inst.FD, false);
ARMReg vD1 = fpr.R1(inst.FD, false);

VMUL(vD0, vA, vC);
VMOV(vD1, vD0);
Expand All @@ -127,9 +159,9 @@ void JitArm::fmulx(UGeckoInstruction inst)
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vD0 = fpr.R0(inst.FD);
ARMReg vA = fpr.R0(inst.FA);
ARMReg vC = fpr.R0(inst.FC);
ARMReg vD0 = fpr.R0(inst.FD, false);

VMUL(vD0, vA, vC);
if (inst.Rc) Helper_UpdateCR1(vD0);
Expand All @@ -139,8 +171,8 @@ void JitArm::fmrx(UGeckoInstruction inst)
INSTRUCTION_START
JITDISABLE(bJITFloatingPointOff)

ARMReg vD = fpr.R0(inst.FD);
ARMReg vB = fpr.R0(inst.FB);
ARMReg vD = fpr.R0(inst.FD, false);

VMOV(vD, vB);

Expand Down

0 comments on commit ef05a14

Please sign in to comment.