From c4ae04ceb1e1daf63f1aed9c8b244875f167878d Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Fri, 15 Sep 2006 17:02:35 +0000 Subject: [PATCH] * config/bfin-parse.y (binary): Do some more constant folding for additions. --- gas/ChangeLog | 5 +++++ gas/config/bfin-parse.y | 27 +++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index b6c2562..c589c09 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2006-09-15 Bernd Schmidt + + * config/bfin-parse.y (binary): Do some more constant folding for + additions. + 2006-09-13 Jan Beulich * input-file.c (input_file_give_next_buffer): Demote as_bad to diff --git a/gas/config/bfin-parse.y b/gas/config/bfin-parse.y index 609c282..f74074e 100644 --- a/gas/config/bfin-parse.y +++ b/gas/config/bfin-parse.y @@ -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 * -- 2.7.4