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