}
}
+#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
+/* If MODE has a precision lower than PREC and SRC is a non-negative constant
+ that would appear negative in MODE, sign-extend SRC for use in nonzero_bits
+ because some machines (maybe most) will actually do the sign-extension and
+ this is the conservative approach.
+
+ ??? For 2.5, try to tighten up the MD files in this regard instead of this
+ kludge. */
+
+static rtx
+sign_extend_short_imm (rtx src, machine_mode mode, unsigned int prec)
+{
+ if (GET_MODE_PRECISION (mode) < prec
+ && CONST_INT_P (src)
+ && INTVAL (src) > 0
+ && val_signbit_known_set_p (mode, INTVAL (src)))
+ src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (mode));
+
+ return src;
+}
+#endif
+
/* Called via note_stores. If X is a pseudo that is narrower than
HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
rtx src = SET_SRC (set);
#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
- /* If X is narrower than a word and SRC is a non-negative
- constant that would appear negative in the mode of X,
- sign-extend it for use in reg_stat[].nonzero_bits because some
- machines (maybe most) will actually do the sign-extension
- and this is the conservative approach.
-
- ??? For 2.5, try to tighten up the MD files in this regard
- instead of this kludge. */
-
- if (GET_MODE_PRECISION (GET_MODE (x)) < BITS_PER_WORD
- && CONST_INT_P (src)
- && INTVAL (src) > 0
- && val_signbit_known_set_p (GET_MODE (x), INTVAL (src)))
- src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (GET_MODE (x)));
+ src = sign_extend_short_imm (src, GET_MODE (x), BITS_PER_WORD);
#endif
/* Don't call nonzero_bits if it cannot change anything. */
if (tem)
{
#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
- /* If X is narrower than MODE and TEM is a non-negative
- constant that would appear negative in the mode of X,
- sign-extend it for use in reg_nonzero_bits because some
- machines (maybe most) will actually do the sign-extension
- and this is the conservative approach.
-
- ??? For 2.5, try to tighten up the MD files in this regard
- instead of this kludge. */
-
- if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode)
- && CONST_INT_P (tem)
- && INTVAL (tem) > 0
- && val_signbit_known_set_p (GET_MODE (x), INTVAL (tem)))
- tem = GEN_INT (INTVAL (tem) | ~GET_MODE_MASK (GET_MODE (x)));
+ tem = sign_extend_short_imm (tem, GET_MODE (x),
+ GET_MODE_PRECISION (mode));
#endif
return tem;
}