From 60b2f82cebfde11fac4a8b9011e1bf3616a76d3d Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Fri, 11 Jun 2004 02:01:18 +0000 Subject: [PATCH] Implement global register allocation for parameters in stack slots. --- ChangeLog | 4 ++++ jit/jit-function.c | 11 +++++++++-- jit/jit-reg-alloc.c | 3 +-- jit/jit-rules-arm.c | 8 ++++++++ jit/jit-rules-interp.c | 12 ++++++++++++ jit/jit-rules-x86.c | 8 ++++++++ jit/jit-rules.h | 1 + 7 files changed, 43 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index bdd5019..964f220 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,10 @@ tutorial/t2.c, tutorial/t5.c: implement tail calls from a function to itself. + * jit/jit-function.c, jit/jit-reg-alloc.c, jit/jit-rules-arm.c, + jit/jit-rules-interp.c, jit/jit-rules-x86.c, jit/jit-rules.h: + implement global register allocation for parameters in stack slots. + 2004-06-10 Rhys Weatherley * jit/jit-apply-arm.c, jit/jit-gen-arm.c, jit/jit-gen-arm.h, diff --git a/jit/jit-function.c b/jit/jit-function.c index 8eef76f..a8212c8 100644 --- a/jit/jit-function.c +++ b/jit/jit-function.c @@ -473,9 +473,16 @@ static void compile_block(jit_gencode_t gen, jit_function_t func, insn->value1->frame_offset = jit_value_get_nint_constant(insn->value2); insn->value1->in_register = 0; - insn->value1->in_frame = 1; insn->value1->has_frame_offset = 1; - insn->value1->has_global_register = 0; /* Disable globals */ + if(insn->value1->has_global_register) + { + insn->value1->in_global_register = 1; + _jit_gen_load_global(gen, insn->value1); + } + else + { + insn->value1->in_frame = 1; + } } break; diff --git a/jit/jit-reg-alloc.c b/jit/jit-reg-alloc.c index 39ea14b..3487f64 100644 --- a/jit/jit-reg-alloc.c +++ b/jit/jit-reg-alloc.c @@ -1489,8 +1489,7 @@ void _jit_regs_alloc_global(jit_gencode_t gen, jit_function_t func) value = (jit_value_t)(block->data + posn * sizeof(struct _jit_value)); if(value->global_candidate && value->usage_count >= JIT_MIN_USED && - !(value->is_addressable) && !(value->is_volatile) && - (!(value->is_parameter) || value->is_reg_parameter)) + !(value->is_addressable) && !(value->is_volatile)) { /* Insert this candidate into the list, ordered on count */ index = 0; diff --git a/jit/jit-rules-arm.c b/jit/jit-rules-arm.c index 61a08aa..24e36c5 100644 --- a/jit/jit-rules-arm.c +++ b/jit/jit-rules-arm.c @@ -1084,6 +1084,14 @@ void _jit_gen_load_value jit_cache_end_output(); } +void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value) +{ + jit_cache_setup_output(32); + arm_load_membase(inst, _jit_reg_info[value->global_reg].cpu_reg, + ARM_FP, value->frame_offset); + jit_cache_end_output(); +} + void _jit_gen_fix_value(jit_value_t value) { if(!(value->has_frame_offset) && !(value->is_constant)) diff --git a/jit/jit-rules-interp.c b/jit/jit-rules-interp.c index 75162c9..4d3d5e1 100644 --- a/jit/jit-rules-interp.c +++ b/jit/jit-rules-interp.c @@ -825,6 +825,18 @@ void _jit_gen_load_value adjust_working(gen, 1); } +/*@ + * @deftypefun void _jit_gen_load_global (jit_gencode_t gen, jit_value_t value) + * Load the contents of @code{value} into its corresponding global register. + * This is used at the head of a function to pull parameters out of stack + * slots into their global register copies. + * @end deftypefun +@*/ +void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value) +{ + /* Global registers are not used in the interpreted back end */ +} + /*@ * @deftypefun void _jit_gen_fix_value (jit_value_t value) * Fix the position of a value within the local variable frame. diff --git a/jit/jit-rules-x86.c b/jit/jit-rules-x86.c index bc683db..bbe9a60 100644 --- a/jit/jit-rules-x86.c +++ b/jit/jit-rules-x86.c @@ -1146,6 +1146,14 @@ void _jit_gen_load_value jit_cache_end_output(); } +void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value) +{ + jit_cache_setup_output(16); + x86_mov_reg_membase(inst, _jit_reg_info[value->global_reg].cpu_reg, + X86_EBP, value->frame_offset, sizeof(void *)); + jit_cache_end_output(); +} + void _jit_gen_fix_value(jit_value_t value) { if(!(value->has_frame_offset) && !(value->is_constant)) diff --git a/jit/jit-rules.h b/jit/jit-rules.h index 43b604f..3a70175 100644 --- a/jit/jit-rules.h +++ b/jit/jit-rules.h @@ -186,6 +186,7 @@ void _jit_gen_free_reg(jit_gencode_t gen, int reg, int other_reg, int value_used); void _jit_gen_load_value (jit_gencode_t gen, int reg, int other_reg, jit_value_t value); +void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value); void _jit_gen_fix_value(jit_value_t value); void _jit_gen_insn(jit_gencode_t gen, jit_function_t func, jit_block_t block, jit_insn_t insn); -- 2.47.3