[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