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.