https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113614

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I guess the thing is that while using for a signed operand a positive precision
(if smaller than the precision of the signed operand) is always fine,
indicating zero extension from something narrower, for unsigned operand a
negative precision (if smaller in absolute value than the precision of the
unsigned operand) might be fine for __mulbitint3 (but even then perhaps only if
the result precision isn't higher than the precision of the operands), for
other libgcc _BitInt operations, including __divmodbitint4 but also the
conversions from _BitInt to binary/decimal floating point really consider an
operand with negative precision as signed with precision equal to the absolute
value of the argument, so there is no way to represent something that has been
sign extended from narrower precision and then cast to unsigned (we'd need to
tell libgcc two numbers somehow, from which smaller precision it is sign
extended and to which wider precision where it becomes unsigned).
But, guess this means we need to make sure such widening casts are not merged
with the libgcc operations.

Reply via email to