X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ast.c;h=238d00a8e9455ec7e3770f8a2b1426887cff1287;hp=6bc6af43b566358187ba05d0cf2a00abab16ecde;hb=b20e2a9d34ce6f062b502631507286e2227e97eb;hpb=91c894d4da65651f2ba7fb664835847ac34543d8 diff --git a/ast.c b/ast.c index 6bc6af4..238d00a 100644 --- a/ast.c +++ b/ast.c @@ -441,6 +441,21 @@ ast_binary* ast_binary_new(lex_ctx_t ctx, int op, ast_instantiate(ast_binary, ctx, ast_binary_delete); 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; @@ -1177,7 +1192,6 @@ ast_function* ast_function_new(lex_ctx_t ctx, const char *name, ast_value *vtype if (!vtype) { compile_error(ast_ctx(self), "internal error: ast_function_new condition 0"); goto cleanup; - } else if (vtype->hasvalue || vtype->expression.vtype != TYPE_FUNCTION) { } else if (vtype->hasvalue || vtype->expression.vtype != TYPE_FUNCTION) { compile_error(ast_ctx(self), "internal error: ast_function_new condition %i %i type=%i (probably 2 bodies?)", (int)!vtype, @@ -1207,8 +1221,8 @@ ast_function* ast_function_new(lex_ctx_t ctx, const char *name, ast_value *vtype self->fixedparams = NULL; self->return_value = NULL; - self->accumulate = NULL; - self->accumulation = 0; + self->static_names = NULL; + self->static_count = 0; return self; @@ -1231,6 +1245,9 @@ void ast_function_delete(ast_function *self) */ ast_unref(self->vtype); } + for (i = 0; i < vec_size(self->static_names); ++i) + mem_d(self->static_names[i]); + vec_free(self->static_names); for (i = 0; i < vec_size(self->blocks); ++i) ast_delete(self->blocks[i]); vec_free(self->blocks); @@ -1867,16 +1884,6 @@ bool ast_function_codegen(ast_function *self, ir_builder *ir) } } - /* generate the call for any accumulation */ - if (self->accumulate) { - ast_call *call = ast_call_new(ast_ctx(self), (ast_expression*)self->accumulate->vtype); - for (i = 0; i < vec_size(ec->params); i++) - vec_push(call->params, (ast_expression*)ec->params[i]); - vec_push(vec_last(self->blocks)->exprs, (ast_expression*)call); - - self->ir_func->flags |= IR_FLAG_ACCUMULATE; - } - for (i = 0; i < vec_size(self->blocks); ++i) { cgen = self->blocks[i]->expression.codegen; if (!(*cgen)((ast_expression*)self->blocks[i], self, false, &dummy))