On Sat, May 11, 2013 at 1:41 AM, DJ Delorie <[email protected]> wrote:
>
>> > Note that I had to make a few changes (fixes?) in the MI portions of
>> > gcc to avoid problems I encountered, I don't know if these changes are
>> > "correct" or if there are better ways to avoid those cases. Those
>>
>> In any case, they should best be posted in separate messages, each one
>> with its own rationale.
>
> Here's the first of those... The patch assumes that, "by definition",
> a partial int mode has fewer bits than an int mode of the same size,
> and thus truncation should be used to go from the int mode to the
> partial int mode.
Can you add that (partial int modes have fewer bits than int modes) as
verification
to genmodes.c:make_partial_integer_mode?
> Index: gcc/cfgexpand.c
> ===================================================================
> --- gcc/cfgexpand.c (revision 198591)
> +++ gcc/cfgexpand.c (working copy)
> @@ -3090,13 +3090,17 @@ expand_debug_expr (tree exp)
> size_t, we need to check for mis-matched modes and correct
> the addend. */
> if (op0 && op1
> && GET_MODE (op0) != VOIDmode && GET_MODE (op1) != VOIDmode
> && GET_MODE (op0) != GET_MODE (op1))
> {
> - if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE
> (op1)))
I wonder if this should not use GET_MODE_PRECISION - after all it is
the precision that determines whether we have to extend / truncate? Or
is precision a so much unused term on RTL that this would cause problems?
Thus,
> + if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE
> (op1))
if (GET_MODE_PRECISION (GET_MODE (op0)) <
GET_MODE_PRECISION (GET_MODE (op1)))
op1 = simplify_gen_unary (TRUNCATE, GET_MODE (op0),
op1, GET_MODE (op1));
?
Richard.
> + /* Don't try to sign-extend SImode to PSImode, for example. */
> + || (GET_MODE_BITSIZE (GET_MODE (op0)) == GET_MODE_BITSIZE
> (GET_MODE (op1))
> + && GET_MODE_CLASS (GET_MODE (op0)) == MODE_PARTIAL_INT
> + && GET_MODE_CLASS (GET_MODE (op1)) == MODE_INT))
> op1 = simplify_gen_unary (TRUNCATE, GET_MODE (op0), op1,
> GET_MODE (op1));
> else
> /* We always sign-extend, regardless of the signedness of
> the operand, because the operand is always unsigned
> here even if the original C expression is signed. */