Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r78625:27cf9aad1e7d Date: 2015-07-21 14:07 +0200 http://bitbucket.org/pypy/pypy/changeset/27cf9aad1e7d/
Log: Fix for casts from r_longlong to bool on 32-bit diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -1220,6 +1220,15 @@ if longlong_arg and longlong_res: return elif longlong_arg: + if v_result.concretetype is lltype.Bool: + longlong_zero = rffi.cast(v_arg.concretetype, 0) + c_longlong_zero = Constant(longlong_zero, v_arg.concretetype) + if unsigned1: + name = 'ullong_ne' + else: + name = 'llong_ne' + op1 = SpaceOperation(name, [v_arg, c_longlong_zero], v_result) + return self.rewrite_operation(op1) v = varoftype(lltype.Signed) op1 = self.rewrite_operation( SpaceOperation('truncate_longlong_to_int', [v_arg], v) diff --git a/rpython/jit/codewriter/test/test_flatten.py b/rpython/jit/codewriter/test/test_flatten.py --- a/rpython/jit/codewriter/test/test_flatten.py +++ b/rpython/jit/codewriter/test/test_flatten.py @@ -789,6 +789,7 @@ (rffi.LONG, rffi.UCHAR, "int_and %i0, $255 -> %i1"), (rffi.LONG, rffi.SHORT, "int_signext %i0, $2 -> %i1"), (rffi.LONG, rffi.USHORT, "int_and %i0, $65535 -> %i1"), + (rffi.LONG, lltype.Bool, "int_is_true %i0 -> %i1"), (rffi.LONG, rffi.LONG, ""), (rffi.LONG, rffi.ULONG, ""), @@ -796,7 +797,7 @@ (rffi.ULONG, rffi.UCHAR, "int_and %i0, $255 -> %i1"), (rffi.ULONG, rffi.SHORT, "int_signext %i0, $2 -> %i1"), (rffi.ULONG, rffi.USHORT, "int_and %i0, $65535 -> %i1"), - (rffi.LONG, lltype.Bool, "int_is_true %i0 -> %i1"), + (rffi.ULONG, lltype.Bool, "int_is_true %i0 -> %i1"), (rffi.ULONG, rffi.LONG, ""), (rffi.ULONG, rffi.ULONG, ""), ]: @@ -818,8 +819,15 @@ FROM = rffi.LONGLONG else: FROM = rffi.ULONGLONG - expected.insert(0, - "residual_call_irf_i $<* fn llong_to_int>, I[], R[], F[%f0], <Descr> -> %i0") + if TO == lltype.Bool: + prefix = 'u' if FROM == rffi.ULONGLONG else '' + expected = [ + "residual_call_irf_i $<* fn %sllong_ne>, I[], R[], F[%%f0, $0L], <Descr> -> %%i0" % prefix, + "int_return %i0", + ] + else: + expected.insert(0, + "residual_call_irf_i $<* fn llong_to_int>, I[], R[], F[%f0], <Descr> -> %i0") expectedstr = '\n'.join(expected) self.encoding_test(f, [rffi.cast(FROM, 42)], expectedstr, transform=True) diff --git a/rpython/jit/metainterp/test/test_longlong.py b/rpython/jit/metainterp/test/test_longlong.py --- a/rpython/jit/metainterp/test/test_longlong.py +++ b/rpython/jit/metainterp/test/test_longlong.py @@ -1,4 +1,5 @@ import py, sys +from rpython.rtyper.lltypesystem import lltype from rpython.rlib.rarithmetic import r_longlong, r_ulonglong, r_uint, intmask from rpython.jit.metainterp.test.support import LLJitMixin @@ -228,6 +229,20 @@ res = self.interp_operations(f, [0x56789ABC]) assert intmask(res) == intmask(0xABC00000) + def test_cast_longlong_to_bool(self): + def f(n): + m = r_longlong(n) << 20 + return lltype.cast_primitive(lltype.Bool, m) + res = self.interp_operations(f, [2**12]) + assert res == 1 + + def test_cast_ulonglong_to_bool(self): + def f(n): + m = r_ulonglong(n) << 20 + return lltype.cast_primitive(lltype.Bool, m) + res = self.interp_operations(f, [2**12]) + assert res == 1 + class TestLLtype(LongLongTests, LLJitMixin): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit