On Fri, Oct 21, 2016 at 11:18:31AM +0200, Eric Botcazou wrote:
> /* For sub-word operations, if target doesn't have them, start
> with precres widening right away, otherwise do it only
> if the most simple cases can't be used. */
> if (WORD_REGISTER_OPERATIONS
> && orig_precres == precres
> && precres < BITS_PER_WORD)
> ;
>
> Jakub, any idea of an elegant way to address this issue?
Then to some extent defining WORD_REGISTER_OPERATIONS on SPARC is a lie,
it only has "INT_REGISTER_OPERATIONS", i.e. all operations smaller than
int are performed on the whole register, int operations can be really done
in SImode in the IL (no need to sign/zero extend anything to DImode, if you
just ignore the high 32 bits).
Guess easiest would be to add some targetm constant or hook that gives
you bit precision - integral arithmetics smaller than this precision is
performed in precision. Then define it by default to
#ifdef WORD_REGISTER_OPERATIONS
BITS_PER_WORD
#else
BITS_PER_UNIT
#endif
and for sparc set to 32, then use this targetm constant or hook in
internal-fn.c instead of WORD_REGISTER_OPERATIONS and BITS_PER_WORD.
Jakub