From ae6101f66234068f67c86ef5bbfa8edf0379ae39 Mon Sep 17 00:00:00 2001 From: pcpa Date: Wed, 25 Sep 2013 00:30:42 -0300 Subject: [PATCH] IA64: Correct some wrong checks value range checks. * lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c: Correct some off by one range checks (that were only accepting values one less than the maximum allowed) and an invalid test condition check that was forcing it to always use indirect jumps even when reachable with an immediate displacement. --- ChangeLog | 9 +++++++++ lib/jit_ia64-cpu.c | 24 ++++++++++++------------ lib/jit_ia64-fpu.c | 4 ++-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1ea6cc17d..034cb0759 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2013-10-25 Paulo Andrade + + * lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c: Correct some + off by one range checks (that were only accepting values + one less than the maximum allowed) and an invalid test + condition check that was forcing it to always use + indirect jumps even when reachable with an immediate + displacement. + 2013-10-24 Paulo Andrade * lib/jit_aarch64-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c, diff --git a/lib/jit_ia64-cpu.c b/lib/jit_ia64-cpu.c index abc969947..ae197ea6b 100644 --- a/lib/jit_ia64-cpu.c +++ b/lib/jit_ia64-cpu.c @@ -2139,7 +2139,7 @@ _A3(jit_state_t *_jit, jit_word_t _p, assert(!(x4 & ~0xfL)); assert(!(x2 & ~0x3L)); assert(!(r3 & ~0x7fL)); - assert(im >= -128 && im < 127); + assert(im >= -128 && im <= 127); assert(!(r1 & ~0x7f)); TSTREG1(r3); TSTPRED(_p); @@ -2156,7 +2156,7 @@ _A4(jit_state_t *_jit, jit_word_t _p, assert(!(_p & ~0x3fL)); assert(!(x2 & ~0x3L)); assert(!(r3 & ~0x7fL)); - assert(im >= -8192 && im < 8191); + assert(im >= -8192 && im <= 8191); assert(!(r1 & ~0x7f)); TSTREG1(r3); TSTPRED(_p); @@ -2173,7 +2173,7 @@ _A5(jit_state_t *_jit, jit_word_t _p, jit_word_t s, i5, i9, i7; assert(!(_p & ~0x3fL)); assert(!(r3 & ~0x3L)); - assert(im >= -2097152 && im < 2097151); + assert(im >= -2097152 && im <= 2097151); assert(!(r1 & ~0x7fL)); /* imm22 = sign_ext(s << 21 | imm5c << 16 | imm9d << 7 | imm7b, 22) */ s = (im & 0x200000) >> 21; @@ -2810,7 +2810,7 @@ _M3(jit_state_t *_jit, jit_word_t _p, assert(!(x6 & ~0x3fL)); assert(!(ht & ~0x3L)); assert(!(r3 & ~0x7fL)); - assert(im > -256 && im < 255); + assert(im > -256 && im <= 255); assert(!(r1 & ~0x7fL)); TSTREG1(r3); TSTPRED(_p); @@ -2830,7 +2830,7 @@ _M5(jit_state_t *_jit, jit_word_t _p, assert(!(ht & ~0x3L)); assert(!(r3 & ~0x7fL)); assert(!(r2 & ~0x7fL)); - assert(im > -256 && im < 255); + assert(im > -256 && im <= 255); TSTREG2(r2, r3); TSTPRED(_p); inst((5L<<37)|(((im>>8)&1L)<<36)|(x6<<30)|(ht<<28)| @@ -3261,7 +3261,7 @@ _B1(jit_state_t *_jit, jit_word_t _p, assert(!(_p & ~0x3fL)); assert(!(d & ~0x1L)); assert(!(wh & ~0x3L)); - assert(im >= -1048576 && im < 1048575); + assert(im >= -1048576 && im <= 1048575); assert(!(p & ~0x1L)); assert(!(tp & ~0x7L)); TSTPRED(_p); @@ -3276,7 +3276,7 @@ _B3(jit_state_t *_jit, jit_word_t _p, assert(!(_p & ~0x3fL)); assert(!(d & ~0x1L)); assert(!(wh & ~0x3L)); - assert(im >= -1048576 && im < 1048575); + assert(im >= -1048576 && im <= 1048575); assert(!(p & ~0x1L)); assert(!(b & ~0x3L)); TSTPRED(_p); @@ -3371,7 +3371,7 @@ _X1(jit_state_t *_jit, jit_word_t _p, { jit_word_t i41, i1, i20; assert(!(_p & ~0x3fL)); - assert(im > -0x2000000000000000 && im < 0x1fffffffffffffff); + assert(im > -0x2000000000000000 && im <= 0x1fffffffffffffff); i41 = (im >> 22) & 0x1ffffffffffL; i1 = (im >> 21) & 0x1L; i20 = im & 0xfffffL; @@ -3429,7 +3429,7 @@ _X5(jit_state_t *_jit, jit_word_t _p, { jit_word_t i41, i1, i20; assert(!(_p & ~0x3fL)); - assert(im > -0x2000000000000000 && im < 0x1fffffffffffffff); + assert(im > -0x2000000000000000 && im <= 0x1fffffffffffffff); i41 = (im >> 22) & 0x1ffffffffffL; i1 = (im >> 21) & 0x1L; i20 = im & 0xfffffL; @@ -3455,7 +3455,7 @@ _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0) if (r0 >= 120) r0 = _jitc->rout + (r0 - 120); - if (i0 >= -2097152 && i0 < 2097151) + if (i0 >= -2097152 && i0 <= 2097151) MOVI(r0, i0); else MOVL(r0, i0); @@ -3477,7 +3477,7 @@ _addi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0) jit_int32_t reg; if (i0 >= -8192 && i0 <= 8191) ADDS(r0, i0, r1); - else if (!(r1 & ~3) && i0 >= -2097152 && i0 < 2097151) + else if (!(r1 & ~3) && i0 >= -2097152 && i0 <= 2097151) ADDL(r1, i0, r0); else { reg = jit_get_reg(jit_class_gpr); @@ -5061,7 +5061,7 @@ _jmpi(jit_state_t *_jit, jit_word_t i0) jit_word_t d; sync(); d = ((jit_word_t)i0 - _jit->pc.w) >> 4; - if (d < -16777216 && d > 16777215) + if (d >= -16777216 && d <= 16777215) BRI(d); else BRL(d); diff --git a/lib/jit_ia64-fpu.c b/lib/jit_ia64-fpu.c index ee6c5eec5..f902df13f 100644 --- a/lib/jit_ia64-fpu.c +++ b/lib/jit_ia64-fpu.c @@ -740,7 +740,7 @@ _M8(jit_state_t *_jit, jit_word_t _p, assert(!(x6 & ~0x3fL)); assert(!(ht & ~0x3L)); assert(!(r3 & ~0x7fL)); - assert(im > -256 && im < 255); + assert(im > -256 && im <= 255); assert(!(f1 & ~0x7fL)); TSTREG1(r3); TSTPRED(_p); @@ -776,7 +776,7 @@ _M10(jit_state_t *_jit, jit_word_t _p, assert(!(ht & ~0x3L)); assert(!(r3 & ~0x7fL)); assert(!(f2 & ~0x7fL)); - assert(im > -256 && im < 255); + assert(im > -256 && im <= 255); TSTREG1(r3); TSTFREG1(f2); TSTPRED(_p);