On 2/10/20 8:12 AM, LIU Zhiwei wrote:
> static inline void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
> - target_ulong *cs_base, uint32_t
> *flags)
> + target_ulong *cs_base, uint32_t
> *pflags)
> {
> + uint32_t flags = 0;
> + uint32_t vlmax;
> + uint8_t vl_eq_vlmax;
bool.
> +
> *pc = env->pc;
> *cs_base = 0;
> +
> + if (env->misa & RVV) {
> + vlmax = vext_get_vlmax(env_archcpu(env), env->vext.vtype);
> + vl_eq_vlmax = (env->vext.vstart == 0) && (vlmax == env->vext.vl);
You might as well move the variable declarations inside this block.
> +target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
> + target_ulong s2)
Indentation.
> +{
> + int vlmax, vl;
> + RISCVCPU *cpu = env_archcpu(env);
> + uint16_t sew = 1 << FIELD_EX64(s2, VTYPE, SEW);
> +
> + if (sew > cpu->cfg.elen) { /* only set vill bit. */
> + env->vext.vtype = FIELD_DP64(0, VTYPE, VILL, 1);
> + env->vext.vl = 0;
> + env->vext.vstart = 0;
> + return 0;
> + }
You're missing checks against EDIV, VILL and the RESERVED field == 0.
> +
> + vlmax = vext_get_vlmax(cpu, s2);
> + if (s1 <= vlmax) {
> + vl = s1;
> + } else {
> + vl = vlmax;
> + }
> + env->vext.vl = vl;
> + env->vext.vtype = s2;
> + env->vext.vstart = 0;
> + return vl;
> +}
>
r~