Hi,

On Thu, 14 Aug 2025 at 11:27, Christophe Lyon
<christophe.l...@linaro.org> wrote:
>
> Hi Keith,
>
> On Tue, 12 Aug 2025 at 18:33, Keith Packard <kei...@keithp.com> wrote:
> >
> > The C shift operators do not precisely match the associated ARM
> > instructions: shifts of negative values or by negative amounts are
> > undefined behavior in C, and GCC may substitute alternate instruction
> > sequences when it can determine that the application is using UB.
> >
> > Replace C shift operators with inline asm to ensure the lsll and asrl
> > primitives always emit the indicated instruction.
> >
> > This issue caused mis-compilation of the ARM cmsis-dsp code for
> > arm_biquad_cascade_df1_32x64_q31:
> >
> >         https://github.com/ARM-software/CMSIS-DSP/pull/265
> >
>
> Thanks for the report and for the patch.
> It looks almost OK, but instead of using __asm__, could you use
> builtins like we do a few lines below (see uqrshll for instance) ?
>
> In addition, could you add a testcase?
>
> Finally, please include a ChangeLog entry in your commit message.
>

Hi,

My todo-list including re-implementing these MVE intrinsics using the
same framework as the others, and I have just posted a series which
does that:
https://inbox.sourceware.org/gcc-patches/20250827144542.646760-1-christophe.l...@linaro.org/T/

patches 3, 4 and 5 should fix asrl and lsll.

Thanks,

Christophe


> Thanks,
>
> Christophe
>
> > Signed-off-by: Keith Packard <kei...@keithp.com>
> > ---
> >  gcc/config/arm/arm_mve.h | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/gcc/config/arm/arm_mve.h b/gcc/config/arm/arm_mve.h
> > index ee18a4714fb..c4fad3c6429 100644
> > --- a/gcc/config/arm/arm_mve.h
> > +++ b/gcc/config/arm/arm_mve.h
> > @@ -258,14 +258,16 @@ __extension__ extern __inline  uint64_t
> >  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
> >  __arm_lsll (uint64_t value, int32_t shift)
> >  {
> > -  return (value << shift);
> > +  __asm__("lsll %Q0, %R0, %1" : "+r" (value) : "rPg" (shift));
> > +  return value;
> >  }
> >
> >  __extension__ extern __inline int64_t
> >  __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
> >  __arm_asrl (int64_t value, int32_t shift)
> >  {
> > -  return (value >> shift);
> > +  __asm__("asrl %Q0, %R0, %1" : "+r" (value) : "rPg" (shift));
> > +  return value;
> >  }
> >
> >  __extension__ extern __inline uint64_t
> > --
> > 2.49.0
> >

Reply via email to