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: Tue, 02 Jan 2007 17:00:18 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Changes by:     Aleksey Demakov <avd>   07/01/02 17:00:18

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

Log message:
        handle early_clobber flag for dest value;
        apply patch #5540 with some modifications;

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.289&r2=1.290
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-reg-alloc.c?cvsroot=dotgnu-pnet&r1=1.48&r2=1.49
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.26&r2=1.27

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.289
retrieving revision 1.290
diff -u -b -r1.289 -r1.290
--- ChangeLog   29 Dec 2006 23:16:15 -0000      1.289
+++ ChangeLog   2 Jan 2007 17:00:18 -0000       1.290
@@ -1,3 +1,11 @@
+2007-01-02  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-rules-x86.ins: add JIT_OP_IMIN_UN rule (based on the
+         patch #5540 by Kirill Kononenko).
+
+       * jit/jit-reg-alloc.c (set_regdesc_value, set_regdesc_register)
+       (choose_output_register): handle EARLY_CLOBBER flag for dest value.
+
 2006-12-30  Aleksey Demakov  <address@hidden>
 
        * jit/jit-reg-class.c, jit/jit-reg-class.h, jit/Makefile.am: add

Index: jit/jit-reg-alloc.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-reg-alloc.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -b -r1.48 -r1.49
--- jit/jit-reg-alloc.c 29 Dec 2006 23:16:15 -0000      1.48
+++ jit/jit-reg-alloc.c 2 Jan 2007 17:00:18 -0000       1.49
@@ -528,18 +528,8 @@
 
        desc = &regs->descs[index];
        desc->value = value;
-       if(index > 0 || regs->ternary)
-       {
-               if((flags & _JIT_REGS_EARLY_CLOBBER) != 0)
-               {
-                       desc->clobber = 1;
-                       desc->early_clobber = 1;
-               }
-               else if((flags & _JIT_REGS_CLOBBER) != 0)
-               {
-                       desc->clobber = 1;
-               }
-       }
+       desc->clobber = ((flags & (_JIT_REGS_CLOBBER | 
_JIT_REGS_EARLY_CLOBBER)) != 0);
+       desc->early_clobber = ((flags & _JIT_REGS_EARLY_CLOBBER) != 0);
        desc->regclass = regclass;
        desc->live = live;
        desc->used = used;
@@ -551,24 +541,23 @@
 static void
 set_regdesc_register(jit_gencode_t gen, _jit_regs_t *regs, int index, int reg, 
int other_reg)
 {
-       int is_output;
-
+       int assign;
        if(reg >= 0)
        {
-               is_output = (index == 0 && !regs->ternary);
+               assign = (index > 0 || regs->ternary || 
regs->descs[0].early_clobber);
 
                regs->descs[index].reg = reg;
                regs->descs[index].other_reg = other_reg;
 
                jit_reg_set_used(gen->touched, reg);
-               if(!is_output)
+               if(assign)
                {
                        jit_reg_set_used(regs->assigned, reg);
                }
                if(other_reg >= 0)
                {
                        jit_reg_set_used(gen->touched, other_reg);
-                       if(!is_output)
+                       if(assign)
                        {
                                jit_reg_set_used(regs->assigned, other_reg);
                        }
@@ -1107,6 +1096,18 @@
                        }
                        if(regs->free_dest)
                        {
+                               if(regs->descs[0].early_clobber
+                                  && regs->descs[0].value->in_global_register)
+                               {
+                                       if(regs->descs[0].value == 
regs->descs[1].value)
+                                       {
+                                               continue;
+                                       }
+                                       if(regs->descs[0].value == 
regs->descs[2].value)
+                                       {
+                                               continue;
+                                       }
+                               }
                                use_cost = 0;
                        }
                        else if(regs->descs[0].value->in_global_register)
@@ -1144,6 +1145,21 @@
                        }
                        if(regs->free_dest)
                        {
+                               if(regs->descs[0].early_clobber)
+                               {
+                                       if(regs->descs[1].value
+                                          && regs->descs[1].value->in_register
+                                          && regs->descs[1].value->reg == reg)
+                                       {
+                                               continue;
+                                       }
+                                       if(regs->descs[2].value
+                                          && regs->descs[2].value->in_register
+                                          && regs->descs[2].value->reg == reg)
+                                       {
+                                               continue;
+                                       }
+                               }
                                use_cost = 0;
                        }
                        else if(regs->descs[1].value
@@ -1386,12 +1402,14 @@
                        {
                                continue;
                        }
-#if !ALLOW_CLOBBER_GLOBAL
                        if(other_reg >= 0 && jit_reg_is_used(gen->permanent, 
other_reg))
                        {
+#if ALLOW_CLOBBER_GLOBAL
+                               use_cost += COST_CLOBBER_GLOBAL;
+#else
                                continue;
-                       }
 #endif
+                       }
                        if(jit_reg_is_used(regs->clobber, reg)
                           || (other_reg >= 0 && jit_reg_is_used(regs->clobber, 
other_reg)))
                        {
@@ -1401,12 +1419,6 @@
                        {
                                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))
-                       {
-                               use_cost += COST_CLOBBER_GLOBAL;
-                       }
-#endif
                }
 
                if(use_cost < suitable_cost

Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- jit/jit-rules-x86.ins       29 Dec 2006 23:16:15 -0000      1.26
+++ jit/jit-rules-x86.ins       2 Jan 2007 17:00:18 -0000       1.27
@@ -1284,6 +1284,14 @@
                x86_fabs(inst);
        }
 
+JIT_OP_IMIN_UN:
+       [=+reg, +reg, reg] -> {
+               x86_alu_reg_reg(inst, X86_SUB, $2, $3);
+               x86_alu_reg_reg(inst, X86_SBB, $1, $1);
+               x86_alu_reg_reg(inst, X86_AND, $1, $2);
+               x86_alu_reg_reg(inst, X86_ADD, $1, $3);
+       }
+
 JIT_OP_ISIGN:
        [=reg, imm] -> {
                if($2 < 0)




reply via email to

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