[pypy-svn] pypy arm-backed-float: start using longlong representation for floats

bivab commits-noreply at bitbucket.org
Wed Mar 30 17:31:35 CEST 2011


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backed-float
Changeset: r43020:b296af1b90d0
Date: 2011-03-30 15:31 +0200
http://bitbucket.org/pypy/pypy/changeset/b296af1b90d0/

Log:	start using longlong representation for floats

diff --git a/pypy/jit/backend/arm/assembler.py b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -8,6 +8,7 @@
 from pypy.jit.backend.llsupport.regalloc import compute_vars_longevity, TempBox
 from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
 from pypy.jit.backend.model import CompiledLoopToken
+from pypy.jit.codewriter import longlong
 from pypy.jit.metainterp.history import (Const, ConstInt, ConstPtr,
                                         BoxInt, BoxPtr, AbstractFailDescr,
                                         INT, REF, FLOAT)
@@ -58,7 +59,7 @@
     def __init__(self, cpu, failargs_limit=1000):
         self.cpu = cpu
         self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
-        self.fail_boxes_float = values_array(lltype.Float, failargs_limit)
+        self.fail_boxes_float = values_array(longlong.FLOATSTORAGE, failargs_limit)
         self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
         self.fail_boxes_count = 0
         self.fail_force_index = 0
@@ -162,7 +163,7 @@
             elif group == self.REF_TYPE:
                 self.fail_boxes_ptr.setitem(fail_index, rffi.cast(llmemory.GCREF, value))
             elif group == self.FLOAT_TYPE:
-                self.fail_boxes_float.setitem(fail_index, rffi.cast(lltype.Float, value))
+                self.fail_boxes_float.setitem(fail_index, longlong.getfloatstorage(value))
             else:
                 assert 0, 'unknown type'
 

diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py
--- a/pypy/jit/backend/arm/regalloc.py
+++ b/pypy/jit/backend/arm/regalloc.py
@@ -9,12 +9,14 @@
                                                     prepare_cmp_op,
                                                     prepare_float_op,
                                                     _check_imm_arg)
+from pypy.jit.codewriter import longlong
 from pypy.jit.metainterp.history import (Const, ConstInt, ConstFloat, ConstPtr,
                                         Box, BoxInt, BoxPtr, AbstractFailDescr,
                                         INT, REF, FLOAT, LoopToken)
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.backend.llsupport.descr import BaseFieldDescr, BaseArrayDescr
 from pypy.jit.backend.llsupport import symbolic
+from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
 from pypy.rpython.lltypesystem import lltype, rffi, rstr, llmemory
 from pypy.jit.codewriter import heaptracker
 from pypy.rlib.objectmodel import we_are_translated
@@ -56,8 +58,12 @@
     save_around_call_regs = r.all_vfp_regs
 
     def convert_to_imm(self, c):
-        adr = self.assembler.datablockwrapper.malloc_aligned(8, 8)
-        rffi.cast(rffi.CArrayPtr(rffi.DOUBLE), adr)[0] = c.getfloat()
+        datablockwrapper = MachineDataBlockWrapper(self.assembler.cpu.asmmemmgr,
+                                                    self.assembler.blocks)
+        adr = datablockwrapper.malloc_aligned(8, 8)
+        datablockwrapper.done()
+        x = c.getfloatstorage()
+        rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), adr)[0] = x
         return locations.ConstFloatLoc(adr)
 
     def __init__(self, longevity, frame_manager=None, assembler=None):

diff --git a/pypy/jit/backend/arm/runner.py b/pypy/jit/backend/arm/runner.py
--- a/pypy/jit/backend/arm/runner.py
+++ b/pypy/jit/backend/arm/runner.py
@@ -39,8 +39,8 @@
         self.assembler.assemble_bridge(faildescr, inputargs, operations,
                                        original_loop_token, log=log)
 
-    def set_future_value_float(self, index, intvalue):
-        self.assembler.fail_boxes_float.setitem(index, intvalue)
+    def set_future_value_float(self, index, floatvalue):
+        self.assembler.fail_boxes_float.setitem(index, floatvalue)
 
     def set_future_value_int(self, index, intvalue):
         self.assembler.fail_boxes_int.setitem(index, intvalue)

diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -117,16 +117,16 @@
         i0 = BoxFloat()
         i1 = BoxFloat()
         operations = [
-            ResOperation(rop.FLOAT_ADD, [i0, ConstFloat(2.3)], i1),
+            ResOperation(rop.FLOAT_ADD, [i0, constfloat(2.3)], i1),
             ResOperation(rop.FINISH, [i1], None, descr=BasicFailDescr(1))
             ]
         inputargs = [i0]
         looptoken = LoopToken()
         self.cpu.compile_loop(inputargs, operations, looptoken)
-        self.cpu.set_future_value_float(0, 2.8)
+        self.cpu.set_future_value_float(0, longlong.getfloatstorage(2.8))
         fail = self.cpu.execute_token(looptoken)
         res = self.cpu.get_latest_value_float(0)
-        assert res == 5.1
+        assert longlong.getrealfloat(res) == 5.1
         assert fail.identifier == 1
 
     def test_compile_loop(self):


More information about the Pypy-commit mailing list