From d1f6ae0c9050665ae2bf936cc6fd0dcc076ee0d9 Mon Sep 17 00:00:00 2001 From: sayle Date: Tue, 21 May 2002 22:38:00 +0000 Subject: 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 --- gcc/ChangeLog | 8 ++++++++ gcc/expr.c | 17 +++++++++++++++-- 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 + + 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 * 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; -- cgit v1.2.1