Commit 3e3ea975 by Richard Stallman

(make_extraction): When making a low part subreg of a reg,

use inner_mode, not is_mode.

(num_sign_bit_copies): Inhibit x-1 special case
when x is a paradoxical subreg.

From-SVN: r2802
parent 711f122a
...@@ -4632,8 +4632,8 @@ make_extraction (mode, inner, pos, pos_rtx, len, ...@@ -4632,8 +4632,8 @@ make_extraction (mode, inner, pos, pos_rtx, len,
a SUBREG and it would sometimes return a new hard register. */ a SUBREG and it would sometimes return a new hard register. */
new = gen_rtx (SUBREG, tmode, inner, new = gen_rtx (SUBREG, tmode, inner,
(WORDS_BIG_ENDIAN (WORDS_BIG_ENDIAN
&& GET_MODE_SIZE (is_mode) > UNITS_PER_WORD && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD
? ((GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (tmode)) ? ((GET_MODE_SIZE (inner_mode) - GET_MODE_SIZE (tmode))
/ UNITS_PER_WORD) / UNITS_PER_WORD)
: 0)); : 0));
else else
...@@ -6345,7 +6345,12 @@ num_sign_bit_copies (x, mode) ...@@ -6345,7 +6345,12 @@ num_sign_bit_copies (x, mode)
be such a carry. Furthermore, if the positive number is known to be such a carry. Furthermore, if the positive number is known to
be 0 or 1, we know the result is either -1 or 0. */ be 0 or 1, we know the result is either -1 or 0. */
if (code == PLUS && XEXP (x, 1) == constm1_rtx) if (code == PLUS && XEXP (x, 1) == constm1_rtx
/* Don't do this if XEXP (x, 0) is a paradoxical subreg
because in principle we don't know what the high bits are. */
&& !(GET_CODE (XEXP (x, 0)) == SUBREG
&& (GET_MODE_SIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
< GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))))
{ {
sig = significant_bits (XEXP (x, 0), mode); sig = significant_bits (XEXP (x, 0), mode);
if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & sig) == 0) if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & sig) == 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment