[RFC PATCH 5/9] target/arm: Introduce mo_endian() helper

Philippe Mathieu-Daudé posted 9 patches 21 hours ago
[RFC PATCH 5/9] target/arm: Introduce mo_endian() helper
Posted by Philippe Mathieu-Daudé 21 hours ago
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 target/arm/internals.h      | 3 +++
 target/arm/helper.c         | 8 ++++++++
 target/arm/tcg/mve_helper.c | 3 ++-
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/target/arm/internals.h b/target/arm/internals.h
index e92a967f575..f21555a69fd 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -28,6 +28,7 @@
 #include "exec/hwaddr.h"
 #include "exec/vaddr.h"
 #include "exec/breakpoint.h"
+#include "exec/memop.h"
 #include "accel/tcg/tb-cpu-state.h"
 #include "hw/core/registerfields.h"
 #include "tcg/tcg-gvec-desc.h"
@@ -46,6 +47,8 @@
 #define BANK_HYP    6
 #define BANK_MON    7
 
+MemOp mo_endian(CPUARMState *env);
+
 static inline int arm_env_mmu_index(CPUARMState *env)
 {
     return EX_TBFLAG_ANY(env->hflags, MMUIDX);
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 7389f2988c4..037d2bcf376 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -38,6 +38,14 @@
 
 static void switch_mode(CPUARMState *env, int mode);
 
+MemOp mo_endian(CPUARMState *env)
+{
+    if (!is_a64(env) && arm_cpu_data_is_big_endian_a32(env, arm_sctlr_b(env))) {
+        return MO_BE;
+    }
+    return MO_LE;
+}
+
 int compare_u64(const void *a, const void *b)
 {
     if (*(uint64_t *)a > *(uint64_t *)b) {
diff --git a/target/arm/tcg/mve_helper.c b/target/arm/tcg/mve_helper.c
index 4bea0991de9..a5a23c97056 100644
--- a/target/arm/tcg/mve_helper.c
+++ b/target/arm/tcg/mve_helper.c
@@ -299,7 +299,8 @@ DO_VSTR(vstrh_w, MO_UW, 2, stw, 4, int32_t)
         unsigned e;                                                     \
         uint32_t addr;                                                  \
         int mmu_idx = arm_to_core_mmu_idx(arm_mmu_idx(env));            \
-        MemOpIdx oi = make_memop_idx(MO_TE | MO_UL | MO_ALIGN, mmu_idx);\
+        MemOpIdx oi = make_memop_idx(mo_endian(env) | MO_UL | MO_ALIGN, \
+                                     mmu_idx);                          \
         for (e = 0; e < 16 / 4; e++, mask >>= 4, eci_mask >>= 4) {      \
             if (!(eci_mask & 1)) {                                      \
                 continue;                                               \
-- 
2.53.0