From 60bf89d82774d972f8bfc4427b883760c6769fbe Mon Sep 17 00:00:00 2001 From: Aleksey Demakov Date: Fri, 13 Jan 2006 20:26:19 +0000 Subject: [PATCH] fix register allocation for long values --- ChangeLog | 9 +++++++++ jit/jit-reg-alloc.c | 3 ++- jit/jit-rules-x86.sel | 12 ++++++++---- tools/gen-sel-parser.y | 11 ++++++++++- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 11b5941..ca28a68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-01-14 Aleksey Demakov + + * tools/gen-sel-parser.y: spilling a register which is the first + part of a register pair spill the other part too. + + * jit/jit-reg-alloc.c (free_register_for_value): + * jit/jit-rules-x86.sel: if a register is the second part of a + register pair do not consider it free. + 2006-01-13 Aleksey Demakov * jit/jit-insn.c: fix all descriptors of intrinsic functions that diff --git a/jit/jit-reg-alloc.c b/jit/jit-reg-alloc.c index 6b34c4d..e3ea5bd 100644 --- a/jit/jit-reg-alloc.c +++ b/jit/jit-reg-alloc.c @@ -994,7 +994,8 @@ static int free_register_for_value else if(!need_pair) { if(gen->contents[reg].num_values == 0 && - !(gen->contents[reg].used_for_temp)) + !(gen->contents[reg].used_for_temp) && + !(gen->contents[reg].is_long_end)) { return reg; } diff --git a/jit/jit-rules-x86.sel b/jit/jit-rules-x86.sel index 25c0dc6..974c504 100644 --- a/jit/jit-rules-x86.sel +++ b/jit/jit-rules-x86.sel @@ -3055,7 +3055,8 @@ JIT_OP_MEMCPY: manual if(regi != reg && regi != reg2) { if(gen->contents[regi].num_values == 0 && - gen->contents[regi].used_for_temp == 0) + !gen->contents[regi].used_for_temp && + !gen->contents[reg].is_long_end) { reg3 = regi; break; @@ -3067,7 +3068,8 @@ JIT_OP_MEMCPY: manual } } if(gen->contents[reg3].num_values > 0 || - gen->contents[reg3].used_for_temp) + gen->contents[regi].used_for_temp || + gen->contents[reg].is_long_end) { save_reg3 = 1; } @@ -3226,7 +3228,8 @@ JIT_OP_MEMSET: manual if(regi != reg && regi != reg2) { if(gen->contents[regi].num_values == 0 && - gen->contents[regi].used_for_temp == 0) + !gen->contents[regi].used_for_temp && + !gen->contents[reg].is_long_end) { reg3 = regi; break; @@ -3238,7 +3241,8 @@ JIT_OP_MEMSET: manual } } if(gen->contents[reg3].num_values > 0 || - gen->contents[reg3].used_for_temp) + gen->contents[regi].used_for_temp || + gen->contents[reg].is_long_end) { save_reg3 = 1; } diff --git a/tools/gen-sel-parser.y b/tools/gen-sel-parser.y index 2a066be..a2ae92f 100644 --- a/tools/gen-sel-parser.y +++ b/tools/gen-sel-parser.y @@ -808,7 +808,16 @@ Rule printf("\t}\n"); printf("\telse\n"); printf("\t{\n"); - printf("\t\t_jit_gen_spill_reg(gen, reg, -1, insn->dest);\n"); + printf("\t\tint other_reg;\n"); + printf("\t\tif(gen->contents[reg].is_long_start)\n"); + printf("\t\t{\n"); + printf("\t\t\tother_reg = _jit_reg_info[reg].other_reg;\n"); + printf("\t\t}\n"); + printf("\t\telse\n"); + printf("\t\t{\n"); + printf("\t\t\tother_reg = -1;\n"); + printf("\t\t}\n"); + printf("\t\t_jit_gen_spill_reg(gen, reg, other_reg, insn->dest);\n"); printf("\t\tif(insn->dest->has_global_register)\n"); printf("\t\t\tinsn->dest->in_global_register = 1;\n"); printf("\t\telse\n"); -- 2.47.3