target-arm: Simplify insn_crosses_page()
Recent changes have left insn_crosses_page() more complicated than it needed to be: * it's only called from thumb_tr_translate_insn() so we know for certain that we're looking at a Thumb insn * the caller's check for dc->pc >= dc->next_page_start - 3 means that dc->pc can't possibly be 4 aligned, so there's no need to check that (the check was partly there to ensure that we didn't treat an ARM insn as Thumb, I think) * we now have thumb_insn_is_16bit() which lets us do a precise check of the length of the next insn, rather than opencoding an inaccurate check Simplify it down to just loading the first half of the insn and calling thumb_insn_is_16bit() on it. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 1507556919-24992-8-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
296e5a0a6c
commit
5b8d7289e9
@ -11872,29 +11872,14 @@ static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
|
||||
{
|
||||
/* Return true if the insn at dc->pc might cross a page boundary.
|
||||
* (False positives are OK, false negatives are not.)
|
||||
* We know this is a Thumb insn, and our caller ensures we are
|
||||
* only called if dc->pc is less than 4 bytes from the page
|
||||
* boundary, so we cross the page if the first 16 bits indicate
|
||||
* that this is a 32 bit insn.
|
||||
*/
|
||||
uint16_t insn;
|
||||
uint16_t insn = arm_lduw_code(env, s->pc, s->sctlr_b);
|
||||
|
||||
if ((s->pc & 3) == 0) {
|
||||
/* At a 4-aligned address we can't be crossing a page */
|
||||
return false;
|
||||
}
|
||||
|
||||
/* This must be a Thumb insn */
|
||||
insn = arm_lduw_code(env, s->pc, s->sctlr_b);
|
||||
|
||||
if ((insn >> 11) >= 0x1d) {
|
||||
/* Top five bits 0b11101 / 0b11110 / 0b11111 : this is the
|
||||
* First half of a 32-bit Thumb insn. Thumb-1 cores might
|
||||
* end up actually treating this as two 16-bit insns (see the
|
||||
* code at the start of disas_thumb2_insn()) but we don't bother
|
||||
* to check for that as it is unlikely, and false positives here
|
||||
* are harmless.
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
/* Definitely a 16-bit insn, can't be crossing a page. */
|
||||
return false;
|
||||
return !thumb_insn_is_16bit(s, insn);
|
||||
}
|
||||
|
||||
static int arm_tr_init_disas_context(DisasContextBase *dcbase,
|
||||
|
Loading…
x
Reference in New Issue
Block a user