]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve vm
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 6 Jun 2019 17:08:21 +0000 (19:08 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 6 Jun 2019 17:08:21 +0000 (19:08 +0200)
src/emit/emit.c
src/lib/func.c
src/vm/vm.c

index 641f2da3ea7ddf6811c20d4d5a373f4891f0ceb4..2d9a3e0c705c7ea9cdabc1852a7f9439f4d9828a 100644 (file)
@@ -165,9 +165,10 @@ ANN static void emit_pre_ctor(const Emitter emit, const Type type) {
 }
 
 #define regxxx(name, instr) \
-ANN static inline void reg##name(const Emitter emit, const m_uint sz) { \
+ANN static inline Instr reg##name(const Emitter emit, const m_uint sz) { \
   const Instr instr = emit_add_instr(emit, Reg##instr); \
   instr->m_val = sz; \
+  return instr; \
 }
 regxxx(pop, Pop)
 regxxx(pushi, PushImm)
@@ -210,9 +211,13 @@ ANN ArrayInfo* emit_array_extend_inner(const Emitter emit, const Type t, const E
 ANN void emit_ext_ctor(const Emitter emit, const VM_Code code) {
   const Instr cpy = emit_add_instr(emit, Reg2Reg);
   cpy->m_val2 = -SZ_INT;
-  regpushi(emit, (m_uint)code);
+  const Instr set_code = regseti(emit, (m_uint)code);
+  set_code->m_val2 = SZ_INT;
   const m_uint offset = emit_code_offset(emit);
-  regseti(emit, offset);
+  const Instr regset = regseti(emit, offset);
+  regset->m_val2 = SZ_INT *2;
+  const Instr push = emit_add_instr(emit, RegPush);
+  push->m_val = SZ_INT *2;
   const Instr prelude = emit_add_instr(emit, !GET_FLAG(code, builtin) ? FuncUsr : FuncMember);
   prelude->m_val2 = 2;
   prelude->m_val = SZ_INT;
@@ -573,7 +578,7 @@ ANN static m_bool emit_exp_decl_non_static(const Emitter emit, const Var_Decl va
     if(missing_depth) {
       const Instr push = emit_add_instr(emit, Reg2Reg);
       push->m_val = -(1 + missing_depth) * SZ_INT;
-      regpop(emit, (missing_depth + 1) * SZ_INT);
+      regpop(emit, (missing_depth) * SZ_INT);
     }
   }
   return GW_OK;
@@ -881,6 +886,8 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f) {
     m_uint val2 = back->m_val2;
     back->opcode = eReg2Reg;
     back->m_val = SZ_INT;
+    const Instr push = emit_add_instr(emit, RegPush);
+    push->m_val = SZ_INT;
     const Instr instr = emit_add_instr(emit, (f_instr)(m_uint)exec);
     instr->m_val = val;
     instr->m_val2 = val2;
index ca08dcdb3506c6d298cd6722997a2a52d3e7eedc..1c63f774cd0f33527c0695b0e5bf415e1dd44a9d 100644 (file)
@@ -211,9 +211,9 @@ static OP_EMIT(opem_fptr_cast) {
     fptr_instr(emit, cast->exp->type->e->d.func, 1);
   if(GET_FLAG(cast->exp->type->e->d.func, member)) {
     const Instr instr = emit_add_instr(emit, RegPop);
-    instr->m_val = SZ_INT*2;
+    instr->m_val = SZ_INT;
     const Instr dup = emit_add_instr(emit, Reg2Reg);
-    dup->m_val2 = SZ_INT;
+    dup->m_val = -SZ_INT;
   }
   return GW_OK;
 }
index 11610db16a3de66ef25f64938807062eb4f8227f..876fcf09c0ec3e89678c70aa739a895f41fcd7ce 100644 (file)
@@ -362,7 +362,6 @@ baseaddr:
   DISPATCH();
 regtoreg:
   *(m_uint*)(reg + (m_int)instr->m_val) = *(m_uint*)(reg + (m_int)instr->m_val2);
-  reg += SZ_INT;
   DISPATCH()
 regtoregaddr:
   *(m_uint**)reg = &*(m_uint*)(reg-SZ_INT);