Julian Brown <jul...@codesourcery.com> writes:
>> > 2. Builtins (__builtin_neon_*) which previously used "big" integer
>> > modes to pass/return values, are initialised such that they
>> > directly pass/return the struct types above instead. The intrinsic
>> > wrappers in arm_neon.h no longer need to use unions to pun the
>> > types of arguments & return values.
>> 
>> Yeah, I'd wondered about that too.  However, these days, I think we
>> ought to be able to generate good code for this type of union, and we
>> seem to for the cases I've tried.  In the end I thought it was better
>> to keep the underlying built-in function close to the rtl pattern.
>> E.g. the fact that the name of the field is "val" seems more like an
>> arm_neon.h detail than something that should be hard-coded into GCC.
>
> I still think it's a good idea to get rid of the unions in this case,
> or at least, replace the wide-integer modes in the unions with wide
> vectors. But I'm happy with whatever works :-).

Yeah, I was wondering about changing the mode to a vector mode
(which is what the rtl pattern will use), but keeping the union.

>> I think we should keep the integer modes too, though, just like we
>> allow DImode for double registers.  (I'm surprised to see we don't
>> allow TImode for quad registers TBH -- might look into that.)
>> Given that there are no architectual restrictions on mode punning,
>> these integer modes are useful neutral ground.
>
> I'm not convinced by that. Consider that:
>
> 1. There are no useful operations on the wide-integer types.
>
> 2. There is no way of representing constants in RTL for the
> wide-integer types (we have an internal bug where a constant-zero
> OImode value is synthesized when using NEON intrinsics, and it leads to
> an ICE: see emit-rtl.c:immed_double_const -- OImode, etc. are wider
> than 2 * HOST_BITS_PER_WIDE_INT, so fail the second assertion).
>
> Unless we can show that the wide-integer modes are really needed, and
> patch things up so (2) no longer holds, I'd strongly prefer to see them
> disappear. (As a side note, we obviously want to avoid wide-integer or
> wide-vector modes *ever* being reloaded via core registers, since there
> simply aren't enough of them for that to be possible. I think that may
> be one of the reasons that integer-equivalent modes for each size have
> traditionally been used by the compiler?).

I think the main reason is that integer modes simply represent a string
of bits, without any particular interpretation (not even signed vs.
unsigned).  So the restrictions on subregs are much more lax than
they are for more specialised modes like floating-point and vector
modes.

We can stop large modes from being stored in integer registers
regardless of whether the mode is an integer or a vector (and we
already do this).  There's certainly the potential to mess things
up by defining the secondary reload hooks in the wrong way --
see for instance

    http://gcc.gnu.org/ml/gcc-patches/2011-01/msg02266.html

-- but the restriction is already there in principle.

I take your point about (2) not being possible at the moment,
but that's a flaw that's worth fixing in its own right.

Richard

_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to