Commit c610adec by Richard Kenner

*** empty log message ***

From-SVN: r1219
parent 460286d7
...@@ -929,6 +929,20 @@ insert_regs (x, classp, modified) ...@@ -929,6 +929,20 @@ insert_regs (x, classp, modified)
return 1; return 1;
} }
} }
/* If X is a SUBREG, we will likely be inserting the inner register in the
table. If that register doesn't have an assigned quantity number at
this point but does later, the insertion that we will be doing now will
not be accessible because its hash code will have changed. So assign
a quantity number now. */
else if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == REG
&& ! REGNO_QTY_VALID_P (REGNO (SUBREG_REG (x))))
{
insert_regs (SUBREG_REG (x), 0, 0);
mention_regs (SUBREG_REG (x));
return 1;
}
else else
return mention_regs (x); return mention_regs (x);
} }
...@@ -2549,9 +2563,23 @@ find_comparison_args (code, parg1, parg2) ...@@ -2549,9 +2563,23 @@ find_comparison_args (code, parg1, parg2)
else if (GET_RTX_CLASS (GET_CODE (arg1)) == '<') else if (GET_RTX_CLASS (GET_CODE (arg1)) == '<')
{ {
if (code == NE || (code == LT && STORE_FLAG_VALUE == -1)) if (code == NE
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
&& code == LT && STORE_FLAG_VALUE == -1)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
&& FLOAT_STORE_FLAG_VALUE < 0)
#endif
)
x = arg1; x = arg1;
else if (code == EQ || (code == GE && STORE_FLAG_VALUE == -1)) else if (code == EQ
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT
&& code == GE && STORE_FLAG_VALUE == -1)
#ifdef FLOAT_STORE_FLAG_VALUE
|| (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_FLOAT
&& FLOAT_STORE_FLAG_VALUE < 0)
#endif
)
x = arg1, reverse_code = 1; x = arg1, reverse_code = 1;
} }
...@@ -2586,10 +2614,16 @@ find_comparison_args (code, parg1, parg2) ...@@ -2586,10 +2614,16 @@ find_comparison_args (code, parg1, parg2)
for STORE_FLAG_VALUE, also look at LT and GE operations. */ for STORE_FLAG_VALUE, also look at LT and GE operations. */
|| ((code == NE || ((code == NE
|| (code == LT || (code == LT
&& inner_mode != VOIDmode && GET_MODE_CLASS (inner_mode) == MODE_INT
&& GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT && GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT
&& (STORE_FLAG_VALUE && (STORE_FLAG_VALUE
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))) & (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == LT
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
&& FLOAT_STORE_FLAG_VALUE < 0)
#endif
)
&& GET_RTX_CLASS (GET_CODE (p->exp)) == '<')) && GET_RTX_CLASS (GET_CODE (p->exp)) == '<'))
{ {
x = p->exp; x = p->exp;
...@@ -2597,10 +2631,16 @@ find_comparison_args (code, parg1, parg2) ...@@ -2597,10 +2631,16 @@ find_comparison_args (code, parg1, parg2)
} }
else if ((code == EQ else if ((code == EQ
|| (code == GE || (code == GE
&& inner_mode != VOIDmode && GET_MODE_CLASS (inner_mode) == MODE_INT
&& GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT && GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT
&& (STORE_FLAG_VALUE && (STORE_FLAG_VALUE
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))) & (1 << (GET_MODE_BITSIZE (inner_mode) - 1))))
#ifdef FLOAT_STORE_FLAG_VALUE
|| (code == GE
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT
&& FLOAT_STORE_FLAG_VALUE < 0)
#endif
)
&& GET_RTX_CLASS (GET_CODE (p->exp)) == '<') && GET_RTX_CLASS (GET_CODE (p->exp)) == '<')
{ {
reverse_code = 1; reverse_code = 1;
...@@ -4175,11 +4215,9 @@ fold_rtx (x, insn) ...@@ -4175,11 +4215,9 @@ fold_rtx (x, insn)
break; break;
case SUBREG: case SUBREG:
/* If this is a single word of a multi-word value, see if we previously /* See if we previously assigned a constant value to this SUBREG. */
assigned a value to that word. */ if ((new = lookup_as_function (x, CONST_INT)) != 0
if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD || (new = lookup_as_function (x, CONST_DOUBLE)) != 0)
&& GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) > UNITS_PER_WORD
&& (new = lookup_as_function (x, CONST_INT)) != 0)
return new; return new;
/* If this is a paradoxical SUBREG, we can't do anything with /* If this is a paradoxical SUBREG, we can't do anything with
...@@ -4598,6 +4636,15 @@ fold_rtx (x, insn) ...@@ -4598,6 +4636,15 @@ fold_rtx (x, insn)
if (const_arg0 == 0 || const_arg1 == 0) if (const_arg0 == 0 || const_arg1 == 0)
{ {
struct table_elt *p0, *p1; struct table_elt *p0, *p1;
rtx true = const_true_rtx, false = const0_rtx;
#ifdef FLOAT_STORE_FLAG_VALUE
if (GET_MODE_CLASS (mode))
{
true = immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, mode);
false = CONST0_RTX (mode);
}
#endif
code = find_comparison_args (code, &folded_arg0, &folded_arg1); code = find_comparison_args (code, &folded_arg0, &folded_arg1);
const_arg0 = equiv_constant (folded_arg0); const_arg0 = equiv_constant (folded_arg0);
...@@ -4636,9 +4683,9 @@ fold_rtx (x, insn) ...@@ -4636,9 +4683,9 @@ fold_rtx (x, insn)
|| GET_CODE (folded_arg0) == CONST)) || GET_CODE (folded_arg0) == CONST))
{ {
if (code == EQ) if (code == EQ)
return const0_rtx; return false;
else if (code == NE) else if (code == NE)
return const_true_rtx; return true;
} }
/* See if the two operands are the same. We don't do this /* See if the two operands are the same. We don't do this
...@@ -4661,7 +4708,7 @@ fold_rtx (x, insn) ...@@ -4661,7 +4708,7 @@ fold_rtx (x, insn)
&& p0->first_same_value == p1->first_same_value))) && p0->first_same_value == p1->first_same_value)))
return ((code == EQ || code == LE || code == GE return ((code == EQ || code == LE || code == GE
|| code == LEU || code == GEU) || code == LEU || code == GEU)
? const_true_rtx : const0_rtx); ? true : false);
/* If FOLDED_ARG0 is a register, see if the comparison we are /* If FOLDED_ARG0 is a register, see if the comparison we are
doing now is either the same as we did before or the reverse doing now is either the same as we did before or the reverse
...@@ -4684,7 +4731,7 @@ fold_rtx (x, insn) ...@@ -4684,7 +4731,7 @@ fold_rtx (x, insn)
== qty_comparison_qty[qty])))) == qty_comparison_qty[qty]))))
return (comparison_dominates_p (qty_comparison_code[qty], return (comparison_dominates_p (qty_comparison_code[qty],
code) code)
? const_true_rtx : const0_rtx); ? true : false);
} }
} }
} }
...@@ -4706,20 +4753,29 @@ fold_rtx (x, insn) ...@@ -4706,20 +4753,29 @@ fold_rtx (x, insn)
int sign_bitnum = GET_MODE_BITSIZE (mode_arg0) - 1; int sign_bitnum = GET_MODE_BITSIZE (mode_arg0) - 1;
int has_sign = (HOST_BITS_PER_INT >= sign_bitnum int has_sign = (HOST_BITS_PER_INT >= sign_bitnum
&& (INTVAL (inner_const) & (1 << sign_bitnum))); && (INTVAL (inner_const) & (1 << sign_bitnum)));
rtx true = const_true_rtx, false = const0_rtx;
#ifdef FLOAT_STORE_FLAG_VALUE
if (GET_MODE_CLASS (mode))
{
true = immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, mode);
false = CONST0_RTX (mode);
}
#endif
switch (code) switch (code)
{ {
case EQ: case EQ:
return const0_rtx; return false;
case NE: case NE:
return const_true_rtx; return true;
case LT: case LE: case LT: case LE:
if (has_sign) if (has_sign)
return const_true_rtx; return true;
break; break;
case GT: case GE: case GT: case GE:
if (has_sign) if (has_sign)
return const0_rtx; return false;
break; break;
} }
} }
...@@ -4728,6 +4784,11 @@ fold_rtx (x, insn) ...@@ -4728,6 +4784,11 @@ fold_rtx (x, insn)
new = simplify_relational_operation (code, mode_arg0, new = simplify_relational_operation (code, mode_arg0,
const_arg0 ? const_arg0 : folded_arg0, const_arg0 ? const_arg0 : folded_arg0,
const_arg1 ? const_arg1 : folded_arg1); const_arg1 ? const_arg1 : folded_arg1);
#ifdef FLOAT_STORE_FLAG_VALUE
if (new != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
new = ((new == const0_rtx) ? CONST0_RTX (mode)
: immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, mode));
#endif
break; break;
case '2': case '2':
...@@ -6323,7 +6384,7 @@ cse_insn (insn, in_libcall_block) ...@@ -6323,7 +6384,7 @@ cse_insn (insn, in_libcall_block)
if (GET_CODE (dest) == STRICT_LOW_PART) if (GET_CODE (dest) == STRICT_LOW_PART)
dest = SUBREG_REG (XEXP (dest, 0)); dest = SUBREG_REG (XEXP (dest, 0));
if (GET_CODE (dest) == REG) if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG)
/* Registers must also be inserted into chains for quantities. */ /* Registers must also be inserted into chains for quantities. */
if (insert_regs (dest, sets[i].src_elt, 1)) if (insert_regs (dest, sets[i].src_elt, 1))
/* If `insert_regs' changes something, the hash code must be /* If `insert_regs' changes something, the hash code must be
......
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