[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dotgnu-pnet-commits] libjit ChangeLog jit/jit-rules-x86.ins
From: |
Klaus Treichel |
Subject: |
[dotgnu-pnet-commits] libjit ChangeLog jit/jit-rules-x86.ins |
Date: |
Sat, 29 Mar 2008 18:45:25 +0000 |
CVSROOT: /cvsroot/dotgnu-pnet
Module name: libjit
Changes by: Klaus Treichel <ktreichel> 08/03/29 18:45:25
Modified files:
. : ChangeLog
jit : jit-rules-x86.ins
Log message:
Fix signed division of a negative value by a positive power of two on
x86.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libjit/ChangeLog?cvsroot=dotgnu-pnet&r1=1.355&r2=1.356
http://cvs.savannah.gnu.org/viewcvs/libjit/jit/jit-rules-x86.ins?cvsroot=dotgnu-pnet&r1=1.33&r2=1.34
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/libjit/ChangeLog,v
retrieving revision 1.355
retrieving revision 1.356
diff -u -b -r1.355 -r1.356
--- ChangeLog 29 Mar 2008 15:01:36 -0000 1.355
+++ ChangeLog 29 Mar 2008 18:45:24 -0000 1.356
@@ -1,3 +1,8 @@
+2008-03-29 Klaus treichel <address@hidden>
+
+ * jit/jit-rules-x86.ins: Fix signed division of negative values by a
+ constant positive power of two.
+
2008-03-29 Klaus Treichel <address@hidden>
* jit/jit-apply.c, tools/gen-apply.c: changes to apply needed for
Index: jit/jit-rules-x86.ins
===================================================================
RCS file: /cvsroot/dotgnu-pnet/libjit/jit/jit-rules-x86.ins,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- jit/jit-rules-x86.ins 24 Jan 2008 20:12:53 -0000 1.33
+++ jit/jit-rules-x86.ins 29 Mar 2008 18:45:25 -0000 1.34
@@ -584,13 +584,26 @@
x86_patch(patch, inst);
x86_neg_reg(inst, $1);
}
- [reg, imm, if("(((jit_nuint)$2) & (((jit_nuint)$2) - 1)) == 0")] -> {
+ [reg, imm, scratch reg, if("$2 == 2")] -> {
+ x86_mov_reg_reg(inst, $3, $1, 4);
+ x86_shift_reg_imm(inst, X86_SHR, $3, 0x1f);
+ x86_alu_reg_reg(inst, X86_ADD, $1, $3);
+ x86_shift_reg_imm(inst, X86_SAR, $1, 1);
+ }
+ [reg, imm, scratch reg, if("($2 > 0) && (((jit_nuint)$2) &
(((jit_nuint)$2) - 1)) == 0")] -> {
/* x & (x - 1) is equal to zero if x is a power of 2 */
- jit_nuint shift, value = $2 >> 1;
+ /* This code is generated by gcc for pentium. */
+ /* We use this code because cmov is not available on all i386
cpus */
+ jit_nuint shift, temp, value = $2 >> 1;
for(shift = 0; value; value >>= 1)
{
++shift;
}
+ temp = 32 - shift;
+ x86_mov_reg_reg(inst, $3, $1, 4);
+ x86_shift_reg_imm(inst, X86_SAR, $3, 0x1f);
+ x86_shift_reg_imm(inst, X86_SHR, $3, temp);
+ x86_alu_reg_reg(inst, X86_ADD, $1, $3);
x86_shift_reg_imm(inst, X86_SAR, $1, shift);
}
[reg("eax"), imm, scratch reg, scratch reg("edx")] -> {
- [dotgnu-pnet-commits] libjit ChangeLog jit/jit-rules-x86.ins,
Klaus Treichel <=