From: fennecdjay Date: Tue, 19 Feb 2019 16:41:36 +0000 (+0100) Subject: :art: Fixes and performance X-Git-Tag: nightly~2761^2~19 X-Git-Url: http://10.11.0.4:5575/?a=commitdiff_plain;h=1a61dc8804f794f7a157c3afd2b394567d9a4ce2;p=gwion.git :art: Fixes and performance --- diff --git a/ast b/ast index 8fe7b190..305c073c 160000 --- a/ast +++ b/ast @@ -1 +1 @@ -Subproject commit 8fe7b190037c09cee1b5ff6cca54b4dba88b9d1a +Subproject commit 305c073c779f3efb3b1ed344b1a924784599da29 diff --git a/include/opcode.h b/include/opcode.h index d7b01b37..3eb434bc 100644 --- a/include/opcode.h +++ b/include/opcode.h @@ -1,6 +1,7 @@ #ifndef __GWION_OPCODES__ #define __GWION_OPCODES__ enum { + RegSetImm, RegPushImm, RegPushImm2, RegPushImm3, @@ -156,6 +157,7 @@ enum { OP_MAX, }; +#define RegSetImm (f_instr)RegSetImm #define RegPushImm (f_instr)RegPushImm #define RegPushImm2 (f_instr)RegPushImm2 #define RegPushImm3 (f_instr)RegPushImm3 diff --git a/opcode.txt b/opcode.txt index ef5908a0..db65393b 100644 --- a/opcode.txt +++ b/opcode.txt @@ -1,3 +1,4 @@ +RegSetImm RegPushImm RegPushImm2 RegPushImm3 diff --git a/src/emit/emit.c b/src/emit/emit.c index 298d3382..08a75f5a 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -188,7 +188,7 @@ ANN void emit_ext_ctor(const Emitter emit, const VM_Code code) { GWDEBUG_EXE emit_add_instr(emit, RegDup); const Instr push_f = emit_add_instr(emit, RegPushImm); push_f->m_val = (m_uint)code; - const Instr offset = emit_add_instr(emit, RegPushImm); + const Instr offset = emit_add_instr(emit, RegSetImm); offset->m_val = emit_code_offset(emit); emit_add_instr(emit, !GET_FLAG(code, builtin) ? FuncUsr : FuncMember); } @@ -314,7 +314,7 @@ ANN static m_bool prim_array(const Emitter emit, const Exp_Primary * primary) { while((e = e->next)); const Type type = array->type; const Type base = array_base(type); - const Instr push = emit_add_instr(emit, RegPushImm); + const Instr push = emit_add_instr(emit, RegSetImm); push->m_val = count; const Instr instr = emit_add_instr(emit, ArrayInit); instr->m_val = (m_uint)type; @@ -340,7 +340,7 @@ ANN static m_bool emit_exp_array(const Emitter emit, const Exp_Array* array) { G instr->m_val = is_var; instr->m_val2 = is_var ? SZ_INT : array->self->type->size; } else { - const Instr push = emit_add_instr(emit, RegPushImm); + const Instr push = emit_add_instr(emit, RegSetImm); push->m_val = depth; const Instr instr = emit_add_instr(emit, ArrayAccessMulti); instr->m_val = is_var || array->self->type->array_depth; @@ -729,7 +729,7 @@ ANN static Instr emit_call(const Emitter emit, const Func f) { return emit_add_instr(emit, exec); } const Instr ex = emit_add_instr(emit, GWOP_EXCEPT); - ex->m_val = -SZ_INT*2; + ex->m_val = -SZ_INT; return emit_add_instr(emit, FuncPtr); } @@ -740,7 +740,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f) { GWDEBUG_EXE } else if((f->value_ref->owner_class && is_special(f->value_ref->owner_class) > 0) || !f->value_ref->owner_class || GET_FLAG(f, template)) push_func_code(emit, f); - const Instr offset = emit_add_instr(emit, RegPushImm); + const Instr offset = emit_add_instr(emit, RegSetImm); offset->m_val = emit_code_offset(emit); const Instr instr = emit_call(emit, f); const m_uint size = instr->m_val = f->def->ret_type->size; diff --git a/src/emit/memoize.c b/src/emit/memoize.c index dee3664f..08db52c0 100644 --- a/src/emit/memoize.c +++ b/src/emit/memoize.c @@ -70,15 +70,16 @@ static inline void memoize_set(Memoize m, const m_bit* arg) { } m_bool memoize_get(VM_Shred shred) { - const VM_Code code = *(VM_Code*)REG(-SZ_INT * 2); +// const VM_Code code = *(VM_Code*)REG(-SZ_INT * 2); + const VM_Code code = *(VM_Code*)REG(-SZ_INT); const Memoize m = code->memoize; - const m_bit* arg = REG(-(SZ_INT*2 + m->arg_sz + (m_uint)m->member)); + const m_bit* arg = REG(-(SZ_INT + m->arg_sz + (m_uint)m->member)); const m_uint size = vector_size(&m->v); for(m_uint i = 0; i < size; ++i) { m_bit* data = (m_bit*)vector_at(&m->v, i); if(memcmp(arg, data, m->arg_sz)) continue; - POP_REG(shred, SZ_INT*2 + (m->arg_sz - m->ret_sz) + (m_uint)m->member) + POP_REG(shred, SZ_INT + (m->arg_sz - m->ret_sz) + (m_uint)m->member) mreturn[m->kind](shred->reg-m->ret_sz, data + m->arg_sz, m->ret_sz); return GW_OK; } diff --git a/src/lib/array.c b/src/lib/array.c index 6a3bfba4..7793b9cd 100644 --- a/src/lib/array.c +++ b/src/lib/array.c @@ -254,9 +254,9 @@ INSTR(ArrayPost) { GWDEBUG_EXE INSTR(ArrayInit) { GWDEBUG_EXE // for litteral array const Type t = (Type)instr->m_val; - const m_uint sz = *(m_uint*)REG(-SZ_INT); + const m_uint sz = *(m_uint*)REG(0); const m_uint off = instr->m_val2 * sz; - POP_REG(shred, off /*- SZ_INT*/); + POP_REG(shred, off - SZ_INT); const M_Object obj = new_array(t, sz); memcpy(ARRAY(obj)->ptr + ARRAY_OFFSET, REG(-SZ_INT), off); *(M_Object*)REG(-SZ_INT) = obj; @@ -371,8 +371,8 @@ INSTR(ArrayAccess) { GWDEBUG_EXE #define DIM(a) gw_err("\t... at dim [%" INT_F "]\n", (a)) INSTR(ArrayAccessMulti) { GWDEBUG_EXE - const m_uint depth = *(m_uint*)REG(-SZ_INT); - POP_REG(shred, SZ_INT * (depth + 2)) + const m_uint depth = *(m_uint*)REG(0); + POP_REG(shred, SZ_INT * (depth + 1)) const M_Object base = *(M_Object*)REG(0); M_Object obj = base; if(!obj) diff --git a/src/vm/vm.c b/src/vm/vm.c index 2a8bf452..93686cd5 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -221,6 +221,7 @@ __attribute__((hot)) ANN void vm_run(const VM* vm) { static const void* dispatch[] = { + &®setimm, &®pushimm, &®pushfloat, &®pushother, &®pushaddr, &®pushmem, &®pushmemfloat, &®pushmemother, &®pushmemaddr, &&pushnow, @@ -295,6 +296,9 @@ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &exec_ini); #endif do { register Instr instr; DISPATCH(); +regsetimm: + *(m_uint*)reg = instr->m_val; + DISPATCH(); regpushimm: *(m_uint*)reg = instr->m_val; reg += SZ_INT; @@ -551,7 +555,7 @@ shred->pc = pc; funcusr: { - reg -= SZ_INT * 2; + reg -= SZ_INT; register const m_uint push = *(m_uint*)(reg + SZ_INT) + *(m_uint*)(mem-SZ_INT); mem += push; *(m_uint*) mem = push;mem += SZ_INT; @@ -581,7 +585,7 @@ funcusr: DISPATCH(); funcmember: { - reg -= SZ_INT * 2; + reg -= SZ_INT; a.code = *(VM_Code*)reg; register const m_uint local_depth = *(m_uint*)(reg + SZ_INT); register m_bit* m = mem + local_depth; @@ -608,7 +612,7 @@ funcmember: } funcstatic: { - reg -= SZ_INT * 2; + reg -= SZ_INT; a.code = *(VM_Code*)reg; register const m_uint local_depth = *(m_uint*)(reg + SZ_INT); register m_bit* m = mem + local_depth; diff --git a/tests/error/self_extend.gw b/tests/error/self_extend.gw new file mode 100644 index 00000000..e6d5a55b --- /dev/null +++ b/tests/error/self_extend.gw @@ -0,0 +1,4 @@ +// [contains] cannot extend itself +class C extends C { + +}