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
1 changed files with 14 additions and 12 deletions

View File

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