target/arm: Pull Thumb insn word loads up to top level
commit296e5a0a6c393553079a641c50521ae33ff89324
authorPeter Maydell <peter.maydell@linaro.org>
Mon, 9 Oct 2017 13:48:36 +0000 (9 14:48 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Thu, 12 Oct 2017 12:23:14 +0000 (12 13:23 +0100)
tree947c1be2776e8a3c5a318303351199bd7de2e529
parent6b8acf256df09c8a8dd7dcaa79b06eaff4ad63f7
target/arm: Pull Thumb insn word loads up to top level

Refactor the Thumb decode to do the loads of the instruction words at
the top level rather than only loading the second half of a 32-bit
Thumb insn in the middle of the decode.

This is simple apart from the awkward case of Thumb1, where the
BL/BLX prefix and suffix instructions live in what in Thumb2 is the
32-bit insn space.  To handle these we decode enough to identify
whether we're looking at a prefix/suffix that we handle as a 16 bit
insn, or a prefix that we're going to merge with the following suffix
to consider as a 32 bit insn.  The translation of the 16 bit cases
then moves from disas_thumb2_insn() to disas_thumb_insn().

The refactoring has the benefit that we don't need to pass the
CPUARMState* down into the decoder code any more, but the major
reason for doing this is that some Thumb instructions must be always
unconditional regardless of the IT state bits, so we need to know the
whole insn before we emit the "skip this insn if the IT bits and cond
state tell us to" code.  (The always unconditional insns are BKPT,
HLT and SG; the last of these is 32 bits.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 1507556919-24992-7-git-send-email-peter.maydell@linaro.org
target/arm/translate.c