target/arm: Implement SME LDR, STR
We can reuse the SVE functions for LDR and STR, passing in the base of the ZA vector and a zero offset. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220708151540.18136-23-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8713f73e53
commit
4c46a5f12c
|
@ -46,3 +46,10 @@ LDST1 1110000 0 esz:2 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
|
|||
&ldst rs=%mova_rs
|
||||
LDST1 1110000 111 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
|
||||
&ldst esz=4 rs=%mova_rs
|
||||
|
||||
&ldstr rv rn imm
|
||||
@ldstr ....... ... . ...... .. ... rn:5 . imm:4 \
|
||||
&ldstr rv=%mova_rs
|
||||
|
||||
LDR 1110000 100 0 000000 .. 000 ..... 0 .... @ldstr
|
||||
STR 1110000 100 1 000000 .. 000 ..... 0 .... @ldstr
|
||||
|
|
|
@ -243,3 +243,27 @@ static bool trans_LDST1(DisasContext *s, arg_LDST1 *a)
|
|||
tcg_temp_free_i64(addr);
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef void GenLdStR(DisasContext *, TCGv_ptr, int, int, int, int);
|
||||
|
||||
static bool do_ldst_r(DisasContext *s, arg_ldstr *a, GenLdStR *fn)
|
||||
{
|
||||
int svl = streaming_vec_reg_size(s);
|
||||
int imm = a->imm;
|
||||
TCGv_ptr base;
|
||||
|
||||
if (!sme_za_enabled_check(s)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ZA[n] equates to ZA0H.B[n]. */
|
||||
base = get_tile_rowcol(s, MO_8, a->rv, imm, false);
|
||||
|
||||
fn(s, base, 0, svl, a->rn, imm * svl);
|
||||
|
||||
tcg_temp_free_ptr(base);
|
||||
return true;
|
||||
}
|
||||
|
||||
TRANS_FEAT(LDR, aa64_sme, do_ldst_r, a, gen_sve_ldr)
|
||||
TRANS_FEAT(STR, aa64_sme, do_ldst_r, a, gen_sve_str)
|
||||
|
|
Loading…
Reference in New Issue