From dcdb2a9ccf413de29935b708b8c949445ada292d Mon Sep 17 00:00:00 2001 From: fennecdjay Date: Sat, 30 Mar 2019 17:56:22 +0100 Subject: [PATCH] :art: Improve loop --- include/opcode.h | 6 ++---- opcode.txt | 3 +-- src/emit/emit.c | 12 ++++-------- src/vm/vm.c | 14 +++++--------- src/vm/vm_code.c | 4 +--- 5 files changed, 13 insertions(+), 26 deletions(-) diff --git a/include/opcode.h b/include/opcode.h index 55eb297b..9fb5fff7 100644 --- a/include/opcode.h +++ b/include/opcode.h @@ -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 diff --git a/opcode.txt b/opcode.txt index e05385dd..d8639229 100644 --- a/opcode.txt +++ b/opcode.txt @@ -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 diff --git a/src/emit/emit.c b/src/emit/emit.c index cec92551..c18e47aa 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -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; } diff --git a/src/vm/vm.c b/src/vm/vm.c index f83441a8..6581750a 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -245,7 +245,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto] &®pushmem, &®pushmemfloat, &®pushmemother, &®pushmemaddr, &&pushnow, &&baseint, &&basefloat, &&baseother, &&baseaddr, - &®dup, &®dup2, + &®dup, &®dup2, &®dup3, &&memsetimm, &®pushme, &®pushmaybe, &&funcreturn, @@ -280,7 +280,6 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto] &&funcusr, &®pop, &®tomem, &&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); diff --git a/src/vm/vm_code.c b/src/vm/vm_code.c index 7f8be57a..5fb2ca83 100644 --- a/src/vm/vm_code.c +++ b/src/vm/vm_code.c @@ -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); } -- 2.43.0