Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60033:88ab83e424c5
Date: 2013-01-13 18:06 +0200
http://bitbucket.org/pypy/pypy/changeset/88ab83e424c5/
Log: argument passing to call_assembler
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -125,6 +125,13 @@
'jfi_frame_depth')
return descrs
+ def getarraydescr_for_frame(self, type, index):
+ """ This function returns a tuple (descr, index) for storing
+ index inside a frame array. It's a little bit delicate, because on
+ say x86 32bit, we can't express all indexes of floats.
+ """
+ raise NotImplementedError # cpu specific
+
class JitFrameDescrs:
def _freeze_(self):
return True
diff --git a/pypy/jit/backend/llsupport/rewrite.py
b/pypy/jit/backend/llsupport/rewrite.py
--- a/pypy/jit/backend/llsupport/rewrite.py
+++ b/pypy/jit/backend/llsupport/rewrite.py
@@ -149,14 +149,20 @@
op0 = ResOperation(rop.GETFIELD_GC, [history.ConstPtr(llref)], lgt_box,
descr=descrs.jfi_frame_depth)
self.newops.append(op0)
+ # XXX for now it generates call_malloc_gc, instead of
+ # call_malloc_nursery, because the array is strange
op1 = ResOperation(rop.NEW_ARRAY, [lgt_box], frame,
descr=descrs.arraydescr)
self.handle_new_array(descrs.arraydescr, op1)
op2 = ResOperation(rop.SETFIELD_GC, [frame, history.ConstPtr(llref)],
None, descr=descrs.jf_frame_info)
self.newops.append(op2)
- lst = op.getarglist()
- self.newops.append(ResOperation(rop.CALL_ASSEMBLER, [frame] + lst,
+ for i, arg in enumerate(op.getarglist()):
+ descr = self.cpu.getarraydescr_for_frame(arg.type, i)
+ self.newops.append(ResOperation(rop.SETARRAYITEM_GC,
+ [frame, ConstInt(i), arg],
+ None, descr))
+ self.newops.append(ResOperation(rop.CALL_ASSEMBLER, [frame],
op.result, op.getdescr()))
# ----------
diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py
b/pypy/jit/backend/llsupport/test/test_rewrite.py
--- a/pypy/jit/backend/llsupport/test/test_rewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_rewrite.py
@@ -75,6 +75,8 @@
framedescrs = self.gc_ll_descr.getframedescrs(self.cpu)
jfi_frame_depth = framedescrs.jfi_frame_depth
jf_frame_info = framedescrs.jf_frame_info
+ signedframedescr = self.cpu.signedframedescr
+ floatframedescr = self.cpu.floatframedescr
casmdescr.compiled_loop_token = clt
#
namespace.update(locals())
@@ -95,6 +97,13 @@
class BaseFakeCPU(object):
def __init__(self):
self._cache = {}
+ self.signedframedescr = ArrayDescr(3, 8, FieldDescr('len', 0, 0, 0), 0)
+ self.floatframedescr = ArrayDescr(5, 8, FieldDescr('len', 0, 0, 0), 0)
+
+ def getarraydescr_for_frame(self, tp, index):
+ if tp == history.FLOAT:
+ return self.floatframedescr
+ return self.signedframedescr
def arraydescrof(self, ARRAY):
try:
@@ -103,6 +112,7 @@
r = ArrayDescr(1, 2, FieldDescr('len', 0, 0, 0), 0)
self._cache[ARRAY] = r
return r
+
def fielddescrof(self, STRUCT, fname):
key = (STRUCT, fname)
try:
@@ -715,14 +725,16 @@
def test_rewrite_call_assembler(self):
self.check_rewrite("""
- [i0]
- i1 = call_assembler(i0, descr=casmdescr)
+ [i0, f0]
+ i2 = call_assembler(i0, f0, descr=casmdescr)
""", """
- [i0]
+ [i0, f0]
i1 = getfield_gc(ConstPtr(ll_frame_info), descr=jfi_frame_depth)
p1 = call_malloc_gc(ConstClass(malloc_array_nonstandard), 1, 2, 0, 0,
i1, descr=malloc_array_nonstandard_descr)
setfield_gc(p1, ConstPtr(ll_frame_info), descr=jf_frame_info)
- i2 = call_assembler(p1, i0, descr=casmdescr)
+ setarrayitem_gc(p1, 0, i0, descr=signedframedescr)
+ setarrayitem_gc(p1, 1, f0, descr=floatframedescr)
+ i2 = call_assembler(p1, descr=casmdescr)
""")
# XXX we want call_malloc_nursery actually, but let's not care
# for now, the array is a bit non-standard
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit