]> Nishi Git Mirror - gwion.git/commitdiff
:Fix: Operator emit func->code, add instr
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 14 Feb 2019 23:32:14 +0000 (00:32 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 14 Feb 2019 23:46:45 +0000 (00:46 +0100)
include/instr.h
include/opcode.h
opcode.txt
src/emit/emit.c
src/lib/instr.c
src/parse/operator.c
src/vm/vm.c

index 8b1677be4f694dcaefbe4f6f0624eb4e0a5274c1..3b57e57854ca9c70ce2df49ea489461f41c05586 100644 (file)
@@ -34,9 +34,6 @@ INSTR(EOC);
 INSTR(DTOR_EOC);
 INSTR(DtorReturn);
 
-INSTR(RegPushMe);
-INSTR(RegPushMaybe);
-
 /* branching */
 INSTR(BranchSwitch);
 INSTR(SwitchIni);
index 6af942c7a07bbd94b01f780fff1db95a714ff034..d7b01b37aec83fa5759aeec0e7319ae06ba968d7 100644 (file)
@@ -15,10 +15,11 @@ enum {
   RegPushBase3,
   RegPushBase4,
   RegDup,
-  MemPushImm,
   MemSetImm,
   RegPop,
   RegPushPtr,
+  RegPushMe,
+  RegPushMaybe,
   FuncReturn,
   Goto,
   AllocWord,
@@ -169,10 +170,11 @@ enum {
 #define  RegPushBase3        (f_instr)RegPushBase3
 #define  RegPushBase4        (f_instr)RegPushBase4
 #define  RegDup              (f_instr)RegDup
-#define  MemPushImm          (f_instr)MemPushImm
 #define  MemSetImm           (f_instr)MemSetImm
 #define  RegPop              (f_instr)RegPop
 #define  RegPushPtr          (f_instr)RegPushPtr
+#define  RegPushMe           (f_instr)RegPushMe
+#define  RegPushMaybe        (f_instr)RegPushMaybe
 #define  FuncReturn          (f_instr)FuncReturn
 #define  Goto                (f_instr)Goto
 #define  AllocWord           (f_instr)AllocWord
index 35ddfcc8fe28b723e4b2407c3c9c80ba395e6238..ef5908a04c2a69295c6f04da6c383fdac3394f7d 100644 (file)
@@ -12,10 +12,11 @@ RegPushBase2
 RegPushBase3
 RegPushBase4
 RegDup
-MemPushImm
 MemSetImm
 RegPop
 RegPushPtr
+RegPushMe
+RegPushMaybe
 FuncReturn
 Goto
 AllocWord
index 3546e55ae7703b85ba83733678244e3926a439d2..53093395319b8111aa3324b54564dc8af342884c 100644 (file)
@@ -814,13 +814,8 @@ ANN static m_bool spork_func(const Emitter emit, const Exp_Call* exp) { GWDEBUG_
   push_spork_code(emit, SPORK_FUNC_PREFIX, exp->self->pos);
   if(GET_FLAG(exp->m_func, member))
     SET_FLAG(emit->code, member);
-  const Instr op = emit_add_instr(emit, MemPushImm);
-  op->m_val = emit->code->stack_depth;
-const Instr p =
-
-  emit_add_instr(emit, RegPushImm);
+  const Instr p = emit_add_instr(emit, RegPushImm);
   p->m_val = (m_uint)exp->m_func->code;
-
   CHECK_BB(emit_exp_call1(emit, exp->m_func))
   const VM_Code code = finalyze(emit);
   const m_uint size = exp->m_func->def->stack_depth - (GET_FLAG(exp->m_func,
index 6065c331a28d299bf29c512784e19ee982c354dc..8c928f867af4b11873e493cfed75940176db6053 100644 (file)
@@ -31,16 +31,6 @@ INSTR(EOC2) { GWDEBUG_EXE
   shreduler_remove(shred->vm->shreduler, shred, 0);
 }
 
-INSTR(RegPushMe) { GWDEBUG_EXE
-  *(M_Object*)REG(0) = shred->me;
-  PUSH_REG(shred, SZ_INT);
-}
-
-INSTR(RegPushMaybe) { GWDEBUG_EXE
-  *(m_uint*)REG(0) = gw_rand(shred->vm->rand) > (UINT32_MAX / 2);
-  PUSH_REG(shred, SZ_INT);
-}
-
 /* branching */
 INSTR(SwitchIni) {
   const Vector v = (Vector)instr->m_val;
index 2c2b7df32ea14e874d8a7511fc6d27cd21965fe6..fb59741d1dca5ad22c316231b04355d659b0b5ef 100644 (file)
@@ -173,7 +173,7 @@ ANN m_bool operator_set_func(const struct Op_Import* opi) {
 ANN static m_bool handle_instr(const Emitter emit, const M_Operator* mo) {
   if(mo->func) {
     const Instr instr = emit_add_instr(emit, RegPushImm);
-    instr->m_val = (m_uint)mo->func;
+    instr->m_val = (m_uint)mo->func->code;
     return emit_exp_call1(emit, mo->func);
   }
   emit_add_instr(emit, mo->instr);
index 60a7f7bea1a4c21498d5a8d803976c806cfd575a..a9959861cbfd89f0f01cd92770ef6b5161c26844 100644 (file)
@@ -224,8 +224,8 @@ ANN void vm_run(const VM* vm) {
     &&pushnow,
     &&baseint, &&basefloat, &&baseother, &&baseaddr,
     &&regdup,
-    &&mempushimm, &&memsetimm,
-    &&regpop, &&regpushptr,
+    &&memsetimm,
+    &&regpop, &&regpushptr, &&regpushme, &&regpushmaybe,
     &&funcreturn,
     &&_goto,
     &&allocint, &&allocfloat, &&allocother, &&allocaddr,
@@ -358,10 +358,6 @@ regdup:
   *(m_uint*)reg = *(m_uint*)(reg-SZ_INT);
   reg += SZ_INT;
   DISPATCH()
-mempushimm:
-  *(m_uint*)mem = instr->m_val;
-  mem += SZ_INT;
-  DISPATCH();
 memsetimm:
   *(m_uint*)(mem+instr->m_val) = instr->m_val2;
   DISPATCH();
@@ -371,6 +367,14 @@ regpop:
 regpushptr:
   *(m_uint*)(reg-SZ_INT) = instr->m_val;
   DISPATCH()
+regpushme:
+  *(M_Object*)reg = shred->me;
+  reg += SZ_INT;
+  DISPATCH()
+regpushmaybe:
+  *(m_uint*)reg = gw_rand((uint32_t*)vm->rand) > (UINT32_MAX / 2);
+  reg += SZ_INT;
+  DISPATCH();
 funcreturn:
   pc = *(m_uint*)(mem-SZ_INT);
   code = *(VM_Code*)(mem-SZ_INT*2);