From: fennecdjay Date: Thu, 7 Mar 2019 20:13:53 +0000 (+0100) Subject: :art: Vararg optimisation X-Git-Tag: nightly~2753^2~18 X-Git-Url: http://10.11.0.4:5575/?a=commitdiff_plain;h=defa5404353a413eda9837b8f97486d7bd4c30d1;p=gwion.git :art: Vararg optimisation --- diff --git a/src/emit/emit.c b/src/emit/emit.c index efa7921c..d80b0d4c 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -584,10 +584,14 @@ ANN static m_uint vararg_size(const Exp_Call* exp_call, const Vector kinds) { return size; } +ANN static inline m_uint round2szint(const m_uint i) { + return ((i + (SZ_INT-1)) & ~(SZ_INT-1)); +} + ANN static void emit_func_arg_vararg(const Emitter emit, const Exp_Call* exp_call) { GWDEBUG_EXE const Instr instr = emit_add_instr(emit, VarargIni); const Vector kinds = new_vector(); - if((instr->m_val = vararg_size(exp_call, kinds))) + if((instr->m_val = round2szint(vararg_size(exp_call, kinds)))) instr->m_val2 = (m_uint)kinds; else { instr->opcode = (m_bit)(m_uint)RegPushImm; diff --git a/src/lib/vararg.c b/src/lib/vararg.c index 2128999c..423e1454 100644 --- a/src/lib/vararg.c +++ b/src/lib/vararg.c @@ -34,11 +34,13 @@ INSTR(VarargIni) { GWDEBUG_EXE struct Vararg_* arg = mp_alloc(Vararg); POP_REG(shred, instr->m_val - SZ_INT) arg->d = (m_bit*)xmalloc(instr->m_val); - memcpy(arg->d, shred->reg - SZ_INT, instr->m_val); + for(m_uint i = 0; i < instr->m_val; i += SZ_INT) + *(m_uint*)(arg->d + i) = *(m_uint*)(shred->reg - SZ_INT + i); const Vector kinds = (Vector)instr->m_val2; arg->s = vector_size(kinds); arg->k = (m_uint*)xmalloc(arg->s * SZ_INT); - memcpy(arg->k, kinds->ptr + OFFSET, arg->s * SZ_INT); + for(m_uint i = 0; i < arg->s; ++i) + *(m_uint*)(arg->k + i) = vector_at(kinds, i); *(struct Vararg_**)REG(-SZ_INT) = arg; } @@ -55,7 +57,7 @@ INSTR(VarargEnd) { GWDEBUG_EXE INSTR(VarargMember) { GWDEBUG_EXE const struct Vararg_* arg = *(struct Vararg_**)MEM(instr->m_val); for(m_uint i = 0; i < instr->m_val2; i += SZ_INT) - *(m_uint*)REG(0) = *(m_uint*)(arg->d + arg->o); + *(m_uint*)REG(i) = *(m_uint*)(arg->d + arg->o + i); PUSH_REG(shred, instr->m_val2); }