]> Nishi Git Mirror - gwion.git/commitdiff
:art: Vararg optimisation
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 7 Mar 2019 20:13:53 +0000 (21:13 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 7 Mar 2019 20:13:53 +0000 (21:13 +0100)
src/emit/emit.c
src/lib/vararg.c

index efa7921ca944505823b7abb92f9c2d0e6e856f81..d80b0d4c8a9fe5a564f46c743dd09a945d450a0f 100644 (file)
@@ -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;
index 2128999cc853d5339e13a31fb0c4b27a850a429c..423e145428a057dd1aa6746ef94ec117751a1244 100644 (file)
@@ -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);
 }