https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117032

Tamar Christina <tnfchris at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |tnfchris at gcc dot gnu.org
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2024-10-08

--- Comment #1 from Tamar Christina <tnfchris at gcc dot gnu.org> ---
Confirmed.

Note that we miss the general case (e.g. without the FLOAT_EXPR) for both
direct and indirect.

static inline 
void g(unsigned short *a, int *b)
{
        b[0] = a[0];
        b[1] = a[1];
        b[2] = a[2];
        b[3] = a[3];
}
static inline 
void g2(int *a, long long *b)
{
        b[0] = a[0];
        b[1] = a[1];
        b[2] = a[2];
        b[3] = a[3];
}

void indirect(unsigned short *a, long long *b)
{
  int t[4];
  g(a, t);
  g2(t, b);
}

void direct(unsigned short *a, long long *b)
{
        b[0] = a[0];
        b[1] = a[1];
        b[2] = a[2];
        b[3] = a[3];
}

This is due to the way vec_unpack is implemented in the backend.
We rewrite it the mode to VHALF to model the intermediate vec_select, however
that means that V4HI is unmodel-able as that requires a V2HI.

I have a patch that adds direct conversion support, but this fails atm due
to the aarch64 backend not supporting 64-bit to 128-bit vector permutes yet
until another series of mine gets in.

Reply via email to