summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-21 22:38:00 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-21 22:38:00 +0000
commitd1f6ae0c9050665ae2bf936cc6fd0dcc076ee0d9 (patch)
treee6e972a811f5ef5fa3c100a265feb19931714020
parentc249c29956eec9f7e87b308d6a130a81d8da2479 (diff)
downloadgcc-d1f6ae0c9050665ae2bf936cc6fd0dcc076ee0d9.tar.gz
PR middle-end/6600
* expr.c (STORE_MAX_PIECES): New macro to avoid immediate constants larger than INTEGER_CST. (store_by_pieces_1): Use it here... (can_store_by_pieces): ... and here to limit the largest mode used. Add a comment to document this function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53706 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/expr.c17
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3bd9d20b481..abad0ac46c5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2002-05-21 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/6600
+ * expr.c (STORE_MAX_PIECES): New macro to avoid immediate constants
+ larger than INTEGER_CST. (store_by_pieces_1): Use it here...
+ (can_store_by_pieces): ... and here to limit the largest mode used.
+ Add a comment to document this function.
+
2002-05-21 Richard Henderson <rth@redhat.com>
* flow.c (life_analysis): Fix test for deleted label.
diff --git a/gcc/expr.c b/gcc/expr.c
index bc0b225704b..1999e162ce9 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -1400,6 +1400,13 @@ convert_modes (mode, oldmode, x, unsignedp)
#define MOVE_MAX_PIECES MOVE_MAX
#endif
+/* STORE_MAX_PIECES is the number of bytes at a time that we can
+ store efficiently. Due to internal GCC limitations, this is
+ MOVE_MAX_PIECES limited by the number of bytes GCC can represent
+ for an immediate constant. */
+
+#define STORE_MAX_PIECES MIN (MOVE_MAX_PIECES, 2 * sizeof (HOST_WIDE_INT))
+
/* Generate several move instructions to copy LEN bytes from block FROM to
block TO. (These are MEM rtx's with BLKmode). The caller must pass FROM
and TO through protect_from_queue before calling.
@@ -2331,6 +2338,12 @@ use_group_regs (call_fusage, regs)
}
+/* Determine whether the LEN bytes generated by CONSTFUN can be
+ stored to memory using several move instructions. CONSTFUNDATA is
+ a pointer which will be passed as argument in every CONSTFUN call.
+ ALIGN is maximum alignment we can assume. Return nonzero if a
+ call to store_by_pieces should succeed. */
+
int
can_store_by_pieces (len, constfun, constfundata, align)
unsigned HOST_WIDE_INT len;
@@ -2361,7 +2374,7 @@ can_store_by_pieces (len, constfun, constfundata, align)
{
l = len;
mode = VOIDmode;
- max_size = MOVE_MAX_PIECES + 1;
+ max_size = STORE_MAX_PIECES + 1;
while (max_size > 1)
{
for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
@@ -2472,7 +2485,7 @@ store_by_pieces_1 (data, align)
unsigned int align;
{
rtx to_addr = XEXP (data->to, 0);
- unsigned HOST_WIDE_INT max_size = MOVE_MAX_PIECES + 1;
+ unsigned HOST_WIDE_INT max_size = STORE_MAX_PIECES + 1;
enum machine_mode mode = VOIDmode, tmode;
enum insn_code icode;