* config/bfin-parse.y (binary): Do some more constant folding for
authorBernd Schmidt <bernds@codesourcery.com>
Fri, 15 Sep 2006 17:02:35 +0000 (17:02 +0000)
committerBernd Schmidt <bernds@codesourcery.com>
Fri, 15 Sep 2006 17:02:35 +0000 (17:02 +0000)
additions.

gas/ChangeLog
gas/config/bfin-parse.y

index b6c256286ff3f7bb2a4f6298392a449d2b43817d..c589c091d7421c70242deac1fc703d8a4de13e49 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-15  Bernd Schmidt  <bernd.schmidt@analog.com>
+
+       * config/bfin-parse.y (binary): Do some more constant folding for
+       additions.
+
 2006-09-13  Jan Beulich  <jbeulich@novell.com>
 
        * input-file.c (input_file_give_next_buffer): Demote as_bad to
index 609c282d497020393a96d6077d70b9f602fe0eef..f74074e55a1b4c0279137a5ef40e2ba66af2c289 100644 (file)
@@ -4270,6 +4270,8 @@ value_match (Expr_Node *expr, int sz, int sign, int mul, int issigned)
 static Expr_Node *
 binary (Expr_Op_Type op, Expr_Node *x, Expr_Node *y)
 {
+  Expr_Node_Value val;
+
   if (x->type == Expr_Node_Constant && y->type == Expr_Node_Constant)
     {
       switch (op)
@@ -4319,13 +4321,26 @@ binary (Expr_Op_Type op, Expr_Node *x, Expr_Node *y)
        }
       return x;
     }
-  else
+  /* Canonicalize order to EXPR OP CONSTANT.  */
+  if (x->type == Expr_Node_Constant)
+    {
+      Expr_Node *t = x;
+      x = y;
+      y = t;
+    }
+  if (y->type == Expr_Node_Constant && x->type == Expr_Node_Binop
+      && x->Right_Child->type == Expr_Node_Constant)
     {
-    /* Create a new expression structure.  */
-    Expr_Node_Value val;
-    val.op_value = op;
-    return Expr_Node_Create (Expr_Node_Binop, val, x, y);
-  }
+      if (op == x->value.op_value && x->value.op_value == Expr_Op_Type_Add)
+       {
+         x->Right_Child->value.i_value += y->value.i_value;
+         return x;
+       }
+    }
+
+  /* Create a new expression structure.  */
+  val.op_value = op;
+  return Expr_Node_Create (Expr_Node_Binop, val, x, y);
 }
 
 static Expr_Node *