]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve loop
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 30 Mar 2019 16:56:22 +0000 (17:56 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 30 Mar 2019 16:56:22 +0000 (17:56 +0100)
include/opcode.h
opcode.txt
src/emit/emit.c
src/vm/vm.c
src/vm/vm_code.c

index 55eb297be6506e93473bfd55d59882f2b20423e0..9fb5fff7572d355cf2c6c693163856886f21ad38 100644 (file)
@@ -17,6 +17,7 @@ enum {
   eRegPushBase4,
   eRegDup,
   eRegDup2,
+  eRegDup3,
   eMemSetImm,
   eRegPushMe,
   eRegPushMaybe,
@@ -139,8 +140,6 @@ enum {
   eBranchNeqInt,
   eBranchEqFloat,
   eBranchNeqFloat,
-  eDecIntAddr,
-  eInitLoopCounter,
   eArrayAppend,
   eArrayTop,
   eObjectInstantiate,
@@ -183,6 +182,7 @@ enum {
 #define  RegPushBase4        (f_instr)eRegPushBase4
 #define  RegDup              (f_instr)eRegDup
 #define  RegDup2             (f_instr)eRegDup2
+#define  RegDup3             (f_instr)eRegDup3
 #define  MemSetImm           (f_instr)eMemSetImm
 #define  RegPushMe           (f_instr)eRegPushMe
 #define  RegPushMaybe        (f_instr)eRegPushMaybe
@@ -305,8 +305,6 @@ enum {
 #define  BranchNeqInt        (f_instr)eBranchNeqInt
 #define  BranchEqFloat       (f_instr)eBranchEqFloat
 #define  BranchNeqFloat      (f_instr)eBranchNeqFloat
-#define  DecIntAddr          (f_instr)eDecIntAddr
-#define  InitLoopCounter     (f_instr)eInitLoopCounter
 #define  ArrayAppend         (f_instr)eArrayAppend
 #define  ArrayTop            (f_instr)eArrayTop
 #define  ObjectInstantiate   (f_instr)eObjectInstantiate
index e05385dde72d4897ba07f6896e33561bcfb7da06..d8639229ede712305e62124a35a76371d7c35030 100644 (file)
@@ -14,6 +14,7 @@ RegPushBase3
 RegPushBase4
 RegDup
 RegDup2
+RegDup3
 MemSetImm
 RegPushMe
 RegPushMaybe
@@ -136,8 +137,6 @@ BranchEqInt
 BranchNeqInt
 BranchEqFloat
 BranchNeqFloat
-DecIntAddr
-InitLoopCounter
 ArrayAppend
 ArrayTop
 ObjectInstantiate
index cec925511878817303db53795c592769f8f5ed9f..c18e47aaf4140175cacb5685f6b35b7d9e4d8eaa 100644 (file)
@@ -1175,20 +1175,16 @@ ANN static m_bool emit_stmt_auto(const Emitter emit, const Stmt_Auto stmt) { GWD
 ANN static m_bool emit_stmt_loop(const Emitter emit, const Stmt_Loop stmt) { GWDEBUG_EXE
   emit_push_stack(emit);
   CHECK_BB(emit_exp(emit, stmt->cond, 0))
-  m_int* counter = (m_int*)xcalloc(1, SZ_INT);
-  const Instr init = emit_add_instr(emit, InitLoopCounter);
-  init->m_val = (m_uint)counter;
   const m_uint index = emit_code_size(emit);
-  const Instr deref = emit_add_instr(emit, DotStatic);
-  deref->m_val = (m_uint)counter;
-  deref->m_val2 = SZ_INT;
+  emit_add_instr(emit, RegDup3);
+  emit_add_instr(emit, int_post_dec);
   const Instr op = emit_add_instr(emit, BranchEqInt);
-  const Instr dec = emit_add_instr(emit, DecIntAddr);
-  dec->m_val = (m_uint)counter;
   CHECK_BB(scoped_stmt(emit, stmt->body, 1))
   const Instr _goto = emit_add_instr(emit, Goto);
   _goto->m_val = index;
   op->m_val = emit_code_size(emit);
+  const Instr pop = emit_add_instr(emit, RegPop);
+  pop->m_val = SZ_INT;
   emit_pop_stack(emit, index);
   return GW_OK;
 }
index f83441a8d9a5117a7b3a510187840181a511fedb..6581750a76eb1a9befb9cff2ce6b11900ee859d4 100644 (file)
@@ -245,7 +245,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&regpushmem, &&regpushmemfloat, &&regpushmemother, &&regpushmemaddr,
     &&pushnow,
     &&baseint, &&basefloat, &&baseother, &&baseaddr,
-    &&regdup, &&regdup2,
+    &&regdup, &&regdup2, &&regdup3,
     &&memsetimm,
     &&regpushme, &&regpushmaybe,
     &&funcreturn,
@@ -280,7 +280,6 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&funcusr, &&regpop, &&regtomem, &&overflow, &&next, &&funcusrend, &&funcmemberend,
     &&sporkini, &&sporkini, &&sporkfunc, &&sporkthis, &&sporkexp, &&forkend, &&sporkend,
     &&brancheqint, &&branchneint, &&brancheqfloat, &&branchnefloat,
-    &&decintaddr, &&initloop,
     &&arrayappend, &&arraytop, &&newobj,
     &&addref, &&assign, &&remref,
     &&except, &&allocmemberaddr, &&dotmember, &&dotfloat, &&dotother, &&dotaddr,
@@ -382,6 +381,10 @@ regdup2:
   *(m_uint*)(reg+SZ_INT) = *(m_uint*)(reg);
   reg += SZ_INT;
   DISPATCH()
+regdup3:
+  *(m_uint**)reg = &*(m_uint*)(reg-SZ_INT);
+  reg += SZ_INT;
+  DISPATCH()
 memsetimm:
   *(m_uint*)(mem+instr->m_val) = instr->m_val2;
   DISPATCH();
@@ -662,13 +665,6 @@ branchnefloat:
   if(*(m_float*)reg)
     pc = instr->m_val;
   DISPATCH();
-decintaddr:
-  --(*((m_uint*)(instr->m_val)));
-  DISPATCH()
-initloop:
-  reg -= SZ_INT;
-  (*(m_uint*)instr->m_val) = labs(*(m_int*)reg);
-  DISPATCH()
 arrayappend:
   m_vector_add(ARRAY(a.obj), reg);
   release(a.obj, shred);
index 7f8be57a582ecebd09c1e0ede54d773001648c1b..5fb2ca837ee9d25bbdcd39b9fb583b0180a6ae6a 100644 (file)
@@ -44,9 +44,7 @@ ANN static void free_code_instr(const Vector v) {
     else if(instr->execute == SwitchIni) {
       free_vector((Vector)instr->m_val);
       free_map((Map)instr->m_val2);
-    } else if(instr->opcode == eInitLoopCounter)
-      free((m_int*)instr->m_val);
-    else if(instr->execute == VarargIni) {
+    } else if(instr->execute == VarargIni) {
       if(instr->m_val2)
       free_vector((Vector)instr->m_val2);
     }