[pypy-svn] pypy jit-longlong: Remove constants of type (Un)signedLongLong.
arigo
commits-noreply at bitbucket.org
Fri Jan 7 11:00:38 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40440:80408b4bf193
Date: 2011-01-07 10:56 +0100
http://bitbucket.org/pypy/pypy/changeset/80408b4bf193/
Log: Remove constants of type (Un)signedLongLong.
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
@@ -22,8 +22,8 @@
return False
class FakeCPU:
- def __init__(self, supports_longlong):
- self.supports_longlong = supports_longlong
+ def __init__(self):
+ self.supports_longlong = []
self.rtyper = FakeRTyper()
@@ -36,8 +36,8 @@
vlist = [varoftype(ARG) for ARG in ARGS]
v_result = varoftype(RESULT)
op = SpaceOperation(opname, vlist, v_result)
- tr = Transformer(FakeCPU([]), FakeBuiltinCallControl())
- op1 = tr.rewrite_operation(op)
+ tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+ [op1] = tr.rewrite_operation(op)
#
def is_ll(TYPE):
return (TYPE == lltype.SignedLongLong or
@@ -61,7 +61,7 @@
[lltype.SignedLongLong], lltype.Bool)
## def test_unary_op(self):
-## tr = Transformer(FakeCPU([]), FakeBuiltinCallControl())
+## tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
## for opname, oopspecindex in [
## ('llong_neg', EffectInfo.OS_LLONG_NEG),
## ('llong_invert', EffectInfo.OS_LLONG_INVERT),
@@ -84,7 +84,7 @@
[lltype.UnsignedLongLong, lltype.UnsignedLongLong],
lltype.UnsignedLongLong)
-## tr = Transformer(FakeCPU([]), FakeBuiltinCallControl())
+## tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
## for opname, oopspecindex in [
## ('llong_add', EffectInfo.OS_LLONG_ADD),
## ('llong_sub', EffectInfo.OS_LLONG_SUB),
@@ -158,14 +158,26 @@
## ('', EffectInfo.OS_LLONG_TO_FLOAT),
-## def test_prebuilt_constant_32(self):
-## c_x = const(r_longlong(-171))
-## op = SpaceOperation('foobar', [c_x], None)
-## oplist = Transformer(FakeCPU(['foobar'])).rewrite_operation(op)
-## assert len(oplist) == 2
-## assert oplist[0].opname == 'cast_int_to_longlong'
-## assert oplist[0].args == [c_x]
-## v = oplist[0].result
-## assert isinstance(v, Variable)
-## assert oplist[1].opname == 'foobar'
-## assert oplist[1].args == [v]
+ def test_prebuilt_constant_32(self):
+ c_x = const(r_longlong(-171))
+ v_y = varoftype(lltype.SignedLongLong)
+ v_z = varoftype(lltype.SignedLongLong)
+ op = SpaceOperation('llong_add', [c_x, v_y], v_z)
+ tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+ oplist = tr.rewrite_operation(op)
+ assert len(oplist) == 2
+ assert oplist[0].opname == 'residual_call_irf_f'
+ assert oplist[0].args[0].value == 'llong_from_int'
+ assert oplist[0].args[1] == 'calldescr-84'
+ assert list(oplist[0].args[2]) == [const(-171)]
+ assert list(oplist[0].args[3]) == []
+ assert list(oplist[0].args[4]) == []
+ v_x = oplist[0].result
+ assert isinstance(v_x, Variable)
+ assert oplist[1].opname == 'residual_call_irf_f'
+ assert oplist[1].args[0].value == 'llong_add'
+ assert oplist[1].args[1] == 'calldescr-70'
+ assert list(oplist[1].args[2]) == []
+ assert list(oplist[1].args[3]) == []
+ assert list(oplist[1].args[4]) == [v_x, v_y]
+ assert oplist[1].result == v_z
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
@@ -237,6 +237,10 @@
z = x + y
return longlong2float(z)
+def _ll_1_llong_from_int(x):
+ xf = r_longlong(x)
+ return longlong2float(xf)
+
# libffi support
# --------------
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
@@ -783,14 +783,39 @@
# and unsupported ones are turned into a call to a function from
# jit.codewriter.support.
+ @staticmethod
+ def _is_longlong(TYPE):
+ return TYPE == lltype.SignedLongLong or TYPE == lltype.UnsignedLongLong
+
+ def _remove_longlong_constants(self, args, oplist):
+ for i in range(len(args)):
+ if (isinstance(args[i], Constant) and
+ self._is_longlong(args[i].concretetype)):
+ v_x = varoftype(args[i].concretetype)
+ value = args[i].value
+ assert -2147483648 <= value <= 2147483647 # XXX!
+ c_x = Constant(int(value), lltype.Signed)
+ op0 = SpaceOperation('llong_from_int', [c_x], v_x)
+ op1 = self.prepare_builtin_call(op0, "llong_from_int", [c_x])
+ op2 = self._handle_oopspec_call(op1, [c_x],
+ EffectInfo.OS_LLONG_FROM_INT)
+ oplist.append(op2)
+ args = args[:]
+ args[i] = v_x
+ return args
+
for _op in ['is_true',
'add',
]:
exec py.code.Source('''
def rewrite_op_llong_%s(self, op):
- op1 = self.prepare_builtin_call(op, "llong_%s", op.args)
- return self._handle_oopspec_call(op1, op.args,
- EffectInfo.OS_LLONG_%s)
+ oplist = []
+ args = self._remove_longlong_constants(op.args, oplist)
+ op1 = self.prepare_builtin_call(op, "llong_%s", args)
+ op2 = self._handle_oopspec_call(op1, args,
+ EffectInfo.OS_LLONG_%s)
+ oplist.append(op2)
+ return oplist
rewrite_op_ullong_%s = rewrite_op_llong_%s
''' % (_op, _op, _op.upper(), _op, _op)).compile()
More information about the Pypy-commit
mailing list