- disable strict alignment on LDRD/STRD
- handle RD in STREX/STREXB
This commit is contained in:
parent
9db26df05f
commit
d1472b816f
1 changed files with 22 additions and 17 deletions
|
@ -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); */
|
||||||
|
|
Loading…
Reference in a new issue