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-internal.h jit/jit-f...


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-internal.h jit/jit-f...
Date: Fri, 14 Apr 2006 14:44:29 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Branch:         
Changes by:     Aleksey Demakov <address@hidden>        06/04/14 14:44:29

Modified files:
        .              : ChangeLog 
        jit            : jit-internal.h jit-function.c jit-rules.h 
                         jit-rules-x86.c jit-rules-interp.c 
                         jit-rules-arm.c jit-reg-alloc.c 

Log message:
        add _jit_gen_exch_top and _jit_gen_spill_top functions; add some tracing

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/ChangeLog.diff?tr1=1.216&tr2=1.217&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-internal.h.diff?tr1=1.22&tr2=1.23&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-function.c.diff?tr1=1.18&tr2=1.19&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules.h.diff?tr1=1.11&tr2=1.12&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules-x86.c.diff?tr1=1.30&tr2=1.31&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules-interp.c.diff?tr1=1.24&tr2=1.25&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-rules-arm.c.diff?tr1=1.21&tr2=1.22&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-reg-alloc.c.diff?tr1=1.22&tr2=1.23&r1=text&r2=text

Patches:
Index: libjit/ChangeLog
diff -u libjit/ChangeLog:1.216 libjit/ChangeLog:1.217
--- libjit/ChangeLog:1.216      Fri Apr 14 11:46:05 2006
+++ libjit/ChangeLog    Fri Apr 14 14:44:29 2006
@@ -3,6 +3,18 @@
        * jit/jit-reg-alloc.h, jit/jit-reg-alloc.c: new register allocator
        improved and extended to support stack registers.
 
+       * jit/jit-internal.h (struct _jit_builder): 
+       * jit/jit-function.c (compile_block, jit_function_compile): add
+       some tracing.
+
+       * jit/jit-rules.h:
+       * jit/jit-rules-arm.c:
+       * jit/jit-rules-interp.c: 
+       * jit/jit-rules-x86.c: add _jit_gen_exch_top and _jit_gen_spill_top
+       functions used by new allocator to handle stack registers. Add reg
+       argument to _jit_gen_spill_global and_jit_gen_load_global
+       functions.
+
 2006-04-11  Aleksey Demakov  <address@hidden>
 
        * jit/jit-insn.c (jit_insn_start_catcher): initialize
Index: libjit/jit/jit-function.c
diff -u libjit/jit/jit-function.c:1.18 libjit/jit/jit-function.c:1.19
--- libjit/jit/jit-function.c:1.18      Thu Apr  6 23:42:31 2006
+++ libjit/jit/jit-function.c   Fri Apr 14 14:44:29 2006
@@ -445,10 +445,20 @@
        jit_insn_iter_t iter;
        jit_insn_t insn;
 
+#ifdef _JIT_COMPILE_DEBUG
+       printf("Block: %d\n", func->builder->block_count++);
+#endif
+
        /* Iterate over all blocks in the function */
        jit_insn_iter_init(&iter, block);
        while((insn = jit_insn_iter_next(&iter)) != 0)
        {
+#ifdef _JIT_COMPILE_DEBUG
+               unsigned char *p1, *p2;
+               p1 = gen->posn.ptr;
+               printf("Insn %5d: 0x%04x - ", func->builder->insn_count++, 
insn->opcode);
+#endif
+
                switch(insn->opcode)
                {
                        case JIT_OP_NOP:                break;          /* 
Ignore NOP's */
@@ -482,7 +492,7 @@
                                if(insn->value1->has_global_register)
                                {
                                        insn->value1->in_global_register = 1;
-                                       _jit_gen_load_global(gen, insn->value1);
+                                       _jit_gen_load_global(gen, 
insn->value1->global_reg, insn->value1);
                                }
                                else
                                {
@@ -540,6 +550,11 @@
                        }
                        break;
                }
+
+#ifdef _JIT_COMPILE_DEBUG
+               p2 = gen->posn.ptr;
+               printf("%d\n", p2 - p1);
+#endif
        }
 }
 
@@ -626,6 +641,12 @@
           due to a lack of space in the current method cache page */
        do
        {
+#ifdef _JIT_COMPILE_DEBUG
+               printf("\n*** Start compilation ***\n\n");
+               func->builder->block_count = 0;
+               func->builder->insn_count = 0;
+#endif
+
                /* Start function output to the cache */
                start = _jit_cache_start_method
                        (cache, &(gen.posn), JIT_FUNCTION_ALIGNMENT, func);
Index: libjit/jit/jit-internal.h
diff -u libjit/jit/jit-internal.h:1.22 libjit/jit/jit-internal.h:1.23
--- libjit/jit/jit-internal.h:1.22      Thu Apr  6 23:42:31 2006
+++ libjit/jit/jit-internal.h   Fri Apr 14 14:44:29 2006
@@ -28,6 +28,11 @@
 #endif
 
 /*
+#define _JIT_COMPILE_DEBUG     1
+*/
+
+
+/*
  * Determine what kind of Win32 system we are running on.
  */
 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
@@ -348,6 +353,10 @@
        /* Size of the outgoing parameter area in the frame */
        jit_nint                        param_area_size;
 
+#ifdef _JIT_COMPILE_DEBUG
+       int                             block_count;
+       int                             insn_count;
+#endif
 };
 
 /*
Index: libjit/jit/jit-reg-alloc.c
diff -u libjit/jit/jit-reg-alloc.c:1.22 libjit/jit/jit-reg-alloc.c:1.23
--- libjit/jit/jit-reg-alloc.c:1.22     Fri Apr 14 11:46:05 2006
+++ libjit/jit/jit-reg-alloc.c  Fri Apr 14 14:44:29 2006
@@ -2997,6 +2997,7 @@
        regs->stack_count = 0;
        regs->initial_stack_size = 0;
        regs->current_stack_size = 0;
+       regs->num_exchanges = 0;
 }
 
 void
Index: libjit/jit/jit-rules-arm.c
diff -u libjit/jit/jit-rules-arm.c:1.21 libjit/jit/jit-rules-arm.c:1.22
--- libjit/jit/jit-rules-arm.c:1.21     Sat Feb 18 19:58:10 2006
+++ libjit/jit/jit-rules-arm.c  Fri Apr 14 14:44:29 2006
@@ -761,12 +761,12 @@
        jit_cache_end_output();
 }
 
-void _jit_gen_spill_global(jit_gencode_t gen, jit_value_t value)
+void _jit_gen_spill_global(jit_gencode_t gen, int reg, jit_value_t value)
 {
        /* TODO: Implement if ARM needs it. */
 }
 
-void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value)
+void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value)
 {
        jit_cache_setup_output(32);
        arm_load_membase(inst, _jit_reg_info[value->global_reg].cpu_reg,
@@ -774,6 +774,14 @@
        jit_cache_end_output();
 }
 
+void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop)
+{
+}
+
+void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop)
+{
+}
+
 void _jit_gen_fix_value(jit_value_t value)
 {
        if(!(value->has_frame_offset) && !(value->is_constant))
Index: libjit/jit/jit-rules-interp.c
diff -u libjit/jit/jit-rules-interp.c:1.24 libjit/jit/jit-rules-interp.c:1.25
--- libjit/jit/jit-rules-interp.c:1.24  Sat Feb 18 19:58:10 2006
+++ libjit/jit/jit-rules-interp.c       Fri Apr 14 14:44:29 2006
@@ -914,7 +914,7 @@
  * after it.
  * @end deftypefun
 @*/
-void _jit_gen_spill_global(jit_gencode_t gen, jit_value_t value)
+void _jit_gen_spill_global(jit_gencode_t gen, int reg, jit_value_t value)
 {
        /* Global registers are not used in the interpreted back end */
 }
@@ -927,11 +927,19 @@
  * slots into their global register copies.
  * @end deftypefun
 @*/
-void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value)
+void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value)
 {
        /* Global registers are not used in the interpreted back end */
 }
 
+void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop)
+{
+}
+
+void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop)
+{
+}
+
 /*@
  * @deftypefun void _jit_gen_fix_value (jit_value_t value)
  * Fix the position of a value within the local variable frame.
Index: libjit/jit/jit-rules-x86.c
diff -u libjit/jit/jit-rules-x86.c:1.30 libjit/jit/jit-rules-x86.c:1.31
--- libjit/jit/jit-rules-x86.c:1.30     Mon Feb 20 14:05:03 2006
+++ libjit/jit/jit-rules-x86.c  Fri Apr 14 14:44:29 2006
@@ -768,6 +768,67 @@
 }
 
 void
+_jit_gen_exch_top(jit_gencode_t gen, int reg, int pop)
+{
+       if(IS_FLOAT_REG(reg))
+       {
+               jit_cache_setup_output(2);
+               if(pop)
+               {
+                       x86_fstp(inst, reg - X86_REG_ST0);
+               }
+               else
+               {
+                       x86_fxch(inst, reg - X86_REG_ST0);
+               }
+               jit_cache_end_output();
+       }
+}
+
+void
+_jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int pop)
+{
+       int offset;
+       if(IS_FLOAT_REG(reg))
+       {
+               /* Fix the value in place within the local variable frame */
+               _jit_gen_fix_value(value);
+
+               /* Make sure that we have sufficient space */
+               jit_cache_setup_output(16);
+
+               /* Output an appropriate instruction to spill the value */
+               offset = (int)(value->frame_offset);
+
+               /* Spill the top of the floating-point register stack */
+               switch(jit_type_normalize(value->type)->kind)
+               {
+                       case JIT_TYPE_FLOAT32:
+                       {
+                               x86_fst_membase(inst, X86_EBP, offset, 0, pop);
+                       }
+                       break;
+
+                       case JIT_TYPE_FLOAT64:
+                       {
+                               x86_fst_membase(inst, X86_EBP, offset, 1, pop);
+                       }
+                       break;
+
+                       case JIT_TYPE_NFLOAT:
+                       {
+                               x86_fst80_membase(inst, X86_EBP, offset);
+                               if(!pop)
+                               {
+                                       x86_fld80_membase(inst, X86_EBP, 
offset);
+                               }
+                       }
+                       break;
+               }
+       }
+}
+
+void
 _jit_gen_load_value(jit_gencode_t gen, int reg, int other_reg, jit_value_t 
value)
 {
        jit_type_t type;
@@ -1135,20 +1196,36 @@
        jit_cache_end_output();
 }
 
-void _jit_gen_spill_global(jit_gencode_t gen, jit_value_t value)
+void _jit_gen_spill_global(jit_gencode_t gen, int reg, jit_value_t value)
 {
        jit_cache_setup_output(16);
-       _jit_gen_fix_value(value);
-       x86_mov_membase_reg(inst, X86_EBP, value->frame_offset,
-                           _jit_reg_info[value->global_reg].cpu_reg, 
sizeof(void *));
+       if(value)
+       {
+               _jit_gen_fix_value(value);
+               x86_mov_membase_reg(inst,
+                        X86_EBP, value->frame_offset,
+                       _jit_reg_info[value->global_reg].cpu_reg, sizeof(void 
*));
+       }
+       else
+       {
+               x86_push_reg(inst, _jit_reg_info[reg].cpu_reg);
+       }
        jit_cache_end_output();
 }
 
-void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value)
+void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value)
 {
        jit_cache_setup_output(16);
-       x86_mov_reg_membase(inst, _jit_reg_info[value->global_reg].cpu_reg,
-                                               X86_EBP, value->frame_offset, 
sizeof(void *));
+       if(value)
+       {
+               x86_mov_reg_membase(inst,
+                       _jit_reg_info[value->global_reg].cpu_reg,
+                       X86_EBP, value->frame_offset, sizeof(void *));
+       }
+       else
+       {
+               x86_pop_reg(inst, _jit_reg_info[reg].cpu_reg);
+       }
        jit_cache_end_output();
 }
 
@@ -1502,7 +1579,11 @@
        switch(insn->opcode)
        {
                #define JIT_INCLUDE_RULES
+#if _JIT_NEW_REG_ALLOC
+               #include "jit-rules-x86.inc"
+#else
                #include "jit-rules-x86.slc"
+#endif
                #undef JIT_INCLUDE_RULES
 
                default:
Index: libjit/jit/jit-rules.h
diff -u libjit/jit/jit-rules.h:1.11 libjit/jit/jit-rules.h:1.12
--- libjit/jit/jit-rules.h:1.11 Sat Feb 18 19:58:10 2006
+++ libjit/jit/jit-rules.h      Fri Apr 14 14:44:29 2006
@@ -193,8 +193,10 @@
                                           int other_reg, int value_used);
 void _jit_gen_load_value
        (jit_gencode_t gen, int reg, int other_reg, jit_value_t value);
-void _jit_gen_spill_global(jit_gencode_t gen, jit_value_t value);
-void _jit_gen_load_global(jit_gencode_t gen, jit_value_t value);
+void _jit_gen_spill_global(jit_gencode_t gen, int reg, jit_value_t value);
+void _jit_gen_load_global(jit_gencode_t gen, int reg, jit_value_t value);
+void _jit_gen_exch_top(jit_gencode_t gen, int reg, int pop);
+void _jit_gen_spill_top(jit_gencode_t gen, int reg, jit_value_t value, int 
pop);
 void _jit_gen_fix_value(jit_value_t value);
 void _jit_gen_insn(jit_gencode_t gen, jit_function_t func,
                                   jit_block_t block, jit_insn_t insn);




reply via email to

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