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~