Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60037:4eda81ccdfc7
Date: 2013-01-13 21:22 +0200
http://bitbucket.org/pypy/pypy/changeset/4eda81ccdfc7/

Log:    FLOAT support for call_assembler

diff --git a/pypy/jit/backend/llsupport/llmodel.py 
b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -259,6 +259,7 @@
                                                       abiname)
 
     def get_latest_descr(self, deadframe):
+        deadframe = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, deadframe)
         descr = deadframe.jf_descr
         return history.AbstractDescr.show(self, descr)
 
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
@@ -2758,10 +2758,9 @@
     def test_assembler_call(self):
         called = []
         def assembler_helper(failindex, deadframe, virtualizable):
-            deadframe = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR,
-                                               deadframe)
             faildescr = self.cpu.get_fail_descr_from_number(failindex)
-            deadframe.jf_descr = cast_instance_to_gcref(faildescr)
+            frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, deadframe)
+            frame.jf_descr = cast_instance_to_gcref(faildescr)
             assert self.cpu.get_int_value(deadframe, 0) == 97
             called.append(self.cpu.get_latest_descr(deadframe))
             return 4 + 9
@@ -2836,14 +2835,18 @@
         if not self.cpu.supports_floats:
             py.test.skip("requires floats")
         called = []
-        def assembler_helper(deadframe, virtualizable):
+        def assembler_helper(failindex, deadframe, virtualizable):
+            frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, deadframe)
+            faildescr = self.cpu.get_fail_descr_from_number(failindex)
+            frame.jf_descr = cast_instance_to_gcref(faildescr)
             x = self.cpu.get_float_value(deadframe, 0)
             assert longlong.getrealfloat(x) == 1.2 + 3.2
             called.append(self.cpu.get_latest_descr(deadframe))
             print '!' * 30 + 'assembler_helper'
             return 13.5
 
-        FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF, llmemory.GCREF],
+        FUNCPTR = lltype.Ptr(lltype.FuncType([lltype.Signed, llmemory.GCREF,
+                                              llmemory.GCREF],
                                              lltype.Float))
         class FakeJitDriverSD:
             index_of_virtualizable = -1
diff --git a/pypy/jit/backend/x86/assembler.py 
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -2163,9 +2163,9 @@
             self.mc.MOV_rb(eax.value, frame_loc.value)
             kind = op.result.type
             if kind == FLOAT:
-                xxx
-                t = unpack_interiorfielddescr(descrs.as_float)
-                self.mc.MOVSD_xm(xmm0.value, (eax.value, t[0]))
+                _, descr = self.cpu.getarraydescr_for_frame(kind, 0)
+                ofs = self.cpu.unpack_arraydescr(descr)
+                self.mc.MOVSD_xm(xmm0.value, (eax.value, ofs))
                 if result_loc is not xmm0:
                     self.mc.MOVSD(result_loc, xmm0)
             else:
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -14,7 +14,9 @@
 from pypy.jit.backend.llsupport import jitframe
 from pypy.jit.backend.x86 import regloc
 from pypy.jit.backend.llsupport.symbolic import WORD
-from pypy.jit.backend.llsupport.descr import unpack_arraydescr
+from pypy.jit.backend.llsupport.descr import ArrayDescr, FLAG_POINTER,\
+     FLAG_FLOAT
+        
 import sys
 
 from pypy.tool.ansi_print import ansi_log
@@ -231,12 +233,22 @@
     def __init__(self, *args, **kwargs):
         assert sys.maxint == (2**63 - 1)
         super(CPU_X86_64, self).__init__(*args, **kwargs)
+        descrs = self.gc_ll_descr.getframedescrs(self)
+        ad = descrs.arraydescr
+        # the same as normal JITFRAME, however with an array of pointers
+        self.refarraydescr = ArrayDescr(ad.basesize, ad.itemsize, ad.lendescr,
+                                        FLAG_POINTER)
+        self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize, 
ad.lendescr,
+                                          FLAG_FLOAT)
 
     def getarraydescr_for_frame(self, type, index):
-        if type != history.INT:
-            xxx
+        if type == history.FLOAT:
+            descr = self.floatarraydescr
+        elif type == history.REF:
+            descr = self.refarraydescr
         else:
             descrs = self.gc_ll_descr.getframedescrs(self)
-            return JITFRAME_FIXED_SIZE + index, descrs.arraydescr
+            descr = descrs.arraydescr
+        return JITFRAME_FIXED_SIZE + index, descr
 
 CPU = CPU386
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to