mirror of https://github.com/xemu-project/xemu.git
target/arm: Implement widening/narrowing MVE VLDR/VSTR insns
Implement the variants of MVE VLDR (encodings T1, T2) which perform "widening" loads where bytes or halfwords are loaded from memory and zero or sign-extended into halfword or word length vector elements, and the narrowing MVE VSTR (encodings T1, T2) where bytes or halfwords are stored from halfword or word elements. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210617121628.20116-3-peter.maydell@linaro.org
This commit is contained in:
parent
507b6a500c
commit
2fc6b7510c
|
@ -22,3 +22,13 @@ DEF_HELPER_FLAGS_3(mve_vldrw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
|||
DEF_HELPER_FLAGS_3(mve_vstrb, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vstrh, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vstrw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
|
||||
DEF_HELPER_FLAGS_3(mve_vldrb_sh, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vldrb_sw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vldrb_uh, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vldrb_uw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vldrh_sw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vldrh_uw, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vstrb_h, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vstrb_w, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
DEF_HELPER_FLAGS_3(mve_vstrh_w, TCG_CALL_NO_WG, void, env, ptr, i32)
|
||||
|
|
|
@ -21,12 +21,33 @@
|
|||
|
||||
%qd 22:1 13:3
|
||||
|
||||
&vldr_vstr rn qd imm p a w size l
|
||||
&vldr_vstr rn qd imm p a w size l u
|
||||
|
||||
@vldr_vstr ....... . . . . l:1 rn:4 ... ...... imm:7 &vldr_vstr qd=%qd
|
||||
@vldr_vstr ....... . . . . l:1 rn:4 ... ...... imm:7 &vldr_vstr qd=%qd u=0
|
||||
# Note that both Rn and Qd are 3 bits only (no D bit)
|
||||
@vldst_wn ... u:1 ... . . . . l:1 . rn:3 qd:3 . ... .. imm:7 &vldr_vstr
|
||||
|
||||
# Vector loads and stores
|
||||
|
||||
# Widening loads and narrowing stores:
|
||||
# for these P=0 W=0 is 'related encoding'; sz=11 is 'related encoding'
|
||||
# This means we need to expand out to multiple patterns for P, W, SZ.
|
||||
# For stores the U bit must be 0 but we catch that in the trans_ function.
|
||||
# The naming scheme here is "VLDSTB_H == in-memory byte load/store to/from
|
||||
# signed halfword element in register", etc.
|
||||
VLDSTB_H 111 . 110 0 a:1 0 1 . 0 ... ... 0 111 01 ....... @vldst_wn \
|
||||
p=0 w=1 size=1
|
||||
VLDSTB_H 111 . 110 1 a:1 0 w:1 . 0 ... ... 0 111 01 ....... @vldst_wn \
|
||||
p=1 size=1
|
||||
VLDSTB_W 111 . 110 0 a:1 0 1 . 0 ... ... 0 111 10 ....... @vldst_wn \
|
||||
p=0 w=1 size=2
|
||||
VLDSTB_W 111 . 110 1 a:1 0 w:1 . 0 ... ... 0 111 10 ....... @vldst_wn \
|
||||
p=1 size=2
|
||||
VLDSTH_W 111 . 110 0 a:1 0 1 . 1 ... ... 0 111 10 ....... @vldst_wn \
|
||||
p=0 w=1 size=2
|
||||
VLDSTH_W 111 . 110 1 a:1 0 w:1 . 1 ... ... 0 111 10 ....... @vldst_wn \
|
||||
p=1 size=2
|
||||
|
||||
# Non-widening loads/stores (P=0 W=0 is 'related encoding')
|
||||
VLDR_VSTR 1110110 0 a:1 . 1 . .... ... 111100 ....... @vldr_vstr \
|
||||
size=0 p=0 w=1
|
||||
|
|
|
@ -168,5 +168,16 @@ DO_VSTR(vstrb, 1, stb, 1, uint8_t)
|
|||
DO_VSTR(vstrh, 2, stw, 2, uint16_t)
|
||||
DO_VSTR(vstrw, 4, stl, 4, uint32_t)
|
||||
|
||||
DO_VLDR(vldrb_sh, 1, ldsb, 2, int16_t)
|
||||
DO_VLDR(vldrb_sw, 1, ldsb, 4, int32_t)
|
||||
DO_VLDR(vldrb_uh, 1, ldub, 2, uint16_t)
|
||||
DO_VLDR(vldrb_uw, 1, ldub, 4, uint32_t)
|
||||
DO_VLDR(vldrh_sw, 2, ldsw, 4, int32_t)
|
||||
DO_VLDR(vldrh_uw, 2, lduw, 4, uint32_t)
|
||||
|
||||
DO_VSTR(vstrb_h, 1, stb, 2, int16_t)
|
||||
DO_VSTR(vstrb_w, 1, stb, 4, int32_t)
|
||||
DO_VSTR(vstrh_w, 2, stw, 4, int32_t)
|
||||
|
||||
#undef DO_VLDR
|
||||
#undef DO_VSTR
|
||||
|
|
|
@ -146,3 +146,17 @@ static bool trans_VLDR_VSTR(DisasContext *s, arg_VLDR_VSTR *a)
|
|||
};
|
||||
return do_ldst(s, a, ldstfns[a->size][a->l]);
|
||||
}
|
||||
|
||||
#define DO_VLDST_WIDE_NARROW(OP, SLD, ULD, ST) \
|
||||
static bool trans_##OP(DisasContext *s, arg_VLDR_VSTR *a) \
|
||||
{ \
|
||||
static MVEGenLdStFn * const ldstfns[2][2] = { \
|
||||
{ gen_helper_mve_##ST, gen_helper_mve_##SLD }, \
|
||||
{ NULL, gen_helper_mve_##ULD }, \
|
||||
}; \
|
||||
return do_ldst(s, a, ldstfns[a->u][a->l]); \
|
||||
}
|
||||
|
||||
DO_VLDST_WIDE_NARROW(VLDSTB_H, vldrb_sh, vldrb_uh, vstrb_h)
|
||||
DO_VLDST_WIDE_NARROW(VLDSTB_W, vldrb_sw, vldrb_uw, vstrb_w)
|
||||
DO_VLDST_WIDE_NARROW(VLDSTH_W, vldrh_sw, vldrh_uw, vstrh_w)
|
||||
|
|
Loading…
Reference in New Issue