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-rules-x86.c


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-rules-x86.c
Date: Mon, 30 Jan 2006 11:35:02 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Branch:         
Changes by:     Aleksey Demakov <address@hidden>        06/01/30 11:35:02

Modified files:
        .              : ChangeLog 
        jit            : jit-rules-x86.c 

Log message:
        optimize _jit_gen_load_value and allow to move a value from one 
register to another

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/ChangeLog.diff?tr1=1.196&tr2=1.197&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules-x86.c.diff?tr1=1.27&tr2=1.28&r1=text&r2=text

Patches:
Index: libjit/ChangeLog
diff -u libjit/ChangeLog:1.196 libjit/ChangeLog:1.197
--- libjit/ChangeLog:1.196      Sun Jan 15 06:53:05 2006
+++ libjit/ChangeLog    Mon Jan 30 11:35:01 2006
@@ -1,3 +1,8 @@
+2006-01-30  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-rules-x86.c (_jit_gen_load_value): optimize loading
+       of zero constants. Allow to move a value from one register to
+       another.
 
 2006-01-15  Rhys Weatherley  <address@hidden>
 
Index: libjit/jit/jit-rules-x86.c
diff -u libjit/jit/jit-rules-x86.c:1.27 libjit/jit/jit-rules-x86.c:1.28
--- libjit/jit/jit-rules-x86.c:1.27     Tue Jan 10 21:03:44 2006
+++ libjit/jit/jit-rules-x86.c  Mon Jan 30 11:35:02 2006
@@ -760,19 +760,30 @@
        }
 }
 
-void _jit_gen_load_value
-       (jit_gencode_t gen, int reg, int other_reg, jit_value_t value)
+static int
+fp_stack_index(jit_gencode_t gen, int reg)
 {
+       int top = gen->stack_map[X86_REG_ST0];
+       return top - reg;
+}
+
+void
+_jit_gen_load_value(jit_gencode_t gen, int reg, int other_reg, jit_value_t 
value)
+{
+       jit_type_t type;
+       int src_reg, other_src_reg;
        void *ptr;
        int offset;
 
        /* Make sure that we have sufficient space */
        jit_cache_setup_output(16);
 
+       type = jit_type_normalize(value->type);
+
+       /* Load zero */
        if(value->is_constant)
        {
-               /* Determine the type of constant to be loaded */
-               switch(jit_type_normalize(value->type)->kind)
+               switch(type->kind)
                {
                        case JIT_TYPE_SBYTE:
                        case JIT_TYPE_UBYTE:
@@ -781,8 +792,15 @@
                        case JIT_TYPE_INT:
                        case JIT_TYPE_UINT:
                        {
-                               x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                               
(jit_nint)(value->address));
+                               if((jit_nint)(value->address) == 0)
+                               {
+                                       x86_clear_reg(inst, 
_jit_reg_info[reg].cpu_reg);
+                               }
+                               else
+                               {
+                                       x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
+                                                       
(jit_nint)(value->address));
+                               }
                        }
                        break;
 
@@ -791,15 +809,27 @@
                        {
                                jit_long long_value;
                                long_value = jit_value_get_long_constant(value);
-                       #ifdef JIT_NATIVE_INT64
-                               x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                               
(jit_nint)long_value);
-                       #else
-                               x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                               
(jit_int)long_value);
-                               x86_mov_reg_imm(inst, 
_jit_reg_info[other_reg].cpu_reg,
-                                                               
(jit_int)(long_value >> 32));
-                       #endif
+                               if(long_value == 0)
+                               {
+#ifdef JIT_NATIVE_INT64
+                                       x86_clear_reg(inst, 
_jit_reg_info[reg].cpu_reg);
+#else
+                                       x86_clear_reg(inst, 
_jit_reg_info[reg].cpu_reg);
+                                       x86_clear_reg(inst, 
_jit_reg_info[other_reg].cpu_reg);
+#endif
+                               }
+                               else
+                               {
+#ifdef JIT_NATIVE_INT64
+                                       x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
+                                                       (jit_nint)long_value);
+#else
+                                       x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
+                                                       (jit_int)long_value);
+                                       x86_mov_reg_imm(inst, 
_jit_reg_info[other_reg].cpu_reg,
+                                                       (jit_int)(long_value >> 
32));
+#endif
+                               }
                        }
                        break;
 
@@ -807,21 +837,27 @@
                        {
                                jit_float32 float32_value;
                                float32_value = 
jit_value_get_float32_constant(value);
-                               if(!jit_cache_check_for_n(&(gen->posn), 32))
-                               {
-                                       jit_cache_mark_full(&(gen->posn));
-                                       return;
-                               }
                                if(IS_WORD_REG(reg))
                                {
                                        x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                       
((jit_int *)&float32_value)[0]);
+                                                       ((jit_int 
*)&float32_value)[0]);
                                }
                                else
                                {
-                                       ptr = _jit_cache_alloc(&(gen->posn), 
sizeof(jit_float32));
-                                       jit_memcpy(ptr, &float32_value, 
sizeof(float32_value));
-                                       x86_fld(inst, ptr, 0);
+                                       if(float32_value == (jit_float32) 0.0)
+                                       {
+                                               x86_fldz(inst);
+                                       }
+                                       else if(float32_value == (jit_float32) 
1.0)
+                                       {
+                                               x86_fld1(inst);
+                                       }
+                                       else
+                                       {
+                                               ptr = 
_jit_cache_alloc(&(gen->posn), sizeof(jit_float32));
+                                               jit_memcpy(ptr, &float32_value, 
sizeof(float32_value));
+                                               x86_fld(inst, ptr, 0);
+                                       }
                                }
                        }
                        break;
@@ -830,23 +866,29 @@
                        {
                                jit_float64 float64_value;
                                float64_value = 
jit_value_get_float64_constant(value);
-                               if(!jit_cache_check_for_n(&(gen->posn), 32))
-                               {
-                                       jit_cache_mark_full(&(gen->posn));
-                                       return;
-                               }
                                if(IS_WORD_REG(reg))
                                {
                                        x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                       
((jit_int *)&float64_value)[0]);
+                                                       ((jit_int 
*)&float64_value)[0]);
                                        x86_mov_reg_imm(inst, 
_jit_reg_info[other_reg].cpu_reg,
-                                                                       
((jit_int *)&float64_value)[1]);
+                                                       ((jit_int 
*)&float64_value)[1]);
                                }
                                else
                                {
-                                       ptr = _jit_cache_alloc(&(gen->posn), 
sizeof(jit_float64));
-                                       jit_memcpy(ptr, &float64_value, 
sizeof(float64_value));
-                                       x86_fld(inst, ptr, 1);
+                                       if(float64_value == (jit_float64) 0.0)
+                                       {
+                                               x86_fldz(inst);
+                                       }
+                                       else if(float64_value == (jit_float64) 
1.0)
+                                       {
+                                               x86_fld1(inst);
+                                       }
+                                       else
+                                       {
+                                               ptr = 
_jit_cache_alloc(&(gen->posn), sizeof(jit_float64));
+                                               jit_memcpy(ptr, &float64_value, 
sizeof(float64_value));
+                                               x86_fld(inst, ptr, 1);
+                                       }
                                }
                        }
                        break;
@@ -855,42 +897,127 @@
                        {
                                jit_nfloat nfloat_value;
                                nfloat_value = 
jit_value_get_nfloat_constant(value);
-                               if(!jit_cache_check_for_n(&(gen->posn), 32))
-                               {
-                                       jit_cache_mark_full(&(gen->posn));
-                                       return;
-                               }
-                               if(IS_WORD_REG(reg) &&
-                                  sizeof(jit_nfloat) == sizeof(jit_float64))
+                               if(IS_WORD_REG(reg) && sizeof(jit_nfloat) == 
sizeof(jit_float64))
                                {
                                        x86_mov_reg_imm(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                       
((jit_int *)&nfloat_value)[0]);
+                                                       ((jit_int 
*)&nfloat_value)[0]);
                                        x86_mov_reg_imm(inst, 
_jit_reg_info[other_reg].cpu_reg,
-                                                                       
((jit_int *)&nfloat_value)[1]);
+                                                       ((jit_int 
*)&nfloat_value)[1]);
                                }
                                else
                                {
-                                       ptr = _jit_cache_alloc(&(gen->posn), 
sizeof(jit_nfloat));
-                                       jit_memcpy(ptr, &nfloat_value, 
sizeof(nfloat_value));
-                                       if(sizeof(jit_nfloat) != 
sizeof(jit_float64))
+                                       if(nfloat_value == (jit_nfloat) 0.0)
                                        {
-                                               x86_fld80_mem(inst, ptr);
+                                               x86_fldz(inst);
+                                       }
+                                       else if(nfloat_value == (jit_nfloat) 
1.0)
+                                       {
+                                               x86_fld1(inst);
                                        }
                                        else
                                        {
-                                               x86_fld(inst, ptr, 1);
+                                               ptr = 
_jit_cache_alloc(&(gen->posn), sizeof(jit_nfloat));
+                                               jit_memcpy(ptr, &nfloat_value, 
sizeof(nfloat_value));
+                                               if(sizeof(jit_nfloat) == 
sizeof(jit_float64))
+                                               {
+                                                       x86_fld(inst, ptr, 1);
+                                               }
+                                               else
+                                               {
+                                                       x86_fld80_mem(inst, 
ptr);
+                                               }
                                        }
                                }
                        }
                        break;
                }
        }
-       else if(value->has_global_register)
+       else if(value->in_register || value->in_global_register)
        {
-               /* Load the value out of a global register */
-               x86_mov_reg_reg(inst, _jit_reg_info[reg].cpu_reg,
-                                               
_jit_reg_info[value->global_reg].cpu_reg,
-                                               sizeof(void *));
+               if(value->in_register)
+               {
+                       src_reg = value->reg;
+                       if(other_reg >= 0)
+                       {
+                               other_src_reg = 
_jit_reg_info[src_reg].other_reg;
+                       }
+               }
+               else
+               {
+                       src_reg = value->global_reg;
+                       other_src_reg = -1;
+               }
+
+               switch(type->kind)
+               {
+#if 0
+                       case JIT_TYPE_SBYTE:
+                       {
+                               x86_widen_reg(inst, _jit_reg_info[reg].cpu_reg,
+                                             _jit_reg_info[src_reg].cpu_reg, 
1, 0);
+                       }
+                       break;
+
+                       case JIT_TYPE_UBYTE:
+                       {
+                               x86_widen_reg(inst, _jit_reg_info[reg].cpu_reg,
+                                             _jit_reg_info[src_reg].cpu_reg, 
0, 0);
+                       }
+                       break;
+
+                       case JIT_TYPE_SHORT:
+                       {
+                               x86_widen_reg(inst, _jit_reg_info[reg].cpu_reg,
+                                             _jit_reg_info[src_reg].cpu_reg, 
1, 1);
+                       }
+                       break;
+
+                       case JIT_TYPE_USHORT:
+                       {
+                               x86_widen_reg(inst, _jit_reg_info[reg].cpu_reg,
+                                             _jit_reg_info[src_reg].cpu_reg, 
0, 1);
+                       }
+                       break;
+#else
+                       case JIT_TYPE_SBYTE:
+                       case JIT_TYPE_UBYTE:
+                       case JIT_TYPE_SHORT:
+                       case JIT_TYPE_USHORT:
+#endif
+                       case JIT_TYPE_INT:
+                       case JIT_TYPE_UINT:
+                       {
+                               x86_mov_reg_reg(inst, 
_jit_reg_info[reg].cpu_reg,
+                                               _jit_reg_info[src_reg].cpu_reg, 
4);
+                       }
+                       break;
+
+                       case JIT_TYPE_LONG:
+                       case JIT_TYPE_ULONG:
+                       {
+#ifdef JIT_NATIVE_INT64
+                               x86_mov_reg_reg(inst, 
_jit_reg_info[reg].cpu_reg,
+                                               _jit_reg_info[src_reg].cpu_reg, 
8);
+#else
+                               x86_mov_reg_reg(inst, 
_jit_reg_info[reg].cpu_reg,
+                                               _jit_reg_info[src_reg].cpu_reg, 
4);
+                               x86_mov_reg_reg(inst, 
_jit_reg_info[other_reg].cpu_reg,
+                                               
_jit_reg_info[other_src_reg].cpu_reg, 4);
+#endif
+                       }
+                       break;
+
+                       case JIT_TYPE_FLOAT32:
+                       case JIT_TYPE_FLOAT64:
+                       case JIT_TYPE_NFLOAT:
+                       {
+                               if(!IS_WORD_REG(reg))
+                               {
+                                       x86_fld_reg(inst, fp_stack_index(gen, 
src_reg));
+                               }
+                       }
+                       break;
+               }
        }
        else
        {
@@ -899,33 +1026,33 @@
                offset = (int)(value->frame_offset);
 
                /* Load the value into the specified register */
-               switch(jit_type_normalize(value->type)->kind)
+               switch(type->kind)
                {
                        case JIT_TYPE_SBYTE:
                        {
                                x86_widen_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                 X86_EBP, 
offset, 1, 0);
+                                                 X86_EBP, offset, 1, 0);
                        }
                        break;
 
                        case JIT_TYPE_UBYTE:
                        {
                                x86_widen_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                 X86_EBP, 
offset, 0, 0);
+                                                 X86_EBP, offset, 0, 0);
                        }
                        break;
 
                        case JIT_TYPE_SHORT:
                        {
                                x86_widen_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                 X86_EBP, 
offset, 1, 1);
+                                                 X86_EBP, offset, 1, 1);
                        }
                        break;
 
                        case JIT_TYPE_USHORT:
                        {
                                x86_widen_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                 X86_EBP, 
offset, 0, 1);
+                                                 X86_EBP, offset, 0, 1);
                        }
                        break;
 
@@ -933,22 +1060,22 @@
                        case JIT_TYPE_UINT:
                        {
                                x86_mov_reg_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                       
X86_EBP, offset, 4);
+                                                   X86_EBP, offset, 4);
                        }
                        break;
 
                        case JIT_TYPE_LONG:
                        case JIT_TYPE_ULONG:
                        {
-                       #ifdef JIT_NATIVE_INT64
+#ifdef JIT_NATIVE_INT64
                                x86_mov_reg_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                       
X86_EBP, offset, 8);
-                       #else
+                                                   X86_EBP, offset, 8);
+#else
                                x86_mov_reg_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                       
X86_EBP, offset, 4);
+                                                   X86_EBP, offset, 4);
                                x86_mov_reg_membase(inst, 
_jit_reg_info[other_reg].cpu_reg,
-                                                                       
X86_EBP, offset + 4, 4);
-                       #endif
+                                                   X86_EBP, offset + 4, 4);
+#endif
                        }
                        break;
 
@@ -957,7 +1084,7 @@
                                if(IS_WORD_REG(reg))
                                {
                                        x86_mov_reg_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                               
X86_EBP, offset, 4);
+                                                           X86_EBP, offset, 4);
                                }
                                else
                                {
@@ -971,9 +1098,9 @@
                                if(IS_WORD_REG(reg))
                                {
                                        x86_mov_reg_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                               
X86_EBP, offset, 4);
+                                                           X86_EBP, offset, 4);
                                        x86_mov_reg_membase(inst, 
_jit_reg_info[other_reg].cpu_reg,
-                                                                               
X86_EBP, offset + 4, 4);
+                                                           X86_EBP, offset + 
4, 4);
                                }
                                else
                                {
@@ -984,13 +1111,12 @@
 
                        case JIT_TYPE_NFLOAT:
                        {
-                               if(IS_WORD_REG(reg) &&
-                                  sizeof(jit_nfloat) == sizeof(jit_float64))
+                               if(IS_WORD_REG(reg) && sizeof(jit_nfloat) == 
sizeof(jit_float64))
                                {
                                        x86_mov_reg_membase(inst, 
_jit_reg_info[reg].cpu_reg,
-                                                                               
X86_EBP, offset, 4);
+                                                           X86_EBP, offset, 4);
                                        x86_mov_reg_membase(inst, 
_jit_reg_info[other_reg].cpu_reg,
-                                                                               
X86_EBP, offset + 4, 4);
+                                                           X86_EBP, offset + 
4, 4);
                                }
                                else if(sizeof(jit_nfloat) == 
sizeof(jit_float64))
                                {




reply via email to

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