Commit 4b980e20 by Richard Kenner

*** empty log message ***

From-SVN: r1318
parent ca3c6eae
...@@ -4327,10 +4327,32 @@ fold_rtx (x, insn) ...@@ -4327,10 +4327,32 @@ fold_rtx (x, insn)
|| (new = lookup_as_function (x, CONST_DOUBLE)) != 0) || (new = lookup_as_function (x, CONST_DOUBLE)) != 0)
return new; return new;
/* If this is a paradoxical SUBREG, we can't do anything with /* If this is a paradoxical SUBREG, we have no idea what value the
it because we have no idea what value the extra bits would have. */ extra bits would have. However, if the operand is equivalent
to a SUBREG whose operand is the same as our mode, and all the
modes are within a word, we can just use the inner operand
because these SUBREGs just say how to treat the register. */
if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
return x; {
enum machine_mode imode = GET_MODE (SUBREG_REG (x));
struct table_elt *elt;
if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD
&& GET_MODE_SIZE (imode) <= UNITS_PER_WORD
&& (elt = lookup (SUBREG_REG (x), HASH (SUBREG_REG (x), imode),
imode)) != 0)
{
for (elt = elt->first_same_value;
elt; elt = elt->next_same_value)
if (GET_CODE (elt->exp) == SUBREG
&& GET_MODE (SUBREG_REG (elt->exp)) == mode
&& exp_equiv_p (elt->exp, elt->exp, 1))
return copy_rtx (SUBREG_REG (elt->exp));
}
return x;
}
/* Fold SUBREG_REG. If it changed, see if we can simplify the SUBREG. /* Fold SUBREG_REG. If it changed, see if we can simplify the SUBREG.
We might be able to if the SUBREG is extracting a single word in an We might be able to if the SUBREG is extracting a single word in an
...@@ -4364,7 +4386,12 @@ fold_rtx (x, insn) ...@@ -4364,7 +4386,12 @@ fold_rtx (x, insn)
extra bits will be. But we can find an equivalence for this SUBREG extra bits will be. But we can find an equivalence for this SUBREG
by folding that operation is the narrow mode. This allows us to by folding that operation is the narrow mode. This allows us to
fold arithmetic in narrow modes when the machine only supports fold arithmetic in narrow modes when the machine only supports
word-sized arithmetic. */ word-sized arithmetic.
Also look for a case where we have a SUBREG whose operand is the
same as our result. If both modes are smaller than a word, we
are simply interpreting a register in different modes and we
can use the inner value. */
if (GET_CODE (folded_arg0) == REG if (GET_CODE (folded_arg0) == REG
&& GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (folded_arg0))) && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (folded_arg0)))
...@@ -4430,6 +4457,13 @@ fold_rtx (x, insn) ...@@ -4430,6 +4457,13 @@ fold_rtx (x, insn)
op0, op1); op0, op1);
} }
else if (GET_CODE (elt->exp) == SUBREG
&& GET_MODE (SUBREG_REG (elt->exp)) == mode
&& (GET_MODE_SIZE (GET_MODE (folded_arg0))
<= UNITS_PER_WORD)
&& exp_equiv_p (elt->exp, elt->exp, 1))
new = copy_rtx (SUBREG_REG (elt->exp));
if (new) if (new)
return new; return new;
} }
......
...@@ -2782,6 +2782,12 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep) ...@@ -2782,6 +2782,12 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
else else
op0 = subtarget; op0 = subtarget;
/* If we want to keep subexpressions around, don't reuse our
last target. */
if (preserve_subexpressions_p ())
subtarget = 0;
/* Now normalize to the proper value in COMPARE_MODE. Sometimes /* Now normalize to the proper value in COMPARE_MODE. Sometimes
we don't have to do anything. */ we don't have to do anything. */
if (normalizep == 0 || normalizep == STORE_FLAG_VALUE) if (normalizep == 0 || normalizep == STORE_FLAG_VALUE)
......
...@@ -121,9 +121,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -121,9 +121,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
/* List of labels that must never be deleted. */ /* List of labels that must never be deleted. */
extern rtx forced_labels; extern rtx forced_labels;
......
...@@ -36,8 +36,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -36,8 +36,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "obstack.h" #include "obstack.h"
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
extern struct obstack *function_maybepermanent_obstack; extern struct obstack *function_maybepermanent_obstack;
......
...@@ -193,8 +193,6 @@ extern struct obstack *rtl_obstack; ...@@ -193,8 +193,6 @@ extern struct obstack *rtl_obstack;
#define obstack_chunk_free free #define obstack_chunk_free free
extern char *oballoc (); extern char *oballoc ();
extern int xmalloc ();
extern void free ();
/* During the analysis of a loop, a chain of `struct movable's /* During the analysis of a loop, a chain of `struct movable's
is made to record all the movable insns found. is made to record all the movable insns found.
......
...@@ -246,9 +246,6 @@ char *reload_firstobj; ...@@ -246,9 +246,6 @@ char *reload_firstobj;
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
/* List of labels that must never be deleted. */ /* List of labels that must never be deleted. */
extern rtx forced_labels; extern rtx forced_labels;
......
...@@ -129,9 +129,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -129,9 +129,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
#ifndef ANNUL_IFTRUE_SLOTS #ifndef ANNUL_IFTRUE_SLOTS
#define eligible_for_annul_true(INSN, SLOTS, TRIAL) 0 #define eligible_for_annul_true(INSN, SLOTS, TRIAL) 0
#endif #endif
......
...@@ -26,8 +26,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -26,8 +26,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "obstack.h" #include "obstack.h"
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
/* Obstack used for allocating RTL objects. /* Obstack used for allocating RTL objects.
Between functions, this is the permanent_obstack. Between functions, this is the permanent_obstack.
......
...@@ -526,6 +526,8 @@ extern char *note_insn_name[]; ...@@ -526,6 +526,8 @@ extern char *note_insn_name[];
/* Generally useful functions. */ /* Generally useful functions. */
extern char *xmalloc ();
extern void free ();
extern rtx rtx_alloc (); extern rtx rtx_alloc ();
extern rtvec rtvec_alloc (); extern rtvec rtvec_alloc ();
extern rtx find_reg_note (); extern rtx find_reg_note ();
......
...@@ -54,9 +54,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -54,9 +54,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define obstack_chunk_free free #define obstack_chunk_free free
struct obstack stmt_obstack; struct obstack stmt_obstack;
extern int xmalloc ();
extern void free ();
/* Filename and line number of last line-number note, /* Filename and line number of last line-number note,
whether we actually emitted it or not. */ whether we actually emitted it or not. */
char *emit_filename; char *emit_filename;
......
...@@ -1161,11 +1161,11 @@ botch (s) ...@@ -1161,11 +1161,11 @@ botch (s)
/* Same as `malloc' but report error if no memory available. */ /* Same as `malloc' but report error if no memory available. */
int char *
xmalloc (size) xmalloc (size)
unsigned size; unsigned size;
{ {
register int value = (int) malloc (size); register char *value = (char *) malloc (size);
if (value == 0) if (value == 0)
fatal ("virtual memory exhausted"); fatal ("virtual memory exhausted");
return value; return value;
...@@ -1173,12 +1173,12 @@ xmalloc (size) ...@@ -1173,12 +1173,12 @@ xmalloc (size)
/* Same as `realloc' but report error if no memory available. */ /* Same as `realloc' but report error if no memory available. */
int char *
xrealloc (ptr, size) xrealloc (ptr, size)
char *ptr; char *ptr;
int size; int size;
{ {
int result = realloc (ptr, size); char *result = (char *) realloc (ptr, size);
if (!result) if (!result)
fatal ("virtual memory exhausted"); fatal ("virtual memory exhausted");
return result; return result;
......
...@@ -43,9 +43,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -43,9 +43,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free #define obstack_chunk_free free
extern int xmalloc ();
extern void free ();
/* Tree nodes of permanent duration are allocated in this obstack. /* Tree nodes of permanent duration are allocated in this obstack.
They are the identifier nodes, and everything outside of They are the identifier nodes, and everything outside of
the bodies and parameters of function definitions. */ the bodies and parameters of function definitions. */
......
...@@ -855,6 +855,8 @@ union tree_node ...@@ -855,6 +855,8 @@ union tree_node
extern char *oballoc (); extern char *oballoc ();
extern char *permalloc (); extern char *permalloc ();
extern char *savealloc (); extern char *savealloc ();
extern char *xmalloc ();
extern void free ();
/* Lowest level primitive for allocating a node. /* Lowest level primitive for allocating a node.
The TREE_CODE is the only argument. Contents are initialized The TREE_CODE is the only argument. Contents are initialized
......
...@@ -58,7 +58,6 @@ extern struct obstack *current_obstack; ...@@ -58,7 +58,6 @@ extern struct obstack *current_obstack;
extern struct obstack *saveable_obstack; extern struct obstack *saveable_obstack;
extern struct obstack permanent_obstack; extern struct obstack permanent_obstack;
#define obstack_chunk_alloc xmalloc #define obstack_chunk_alloc xmalloc
extern int xmalloc ();
/* Number for making the label on the next /* Number for making the label on the next
constant that is stored in memory. */ constant that is stored in memory. */
......
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