[pypy-svn] pypy jit-longlong: Finish the first set of operations in the codewriter.
arigo
commits-noreply at bitbucket.org
Fri Jan 7 11:48:14 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40446:a02e00903fdc
Date: 2011-01-07 11:40 +0100
http://bitbucket.org/pypy/pypy/changeset/a02e00903fdc/
Log: Finish the first set of operations in the codewriter.
diff --git a/pypy/jit/codewriter/test/test_longlong.py b/pypy/jit/codewriter/test/test_longlong.py
--- a/pypy/jit/codewriter/test/test_longlong.py
+++ b/pypy/jit/codewriter/test/test_longlong.py
@@ -39,20 +39,22 @@
tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
[op1] = tr.rewrite_operation(op)
#
- def is_ll(TYPE):
+ def is_llf(TYPE):
return (TYPE == lltype.SignedLongLong or
- TYPE == lltype.UnsignedLongLong)
- assert [ARG for ARG in ARGS if is_ll(ARG)]
- if is_ll(RESULT):
+ TYPE == lltype.UnsignedLongLong or
+ TYPE == lltype.Float)
+ if is_llf(RESULT):
assert op1.opname == 'residual_call_irf_f'
else:
assert op1.opname == 'residual_call_irf_i'
gotindex = getattr(EffectInfo, 'OS_' + op1.args[0].value.upper())
assert gotindex == oopspecindex
assert op1.args[1] == 'calldescr-%d' % oopspecindex
- assert list(op1.args[2]) == []
+ assert list(op1.args[2]) == [v for v in vlist
+ if not is_llf(v.concretetype)]
assert list(op1.args[3]) == []
- assert list(op1.args[4]) == vlist
+ assert list(op1.args[4]) == [v for v in vlist
+ if is_llf(v.concretetype)]
assert op1.result == v_result
def test_is_true(self):
@@ -115,27 +117,28 @@
T = lltype.SignedLongLong
self.do_check(opname, oopspecindex, [T, T], T)
+ def test_shifts(self):
+ for opname, oopspecindex in [
+ ('llong_lshift', EffectInfo.OS_LLONG_LSHIFT),
+ ('llong_rshift', EffectInfo.OS_LLONG_RSHIFT),
+ ('ullong_lshift', EffectInfo.OS_LLONG_LSHIFT),
+ ('ullong_rshift', EffectInfo.OS_LLONG_URSHIFT),
+ ]:
+ if opname.startswith('u'):
+ T = lltype.UnsignedLongLong
+ else:
+ T = lltype.SignedLongLong
+ self.do_check(opname, oopspecindex, [T, lltype.Signed], T)
-
-## ('llong_lshift', EffectInfo.OS_LLONG_LSHIFT),
-## ('', EffectInfo.OS_LLONG_RSHIFT),
-
-
-## 'llong_lshift': LLOp(canfold=True),
-## 'llong_rshift': LLOp(canfold=True),
-
-## 'ullong_lshift': LLOp(canfold=True),
-## 'ullong_rshift': LLOp(canfold=True),
-
-## ]:
-
-
-
-## ('', EffectInfo.OS_LLONG_FROM_INT),
-## ('', EffectInfo.OS_LLONG_TO_INT),
-## ('', EffectInfo.OS_LLONG_FROM_FLOAT),
-## ('', EffectInfo.OS_LLONG_TO_FLOAT),
-
+ def test_casts(self):
+ self.do_check('cast_int_to_longlong', EffectInfo.OS_LLONG_FROM_INT,
+ [lltype.Signed], lltype.SignedLongLong)
+ self.do_check('truncate_longlong_to_int', EffectInfo.OS_LLONG_TO_INT,
+ [lltype.SignedLongLong], lltype.Signed)
+ self.do_check('cast_float_to_longlong', EffectInfo.OS_LLONG_FROM_FLOAT,
+ [lltype.Float], lltype.SignedLongLong)
+ self.do_check('cast_longlong_to_float', EffectInfo.OS_LLONG_TO_FLOAT,
+ [lltype.SignedLongLong], lltype.Float)
def test_prebuilt_constant_32(self):
c_x = const(r_longlong(-171))
diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py
--- a/pypy/jit/codewriter/support.py
+++ b/pypy/jit/codewriter/support.py
@@ -19,7 +19,7 @@
from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
from pypy.jit.metainterp.typesystem import deref
from pypy.rlib import rgc
-from pypy.rlib.rarithmetic import r_longlong, r_ulonglong
+from pypy.rlib.rarithmetic import r_longlong, r_ulonglong, intmask
from pypy.rlib.longlong2float import longlong2float, float2longlong
def getargtypes(annotator, values):
@@ -327,10 +327,37 @@
z = x ^ y
return longlong2float(z)
+def _ll_2_llong_lshift(xf, y):
+ x = float2longlong(xf)
+ z = x << y
+ return longlong2float(z)
+
+def _ll_2_llong_rshift(xf, y):
+ x = float2longlong(xf)
+ z = x >> y
+ return longlong2float(z)
+
+def _ll_2_llong_urshift(xf, y):
+ x = float2longlong(xf)
+ z = r_ulonglong(x) >> y
+ return longlong2float(r_longlong(z))
+
def _ll_1_llong_from_int(x):
y = r_longlong(x)
return longlong2float(y)
+def _ll_1_llong_to_int(xf):
+ x = float2longlong(xf)
+ return intmask(x)
+
+def _ll_1_llong_from_float(xf):
+ y = r_longlong(xf)
+ return longlong2float(y)
+
+def _ll_1_llong_to_float(xf):
+ x = float2longlong(xf)
+ return float(x)
+
# libffi support
# --------------
diff --git a/pypy/jit/codewriter/effectinfo.py b/pypy/jit/codewriter/effectinfo.py
--- a/pypy/jit/codewriter/effectinfo.py
+++ b/pypy/jit/codewriter/effectinfo.py
@@ -72,6 +72,7 @@
OS_LLONG_ULE = 89
OS_LLONG_UGT = 90
OS_LLONG_UGE = 91
+ OS_LLONG_URSHIFT = 92
def __new__(cls, readonly_descrs_fields,
write_descrs_fields, write_descrs_arrays,
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -833,6 +833,14 @@
('ullong_and', 'AND'),
('ullong_or', 'OR'),
('ullong_xor', 'XOR'),
+ ('llong_lshift', 'LSHIFT'),
+ ('llong_rshift', 'RSHIFT'),
+ ('ullong_lshift', 'LSHIFT'),
+ ('ullong_rshift', 'URSHIFT'),
+ ('cast_int_to_longlong', 'FROM_INT'),
+ ('truncate_longlong_to_int', 'TO_INT'),
+ ('cast_float_to_longlong', 'FROM_FLOAT'),
+ ('cast_longlong_to_float', 'TO_FLOAT'),
]:
exec py.code.Source('''
def rewrite_op_%s(self, op):
More information about the Pypy-commit
mailing list