From: Aleksey Demakov Date: Thu, 6 Jul 2006 12:04:07 +0000 (+0000) Subject: fix division by power of two X-Git-Tag: before.move.to.git~224 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=5a5513281fe61003415c09a56df13c37b16cfc6e;p=francis%2Flibjit.git fix division by power of two --- diff --git a/ChangeLog b/ChangeLog index 78bcf61..0792140 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2006-07-06 Aleksey Demakov + + * jit/jit-rules-x86.ins: fix division by power of two. + 2006-07-05 Aleksey Demakov * configure.in: make new register allocator the default. diff --git a/jit/jit-rules-x86.ins b/jit/jit-rules-x86.ins index d6d73cb..81838be 100644 --- a/jit/jit-rules-x86.ins +++ b/jit/jit-rules-x86.ins @@ -554,8 +554,8 @@ JIT_OP_IDIV: more_space } [reg, imm, if("(((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; - for(shift = 0, value = $2; value; value >>= 1) + jit_nuint shift, value = $2 >> 1; + for(shift = 0; value; value >>= 1) { ++shift; } @@ -594,12 +594,12 @@ JIT_OP_IDIV_UN: more_space } [reg, imm, if("(((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; - for(shift = 0, value = $2; value; value >>= 1) + jit_nuint shift, value = $2 >> 1; + for(shift = 0; value; value >>= 1) { ++shift; } - x86_shift_reg_imm(inst, X86_SAR, $1, shift); + x86_shift_reg_imm(inst, X86_SHR, $1, shift); } [reg("eax"), imm, scratch("?", "edx")] -> { x86_mov_reg_imm(inst, $3, $2);