|
@@ -1456,23 +1456,23 @@ static int fp_access_check_vector_hsd(DisasContext *s, bool is_q, MemOp esz)
|
|
|
bool sve_access_check(DisasContext *s)
|
|
|
{
|
|
|
if (s->pstate_sm || !dc_isar_feature(aa64_sve, s)) {
|
|
|
+ bool ret;
|
|
|
+
|
|
|
assert(dc_isar_feature(aa64_sme, s));
|
|
|
- if (!sme_sm_enabled_check(s)) {
|
|
|
- goto fail_exit;
|
|
|
- }
|
|
|
- } else if (s->sve_excp_el) {
|
|
|
+ ret = sme_sm_enabled_check(s);
|
|
|
+ s->sve_access_checked = (ret ? 1 : -1);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ if (s->sve_excp_el) {
|
|
|
+ /* Assert that we only raise one exception per instruction. */
|
|
|
+ assert(!s->sve_access_checked);
|
|
|
gen_exception_insn_el(s, 0, EXCP_UDEF,
|
|
|
syn_sve_access_trap(), s->sve_excp_el);
|
|
|
- goto fail_exit;
|
|
|
+ s->sve_access_checked = -1;
|
|
|
+ return false;
|
|
|
}
|
|
|
s->sve_access_checked = 1;
|
|
|
return fp_access_check(s);
|
|
|
-
|
|
|
- fail_exit:
|
|
|
- /* Assert that we only raise one exception per instruction. */
|
|
|
- assert(!s->sve_access_checked);
|
|
|
- s->sve_access_checked = -1;
|
|
|
- return false;
|
|
|
}
|
|
|
|
|
|
/*
|