Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r65416:31e55d332904 Date: 2013-07-16 10:32 +0200 http://bitbucket.org/pypy/pypy/changeset/31e55d332904/
Log: A no-branch version of int_abs() diff --git a/rpython/jit/codewriter/support.py b/rpython/jit/codewriter/support.py --- a/rpython/jit/codewriter/support.py +++ b/rpython/jit/codewriter/support.py @@ -7,6 +7,7 @@ from rpython.rlib import rgc from rpython.rlib.jit import elidable, oopspec from rpython.rlib.rarithmetic import r_longlong, r_ulonglong, r_uint, intmask +from rpython.rlib.rarithmetic import LONG_BIT from rpython.rtyper import rlist from rpython.rtyper.annlowlevel import MixLevelHelperAnnotator from rpython.rtyper.extregistry import ExtRegistryEntry @@ -272,10 +273,9 @@ return result def _ll_1_int_abs(x): - if x < 0: - return -x - else: - return x + # this version doesn't branch + mask = x >> (LONG_BIT - 1) + return (x ^ mask) - mask def _ll_1_cast_uint_to_float(x): # XXX on 32-bit platforms, this should be done using cast_longlong_to_float diff --git a/rpython/jit/codewriter/test/test_support.py b/rpython/jit/codewriter/test/test_support.py --- a/rpython/jit/codewriter/test/test_support.py +++ b/rpython/jit/codewriter/test/test_support.py @@ -1,8 +1,9 @@ -import py +import py, sys from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.annlowlevel import llstr from rpython.flowspace.model import Variable, Constant, SpaceOperation from rpython.jit.codewriter.support import decode_builtin_call, LLtypeHelpers +from rpython.jit.codewriter.support import _ll_1_int_abs def newconst(x): return Constant(x, lltype.typeOf(x)) @@ -133,3 +134,12 @@ py.test.raises(IndexError, func, p1, llstr("w")) py.test.raises(AttributeError, func, p1, llstr(None)) py.test.raises(AttributeError, func, llstr(None), p2) + +def test_int_abs(): + assert _ll_1_int_abs(0) == 0 + assert _ll_1_int_abs(1) == 1 + assert _ll_1_int_abs(10) == 10 + assert _ll_1_int_abs(sys.maxint) == sys.maxint + assert _ll_1_int_abs(-1) == 1 + assert _ll_1_int_abs(-10) == 10 + assert _ll_1_int_abs(-sys.maxint) == sys.maxint _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit