Hi

As described in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47855, there are
many insn patterns don't compute attribute length correctly. This patch is the
first and simplest part of the fixing.

This patch has been tested on qemu.

thanks
Carrot


ChangeLog:
2011-03-26  Wei Guozhi  <car...@google.com>

        PR target/47855
        * config/arm/arm.md (arm_cmpsi_insn): Compute attr "length".
        (arm_cond_branch): Likewise.
        (arm_cond_branch_reversed): Likewise.
        (arm_jump): Likewise.
        (push_multi): Likewise.


Index: arm.md
===================================================================
--- arm.md      (revision 171337)
+++ arm.md      (working copy)
@@ -7115,7 +7115,18 @@
   "@
    cmp%?\\t%0, %1
    cmn%?\\t%0, #%n1"
-  [(set_attr "conds" "set")]
+  [(set_attr "conds" "set")
+   (set (attr "length")
+     (if_then_else
+       (and (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0))
+                (eq (symbol_ref "which_alternative") (const_int 0)))
+           (ior (ne (symbol_ref "REG_P (operands[1])") (const_int 0))
+               (and (ne (symbol_ref "CONST_INT_P (operands[1])") (const_int 0))
+                    (and (ge (symbol_ref "INTVAL (operands[1])") (const_int 0))
+                         (le (symbol_ref "INTVAL (operands[1])")
+                             (const_int 255))))))
+       (const_int 2)
+       (const_int 4)))]
 )

 (define_insn "*cmpsi_shiftsi"
@@ -7286,7 +7297,14 @@
   return \"b%d1\\t%l0\";
   "
   [(set_attr "conds" "use")
-   (set_attr "type" "branch")]
+   (set_attr "type" "branch")
+   (set (attr "length")
+       (if_then_else
+          (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0))
+               (and (ge (minus (match_dup 0) (pc)) (const_int -250))
+                    (le (minus (match_dup 0) (pc)) (const_int 256))))
+          (const_int 2)
+          (const_int 4)))]
 )

 (define_insn "*arm_cond_branch_reversed"
@@ -7305,7 +7323,14 @@
   return \"b%D1\\t%l0\";
   "
   [(set_attr "conds" "use")
-   (set_attr "type" "branch")]
+   (set_attr "type" "branch")
+   (set (attr "length")
+       (if_then_else
+          (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0))
+               (and (ge (minus (match_dup 0) (pc)) (const_int -250))
+                    (le (minus (match_dup 0) (pc)) (const_int 256))))
+          (const_int 2)
+          (const_int 4)))]
 )



@@ -7757,7 +7782,14 @@
     return \"b%?\\t%l0\";
   }
   "
-  [(set_attr "predicable" "yes")]
+  [(set_attr "predicable" "yes")
+   (set (attr "length")
+       (if_then_else
+          (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0))
+               (and (ge (minus (match_dup 0) (pc)) (const_int -2044))
+                    (le (minus (match_dup 0) (pc)) (const_int 2048))))
+          (const_int 2)
+          (const_int 4)))]
 )

 (define_insn "*thumb_jump"
@@ -10256,7 +10288,26 @@

     return \"\";
   }"
-  [(set_attr "type" "store4")]
+  [(set_attr "type" "store4")
+   (set (attr "length")
+       (if_then_else
+          (and (ne (symbol_ref "TARGET_THUMB2") (const_int 0))
+               (ne (symbol_ref "{
+                   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; 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)))]
 )

 (define_insn "stack_tie"

Reply via email to