> Right. But that's the whole point behind avoiding the narrowing subreg > and forcing use of a truncate operation. > > So basically the question becomes is there a way to modify those bits in > a way that GCC doesn't know that it needs to to truncate/extend? >
I guess that this code may cause some problem. int test(int val, unsigned char c, int pos) { ((unsigned char*)&val)[pos+0] = c; return val; } GCC avoids using bitops, instead it uses load/store for it. Any ISA has INSERT_CHAR_VAR instruction? INSERT_CHAR_VAR $rN, $rM,$rX So I guess that known_lt may be a better choice if (known_lt) no_truncate_or_extend_needed; else add_truncate_or_extend; > The most obvious concern would be bitfield insertions that modify those > bits. But in that case the destination must have been DImode and we > must truncate it to SImode before we can do anything with the SImode > object. BUt that's all supposed to work as long as > TRULY_NOOP_TRUNCATION is defined properly. > > Jeff