Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit