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