[Top][All Lists]
[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: |
Sun, 26 Nov 2006 12:05:02 +0000 |
CVSROOT: /sources/dotgnu-pnet
Module name: libjit
Changes by: Aleksey Demakov <avd> 06/11/26 12:05:02
Modified files:
. : ChangeLog
jit : jit-reg-alloc.c jit-rules-x86.ins
Log message:
fix global register use cost computation;
mark a few x86 instruction selection rules as commutative;
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.280&r2=1.281
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-reg-alloc.c?cvsroot=dotgnu-pnet&r1=1.45&r2=1.46
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.21&r2=1.22
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.280
retrieving revision 1.281
diff -u -b -r1.280 -r1.281
--- ChangeLog 25 Nov 2006 14:43:10 -0000 1.280
+++ ChangeLog 26 Nov 2006 12:05:02 -0000 1.281
@@ -1,3 +1,12 @@
+2006-11-26 Aleksey Demakov <address@hidden>
+
+ * jit/jit-reg-alloc.c (choose_output_register): fix global register
+ use cost computation.
+
+ * jit/jit-rules-x86.ins: mark as commutative JIT_OP_IADD,
+ JIT_OP_IMUL, JIT_OP_LADD, JIT_OP_IAND, JIT_OP_IOR, JIT_OP_IXOR,
+ JIT_OP_LAND, JIT_OP_LOR, JIT_OP_XOR rules.
+
2006-11-25 Aleksey Demakov <address@hidden>
* jit/jit-reg-alloc.c (exch_stack_top, free_value): fix freeing
Index: jit/jit-reg-alloc.c
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-reg-alloc.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -b -r1.45 -r1.46
--- jit/jit-reg-alloc.c 25 Nov 2006 14:43:10 -0000 1.45
+++ jit/jit-reg-alloc.c 26 Nov 2006 12:05:02 -0000 1.46
@@ -984,7 +984,7 @@
choose_scratch_register(jit_gencode_t gen, _jit_regs_t *regs, int index)
{
int reg, type;
- int use_cost, spill_cost;
+ int use_cost;
int suitable_reg;
int suitable_cost;
int suitable_age;
@@ -1042,14 +1042,15 @@
use_cost += COST_THRASH;
}
- spill_cost = compute_spill_cost(gen, regs, reg, -1);
+ use_cost += compute_spill_cost(gen, regs, reg, -1);
- if((use_cost + spill_cost) < suitable_cost
- || (spill_cost > 0 && (use_cost + spill_cost) ==
suitable_cost
+ if(use_cost < suitable_cost
+ || (use_cost == suitable_cost
+ && gen->contents[reg].num_values > 0
&& gen->contents[reg].age < suitable_age))
{
suitable_reg = reg;
- suitable_cost = use_cost + spill_cost;
+ suitable_cost = use_cost;
suitable_age = gen->contents[reg].age;
}
}
@@ -1068,7 +1069,7 @@
{
int type, need_pair;
int reg, other_reg;
- int use_cost, spill_cost;
+ int use_cost;
int suitable_reg, suitable_other_reg;
int suitable_cost;
int suitable_age;
@@ -1112,45 +1113,62 @@
other_reg = -1;
}
- /* It is not allowed to assign an output value to a global
register
- unless it is the very value the global register contains. */
if(jit_reg_is_used(gen->permanent, reg))
{
- if(regs->descs[0].value->has_global_register
- && regs->descs[0].value->global_reg == reg)
+ if(!regs->descs[0].value->has_global_register
+ || regs->descs[0].value->global_reg != reg)
+ {
+ /* It is not allowed to assign an output value
to a global
+ register unless it is the very value the
global register
+ contains. */
+ continue;
+ }
+ if(regs->free_dest)
{
use_cost = 0;
}
- else
+ else if(regs->descs[0].value->in_global_register)
{
- continue;
+ if(regs->descs[0].value == regs->descs[1].value)
+ {
+ use_cost = 0;
}
+ else if(regs->descs[0].value ==
regs->descs[2].value)
+ {
+ if(regs->commutative)
+ {
+ use_cost = 0;
}
else
{
- if(other_reg >= 0 && jit_reg_is_used(gen->permanent,
other_reg))
- {
continue;
}
- if(regs->descs[0].value->has_global_register)
+ }
+ else
{
- use_cost = COST_GLOBAL_BIAS;
+ use_cost = COST_COPY;
+ }
}
else
{
- use_cost = 0;
+ use_cost = COST_COPY;
}
}
-
+ else
+ {
+ if(other_reg >= 0 && jit_reg_is_used(gen->permanent,
other_reg))
+ {
+ continue;
+ }
if(regs->free_dest)
{
- /* noop */
+ use_cost = 0;
}
else if(regs->descs[1].value
&& regs->descs[1].value->in_register
&& regs->descs[1].value->reg == reg)
{
- /* noop */
+ use_cost = 0;
}
else if(regs->descs[2].value
&& regs->descs[2].value->in_register
@@ -1158,27 +1176,33 @@
{
if(regs->commutative || regs->x87_arith)
{
- /* noop */
+ use_cost = 0;
}
else
{
- use_cost += COST_THRASH;
+ use_cost = COST_THRASH;
}
}
else
{
- use_cost += COST_COPY;
+ use_cost = COST_COPY;
+ }
+ if(regs->descs[0].value->has_global_register)
+ {
+ use_cost += COST_GLOBAL_BIAS;
+ }
}
- spill_cost = compute_spill_cost(gen, regs, reg, other_reg);
+ use_cost += compute_spill_cost(gen, regs, reg, other_reg);
- if((use_cost + spill_cost) < suitable_cost
- || (spill_cost > 0 && (use_cost + spill_cost) ==
suitable_cost
+ if(use_cost < suitable_cost
+ || (use_cost == suitable_cost
+ && gen->contents[reg].num_values > 0
&& gen->contents[reg].age < suitable_age))
{
suitable_reg = reg;
suitable_other_reg = other_reg;
- suitable_cost = use_cost + spill_cost;
+ suitable_cost = use_cost;
suitable_age = gen->contents[reg].age;
}
}
@@ -1281,7 +1305,7 @@
_jit_regdesc_t *desc2;
int type, need_pair;
int reg, other_reg;
- int use_cost, spill_cost;
+ int use_cost;
int suitable_reg, suitable_other_reg;
int suitable_cost;
int suitable_age;
@@ -1394,32 +1418,29 @@
if(jit_reg_is_used(regs->clobber, reg)
|| (other_reg >= 0 && jit_reg_is_used(regs->clobber,
other_reg)))
{
- spill_cost = 0;
+ /* noop */
}
else
{
- spill_cost = compute_spill_cost(gen, regs, reg,
other_reg);
+ 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))
{
- spill_cost += COST_CLOBBER_GLOBAL;
+ use_cost += COST_CLOBBER_GLOBAL;
}
#endif
}
- else
- {
- spill_cost = 0;
- }
- if((use_cost + spill_cost) < suitable_cost
- || (spill_cost > 0 && (use_cost + spill_cost) ==
suitable_cost
+ if(use_cost < suitable_cost
+ || (use_cost == suitable_cost
+ && gen->contents[reg].num_values > 0
&& gen->contents[reg].age < suitable_age))
{
/* This is the oldest suitable register of this type */
suitable_reg = reg;
suitable_other_reg = other_reg;
- suitable_cost = use_cost + spill_cost;
+ suitable_cost = use_cost;
suitable_age = gen->contents[reg].age;
}
}
Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /sources/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- jit/jit-rules-x86.ins 25 Nov 2006 15:41:53 -0000 1.21
+++ jit/jit-rules-x86.ins 26 Nov 2006 12:05:02 -0000 1.22
@@ -213,7 +213,7 @@
* Arithmetic opcodes.
*/
-JIT_OP_IADD: binary
+JIT_OP_IADD: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_ADD, $1, $2);
}
@@ -235,7 +235,7 @@
x86_alu_reg_reg(inst, X86_SUB, $1, $2);
}
-JIT_OP_IMUL: binary
+JIT_OP_IMUL: commutative
[reg, imm] -> {
/* Handle special cases of immediate multiplies */
switch($2)
@@ -674,7 +674,7 @@
x86_neg_reg(inst, $1);
}
-JIT_OP_LADD: binary
+JIT_OP_LADD: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
@@ -788,7 +788,7 @@
* Bitwise opcodes.
*/
-JIT_OP_IAND: binary
+JIT_OP_IAND: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_AND, $1, $2);
}
@@ -799,7 +799,7 @@
x86_alu_reg_reg(inst, X86_AND, $1, $2);
}
-JIT_OP_IOR: binary
+JIT_OP_IOR: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_OR, $1, $2);
}
@@ -810,7 +810,7 @@
x86_alu_reg_reg(inst, X86_OR, $1, $2);
}
-JIT_OP_IXOR: binary
+JIT_OP_IXOR: commutative
[reg, imm] -> {
x86_alu_reg_imm(inst, X86_XOR, $1, $2);
}
@@ -850,7 +850,7 @@
inst = shift_reg(inst, X86_SHR, $1, $2);
}
-JIT_OP_LAND: binary
+JIT_OP_LAND: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
@@ -866,7 +866,7 @@
x86_alu_reg_reg(inst, X86_AND, %1, %2);
}
-JIT_OP_LOR: binary
+JIT_OP_LOR: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
@@ -882,7 +882,7 @@
x86_alu_reg_reg(inst, X86_OR, %1, %2);
}
-JIT_OP_LXOR: binary
+JIT_OP_LXOR: commutative
[lreg, imm] -> {
jit_int value1 = ((jit_int *)($2))[0];
jit_int value2 = ((jit_int *)($2))[1];
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [dotgnu-pnet-commits] libjit ChangeLog jit/jit-reg-alloc.c jit/jit-ru...,
Aleksey Demakov <=