Commit f82da7d2 by Jim Wilson

(simplify_rtx, case SUBREG): For SUBREG of a constant,

use <= instead of < when comparing mode sizes.
(force_to_mode, case NOT): Use full mask inside	the NOT operation.

From-SVN: r10814
parent e24b8776
...@@ -3307,7 +3307,7 @@ simplify_rtx (x, op0_mode, last, in_dest) ...@@ -3307,7 +3307,7 @@ simplify_rtx (x, op0_mode, last, in_dest)
always valid. On a big-endian machine, it's valid always valid. On a big-endian machine, it's valid
only if the constant's mode fits in one word. */ only if the constant's mode fits in one word. */
if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x) if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x)
&& GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode) && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (op0_mode)
&& (! WORDS_BIG_ENDIAN && (! WORDS_BIG_ENDIAN
|| GET_MODE_BITSIZE (op0_mode) <= BITS_PER_WORD)) || GET_MODE_BITSIZE (op0_mode) <= BITS_PER_WORD))
return gen_lowpart_for_combine (mode, SUBREG_REG (x)); return gen_lowpart_for_combine (mode, SUBREG_REG (x));
...@@ -6171,6 +6171,10 @@ force_to_mode (x, mode, mask, reg, just_select) ...@@ -6171,6 +6171,10 @@ force_to_mode (x, mode, mask, reg, just_select)
return force_to_mode (x, mode, mask, reg, next_select); return force_to_mode (x, mode, mask, reg, next_select);
} }
/* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
use the full mask inside the NOT. */
mask = fuller_mask;
unop: unop:
op0 = gen_lowpart_for_combine (op_mode, op0 = gen_lowpart_for_combine (op_mode,
force_to_mode (XEXP (x, 0), mode, mask, force_to_mode (XEXP (x, 0), mode, mask,
......
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