Hi Julian,
On 12 November 2010 17:49, Julian Brown julian@codesourcery.com wrote:
For the first of these, I think we can get away with changing the vectorizer to use explicit "array" loads and stores (i.e. vldN/vstN), so that vector registers will hold elements in memory order -- so, all the contortions in the attached patch will be unnecessary. ABI issues are irrelevant, since vectors are "invisible" at the source code layer generally, including at ABI boundaries.
... The important observation is that vectors from case 1 and from cases 2/3 never interact: it's quite safe for them to use different element orderings, without extensive changes to GCC infrastructure (i.e., multiple internal representations). I don't think I quite realised this previously.
Do you think now that the changes in GIMPLE and RTL (a function attached to each vector) are unnecessary?
From the vectorizer point of view, target hooks look like the easiest
solution (yet ugly). I am trying to think about something else, but nothing really makes sense.
So, anyway, back to the patch in question. The choices are, I think:
- Apply as-is (after I've ironed out the wrinkles), and then remove
the "ugly" bits at a later point when vectorizer "array load/store" support is implemented.
- Apply a version which simply disables all the troublesome
patterns until the same support appears.
I slightly prefer the first one, it's kind of an incremental solution.
Ira
Apologies if I'm retreading old ground ;-).
(The CANNOT_CHANGE_MODE_CLASS fragment is necessary to generate good code for the quad-word vec_pack_trunc_<mode> pattern. It would eventually be applied as a separate patch.)
Thoughts?
Julian
ChangeLog
gcc/
- config/arm/arm.h (CANNOT_CHANGE_MODE_CLASS): Allow changing mode
of vector registers.
- config/arm/neon.md (vec_shr_<mode>, vec_shl_<mode>): Disable in
big-endian mode. (reduc_splus_<mode>, reduc_smin_<mode>, reduc_smax_<mode>) (reduc_umin_<mode>, reduc_umax_<mode>) (neon_vec_unpack<US>_lo_<mode>, neon_vec_unpack<US>_hi_<mode>) (neon_vec_<US>mult_lo_<mode>, neon_vec_<US>mult_hi_<mode>) (vec_pack_trunc_<mode>, neon_vec_pack_trunc_<mode>): Handle big-endian mode for quad-word vectors.