Introduce parser-time optimization that replaces a function's local variables with registers.

JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
Ruben Ayrapetyan
2015-08-21 14:19:04 +03:00
parent 91aecc3bd0
commit 5b9ce05491
11 changed files with 360 additions and 65 deletions
+8 -7
View File
@@ -543,11 +543,12 @@ vm_run_from_pos (const vm_instr_t *instrs_p, /**< byte-code array */
const vm_instr_t *curr = &instrs_p[start_pos];
JERRY_ASSERT (curr->op_idx == VM_OP_REG_VAR_DECL);
const idx_t min_reg_num = curr->data.reg_var_decl.min;
const idx_t max_reg_num = curr->data.reg_var_decl.max;
JERRY_ASSERT (max_reg_num >= min_reg_num);
const idx_t min_reg_idx = curr->data.reg_var_decl.min;
const idx_t max_reg_idx = curr->data.reg_var_decl.max;
const idx_t local_var_regs_num = curr->data.reg_var_decl.local_var_regs_num;
JERRY_ASSERT (max_reg_idx >= min_reg_idx);
const int32_t regs_num = max_reg_num - min_reg_num + 1;
int32_t regs_num = max_reg_idx - min_reg_idx + 1;
MEM_DEFINE_LOCAL_ARRAY (regs, regs_num, ecma_value_t);
@@ -559,10 +560,10 @@ vm_run_from_pos (const vm_instr_t *instrs_p, /**< byte-code array */
frame_ctx.is_strict = is_strict;
frame_ctx.is_eval_code = is_eval_code;
frame_ctx.is_call_in_direct_eval_form = false;
frame_ctx.min_reg_num = min_reg_num;
frame_ctx.max_reg_num = max_reg_num;
frame_ctx.min_reg_idx = min_reg_idx;
frame_ctx.max_reg_idx = max_reg_idx;
frame_ctx.tmp_num_p = ecma_alloc_number ();
vm_stack_add_frame (&frame_ctx.stack_frame, regs, regs_num);
vm_stack_add_frame (&frame_ctx.stack_frame, regs, regs_num, local_var_regs_num);
vm_frame_ctx_t *prev_context_p = vm_top_context_p;
vm_top_context_p = &frame_ctx;