]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
fix problem with global registers and commutative ops
authorAleksey Demakov <ademakov@gmail.com>
Sun, 6 Jul 2008 09:07:18 +0000 (09:07 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Sun, 6 Jul 2008 09:07:18 +0000 (09:07 +0000)
ChangeLog
jit/jit-reg-alloc.c

index 66a9f56d3efb98990e16c1b7396c3563acd5817e..f2549018f4c9c21e112ca661b37f5487b899f434 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-07-06  Juan Jesus Garcia de Soria  <juanj.g_soria@grupobbva.com>
+
+       * jit/jit-reg-alloc.c (choose_input_order): take into account global
+       registers to see if it is suitable to exchange input values. This
+       fixes a problem that took place when a commutative op is applied to
+       a value that resides in a global register and is both the dest and
+       the second source value of the op.
+
 2008-05-30  Aleksey Demakov  <ademakov@gmail.com>
 
        * include/jit/jit-common.h: remove unused jit_function_compiled_t
index 1394aa4f970a3a8f6c88c732815766f8a239fa53..4f46098034b63af91be0d29d399ab2350ccfc5a6 100644 (file)
@@ -1219,6 +1219,8 @@ choose_output_register(jit_gencode_t gen, _jit_regs_t *regs)
                                {
                                        if(regs->commutative)
                                        {
+                                               /* This depends on choose_input_order()
+                                                  doing its job on the next step. */
                                                use_cost = 0;
                                        }
                                        else
@@ -1273,11 +1275,15 @@ choose_output_register(jit_gencode_t gen, _jit_regs_t *regs)
                        {
                                if(regs->commutative)
                                {
+                                       /* This depends on choose_input_order()
+                                          doing its job on the next step. */
                                        use_cost = 0;
                                }
 #ifdef JIT_REG_STACK
                                else if(regs->reversible && regs->no_pop)
                                {
+                                       /* This depends on choose_input_order()
+                                          doing its job on the next step. */
                                        use_cost = 0;
                                }
 #endif
@@ -1336,10 +1342,14 @@ choose_output_register(jit_gencode_t gen, _jit_regs_t *regs)
 static void
 choose_input_order(jit_gencode_t gen, _jit_regs_t *regs)
 {
-       if(regs->descs[2].value
-          && regs->descs[2].value->in_register
-          && regs->descs[2].value->reg == regs->descs[0].reg
-          && regs->descs[2].value != regs->descs[1].value)
+       jit_value_t value;
+
+       value = regs->descs[2].value;
+       if(value && value != regs->descs[1].value
+          && ((value->in_register
+               && value->reg == regs->descs[0].reg)
+              || (value->in_global_register
+                  && value->global_reg == regs->descs[0].reg)))
        {
 #ifdef JIT_REG_STACK
                if(regs->reversible && regs->no_pop)