From: Brendan Hansen Date: Thu, 5 Jan 2023 02:24:39 +0000 (-0600) Subject: added small optimizations to OVM codegen X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=162a0d1ce19de138d81e9b57dc19be65614e30ec;p=onyx.git added small optimizations to OVM codegen --- diff --git a/core/container/iter.onyx b/core/container/iter.onyx index 869c4de5..fba14a0a 100644 --- a/core/container/iter.onyx +++ b/core/container/iter.onyx @@ -557,10 +557,10 @@ from_array :: #match #local {} from_array :: (arr: [] $T/type_is_struct) => generator( ^.{ data = arr.data, count = arr.count, current = 0 }, - (use ctx: ^$T) -> (typeof ctx.data, bool) { - if current < count { - defer current += 1; - return ^data[current], true; + ctx => { + if ctx.current < ctx.count { + defer ctx.current += 1; + return ^ctx.data[ctx.current], true; } return null, false; @@ -571,10 +571,10 @@ from_array :: (arr: [] $T/type_is_struct) => generator( from_array :: (arr: [] $T) => generator( ^.{ data = arr.data, count = arr.count, current = 0 }, - (use ctx: ^$T) -> (typeof *ctx.data, bool) { - if current < count { - defer current += 1; - return data[current], true; + ctx => { + if ctx.current < ctx.count { + defer ctx.current += 1; + return ctx.data[ctx.current], true; } return .{}, false; diff --git a/interpreter/src/vm/code_builder.c b/interpreter/src/vm/code_builder.c index a00e416d..59da1e86 100644 --- a/interpreter/src/vm/code_builder.c +++ b/interpreter/src/vm/code_builder.c @@ -410,8 +410,15 @@ void ovm_code_builder_add_local_set(ovm_code_builder_t *builder, i32 local_idx) { ovm_instr_t *last_instr = &bh_arr_last(builder->program->code); if (OVM_INSTR_INSTR(*last_instr) == OVMI_IMM) { - if (IS_TEMPORARY_VALUE(builder, last_instr->r) - && last_instr->r == LAST_VALUE(builder)) { + if (IS_TEMPORARY_VALUE(builder, last_instr->r) && last_instr->r == LAST_VALUE(builder)) { + last_instr->r = local_idx; + POP_VALUE(builder); + return; + } + } + + if (OVM_INSTR_INSTR(*last_instr) == OVMI_REG_GET) { + if (IS_TEMPORARY_VALUE(builder, last_instr->r) && last_instr->r == LAST_VALUE(builder)) { last_instr->r = local_idx; POP_VALUE(builder); return; @@ -461,6 +468,21 @@ void ovm_code_builder_add_register_get(ovm_code_builder_t *builder, i32 reg_idx) } void ovm_code_builder_add_register_set(ovm_code_builder_t *builder, i32 reg_idx) { + // :PrimitiveOptimization + { + ovm_instr_t *last_instr = &bh_arr_last(builder->program->code); + if (OVM_INSTR_INSTR(*last_instr) == OVMI_MOV) { + if (IS_TEMPORARY_VALUE(builder, last_instr->r) && last_instr->r == LAST_VALUE(builder)) { + + last_instr->full_instr = OVM_TYPED_INSTR(OVMI_REG_SET, OVM_TYPE_NONE); + last_instr->r = reg_idx; + + POP_VALUE(builder); + return; + } + } + } + ovm_instr_t instr = {0}; instr.full_instr = OVM_TYPED_INSTR(OVMI_REG_SET, OVM_TYPE_NONE); instr.r = reg_idx; diff --git a/shared/lib/linux_x86_64/lib/libovmwasm.so b/shared/lib/linux_x86_64/lib/libovmwasm.so index 6e2ffbb9..9368eae7 100755 Binary files a/shared/lib/linux_x86_64/lib/libovmwasm.so and b/shared/lib/linux_x86_64/lib/libovmwasm.so differ