Hi!

On Sat, Jan 23, 2021 at 01:03:31AM +0100, Jakub Jelinek wrote:
> On Fri, Jan 22, 2021 at 05:45:54PM -0600, Segher Boessenkool wrote:
> > On Fri, Jan 22, 2021 at 07:02:04PM +0100, Jakub Jelinek wrote:
> > > The x86 __m64 type is defined as:
> > > /* The Intel API is flexible enough that we must allow aliasing with other
> > >    vector types, and their scalar components.  */
> > > typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));
> > > and so matches the comment above it in that reads and stores through
> > > pointers to __m64 can alias anything.
> > > But in the rs6000 headers that is the case only for __m128, but not __m64.
> > 
> > We define __m64 as an integer type, because we do not have 8-byte
> > vectors.  There is __m64_union to do conversions.
> 
> It being an integer type is not the problem.

Sure, just pointing out the quite big difference we have.

> > > The following patch adds that attribute, which fixes the
> > > FAIL: gcc.target/powerpc/sse-movhps-1.c execution test
> > > FAIL: gcc.target/powerpc/sse-movlps-1.c execution test
> > > regressions that appeared when Honza improved ipa-modref.
> > 
> > What is the actual error there?  It sounds like something forgot to
> > pass something through __m64_union.
> 
> The problem is that the testcase uses the
> _mm_loadl_pi
> API, and per the Intel intrinsic rules it is ok when that intrinsic
> loads from wide range of types, e.g. including pairs of integers or
> 4 shorts or 8 chars or pair of floats.

<snip>

Oh right.  I nominate it for worst API ever :-)

Thanks for the explanation.  The patch is okay for trunk.  Thanks!


Segher

Reply via email to