mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-10-08 00:03:36 +00:00
[ARM] Implement lha and fix lfs.
This commit is contained in:
parent
ca7fb9f38e
commit
cf8e8c91b6
@ -173,6 +173,7 @@ public:
|
|||||||
void icbi(UGeckoInstruction _inst);
|
void icbi(UGeckoInstruction _inst);
|
||||||
void lbz(UGeckoInstruction _inst);
|
void lbz(UGeckoInstruction _inst);
|
||||||
void lhz(UGeckoInstruction _inst);
|
void lhz(UGeckoInstruction _inst);
|
||||||
|
void lha(UGeckoInstruction _inst);
|
||||||
void lwz(UGeckoInstruction _inst);
|
void lwz(UGeckoInstruction _inst);
|
||||||
void lwzx(UGeckoInstruction _inst);
|
void lwzx(UGeckoInstruction _inst);
|
||||||
void stb(UGeckoInstruction _inst);
|
void stb(UGeckoInstruction _inst);
|
||||||
|
@ -453,6 +453,55 @@ void JitArm::lhz(UGeckoInstruction inst)
|
|||||||
#endif
|
#endif
|
||||||
SetJumpTarget(DoNotLoad);
|
SetJumpTarget(DoNotLoad);
|
||||||
}
|
}
|
||||||
|
void JitArm::lha(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(LoadStore)
|
||||||
|
|
||||||
|
ARMReg rA = gpr.GetReg();
|
||||||
|
ARMReg rB = gpr.GetReg();
|
||||||
|
ARMReg RD = gpr.R(inst.RD);
|
||||||
|
LDR(rA, R9, PPCSTATE_OFF(Exceptions));
|
||||||
|
CMP(rA, EXCEPTION_DSI);
|
||||||
|
FixupBranch DoNotLoad = B_CC(CC_EQ);
|
||||||
|
#if 0 // FASTMEM
|
||||||
|
// Backpatch route
|
||||||
|
// Gets loaded in to RD
|
||||||
|
// Address is in R10
|
||||||
|
gpr.Unlock(rA, rB);
|
||||||
|
if (inst.RA)
|
||||||
|
{
|
||||||
|
ARMReg RA = gpr.R(inst.RA);
|
||||||
|
MOV(R10, RA); // - 4
|
||||||
|
}
|
||||||
|
else
|
||||||
|
MOV(R10, 0); // - 4
|
||||||
|
|
||||||
|
LoadToReg(RD, R10, 16, (u32)inst.SIMM_16);
|
||||||
|
#else
|
||||||
|
|
||||||
|
if (inst.RA)
|
||||||
|
{
|
||||||
|
MOVI2R(rB, inst.SIMM_16);
|
||||||
|
ARMReg RA = gpr.R(inst.RA);
|
||||||
|
ADD(rB, rB, RA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
MOVI2R(rB, (u32)inst.SIMM_16);
|
||||||
|
|
||||||
|
MOVI2R(rA, (u32)&Memory::Read_U16);
|
||||||
|
PUSH(4, R0, R1, R2, R3);
|
||||||
|
MOV(R0, rB);
|
||||||
|
BL(rA);
|
||||||
|
MOV(rA, R0);
|
||||||
|
SXTH(rA, rA);
|
||||||
|
POP(4, R0, R1, R2, R3);
|
||||||
|
MOV(RD, rA);
|
||||||
|
gpr.Unlock(rA, rB);
|
||||||
|
#endif
|
||||||
|
SetJumpTarget(DoNotLoad);
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm::lwz(UGeckoInstruction inst)
|
void JitArm::lwz(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
@ -36,7 +36,6 @@ void JitArm::lfs(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
JITDISABLE(LoadStoreFloating)
|
JITDISABLE(LoadStoreFloating)
|
||||||
Default(inst); return;
|
|
||||||
|
|
||||||
ARMReg rA = gpr.GetReg();
|
ARMReg rA = gpr.GetReg();
|
||||||
ARMReg rB = gpr.GetReg();
|
ARMReg rB = gpr.GetReg();
|
||||||
@ -60,9 +59,8 @@ void JitArm::lfs(UGeckoInstruction inst)
|
|||||||
PUSH(4, R0, R1, R2, R3);
|
PUSH(4, R0, R1, R2, R3);
|
||||||
MOV(R0, rB);
|
MOV(R0, rB);
|
||||||
BL(rA);
|
BL(rA);
|
||||||
// XXX: Need to use VCVT here.
|
VCVT(v0, S0, 0);
|
||||||
VMOV(v0, D0);
|
VCVT(v1, S0, 0);
|
||||||
VMOV(v1, D0);
|
|
||||||
POP(4, R0, R1, R2, R3);
|
POP(4, R0, R1, R2, R3);
|
||||||
|
|
||||||
gpr.Unlock(rA, rB);
|
gpr.Unlock(rA, rB);
|
||||||
|
@ -84,7 +84,7 @@ static GekkoOPTemplate primarytable[] =
|
|||||||
{35, &JitArm::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}},
|
{35, &JitArm::Default}, //"lbzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}},
|
||||||
{40, &JitArm::lhz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}},
|
{40, &JitArm::lhz}, //"lhz", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}},
|
||||||
{41, &JitArm::Default}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}},
|
{41, &JitArm::Default}, //"lhzu", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}},
|
||||||
{42, &JitArm::Default}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}},
|
{42, &JitArm::lha}, //"lha", OPTYPE_LOAD, FL_OUT_D | FL_IN_A}},
|
||||||
{43, &JitArm::Default}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}},
|
{43, &JitArm::Default}, //"lhau", OPTYPE_LOAD, FL_OUT_D | FL_OUT_A | FL_IN_A}},
|
||||||
|
|
||||||
{44, &JitArm::sth}, //"sth", OPTYPE_STORE, FL_IN_A | FL_IN_S}},
|
{44, &JitArm::sth}, //"sth", OPTYPE_STORE, FL_IN_A | FL_IN_S}},
|
||||||
|
Loading…
Reference in New Issue
Block a user