> 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