From 1cd3c2a408176b61aa04a9545ef1740324ddd870 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 8 Oct 2018 12:54:55 -0400 Subject: [PATCH] target/arm: Split contiguous stores for endianness We can choose the endianness at translation time, rather than re-computing it at execution time. Backports commit 28d57f2dc59c287e1c40239509b0a325fd00e32f from qemu --- qemu/aarch64.h | 45 ++++++++++++++------- qemu/aarch64eb.h | 45 ++++++++++++++------- qemu/header_gen.py | 45 ++++++++++++++------- qemu/target/arm/helper-sve.h | 48 +++++++++++++++------- qemu/target/arm/sve_helper.c | 11 +++-- qemu/target/arm/translate-sve.c | 72 +++++++++++++++++++++++++-------- 6 files changed, 186 insertions(+), 80 deletions(-) diff --git a/qemu/aarch64.h b/qemu/aarch64.h index 191ec5ce..e7c9ff4e 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -4065,21 +4065,36 @@ #define helper_sve_st1bd_r helper_sve_st1bd_r_aarch64 #define helper_sve_st1bh_r helper_sve_st1bh_r_aarch64 #define helper_sve_st1bs_r helper_sve_st1bs_r_aarch64 -#define helper_sve_st1dd_r helper_sve_st1dd_r_aarch64 -#define helper_sve_st2dd_r helper_sve_st2dd_r_aarch64 -#define helper_sve_st3dd_r helper_sve_st3dd_r_aarch64 -#define helper_sve_st4dd_r helper_sve_st4dd_r_aarch64 -#define helper_sve_st1hh_r helper_sve_st1hh_r_aarch64 -#define helper_sve_st2hh_r helper_sve_st2hh_r_aarch64 -#define helper_sve_st3hh_r helper_sve_st3hh_r_aarch64 -#define helper_sve_st4hh_r helper_sve_st4hh_r_aarch64 -#define helper_sve_st1hd_r helper_sve_st1hd_r_aarch64 -#define helper_sve_st1hs_r helper_sve_st1hs_r_aarch64 -#define helper_sve_st1sd_r helper_sve_st1sd_r_aarch64 -#define helper_sve_st1ss_r helper_sve_st1ss_r_aarch64 -#define helper_sve_st2ss_r helper_sve_st2ss_r_aarch64 -#define helper_sve_st3ss_r helper_sve_st3ss_r_aarch64 -#define helper_sve_st4ss_r helper_sve_st4ss_r_aarch64 +#define helper_sve_st1dd_be_r helper_sve_st1dd_be_r_aarch64 +#define helper_sve_st1dd_le_r helper_sve_st1dd_le_r_aarch64 +#define helper_sve_st2dd_be_r helper_sve_st2dd_be_r_aarch64 +#define helper_sve_st2dd_le_r helper_sve_st2dd_le_r_aarch64 +#define helper_sve_st3dd_be_r helper_sve_st3dd_be_r_aarch64 +#define helper_sve_st3dd_le_r helper_sve_st3dd_le_r_aarch64 +#define helper_sve_st4dd_be_r helper_sve_st4dd_be_r_aarch64 +#define helper_sve_st4dd_le_r helper_sve_st4dd_le_r_aarch64 +#define helper_sve_st1hh_be_r helper_sve_st1hh_be_r_aarch64 +#define helper_sve_st1hh_le_r helper_sve_st1hh_le_r_aarch64 +#define helper_sve_st2hh_be_r helper_sve_st2hh_be_r_aarch64 +#define helper_sve_st2hh_le_r helper_sve_st2hh_le_r_aarch64 +#define helper_sve_st3hh_be_r helper_sve_st3hh_be_r_aarch64 +#define helper_sve_st3hh_le_r helper_sve_st3hh_le_r_aarch64 +#define helper_sve_st4hh_be_r helper_sve_st4hh_be_r_aarch64 +#define helper_sve_st4hh_le_r helper_sve_st4hh_le_r_aarch64 +#define helper_sve_st1hd_be_r helper_sve_st1hd_be_r_aarch64 +#define helper_sve_st1hd_le_r helper_sve_st1hd_le_r_aarch64 +#define helper_sve_st1hs_be_r helper_sve_st1hs_be_r_aarch64 +#define helper_sve_st1hs_le_r helper_sve_st1hs_le_r_aarch64 +#define helper_sve_st1sd_be_r helper_sve_st1sd_be_r_aarch64 +#define helper_sve_st1sd_le_r helper_sve_st1sd_le_r_aarch64 +#define helper_sve_st1ss_be_r helper_sve_st1ss_be_r_aarch64 +#define helper_sve_st1ss_le_r helper_sve_st1ss_le_r_aarch64 +#define helper_sve_st2ss_be_r helper_sve_st2ss_be_r_aarch64 +#define helper_sve_st2ss_le_r helper_sve_st2ss_le_r_aarch64 +#define helper_sve_st3ss_be_r helper_sve_st3ss_be_r_aarch64 +#define helper_sve_st3ss_le_r helper_sve_st3ss_le_r_aarch64 +#define helper_sve_st4ss_be_r helper_sve_st4ss_be_r_aarch64 +#define helper_sve_st4ss_le_r helper_sve_st4ss_le_r_aarch64 #define helper_sve_stbd_zd helper_sve_stbd_zd_aarch64 #define helper_sve_stbd_zss helper_sve_stbd_zss_aarch64 #define helper_sve_stbd_zsu helper_sve_stbd_zsu_aarch64 diff --git a/qemu/aarch64eb.h b/qemu/aarch64eb.h index 1566eb78..cd61ba3a 100644 --- a/qemu/aarch64eb.h +++ b/qemu/aarch64eb.h @@ -4065,21 +4065,36 @@ #define helper_sve_st1bd_r helper_sve_st1bd_r_aarch64eb #define helper_sve_st1bh_r helper_sve_st1bh_r_aarch64eb #define helper_sve_st1bs_r helper_sve_st1bs_r_aarch64eb -#define helper_sve_st1dd_r helper_sve_st1dd_r_aarch64eb -#define helper_sve_st2dd_r helper_sve_st2dd_r_aarch64eb -#define helper_sve_st3dd_r helper_sve_st3dd_r_aarch64eb -#define helper_sve_st4dd_r helper_sve_st4dd_r_aarch64eb -#define helper_sve_st1hh_r helper_sve_st1hh_r_aarch64eb -#define helper_sve_st2hh_r helper_sve_st2hh_r_aarch64eb -#define helper_sve_st3hh_r helper_sve_st3hh_r_aarch64eb -#define helper_sve_st4hh_r helper_sve_st4hh_r_aarch64eb -#define helper_sve_st1hd_r helper_sve_st1hd_r_aarch64eb -#define helper_sve_st1hs_r helper_sve_st1hs_r_aarch64eb -#define helper_sve_st1sd_r helper_sve_st1sd_r_aarch64eb -#define helper_sve_st1ss_r helper_sve_st1ss_r_aarch64eb -#define helper_sve_st2ss_r helper_sve_st2ss_r_aarch64eb -#define helper_sve_st3ss_r helper_sve_st3ss_r_aarch64eb -#define helper_sve_st4ss_r helper_sve_st4ss_r_aarch64eb +#define helper_sve_st1dd_be_r helper_sve_st1dd_be_r_aarch64eb +#define helper_sve_st1dd_le_r helper_sve_st1dd_le_r_aarch64eb +#define helper_sve_st2dd_be_r helper_sve_st2dd_be_r_aarch64eb +#define helper_sve_st2dd_le_r helper_sve_st2dd_le_r_aarch64eb +#define helper_sve_st3dd_be_r helper_sve_st3dd_be_r_aarch64eb +#define helper_sve_st3dd_le_r helper_sve_st3dd_le_r_aarch64eb +#define helper_sve_st4dd_be_r helper_sve_st4dd_be_r_aarch64eb +#define helper_sve_st4dd_le_r helper_sve_st4dd_le_r_aarch64eb +#define helper_sve_st1hh_be_r helper_sve_st1hh_be_r_aarch64eb +#define helper_sve_st1hh_le_r helper_sve_st1hh_le_r_aarch64eb +#define helper_sve_st2hh_be_r helper_sve_st2hh_be_r_aarch64eb +#define helper_sve_st2hh_le_r helper_sve_st2hh_le_r_aarch64eb +#define helper_sve_st3hh_be_r helper_sve_st3hh_be_r_aarch64eb +#define helper_sve_st3hh_le_r helper_sve_st3hh_le_r_aarch64eb +#define helper_sve_st4hh_be_r helper_sve_st4hh_be_r_aarch64eb +#define helper_sve_st4hh_le_r helper_sve_st4hh_le_r_aarch64eb +#define helper_sve_st1hd_be_r helper_sve_st1hd_be_r_aarch64eb +#define helper_sve_st1hd_le_r helper_sve_st1hd_le_r_aarch64eb +#define helper_sve_st1hs_be_r helper_sve_st1hs_be_r_aarch64eb +#define helper_sve_st1hs_le_r helper_sve_st1hs_le_r_aarch64eb +#define helper_sve_st1sd_be_r helper_sve_st1sd_be_r_aarch64eb +#define helper_sve_st1sd_le_r helper_sve_st1sd_le_r_aarch64eb +#define helper_sve_st1ss_be_r helper_sve_st1ss_be_r_aarch64eb +#define helper_sve_st1ss_le_r helper_sve_st1ss_le_r_aarch64eb +#define helper_sve_st2ss_be_r helper_sve_st2ss_be_r_aarch64eb +#define helper_sve_st2ss_le_r helper_sve_st2ss_le_r_aarch64eb +#define helper_sve_st3ss_be_r helper_sve_st3ss_be_r_aarch64eb +#define helper_sve_st3ss_le_r helper_sve_st3ss_le_r_aarch64eb +#define helper_sve_st4ss_be_r helper_sve_st4ss_be_r_aarch64eb +#define helper_sve_st4ss_le_r helper_sve_st4ss_le_r_aarch64eb #define helper_sve_stbd_zd helper_sve_stbd_zd_aarch64eb #define helper_sve_stbd_zss helper_sve_stbd_zss_aarch64eb #define helper_sve_stbd_zsu helper_sve_stbd_zsu_aarch64eb diff --git a/qemu/header_gen.py b/qemu/header_gen.py index efe5a862..2184bcf0 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -4089,21 +4089,36 @@ aarch64_symbols = ( 'helper_sve_st1bd_r', 'helper_sve_st1bh_r', 'helper_sve_st1bs_r', - 'helper_sve_st1dd_r', - 'helper_sve_st2dd_r', - 'helper_sve_st3dd_r', - 'helper_sve_st4dd_r', - 'helper_sve_st1hh_r', - 'helper_sve_st2hh_r', - 'helper_sve_st3hh_r', - 'helper_sve_st4hh_r', - 'helper_sve_st1hd_r', - 'helper_sve_st1hs_r', - 'helper_sve_st1sd_r', - 'helper_sve_st1ss_r', - 'helper_sve_st2ss_r', - 'helper_sve_st3ss_r', - 'helper_sve_st4ss_r', + 'helper_sve_st1dd_be_r', + 'helper_sve_st1dd_le_r', + 'helper_sve_st2dd_be_r', + 'helper_sve_st2dd_le_r', + 'helper_sve_st3dd_be_r', + 'helper_sve_st3dd_le_r', + 'helper_sve_st4dd_be_r', + 'helper_sve_st4dd_le_r', + 'helper_sve_st1hh_be_r', + 'helper_sve_st1hh_le_r', + 'helper_sve_st2hh_be_r', + 'helper_sve_st2hh_le_r', + 'helper_sve_st3hh_be_r', + 'helper_sve_st3hh_le_r', + 'helper_sve_st4hh_be_r', + 'helper_sve_st4hh_le_r', + 'helper_sve_st1hd_be_r', + 'helper_sve_st1hd_le_r', + 'helper_sve_st1hs_be_r', + 'helper_sve_st1hs_le_r', + 'helper_sve_st1sd_be_r', + 'helper_sve_st1sd_le_r', + 'helper_sve_st1ss_be_r', + 'helper_sve_st1ss_le_r', + 'helper_sve_st2ss_be_r', + 'helper_sve_st2ss_le_r', + 'helper_sve_st3ss_be_r', + 'helper_sve_st3ss_le_r', + 'helper_sve_st4ss_be_r', + 'helper_sve_st4ss_le_r', 'helper_sve_stbd_zd', 'helper_sve_stbd_zss', 'helper_sve_stbd_zsu', diff --git a/qemu/target/arm/helper-sve.h b/qemu/target/arm/helper-sve.h index af84c1e8..6b9b93af 100644 --- a/qemu/target/arm/helper-sve.h +++ b/qemu/target/arm/helper-sve.h @@ -1248,29 +1248,47 @@ DEF_HELPER_FLAGS_4(sve_st2bb_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) DEF_HELPER_FLAGS_4(sve_st3bb_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) DEF_HELPER_FLAGS_4(sve_st4bb_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st1hh_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st2hh_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st3hh_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st4hh_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1hh_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st2hh_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st3hh_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st4hh_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st1ss_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st2ss_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st3ss_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st4ss_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1hh_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st2hh_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st3hh_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st4hh_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st1dd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st2dd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st3dd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st4dd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1ss_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st2ss_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st3ss_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st4ss_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) + +DEF_HELPER_FLAGS_4(sve_st1ss_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st2ss_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st3ss_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st4ss_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) + +DEF_HELPER_FLAGS_4(sve_st1dd_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st2dd_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st3dd_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st4dd_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) + +DEF_HELPER_FLAGS_4(sve_st1dd_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st2dd_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st3dd_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st4dd_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) DEF_HELPER_FLAGS_4(sve_st1bh_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) DEF_HELPER_FLAGS_4(sve_st1bs_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) DEF_HELPER_FLAGS_4(sve_st1bd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st1hs_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st1hd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1hs_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1hd_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1hs_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1hd_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) -DEF_HELPER_FLAGS_4(sve_st1sd_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1sd_le_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) +DEF_HELPER_FLAGS_4(sve_st1sd_be_r, TCG_CALL_NO_WG, void, env, ptr, tl, i32) DEF_HELPER_FLAGS_6(sve_ldbsu_zsu, TCG_CALL_NO_WG, void, env, ptr, ptr, ptr, tl, i32) diff --git a/qemu/target/arm/sve_helper.c b/qemu/target/arm/sve_helper.c index 32bfc217..7a1ac9b2 100644 --- a/qemu/target/arm/sve_helper.c +++ b/qemu/target/arm/sve_helper.c @@ -4359,12 +4359,17 @@ void __attribute__((flatten)) HELPER(sve_st##N##NAME##_r) \ } #define DO_STN_2(N, NAME, ESIZE, MSIZE) \ -void __attribute__((flatten)) HELPER(sve_st##N##NAME##_r) \ +void __attribute__((flatten)) HELPER(sve_st##N##NAME##_le_r) \ (CPUARMState *env, void *vg, target_ulong addr, uint32_t desc) \ { \ sve_st##N##_r(env, vg, addr, desc, GETPC(), ESIZE, MSIZE, \ - arm_cpu_data_is_big_endian(env) \ - ? sve_st1##NAME##_be_tlb : sve_st1##NAME##_le_tlb); \ + sve_st1##NAME##_le_tlb); \ +} \ +void __attribute__((flatten)) HELPER(sve_st##N##NAME##_be_r) \ + (CPUARMState *env, void *vg, target_ulong addr, uint32_t desc) \ +{ \ + sve_st##N##_r(env, vg, addr, desc, GETPC(), ESIZE, MSIZE, \ + sve_st1##NAME##_be_tlb); \ } DO_STN_1(1, bb, 1) diff --git a/qemu/target/arm/translate-sve.c b/qemu/target/arm/translate-sve.c index 8773e4db..99bcc9d5 100644 --- a/qemu/target/arm/translate-sve.c +++ b/qemu/target/arm/translate-sve.c @@ -5127,32 +5127,70 @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a, uint32_t insn) static void do_st_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr, int msz, int esz, int nreg) { - static gen_helper_gvec_mem * const fn_single[4][4] = { - { gen_helper_sve_st1bb_r, gen_helper_sve_st1bh_r, - gen_helper_sve_st1bs_r, gen_helper_sve_st1bd_r }, - { NULL, gen_helper_sve_st1hh_r, - gen_helper_sve_st1hs_r, gen_helper_sve_st1hd_r }, - { NULL, NULL, - gen_helper_sve_st1ss_r, gen_helper_sve_st1sd_r }, - { NULL, NULL, NULL, gen_helper_sve_st1dd_r }, + static gen_helper_gvec_mem * const fn_single[2][4][4] = { + { { gen_helper_sve_st1bb_r, + gen_helper_sve_st1bh_r, + gen_helper_sve_st1bs_r, + gen_helper_sve_st1bd_r }, + { NULL, + gen_helper_sve_st1hh_le_r, + gen_helper_sve_st1hs_le_r, + gen_helper_sve_st1hd_le_r }, + { NULL, NULL, + gen_helper_sve_st1ss_le_r, + gen_helper_sve_st1sd_le_r }, + { NULL, NULL, NULL, + gen_helper_sve_st1dd_le_r } }, + { { gen_helper_sve_st1bb_r, + gen_helper_sve_st1bh_r, + gen_helper_sve_st1bs_r, + gen_helper_sve_st1bd_r }, + { NULL, + gen_helper_sve_st1hh_be_r, + gen_helper_sve_st1hs_be_r, + gen_helper_sve_st1hd_be_r }, + { NULL, NULL, + gen_helper_sve_st1ss_be_r, + gen_helper_sve_st1sd_be_r }, + { NULL, NULL, NULL, + gen_helper_sve_st1dd_be_r } }, }; - static gen_helper_gvec_mem * const fn_multiple[3][4] = { - { gen_helper_sve_st2bb_r, gen_helper_sve_st2hh_r, - gen_helper_sve_st2ss_r, gen_helper_sve_st2dd_r }, - { gen_helper_sve_st3bb_r, gen_helper_sve_st3hh_r, - gen_helper_sve_st3ss_r, gen_helper_sve_st3dd_r }, - { gen_helper_sve_st4bb_r, gen_helper_sve_st4hh_r, - gen_helper_sve_st4ss_r, gen_helper_sve_st4dd_r }, + static gen_helper_gvec_mem * const fn_multiple[2][3][4] = { + { { gen_helper_sve_st2bb_r, + gen_helper_sve_st2hh_le_r, + gen_helper_sve_st2ss_le_r, + gen_helper_sve_st2dd_le_r }, + { gen_helper_sve_st3bb_r, + gen_helper_sve_st3hh_le_r, + gen_helper_sve_st3ss_le_r, + gen_helper_sve_st3dd_le_r }, + { gen_helper_sve_st4bb_r, + gen_helper_sve_st4hh_le_r, + gen_helper_sve_st4ss_le_r, + gen_helper_sve_st4dd_le_r } }, + { { gen_helper_sve_st2bb_r, + gen_helper_sve_st2hh_be_r, + gen_helper_sve_st2ss_be_r, + gen_helper_sve_st2dd_be_r }, + { gen_helper_sve_st3bb_r, + gen_helper_sve_st3hh_be_r, + gen_helper_sve_st3ss_be_r, + gen_helper_sve_st3dd_be_r }, + { gen_helper_sve_st4bb_r, + gen_helper_sve_st4hh_be_r, + gen_helper_sve_st4ss_be_r, + gen_helper_sve_st4dd_be_r } }, }; gen_helper_gvec_mem *fn; + int be = s->be_data == MO_BE; if (nreg == 0) { /* ST1 */ - fn = fn_single[msz][esz]; + fn = fn_single[be][msz][esz]; } else { /* ST2, ST3, ST4 -- msz == esz, enforced by encoding */ assert(msz == esz); - fn = fn_multiple[nreg - 1][msz]; + fn = fn_multiple[be][nreg - 1][msz]; } assert(fn != NULL); do_mem_zpa(s, zt, pg, addr, fn);