mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-03-01 10:13:38 +00:00
[ARM] Disable mfmsr. Implement stb and subfx.
This commit is contained in:
parent
5899013876
commit
b30a697355
@ -157,6 +157,7 @@ public:
|
|||||||
void orx(UGeckoInstruction _inst);
|
void orx(UGeckoInstruction _inst);
|
||||||
void rlwimix(UGeckoInstruction _inst);
|
void rlwimix(UGeckoInstruction _inst);
|
||||||
void rlwinmx(UGeckoInstruction _inst);
|
void rlwinmx(UGeckoInstruction _inst);
|
||||||
|
void subfx(UGeckoInstruction _inst);
|
||||||
void extshx(UGeckoInstruction inst);
|
void extshx(UGeckoInstruction inst);
|
||||||
void extsbx(UGeckoInstruction inst);
|
void extsbx(UGeckoInstruction inst);
|
||||||
|
|
||||||
@ -173,6 +174,7 @@ public:
|
|||||||
void lhz(UGeckoInstruction _inst);
|
void lhz(UGeckoInstruction _inst);
|
||||||
void lwz(UGeckoInstruction _inst);
|
void lwz(UGeckoInstruction _inst);
|
||||||
void lwzx(UGeckoInstruction _inst);
|
void lwzx(UGeckoInstruction _inst);
|
||||||
|
void stb(UGeckoInstruction _inst);
|
||||||
void stbu(UGeckoInstruction _inst);
|
void stbu(UGeckoInstruction _inst);
|
||||||
void sth(UGeckoInstruction _inst);
|
void sth(UGeckoInstruction _inst);
|
||||||
void sthu(UGeckoInstruction _inst);
|
void sthu(UGeckoInstruction _inst);
|
||||||
|
@ -99,6 +99,18 @@ void JitArm::addx(UGeckoInstruction inst)
|
|||||||
ADDS(RD, RA, RB);
|
ADDS(RD, RA, RB);
|
||||||
if (inst.Rc) ComputeRC();
|
if (inst.Rc) ComputeRC();
|
||||||
}
|
}
|
||||||
|
void JitArm::subfx(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(Integer)
|
||||||
|
|
||||||
|
ARMReg RA = gpr.R(inst.RA);
|
||||||
|
ARMReg RB = gpr.R(inst.RB);
|
||||||
|
ARMReg RD = gpr.R(inst.RD);
|
||||||
|
SUBS(RD, RB, RA);
|
||||||
|
if (inst.OE) PanicAlert("OE: subfx");
|
||||||
|
if (inst.Rc) GenerateRC();
|
||||||
|
}
|
||||||
void JitArm::mulli(UGeckoInstruction inst)
|
void JitArm::mulli(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
@ -36,6 +36,55 @@
|
|||||||
#else
|
#else
|
||||||
#define FASTMEM 0
|
#define FASTMEM 0
|
||||||
#endif
|
#endif
|
||||||
|
void JitArm::stb(UGeckoInstruction inst)
|
||||||
|
{
|
||||||
|
INSTRUCTION_START
|
||||||
|
JITDISABLE(LoadStore)
|
||||||
|
|
||||||
|
ARMReg RS = gpr.R(inst.RS);
|
||||||
|
#if 0 // FASTMEM
|
||||||
|
// R10 contains the dest address
|
||||||
|
ARMReg Value = R11;
|
||||||
|
ARMReg RA;
|
||||||
|
if (inst.RA)
|
||||||
|
RA = gpr.R(inst.RA);
|
||||||
|
MOV(Value, RS);
|
||||||
|
if (inst.RA)
|
||||||
|
{
|
||||||
|
MOVI2R(R10, inst.SIMM_16, false);
|
||||||
|
ADD(R10, R10, RA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MOVI2R(R10, (u32)inst.SIMM_16, false);
|
||||||
|
NOP(1);
|
||||||
|
}
|
||||||
|
StoreFromReg(R10, Value, 16, 0);
|
||||||
|
#else
|
||||||
|
ARMReg ValueReg = gpr.GetReg();
|
||||||
|
ARMReg Addr = gpr.GetReg();
|
||||||
|
ARMReg Function = gpr.GetReg();
|
||||||
|
|
||||||
|
MOV(ValueReg, RS);
|
||||||
|
if (inst.RA)
|
||||||
|
{
|
||||||
|
MOVI2R(Addr, inst.SIMM_16);
|
||||||
|
ARMReg RA = gpr.R(inst.RA);
|
||||||
|
ADD(Addr, Addr, RA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
MOVI2R(Addr, (u32)inst.SIMM_16);
|
||||||
|
|
||||||
|
MOVI2R(Function, (u32)&Memory::Write_U8);
|
||||||
|
PUSH(4, R0, R1, R2, R3);
|
||||||
|
MOV(R0, ValueReg);
|
||||||
|
MOV(R1, Addr);
|
||||||
|
BL(Function);
|
||||||
|
POP(4, R0, R1, R2, R3);
|
||||||
|
gpr.Unlock(ValueReg, Addr, Function);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void JitArm::stbu(UGeckoInstruction inst)
|
void JitArm::stbu(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
|
@ -111,6 +111,8 @@ void JitArm::mfmsr(UGeckoInstruction inst)
|
|||||||
{
|
{
|
||||||
INSTRUCTION_START
|
INSTRUCTION_START
|
||||||
JITDISABLE(SystemRegisters)
|
JITDISABLE(SystemRegisters)
|
||||||
|
Default(inst); return;
|
||||||
|
|
||||||
LDR(gpr.R(inst.RD), R9, PPCSTATE_OFF(msr));
|
LDR(gpr.R(inst.RD), R9, PPCSTATE_OFF(msr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ static GekkoOPTemplate primarytable[] =
|
|||||||
{45, &JitArm::sthu}, //"sthu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}},
|
{45, &JitArm::sthu}, //"sthu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}},
|
||||||
{36, &JitArm::stw}, //"stw", OPTYPE_STORE, FL_IN_A | FL_IN_S}},
|
{36, &JitArm::stw}, //"stw", OPTYPE_STORE, FL_IN_A | FL_IN_S}},
|
||||||
{37, &JitArm::stwu}, //"stwu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}},
|
{37, &JitArm::stwu}, //"stwu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}},
|
||||||
{38, &JitArm::Default}, //"stb", OPTYPE_STORE, FL_IN_A | FL_IN_S}},
|
{38, &JitArm::stb}, //"stb", OPTYPE_STORE, FL_IN_A | FL_IN_S}},
|
||||||
{39, &JitArm::stbu}, //"stbu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}},
|
{39, &JitArm::stbu}, //"stbu", OPTYPE_STORE, FL_OUT_A | FL_IN_A | FL_IN_S}},
|
||||||
|
|
||||||
{46, &JitArm::Default}, //"lmw", OPTYPE_SYSTEM, FL_EVIL, 10}},
|
{46, &JitArm::Default}, //"lmw", OPTYPE_SYSTEM, FL_EVIL, 10}},
|
||||||
@ -322,7 +322,7 @@ static GekkoOPTemplate table31_2[] =
|
|||||||
{235, &JitArm::Default}, //"mullwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}},
|
{235, &JitArm::Default}, //"mullwx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}},
|
||||||
{747, &JitArm::Default}, //"mullwox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}},
|
{747, &JitArm::Default}, //"mullwox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT, 4}},
|
||||||
{104, &JitArm::negx}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{104, &JitArm::negx}, //"negx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{40, &JitArm::Default}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{40, &JitArm::subfx}, //"subfx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{552, &JitArm::Default}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
{552, &JitArm::Default}, //"subox", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_RC_BIT}},
|
||||||
{8, &JitArm::Default}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
{8, &JitArm::Default}, //"subfcx", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_SET_CA | FL_RC_BIT}},
|
||||||
{136, &JitArm::Default}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
{136, &JitArm::Default}, //"subfex", OPTYPE_INTEGER, FL_OUT_D | FL_IN_AB | FL_READ_CA | FL_SET_CA | FL_RC_BIT}},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user