On 08/04/11 08:36, Carrot Wei wrote:
Hi

This patch moves the length computation of push_multi into a C
function to avoid the usage of GNU extension.

Please put the comment regarding the calculation of the length attribute along with the pattern in thumb2.md as well.


Tested on qemu without regression. OK to install?

Ok with that change.

Thanks for fixing this up.

cheers
Ramana

thanks
Carrot

ChangeLog:
2011-04-08  Wei Guozhi<car...@google.com>

         PR target/47855
         * config/arm/arm-protos.h (arm_attr_length_push_multi): New prototype.
         * config/arm/arm.c (arm_attr_length_push_multi): New function.
         * config/arm/arm.md (*push_multi): Change the length computation to
         call a C function.


Index: arm.c
===================================================================
--- arm.c       (revision 172158)
+++ arm.c       (working copy)
@@ -23696,4 +23696,30 @@ arm_preferred_rename_class (reg_class_t
      return NO_REGS;
  }

+/* Compute the atrribute "length" of insn "*push_multi".
+   So this function MUST be kept in sync with that insn pattern.  */
+int
+arm_attr_length_push_multi(rtx parallel_op, rtx first_op)
+{
+  int i, regno, hi_reg;
+  int num_saves = XVECLEN (parallel_op, 0);
+
+  /* ARM mode.  */
+  if (TARGET_ARM)
+    return 4;
+
+  /* Thumb2 mode.  */
+  regno = REGNO (first_op);
+  hi_reg = (REGNO_REG_CLASS (regno) == HI_REGS)&&  (regno != LR_REGNUM);
+  for (i = 1; i<  num_saves&&  !hi_reg; i++)
+    {
+      regno = REGNO (XEXP (XVECEXP (parallel_op, 0, i), 0));
+      hi_reg |= (REGNO_REG_CLASS (regno) == HI_REGS)&&  (regno != LR_REGNUM);
+    }
+
+  if (!hi_reg)
+    return 2;
+  return 4;
+}
+
  #include "gt-arm.h"
Index: arm-protos.h
===================================================================
--- arm-protos.h        (revision 172158)
+++ arm-protos.h        (working copy)
@@ -152,6 +152,7 @@ extern void arm_expand_sync (enum machin
  extern const char *arm_output_memory_barrier (rtx *);
  extern const char *arm_output_sync_insn (rtx, rtx *);
  extern unsigned int arm_sync_loop_insns (rtx , rtx *);
+extern int arm_attr_length_push_multi(rtx, rtx);

  #if defined TREE_CODE
  extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
Index: arm.md
===================================================================
--- arm.md      (revision 172158)
+++ arm.md      (working copy)
@@ -10290,27 +10290,7 @@
    }"
    [(set_attr "type" "store4")
     (set (attr "length")
-       (if_then_else
-          (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0))
-               (ne (symbol_ref "{
-                   /* Check if there are any high register (except lr)
-                      references in the list. KEEP the following iteration
-                      in sync with the template above.  */
-                   int i, regno, hi_reg;
-                   int num_saves = XVECLEN (operands[2], 0);
-                   regno = REGNO (operands[1]);
-                   hi_reg = (REGNO_REG_CLASS (regno) == HI_REGS)
-                       &&  (regno != LR_REGNUM);
-                   for (i = 1; i<  num_saves&&  !hi_reg; i++)
-                     {
-                       regno = REGNO (XEXP (XVECEXP (operands[2], 0, i), 0));
-                       hi_reg |= (REGNO_REG_CLASS (regno) == HI_REGS)
-                               &&  (regno != LR_REGNUM);
-                     }
-                   !hi_reg;    }")
-                 (const_int 0)))
-          (const_int 2)
-          (const_int 4)))]
+       (symbol_ref "arm_attr_length_push_multi (operands[2], operands[1])"))]
  )

  (define_insn "stack_tie"

On Thu, Apr 7, 2011 at 7:30 PM, Ramana Radhakrishnan
<ramana.radhakrish...@linaro.org>  wrote:
On 07/04/11 12:08, Carrot Wei wrote:

On Thu, Apr 7, 2011 at 5:31 PM, Richard Sandiford
<richard.sandif...@linaro.org>    wrote:

Hi Carrot,

Sorry if this has already been reported, but the patch breaks bootstrap
of arm-linux-gnueabi (or cross builds with --enable-werror).  The problem
is that this...

uses a statement expression -- i.e. ({ code; result; }) -- which is
a GNU extension.

I suppose a simple fix would be to put the code into an arm.c function.


Thank you for the report, I will add this fix to the second part of the
patch.

It would be worth unbreaking bootstrap as a separate patch and not
conflating it with a different set of improvements.

Ramana


Carrot



Reply via email to