target/riscv: Properly check SEW in amo_op

We're currently assuming SEW <= 3, and the "else" from
the SEW == 3 must be less.  Use a switch and explicitly
bound both SEW and SEQ for all cases.

Reviewed-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20211020031709.359469-8-richard.henderson@linaro.org
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
Richard Henderson 2021-10-19 20:17:01 -07:00 committed by Alistair Francis
parent fbb48032e4
commit 4e97d459a0

View File

@ -704,18 +704,20 @@ static bool amo_op(DisasContext *s, arg_rwdvm *a, uint8_t seq)
gen_helper_exit_atomic(cpu_env);
s->base.is_jmp = DISAS_NORETURN;
return true;
} else {
if (s->sew == 3) {
if (!is_32bit(s)) {
fn = fnsd[seq];
} else {
/* Check done in amo_check(). */
g_assert_not_reached();
}
} else {
assert(seq < ARRAY_SIZE(fnsw));
fn = fnsw[seq];
}
}
switch (s->sew) {
case 0 ... 2:
assert(seq < ARRAY_SIZE(fnsw));
fn = fnsw[seq];
break;
case 3:
/* XLEN check done in amo_check(). */
assert(seq < ARRAY_SIZE(fnsd));
fn = fnsd[seq];
break;
default:
g_assert_not_reached();
}
data = FIELD_DP32(data, VDATA, MLEN, s->mlen);