OSDN Git Service

PR middle-end/6600
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 May 2002 22:38:00 +0000 (22:38 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 May 2002 22:38:00 +0000 (22:38 +0000)
* 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
gcc/expr.c

index 3bd9d20..abad0ac 100644 (file)
@@ -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.
index bc0b225..1999e16 100644 (file)
@@ -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)
 }
 \f
 
+/* 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;