[pypy-svn] r67526 - in pypy/trunk/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Sat Sep 5 17:21:42 CEST 2009
Author: arigo
Date: Sat Sep 5 17:21:38 2009
New Revision: 67526
Added:
pypy/trunk/pypy/jit/metainterp/test/test_executor.py (contents, props changed)
Modified:
pypy/trunk/pypy/jit/metainterp/executor.py
pypy/trunk/pypy/jit/metainterp/history.py
pypy/trunk/pypy/jit/metainterp/policy.py
pypy/trunk/pypy/jit/metainterp/resoperation.py
Log:
Port r66735: the minimum for floats - boxes and a few operations.
Modified: pypy/trunk/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/executor.py (original)
+++ pypy/trunk/pypy/jit/metainterp/executor.py Sat Sep 5 17:21:38 2009
@@ -7,7 +7,7 @@
from pypy.rpython.lltypesystem.lloperation import llop
from pypy.rlib.rarithmetic import ovfcheck, r_uint, intmask
from pypy.jit.metainterp.history import BoxInt, ConstInt, check_descr
-from pypy.jit.metainterp.history import INT, REF
+from pypy.jit.metainterp.history import INT, REF, ConstFloat
from pypy.jit.metainterp.resoperation import rop
@@ -218,6 +218,44 @@
cpu._overflow_flag = ovf
return BoxInt(z)
+# ----------
+
+def do_float_neg(cpu, args, descr=None):
+ return ConstFloat(-args[0].getfloat())
+
+def do_float_is_true(cpu, args, descr=None):
+ return ConstInt(bool(args[0].getfloat()))
+
+def do_float_add(cpu, args, descr=None):
+ return ConstFloat(args[0].getfloat() + args[1].getfloat())
+
+def do_float_sub(cpu, args, descr=None):
+ return ConstFloat(args[0].getfloat() - args[1].getfloat())
+
+def do_float_mul(cpu, args, descr=None):
+ return ConstFloat(args[0].getfloat() * args[1].getfloat())
+
+def do_float_truediv(cpu, args, descr=None):
+ return ConstFloat(args[0].getfloat() / args[1].getfloat())
+
+def do_float_lt(cpu, args, descr=None):
+ return ConstInt(args[0].getfloat() < args[1].getfloat())
+
+def do_float_le(cpu, args, descr=None):
+ return ConstInt(args[0].getfloat() <= args[1].getfloat())
+
+def do_float_eq(cpu, args, descr=None):
+ return ConstInt(args[0].getfloat() == args[1].getfloat())
+
+def do_float_ne(cpu, args, descr=None):
+ return ConstInt(args[0].getfloat() != args[1].getfloat())
+
+def do_float_gt(cpu, args, descr=None):
+ return ConstInt(args[0].getfloat() > args[1].getfloat())
+
+def do_float_ge(cpu, args, descr=None):
+ return ConstInt(args[0].getfloat() >= args[1].getfloat())
+
# ____________________________________________________________
def do_debug_merge_point(cpu, args, descr=None):
Modified: pypy/trunk/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/history.py (original)
+++ pypy/trunk/pypy/jit/metainterp/history.py Sat Sep 5 17:21:38 2009
@@ -16,13 +16,16 @@
# ____________________________________________________________
-INT = 'i'
-REF = 'r'
+INT = 'i'
+REF = 'r'
+FLOAT = 'f'
-def getkind(TYPE):
+def getkind(TYPE, supports_floats=False):
if TYPE is lltype.Void:
return "void"
elif isinstance(TYPE, lltype.Primitive):
+ if TYPE is lltype.Float and supports_floats:
+ return 'float'
if TYPE in (lltype.Float, lltype.SingleFloat):
raise NotImplementedError("type %s not supported" % TYPE)
# XXX fix this for oo...
@@ -79,6 +82,9 @@
def getint(self):
raise NotImplementedError
+ def getfloat(self):
+ raise NotImplementedError
+
def getref_base(self):
raise NotImplementedError
@@ -276,6 +282,38 @@
def repr_rpython(self):
return repr_rpython(self, 'ca')
+class ConstFloat(Const):
+ type = FLOAT
+ value = 0.0
+ _attrs_ = ('value',)
+
+ def __init__(self, floatval):
+ assert isinstance(floatval, float)
+ self.value = floatval
+
+ def clonebox(self):
+ return BoxFloat(self.value)
+
+ nonconstbox = clonebox
+
+ def getfloat(self):
+ return self.value
+
+ def _get_hash_(self):
+ return hash(self.value)
+
+ def set_future_value(self, cpu, j):
+ cpu.set_future_value_float(j, self.getfloat())
+
+ def equals(self, other):
+ return self.value == other.getfloat()
+
+ def _getrepr_(self):
+ return self.value
+
+ def repr_rpython(self):
+ return repr_rpython(self, 'cf')
+
class ConstPtr(Const):
type = REF
value = lltype.nullptr(llmemory.GCREF.TO)
@@ -468,6 +506,40 @@
changevalue_int = __init__
+class BoxFloat(Box):
+ type = FLOAT
+ _attrs_ = ('value',)
+
+ def __init__(self, floatval=0.0):
+ assert isinstance(floatval, float)
+ self.value = floatval
+
+ def clonebox(self):
+ return BoxFloat(self.value)
+
+ def constbox(self):
+ return ConstFloat(self.value)
+
+ def getfloat(self):
+ return self.value
+
+ def _get_hash_(self):
+ return hash(self.value)
+
+ def set_future_value(self, cpu, j):
+ cpu.set_future_value_float(j, self.value)
+
+ def _getrepr_(self):
+ return self.value
+
+ def repr_rpython(self):
+ return repr_rpython(self, 'bf')
+
+ def changevalue_box(self, srcbox):
+ self.changevalue_float(srcbox.getfloat())
+
+ changevalue_float = __init__
+
class BoxPtr(Box):
type = REF
_attrs_ = ('value',)
Modified: pypy/trunk/pypy/jit/metainterp/policy.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/policy.py (original)
+++ pypy/trunk/pypy/jit/metainterp/policy.py Sat Sep 5 17:21:38 2009
@@ -3,6 +3,7 @@
from pypy.rpython.lltypesystem import lltype
class JitPolicy(object):
+ supports_floats = False # patched to True if supported by the backend
def look_inside_function(self, func):
if hasattr(func, '_look_inside_me_'):
@@ -23,7 +24,9 @@
see_function = True
else:
see_function = self.look_inside_function(func)
- return see_function and not contains_unsupported_variable_type(graph)
+ return (see_function and
+ not contains_unsupported_variable_type(graph,
+ self.supports_floats))
def graphs_from(self, op):
if op.opname == 'direct_call':
@@ -73,16 +76,16 @@
return 'residual'
return 'regular'
-def contains_unsupported_variable_type(graph):
+def contains_unsupported_variable_type(graph, supports_floats):
getkind = history.getkind
try:
for block in graph.iterblocks():
for v in block.inputargs:
- getkind(v.concretetype)
+ getkind(v.concretetype, supports_floats)
for op in block.operations:
for v in op.args:
- getkind(v.concretetype)
- getkind(op.result.concretetype)
+ getkind(v.concretetype, supports_floats)
+ getkind(op.result.concretetype, supports_floats)
except NotImplementedError, e:
history.log.WARNING('%s, ignoring graph' % (e,))
history.log.WARNING(' %s' % (graph,))
Modified: pypy/trunk/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/resoperation.py (original)
+++ pypy/trunk/pypy/jit/metainterp/resoperation.py Sat Sep 5 17:21:38 2009
@@ -138,6 +138,10 @@
'INT_RSHIFT',
'INT_LSHIFT',
'UINT_RSHIFT',
+ 'FLOAT_ADD',
+ 'FLOAT_SUB',
+ 'FLOAT_MUL',
+ 'FLOAT_TRUEDIV',
#
'_COMPARISON_FIRST',
'INT_LT',
Added: pypy/trunk/pypy/jit/metainterp/test/test_executor.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/metainterp/test/test_executor.py Sat Sep 5 17:21:38 2009
@@ -0,0 +1,26 @@
+from pypy.jit.metainterp.executor import make_execute_list, execute
+from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.history import BoxInt, ConstInt
+from pypy.jit.metainterp.history import BoxFloat, ConstFloat
+from pypy.jit.backend.model import AbstractCPU
+
+
+class FakeCPU(AbstractCPU):
+ pass
+make_execute_list(FakeCPU)
+
+
+def test_int_ops():
+ box = execute(FakeCPU(), rop.INT_ADD, [BoxInt(40), ConstInt(2)])
+ assert box.value == 42
+
+def test_float_ops():
+ cpu = FakeCPU()
+ box = execute(cpu, rop.FLOAT_ADD, [BoxFloat(40.5), ConstFloat(2.25)])
+ assert box.value == 42.75
+ box = execute(cpu, rop.FLOAT_SUB, [BoxFloat(40.5), ConstFloat(2.25)])
+ assert box.value == 38.25
+ box = execute(cpu, rop.FLOAT_MUL, [BoxFloat(40.5), ConstFloat(2.25)])
+ assert box.value == 91.125
+ box = execute(cpu, rop.FLOAT_TRUEDIV, [BoxFloat(10.125), ConstFloat(2.25)])
+ assert box.value == 4.5
More information about the Pypy-commit
mailing list