qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 3/8] target/alpha: Merge several flag bytes into


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH 3/8] target/alpha: Merge several flag bytes into ENV->FLAGS
Date: Mon, 17 Jul 2017 17:04:11 -1000
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1

On 07/17/2017 03:53 PM, Emilio G. Cota wrote:
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;
+    };

I did consider this.

Doing things this way requires that I consider host endianness when forming the bit masks. As opposed to only needing to consider host endianness while computing byte offsets within the translator.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]