From: fennecdjay Date: Mon, 11 Mar 2019 09:15:21 +0000 (+0100) Subject: :art: No arg function can't be pure X-Git-Tag: nightly~2753^2~1 X-Git-Url: http://10.11.0.4:5575/?a=commitdiff_plain;h=b90b254e6d34677bd538bb036420f9199f1d1def;p=gwion.git :art: No arg function can't be pure --- diff --git a/include/instr.h b/include/instr.h index 6a39d7ac..ec5baff3 100644 --- a/include/instr.h +++ b/include/instr.h @@ -77,5 +77,9 @@ struct dottmpl_ { }; ANN void free_dottmpl(struct dottmpl_*); ANN m_bool traverse_dot_tmpl(const Emitter emit, const struct dottmpl_ *dt); +// optimizations +#ifdef OPTIMIZE +INSTR(PutArgsInMem); +#endif #include "opcode.h" #endif diff --git a/src/emit/emit.c b/src/emit/emit.c index 0a66b706..420e2b90 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -1022,15 +1022,11 @@ ANN static m_bool optimize_taill_call(const Emitter emit, const Exp_Call* e) { Exp arg = e->args; if(arg) CHECK_BB(emit_exp(emit, e->args, 0)) - const Instr pop = emit_add_instr(emit, RegPop); + const Instr instr = emit_add_instr(emit, PutArgsInMem); while(arg) { - pop->m_val += arg->type->size; + instr->m_val += arg->type->size; arg = arg->next; } - for(m_uint i = 0; i < pop->m_val; i += SZ_INT) { - const Instr cpy = emit_add_instr(emit, Reg2Mem); - cpy->m_val = cpy->m_val2 = i; - } emit_add_instr(emit, Goto); return GW_OK; } diff --git a/src/lib/instr.c b/src/lib/instr.c index a1f0a8c0..81cf6e99 100644 --- a/src/lib/instr.c +++ b/src/lib/instr.c @@ -68,6 +68,14 @@ INSTR(AutoLoopEnd) { GWDEBUG_EXE } } +#ifdef OPTIMIZE +INSTR(PutArgsInMem) { GWDEBUG_EXE + POP_REG(shred, instr->m_val) + for(m_uint i = 0; i < instr->m_val; i += SZ_INT) + *(m_uint*)(shred->mem + i) = *(m_uint*)(shred->reg + i); +} +#endif + INSTR(PopArrayClass) { GWDEBUG_EXE POP_REG(shred, SZ_INT); const M_Object obj = *(M_Object*)REG(-SZ_INT); diff --git a/src/parse/check.c b/src/parse/check.c index f3e51c47..342aee79 100644 --- a/src/parse/check.c +++ b/src/parse/check.c @@ -1129,17 +1129,21 @@ ANN m_bool check_func_def(const Env env, const Func_Def f) { GWDEBUG_EXE env->func = func; ++env->scope->depth; nspc_push_value(env->curr); - if((f->arg_list && (ret = check_func_args(env, f->arg_list)) > 0) || !f->arg_list) { - const Value variadic = GET_FLAG(f, variadic) ? set_variadic(env) : NULL; - if(!GET_FLAG(f, builtin) && check_stmt_code(env, &f->d.code->d.stmt_code) < 0) - ret = err_msg(f->td ? f->td->xid->pos : 0, "...in function '%s'", - s_name(f->name)); - if(variadic) - REM_REF(variadic) - if(GET_FLAG(f, builtin)) - func->code->stack_depth = f->stack_depth; - else if(GET_FLAG(f, op)) - operator_func(func); + if(!f->arg_list) + UNSET_FLAG(f->func, pure); + else + ret = check_func_args(env, f->arg_list); + if(ret > 0) { + const Value variadic = GET_FLAG(f, variadic) ? set_variadic(env) : NULL; + if(!GET_FLAG(f, builtin) && check_stmt_code(env, &f->d.code->d.stmt_code) < 0) + ret = err_msg(f->td ? f->td->xid->pos : 0, "...in function '%s'", + s_name(f->name)); + if(variadic) + REM_REF(variadic) + if(GET_FLAG(f, builtin)) + func->code->stack_depth = f->stack_depth; + else if(GET_FLAG(f, op)) + operator_func(func); } nspc_pop_value(env->curr); --env->scope->depth;