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

Reply via email to