qemu-riscv
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] target/riscv: Fix LMUL check to use minimum SEW


From: Rob Bradford
Subject: Re: [PATCH] target/riscv: Fix LMUL check to use minimum SEW
Date: Mon, 17 Jul 2023 16:13:04 +0100
User-agent: Evolution 3.48.3 (3.48.3-1.module_f38+16987+774193ea)

On Thu, 2023-07-06 at 21:22 +0800, Weiwei Li wrote:
> 
> On 2023/7/6 18:44, Rob Bradford wrote:
> > The previous check was failing with:
> > 
> > ELEN = 64 SEW = 16 and LMUL = 1/8 (encoded as 5) which is a valid
> > combination.
> > 
> > Fix the check to correctly match the specification by using minimum
> > SEW
> > rather than the active SEW.
> > 
> >  From the specification:
> > 
> > "In general, the requirement is to support LMUL ≥ SEWMIN/ELEN,
> > where
> > SEWMIN is the narrowest supported SEW value and ELEN is the widest
> > supported SEW value. In the standard extensions, SEWMIN=8. For
> > standard
> > vector extensions with ELEN=32, fractional LMULs of 1/2 and 1/4
> > must be
> > supported. For standard vector extensions with ELEN=64, fractional
> > LMULs
> > of 1/2, 1/4, and 1/8 must be supported."
> > 
> >  From inspection this new check allows:
> > 
> > ELEN=64 1/2, 1/4, 1/8 (encoded as 7, 6, 5 respectfully)
> > ELEN=32 1/2, 1/4 (encoded as 7 and 6 respectfully)
> 

Hi Weiwei Li,

Thanks for your reply. Sorry for delay in replying i've been away.

> This is a little confusing.  there is  note in spec to explain why 
> LMUL 
> ≥ SEW MIN /ELEN:
> 
> "When LMUL < SEW MIN /ELEN, there is no guarantee an implementation 
> would have enough bits in the fractional vector register to store
> 
> Note at least one element, as VLEN=ELEN is a valid implementation 
> choice. For example, with VLEN=ELEN=32, and SEW MIN =8, an LMUL of
> 
> 1/8 would only provide four bits of storage in a vector register."
> 
> In this way, when VLEN=ELEN=64,  an LMUL of 1/8 would only provide 8 
> bits of storage in a vector register, so it's also not suitable for
> sew 
> = 16.
> 
> Maybe we can explain the above description of the spec in another
> way: 
> we must support lmul=1/8 when ELEN=64, but it's only available when
> sew = 8.
> 

I'm afraid i'm not sure I agree with this comment.

VLEN=128 ELEN=64 SEW=16 LMUL=1/8 is a perfectly reasonable
configuration and contradicts your statement.

The goal of my patch was to ensure that we permit a valid configuration
not to also reject other invalid configurations.

An extra check that takes into consideration VLEN would also make sense
to me:

e.g. VLEN=64 LMUL=1/8 SEW=16 should be rejected

Cheers,

Rob

> Regards,
> 
> Weiwei Li
> 
> `
> 
> Regards,
> 
> Weiwei Li
> 
> > 
> > Fixes: d9b7609a1fb2 ("target/riscv: rvv-1.0: configure
> > instructions")
> > 
> > Signed-off-by: Rob Bradford <rbradford@rivosinc.com>
> > ---
> >   target/riscv/vector_helper.c | 4 ++--
> >   1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/target/riscv/vector_helper.c
> > b/target/riscv/vector_helper.c
> > index 1e06e7447c..8dfd8fe484 100644
> > --- a/target/riscv/vector_helper.c
> > +++ b/target/riscv/vector_helper.c
> > @@ -43,9 +43,9 @@ target_ulong HELPER(vsetvl)(CPURISCVState *env,
> > target_ulong s1,
> >                                               xlen - 1 -
> > R_VTYPE_RESERVED_SHIFT);
> >   
> >       if (lmul & 4) {
> > -        /* Fractional LMUL. */
> > +        /* Fractional LMUL - check LMUL >= ELEN/SEW_MIN (8) */
> >           if (lmul == 4 ||
> > -            cpu->cfg.elen >> (8 - lmul) < sew) {
> > +            cpu->cfg.elen >> (8 - lmul) < 8) {
> >               vill = true;
> >           }
> >       }
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]