]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
Merge branch 'cooking' into ast_iterator graphitemaster/ast_iterator
authorDale Weiler <killfieldengine@gmail.com>
Sun, 1 Dec 2013 14:57:05 +0000 (09:57 -0500)
committerDale Weiler <killfieldengine@gmail.com>
Sun, 1 Dec 2013 14:57:05 +0000 (09:57 -0500)
1  2 
ast.c
ast.h
parser.c

diff --cc ast.c
index 7b7737bda126c335ac31964c9b80b4a31945380d,238d00a8e9455ec7e3770f8a2b1426887cff1287..f7a4fb3c59dd8276213bfdc7127eba39940f10d8
--- 1/ast.c
--- 2/ast.c
+++ b/ast.c
@@@ -467,9 -438,24 +467,24 @@@ bool ast_value_set_name(ast_value *self
  ast_binary* ast_binary_new(lex_ctx_t ctx, int op,
                             ast_expression* left, ast_expression* right)
  {
 -    ast_instantiate(ast_binary, ctx, ast_binary_delete);
 +    ast_instantiate(ast_binary, ctx, ast_binary_delete, ast_binary_next_child);
      ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_binary_codegen);
  
+     if (ast_istype(right, ast_unary) && OPTS_OPTIMIZATION(OPTIM_PEEPHOLE)) {
+         ast_expression *normal = ((ast_unary*)right)->operand;
+         /* make a-(-b) => a + b */
+         if (op == INSTR_SUB_F) {
+             op = INSTR_ADD_F;
+             right = normal;
+             ++opts_optimizationcount[OPTIM_PEEPHOLE];
+         } else if (op == INSTR_SUB_V) {
+             op = INSTR_ADD_V;
+             right = normal;
+             ++opts_optimizationcount[OPTIM_PEEPHOLE];
+         }
+     }
      self->op = op;
      self->left = left;
      self->right = right;
diff --cc ast.h
Simple merge
diff --cc parser.c
Simple merge