|
@@ -1381,14 +1381,14 @@ static bool fp_access_check_only(DisasContext *s)
|
|
|
{
|
|
|
if (s->fp_excp_el) {
|
|
|
assert(!s->fp_access_checked);
|
|
|
- s->fp_access_checked = true;
|
|
|
+ s->fp_access_checked = -1;
|
|
|
|
|
|
gen_exception_insn_el(s, 0, EXCP_UDEF,
|
|
|
syn_fp_access_trap(1, 0xe, false, 0),
|
|
|
s->fp_excp_el);
|
|
|
return false;
|
|
|
}
|
|
|
- s->fp_access_checked = true;
|
|
|
+ s->fp_access_checked = 1;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1465,13 +1465,13 @@ bool sve_access_check(DisasContext *s)
|
|
|
syn_sve_access_trap(), s->sve_excp_el);
|
|
|
goto fail_exit;
|
|
|
}
|
|
|
- s->sve_access_checked = true;
|
|
|
+ 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 = true;
|
|
|
+ s->sve_access_checked = -1;
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -1500,8 +1500,9 @@ bool sme_enabled_check(DisasContext *s)
|
|
|
* sme_excp_el by itself for cpregs access checks.
|
|
|
*/
|
|
|
if (!s->fp_excp_el || s->sme_excp_el < s->fp_excp_el) {
|
|
|
- s->fp_access_checked = true;
|
|
|
- return sme_access_check(s);
|
|
|
+ bool ret = sme_access_check(s);
|
|
|
+ s->fp_access_checked = (ret ? 1 : -1);
|
|
|
+ return ret;
|
|
|
}
|
|
|
return fp_access_check_only(s);
|
|
|
}
|
|
@@ -10257,8 +10258,8 @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
|
|
|
s->insn = insn;
|
|
|
s->base.pc_next = pc + 4;
|
|
|
|
|
|
- s->fp_access_checked = false;
|
|
|
- s->sve_access_checked = false;
|
|
|
+ s->fp_access_checked = 0;
|
|
|
+ s->sve_access_checked = 0;
|
|
|
|
|
|
if (s->pstate_il) {
|
|
|
/*
|