citra-emu
/
citra-canary
Archived
1
0
Fork 0

- disable strict alignment on LDRD/STRD

- handle RD in STREX/STREXB
This commit is contained in:
bunnei 2014-05-06 21:34:00 -04:00
parent 9db26df05f
commit d1472b816f
1 changed files with 22 additions and 17 deletions

View File

@ -5536,14 +5536,15 @@ Handle_Load_Double (ARMul_State * state, ARMword instr)
addr = base; addr = base;
/* The address must be aligned on a 8 byte boundary. */ /* The address must be aligned on a 8 byte boundary. */
if (addr & 0x7) { // FIX(Normatt): Disable strict alignment on LDRD/STRD
#ifdef ABORTS // if (addr & 0x7) {
ARMul_DATAABORT (addr); //#ifdef ABORTS
#else // ARMul_DATAABORT (addr);
ARMul_UndefInstr (state, instr); //#else
#endif // ARMul_UndefInstr (state, instr);
return; //#endif
} // return;
// }
/* For pre indexed or post indexed addressing modes, /* For pre indexed or post indexed addressing modes,
check that the destination registers do not overlap check that the destination registers do not overlap
@ -5640,14 +5641,15 @@ Handle_Store_Double (ARMul_State * state, ARMword instr)
addr = base; addr = base;
/* The address must be aligned on a 8 byte boundary. */ /* The address must be aligned on a 8 byte boundary. */
if (addr & 0x7) { // FIX(Normatt): Disable strict alignment on LDRD/STRD
#ifdef ABORTS // if (addr & 0x7) {
ARMul_DATAABORT (addr); //#ifdef ABORTS
#else // ARMul_DATAABORT (addr);
ARMul_UndefInstr (state, instr); //#else
#endif // ARMul_UndefInstr (state, instr);
return; //#endif
} // return;
// }
/* For pre indexed or post indexed addressing modes, /* For pre indexed or post indexed addressing modes,
check that the destination registers do not overlap check that the destination registers do not overlap
@ -6405,6 +6407,8 @@ handle_v6_insn (ARMul_State * state, ARMword instr)
if (state->Aborted) { if (state->Aborted) {
TAKEABORT; TAKEABORT;
} }
// FIX(Normmatt): Handle RD in STREX/STREXB
state->Reg[DESTReg] = 0; //Always succeed
return 1; return 1;
} }
@ -6432,7 +6436,8 @@ handle_v6_insn (ARMul_State * state, ARMword instr)
if (state->Aborted) { if (state->Aborted) {
TAKEABORT; TAKEABORT;
} }
// FIX(Normmatt): Handle RD in STREX/STREXB
state->Reg[DESTReg] = 0; //Always succeed
//printf("In %s, strexb not implemented\n", __FUNCTION__); //printf("In %s, strexb not implemented\n", __FUNCTION__);
UNDEF_LSRBPC; UNDEF_LSRBPC;
/* WRITESDEST (dest); */ /* WRITESDEST (dest); */