[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-internal.h jit/jit-f...,
Aleksey Demakov <=