On Thu, Jul 13, 2017 at 14:18:14 -1000, Richard Henderson wrote:
The flags are arranged such that we can manipulate them either
a whole, or as individual bytes. The computation within
cpu_get_tb_cpu_state is now reduced to a single load and mask.
Signed-off-by: Richard Henderson <address@hidden>
---
target/alpha/cpu.h | 70 +++++++++++++++++--------------------
hw/alpha/dp264.c | 1 -
linux-user/main.c | 25 +++++++------
target/alpha/cpu.c | 7 ++--
target/alpha/helper.c | 12 +++----
target/alpha/machine.c | 10 ++----
target/alpha/translate.c | 91 +++++++++++++++++++++++++++++++-----------------
7 files changed, 117 insertions(+), 99 deletions(-)
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
index aa83417..e95be2b 100644
--- a/target/alpha/cpu.h
+++ b/target/alpha/cpu.h
@@ -242,13 +242,11 @@ struct CPUAlphaState {
uint8_t fpcr_dyn_round;
uint8_t fpcr_flush_to_zero;
- /* The Internal Processor Registers. Some of these we assume always
- exist for use in user-mode. */
- uint8_t ps;
- uint8_t intr_flag;
- uint8_t pal_mode;
- uint8_t fen;
+ /* Mask of PALmode, Processor State et al. Most of this gets copied
+ into the TranslatorBlock flags and controls code generation. */
+ uint32_t flags;
Did you consider doing something like the appended? I don't like it
because it messes with endianness, which is always a pain. But it
lets you preserve the code that only touches the u8's as-is; this
comes at the price of requiring a fast-path swap in big-endian hosts.
An alternative would be to store the u8's in an order dependent on
the endianness of the host -- but that would break vmstate saving,
I guess.
Emilio
---8<---
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
index aa83417..22c52ac 100644
--- a/target/alpha/cpu.h
+++ b/target/alpha/cpu.h
@@ -244,10 +244,15 @@ struct CPUAlphaState {
/* The Internal Processor Registers. Some of these we assume always
exist for use in user-mode. */
- uint8_t ps;
- uint8_t intr_flag;
- uint8_t pal_mode;
- uint8_t fen;
+ union {
+ struct {
+ uint8_t pal_mode;
+ uint8_t ps;
+ uint8_t intr_flag;
+ uint8_t fen;
+ };
+ uint32_t flags;
+ };