Skip to content

Commit

Permalink
target/arm: Implement SME ZERO
Browse files Browse the repository at this point in the history
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20220708151540.18136-19-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
rth7680 authored and pm215 committed Jul 11, 2022
1 parent 0d93576 commit ad939af
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 0 deletions.
2 changes: 2 additions & 0 deletions target/arm/helper-sme.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@

DEF_HELPER_FLAGS_2(set_pstate_sm, TCG_CALL_NO_RWG, void, env, i32)
DEF_HELPER_FLAGS_2(set_pstate_za, TCG_CALL_NO_RWG, void, env, i32)

DEF_HELPER_FLAGS_3(sme_zero, TCG_CALL_NO_RWG, void, env, i32, i32)
4 changes: 4 additions & 0 deletions target/arm/sme.decode
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,7 @@
#
# This file is processed by scripts/decodetree.py
#

### SME Misc

ZERO 11000000 00 001 00000000000 imm:8
25 changes: 25 additions & 0 deletions target/arm/sme_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,28 @@ void helper_set_pstate_za(CPUARMState *env, uint32_t i)
memset(env->zarray, 0, sizeof(env->zarray));
}
}

void helper_sme_zero(CPUARMState *env, uint32_t imm, uint32_t svl)
{
uint32_t i;

/*
* Special case clearing the entire ZA space.
* This falls into the CONSTRAINED UNPREDICTABLE zeroing of any
* parts of the ZA storage outside of SVL.
*/
if (imm == 0xff) {
memset(env->zarray, 0, sizeof(env->zarray));
return;
}

/*
* Recall that ZAnH.D[m] is spread across ZA[n+8*m],
* so each row is discontiguous within ZA[].
*/
for (i = 0; i < svl; i++) {
if (imm & (1 << (i % 8))) {
memset(&env->zarray[i], 0, svl);
}
}
}
13 changes: 13 additions & 0 deletions target/arm/translate-sme.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,16 @@
*/

#include "decode-sme.c.inc"


static bool trans_ZERO(DisasContext *s, arg_ZERO *a)
{
if (!dc_isar_feature(aa64_sme, s)) {
return false;
}
if (sme_za_enabled_check(s)) {
gen_helper_sme_zero(cpu_env, tcg_constant_i32(a->imm),
tcg_constant_i32(streaming_vec_reg_size(s)));
}
return true;
}

0 comments on commit ad939af

Please sign in to comment.