On 07/01/2011 10:29 AM, Bernd Schmidt wrote:
>       * cse.c (find_comparison_args): Use val_mode_signbit_set_p.
>       * simplify-rtx.c (mode_signbit_p): Use GET_MODE_PRECISION.
>       (val_mode_signbit_p, val_mode_signbit_set_p): New functions.
>       (simplify_const_unary_operation, simplify_binary_operation_1,
>       simplify_const_binary_operation,
>       simplify_const_relational_operation): Use them.  Use
>       GET_MODE_MASK for masking and sign-extensions.
>       * combine.c (set_nonzero_bits_and_sign_copies, simplify_set,
>       combine_simplify_rtx, force_to_mode, reg_nonzero_bits_for_combine,
>       simplify_shift_const_1, simplify_comparison): Likewise.
>       * expr.c (convert_modes): Likewise.
>       * rtlanal.c (nonzero_bits1, canonicalize_condition): Likewise.
>       * expmed.c (emit_cstore, emit_store_flag_1, emit_store_flag):
>       Likewise.
>       * rtl.h (val_mode_signbit_p, val_mode_signbit_set_p): Declare.

Ok, but,

>         /* We must sign or zero-extend in this case.  Start by
>            zero-extending, then sign extend if we need to.  */
> -       val &= ((HOST_WIDE_INT) 1 << width) - 1;
> +       val &= GET_MODE_MASK (oldmode);
>         if (! unsignedp
> -           && (val & ((HOST_WIDE_INT) 1 << (width - 1))))
> -         val |= (HOST_WIDE_INT) (-1) << width;
> +           && val_signbit_known_set_p (oldmode, val))
> +         val |= ~GET_MODE_MASK (oldmode);
>  
>         return gen_int_mode (val, mode);

Shouldn't that sign-extension already be done by gen_int_mode?

There are at least 4 more copies of this idiom in your patch.
As a follow-up could you pull that out into a new function?

Perhaps signextend_int_mode, akin to gen_int_mode?


r~

Reply via email to