dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] libjit ChangeLog jit/jit-reg-alloc.c jit/jit-ru...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ChangeLog jit/jit-reg-alloc.c jit/jit-ru...
Date: Sun, 26 Nov 2006 12:05:02 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Changes by:     Aleksey Demakov <avd>   06/11/26 12:05:02

Modified files:
        .              : ChangeLog 
        jit            : jit-reg-alloc.c jit-rules-x86.ins 

Log message:
        fix global register use cost computation;
        mark a few x86 instruction selection rules as commutative;

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.280&r2=1.281
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-reg-alloc.c?cvsroot=dotgnu-pnet&r1=1.45&r2=1.46
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.21&r2=1.22

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.280
retrieving revision 1.281
diff -u -b -r1.280 -r1.281
--- ChangeLog   25 Nov 2006 14:43:10 -0000      1.280
+++ ChangeLog   26 Nov 2006 12:05:02 -0000      1.281
@@ -1,3 +1,12 @@
+2006-11-26  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-reg-alloc.c (choose_output_register): fix global register
+       use cost computation.
+
+       * jit/jit-rules-x86.ins: mark as commutative JIT_OP_IADD,
+       JIT_OP_IMUL, JIT_OP_LADD, JIT_OP_IAND, JIT_OP_IOR, JIT_OP_IXOR,
+       JIT_OP_LAND, JIT_OP_LOR, JIT_OP_XOR rules.
+
 2006-11-25  Aleksey Demakov  <address@hidden>
 
        * jit/jit-reg-alloc.c (exch_stack_top, free_value): fix freeing

Index: jit/jit-reg-alloc.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-reg-alloc.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -b -r1.45 -r1.46
--- jit/jit-reg-alloc.c 25 Nov 2006 14:43:10 -0000      1.45
+++ jit/jit-reg-alloc.c 26 Nov 2006 12:05:02 -0000      1.46
@@ -984,7 +984,7 @@
 choose_scratch_register(jit_gencode_t gen, _jit_regs_t *regs, int index)
 {
        int reg, type;
-       int use_cost, spill_cost;
+       int use_cost;
        int suitable_reg;
        int suitable_cost;
        int suitable_age;
@@ -1042,14 +1042,15 @@
                        use_cost += COST_THRASH;
                }
 
-               spill_cost = compute_spill_cost(gen, regs, reg, -1);
+               use_cost += compute_spill_cost(gen, regs, reg, -1);
 
-               if((use_cost + spill_cost) < suitable_cost
-                  || (spill_cost > 0 && (use_cost + spill_cost) == 
suitable_cost
+               if(use_cost < suitable_cost
+                  || (use_cost == suitable_cost
+                      && gen->contents[reg].num_values > 0
                       && gen->contents[reg].age < suitable_age))
                {
                        suitable_reg = reg;
-                       suitable_cost = use_cost + spill_cost;
+                       suitable_cost = use_cost;
                        suitable_age = gen->contents[reg].age;
                }
        }
@@ -1068,7 +1069,7 @@
 {
        int type, need_pair;
        int reg, other_reg;
-       int use_cost, spill_cost;
+       int use_cost;
        int suitable_reg, suitable_other_reg;
        int suitable_cost;
        int suitable_age;
@@ -1112,45 +1113,62 @@
                        other_reg = -1;
                }
 
-               /* It is not allowed to assign an output value to a global 
register
-                  unless it is the very value the global register contains. */
                if(jit_reg_is_used(gen->permanent, reg))
                {
-                       if(regs->descs[0].value->has_global_register
-                          && regs->descs[0].value->global_reg == reg)
+                       if(!regs->descs[0].value->has_global_register
+                          || regs->descs[0].value->global_reg != reg)
+                       {
+                               /* It is not allowed to assign an output value 
to a global
+                                  register unless it is the very value the 
global register
+                                  contains. */
+                               continue;
+                       }
+                       if(regs->free_dest)
                        {
                                use_cost = 0;
                        }
-                       else
+                       else if(regs->descs[0].value->in_global_register)
                        {
-                               continue;
+                               if(regs->descs[0].value == regs->descs[1].value)
+                               {
+                                       use_cost = 0;
                        }
+                               else if(regs->descs[0].value == 
regs->descs[2].value)
+                               {
+                                       if(regs->commutative)
+                                       {
+                                               use_cost = 0;
                }
                else
                {
-                       if(other_reg >= 0 && jit_reg_is_used(gen->permanent, 
other_reg))
-                       {
                                continue;
                        }
-                       if(regs->descs[0].value->has_global_register)
+                               }
+                               else
                        {
-                               use_cost = COST_GLOBAL_BIAS;
+                                       use_cost = COST_COPY;
+                               }
                        }
                        else
                        {
-                               use_cost = 0;
+                               use_cost = COST_COPY;
                        }
                }
-
+               else
+               {
+                       if(other_reg >= 0 && jit_reg_is_used(gen->permanent, 
other_reg))
+                       {
+                               continue;
+                       }
                if(regs->free_dest)
                {
-                       /* noop */
+                               use_cost = 0;
                }
                else if(regs->descs[1].value
                        && regs->descs[1].value->in_register
                        && regs->descs[1].value->reg == reg)
                {
-                       /* noop */
+                               use_cost = 0;
                }
                else if(regs->descs[2].value
                        && regs->descs[2].value->in_register
@@ -1158,27 +1176,33 @@
                {
                        if(regs->commutative || regs->x87_arith)
                        {
-                               /* noop */
+                                       use_cost = 0;
                        }
                        else
                        {
-                               use_cost += COST_THRASH;
+                                       use_cost = COST_THRASH;
                        }
                }
                else
                {
-                       use_cost += COST_COPY;
+                               use_cost = COST_COPY;
+                       }
+                       if(regs->descs[0].value->has_global_register)
+                       {
+                               use_cost += COST_GLOBAL_BIAS;
+                       }
                }
 
-               spill_cost = compute_spill_cost(gen, regs, reg, other_reg);
+               use_cost += compute_spill_cost(gen, regs, reg, other_reg);
 
-               if((use_cost + spill_cost) < suitable_cost
-                  || (spill_cost > 0 && (use_cost + spill_cost) == 
suitable_cost
+               if(use_cost < suitable_cost
+                  || (use_cost == suitable_cost
+                      && gen->contents[reg].num_values > 0
                       && gen->contents[reg].age < suitable_age))
                {
                        suitable_reg = reg;
                        suitable_other_reg = other_reg;
-                       suitable_cost = use_cost + spill_cost;
+                       suitable_cost = use_cost;
                        suitable_age = gen->contents[reg].age;
                }
        }
@@ -1281,7 +1305,7 @@
        _jit_regdesc_t *desc2;
        int type, need_pair;
        int reg, other_reg;
-       int use_cost, spill_cost;
+       int use_cost;
        int suitable_reg, suitable_other_reg;
        int suitable_cost;
        int suitable_age;
@@ -1394,32 +1418,29 @@
                        if(jit_reg_is_used(regs->clobber, reg)
                           || (other_reg >= 0 && jit_reg_is_used(regs->clobber, 
other_reg)))
                        {
-                               spill_cost = 0;
+                               /* noop */
                        }
                        else
                        {
-                               spill_cost = compute_spill_cost(gen, regs, reg, 
other_reg);
+                               use_cost += compute_spill_cost(gen, regs, reg, 
other_reg);
                        }
 #if ALLOW_CLOBBER_GLOBAL
                        if(other_reg >= 0 && jit_reg_is_used(gen->permanent, 
other_reg))
                        {
-                               spill_cost += COST_CLOBBER_GLOBAL;
+                               use_cost += COST_CLOBBER_GLOBAL;
                        }
 #endif
                }
-               else
-               {
-                       spill_cost = 0;
-               }
 
-               if((use_cost + spill_cost) < suitable_cost
-                  || (spill_cost > 0 && (use_cost + spill_cost) == 
suitable_cost
+               if(use_cost < suitable_cost
+                  || (use_cost == suitable_cost
+                      && gen->contents[reg].num_values > 0
                       && gen->contents[reg].age < suitable_age))
                {
                        /* This is the oldest suitable register of this type */
                        suitable_reg = reg;
                        suitable_other_reg = other_reg;
-                       suitable_cost = use_cost + spill_cost;
+                       suitable_cost = use_cost;
                        suitable_age = gen->contents[reg].age;
                }
        }

Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- jit/jit-rules-x86.ins       25 Nov 2006 15:41:53 -0000      1.21
+++ jit/jit-rules-x86.ins       26 Nov 2006 12:05:02 -0000      1.22
@@ -213,7 +213,7 @@
  * Arithmetic opcodes.
  */
 
-JIT_OP_IADD: binary
+JIT_OP_IADD: commutative
        [reg, imm] -> {
                x86_alu_reg_imm(inst, X86_ADD, $1, $2);
        }
@@ -235,7 +235,7 @@
                x86_alu_reg_reg(inst, X86_SUB, $1, $2);
        }
 
-JIT_OP_IMUL: binary
+JIT_OP_IMUL: commutative
        [reg, imm] -> {
                /* Handle special cases of immediate multiplies */
                switch($2)
@@ -674,7 +674,7 @@
                x86_neg_reg(inst, $1);
        }
 
-JIT_OP_LADD: binary
+JIT_OP_LADD: commutative
        [lreg, imm] -> {
                jit_int value1 = ((jit_int *)($2))[0];
                jit_int value2 = ((jit_int *)($2))[1];
@@ -788,7 +788,7 @@
  * Bitwise opcodes.
  */
 
-JIT_OP_IAND: binary
+JIT_OP_IAND: commutative
        [reg, imm] -> {
                x86_alu_reg_imm(inst, X86_AND, $1, $2);
        }
@@ -799,7 +799,7 @@
                x86_alu_reg_reg(inst, X86_AND, $1, $2);
        }
 
-JIT_OP_IOR: binary
+JIT_OP_IOR: commutative
        [reg, imm] -> {
                x86_alu_reg_imm(inst, X86_OR, $1, $2);
        }
@@ -810,7 +810,7 @@
                x86_alu_reg_reg(inst, X86_OR, $1, $2);
        }
 
-JIT_OP_IXOR: binary
+JIT_OP_IXOR: commutative
        [reg, imm] -> {
                x86_alu_reg_imm(inst, X86_XOR, $1, $2);
        }
@@ -850,7 +850,7 @@
                inst = shift_reg(inst, X86_SHR, $1, $2);
        }
 
-JIT_OP_LAND: binary
+JIT_OP_LAND: commutative
        [lreg, imm] -> {
                jit_int value1 = ((jit_int *)($2))[0];
                jit_int value2 = ((jit_int *)($2))[1];
@@ -866,7 +866,7 @@
                x86_alu_reg_reg(inst, X86_AND, %1, %2);
        }
 
-JIT_OP_LOR: binary
+JIT_OP_LOR: commutative
        [lreg, imm] -> {
                jit_int value1 = ((jit_int *)($2))[0];
                jit_int value2 = ((jit_int *)($2))[1];
@@ -882,7 +882,7 @@
                x86_alu_reg_reg(inst, X86_OR, %1, %2);
        }
 
-JIT_OP_LXOR: binary
+JIT_OP_LXOR: commutative
        [lreg, imm] -> {
                jit_int value1 = ((jit_int *)($2))[0];
                jit_int value2 = ((jit_int *)($2))[1];




reply via email to

[Prev in Thread] Current Thread [Next in Thread]