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.

Backports commit 5b8d7289e9e92a0d7bcecb93cd189e245fef10cd from qemu
This commit is contained in:
Peter Maydell 2018-03-05 03:44:48 -05:00 committed by Lioncash
parent 96f86f472a
commit 7a293cd7cc
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -12083,29 +12083,14 @@ static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
{ {
/* Return true if the insn at dc->pc might cross a page boundary. /* Return true if the insn at dc->pc might cross a page boundary.
* (False positives are OK, false negatives are not.) * (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) { return !thumb_insn_is_16bit(s, insn);
/* 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;
} }
static int arm_tr_init_disas_context(DisasContextBase *dcbase, static int arm_tr_init_disas_context(DisasContextBase *dcbase,