]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
fix register allocation for long values
authorAleksey Demakov <ademakov@gmail.com>
Fri, 13 Jan 2006 20:26:19 +0000 (20:26 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Fri, 13 Jan 2006 20:26:19 +0000 (20:26 +0000)
ChangeLog
jit/jit-reg-alloc.c
jit/jit-rules-x86.sel
tools/gen-sel-parser.y

index 11b594106e54ec5ffca9fc59e0d9372a50d1d041..ca28a68064a5a907f1aad5f5aa309996f6ab8dcd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-01-14  Aleksey Demakov  <ademakov@gmail.com>
+
+       * 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  <ademakov@gmail.com>
 
        * jit/jit-insn.c: fix all descriptors of intrinsic functions that
index 6b34c4db914fbfbdc2f1f2db4e1a1a32e194b7c8..e3ea5bd6b453fe4edd7d34c48bd7f65351c6fcad 100644 (file)
@@ -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;
                                }
index 25c0dc63a1bef1b6b2b09700075dc20b823aa019..974c50479cfb777acc053987764d56b7870a7d1b 100644 (file)
@@ -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;
                                        }
index 2a066beca66ce94c288f429032c035cca8537689..a2ae92f6e90fffa71c35b86e99c6f73b7d891956 100644 (file)
@@ -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");