[pypy-commit] pypy remove-globals-in-jit: Fix, progress.
arigo
noreply at buildbot.pypy.org
Thu Nov 15 21:46:04 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: remove-globals-in-jit
Changeset: r58932:f33c664093a8
Date: 2012-11-15 21:40 +0100
http://bitbucket.org/pypy/pypy/changeset/f33c664093a8/
Log: Fix, progress.
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
@@ -112,12 +112,22 @@
@specialize.memo()
def getframedescrs(self, cpu):
- return (
- cpu.arraydescrof(jitframe.DEADFRAME),
- cpu.interiorfielddescrof(jitframe.DEADFRAME, 'int', 'jf_values'),
- cpu.interiorfielddescrof(jitframe.DEADFRAME, 'ref', 'jf_values'),
- cpu.interiorfielddescrof(jitframe.DEADFRAME, 'float', 'jf_values'),
- cpu.fielddescrof(jitframe.DEADFRAME, 'jf_descr'))
+ descrs = JitFrameDescrs()
+ descrs.arraydescr = cpu.arraydescrof(jitframe.DEADFRAME)
+ descrs.as_int = cpu.interiorfielddescrof(jitframe.DEADFRAME,
+ 'int', 'jf_values')
+ descrs.as_ref = cpu.interiorfielddescrof(jitframe.DEADFRAME,
+ 'ref', 'jf_values')
+ descrs.as_float = cpu.interiorfielddescrof(jitframe.DEADFRAME,
+ 'float', 'jf_values')
+ descrs.jf_descr = cpu.fielddescrof(jitframe.DEADFRAME, 'jf_descr')
+ descrs.jf_guard_exc = cpu.fielddescrof(jitframe.DEADFRAME,
+ 'jf_guard_exc')
+ return descrs
+
+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
@@ -350,12 +350,11 @@
v_deadframe = BoxPtr()
args_boxes = finish_op.getarglist() # may contain Consts too
#
- arraydescr, int_descr, ref_descr, float_descr, jf_descr = (
- self.gc_ll_descr.getframedescrs(self.cpu))
+ descrs = self.gc_ll_descr.getframedescrs(self.cpu)
#
op = ResOperation(rop.NEW_ARRAY,
[ConstInt(len(args_boxes))], v_deadframe,
- descr=arraydescr)
+ descr=descrs.arraydescr)
self.handle_malloc_operation(op)
#
for i in range(len(args_boxes)):
@@ -363,9 +362,9 @@
# deadframe object. Ignore write barriers because it's a
# recent object.
box = args_boxes[i]
- if box.type == history.INT: descr = int_descr
- elif box.type == history.REF: descr = ref_descr
- elif box.type == history.FLOAT: descr = float_descr
+ if box.type == history.INT: descr = descrs.as_int
+ elif box.type == history.REF: descr = descrs.as_ref
+ elif box.type == history.FLOAT: descr = descrs.as_float
else: assert 0, "bad box type?"
op = ResOperation(rop.SETINTERIORFIELD_GC,
[v_deadframe, ConstInt(i), box], None,
@@ -376,7 +375,7 @@
gcref_descr = finish_op.getdescr().hide(self.cpu)
op = ResOperation(rop.SETFIELD_GC,
[v_deadframe, ConstPtr(gcref_descr)], None,
- descr=jf_descr)
+ descr=descrs.jf_descr)
self.newops.append(op)
#
op = ResOperation(rop.FINISH, [v_deadframe], None)
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
@@ -2847,7 +2847,8 @@
x = self.cpu.get_latest_value_float(deadframe, 0)
assert longlong.getrealfloat(x) == 1.2 + 3.2
called.append(self.cpu.get_latest_descr(deadframe))
- return longlong.getfloatstorage(13.5)
+ print '!' * 30 + 'assembler_helper'
+ return 13.5
FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF, llmemory.GCREF],
lltype.Float))
@@ -2902,10 +2903,10 @@
othertoken = JitCellToken()
self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
args = [longlong.getfloatstorage(1.2),
- longlong.getfloatstorage(3.2)]
+ longlong.getfloatstorage(4.2)]
deadframe = self.cpu.execute_token(othertoken, *args)
x = self.cpu.get_latest_value_float(deadframe, 0)
- assert longlong.getrealfloat(x) == 1.2 + 3.2
+ assert longlong.getrealfloat(x) == 1.2 + 4.2
assert not called
finally:
del self.cpu.done_with_this_frame_float_v
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
@@ -2145,9 +2145,9 @@
if exc:
# save ebx into 'jf_guard_exc'
- offset, size = symbolic.get_field_token(
- jitframe.DEADFRAME, 'jf_guard_exc',
- self.cpu.translate_support_code)
+ from pypy.jit.backend.llsupport.descr import unpack_fielddescr
+ descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
+ offset, size, _ = unpack_fielddescr(descrs.jf_guard_exc)
mc.MOV_mr((eax.value, offset), ebx.value)
# now we return from the complete frame, which starts from
@@ -2392,7 +2392,15 @@
value = self.cpu.done_with_this_frame_float_v
else:
raise AssertionError(kind)
- self.mc.CMP_ri(eax.value, value)
+
+ from pypy.jit.backend.llsupport.descr import unpack_fielddescr
+ from pypy.jit.backend.llsupport.descr import unpack_interiorfielddescr
+ descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
+ _offset, _size, _ = unpack_fielddescr(descrs.jf_descr)
+ fail_descr = self.cpu.get_fail_descr_from_number(value)
+ value = fail_descr.hide(self.cpu)
+ value = rffi.cast(lltype.Signed, value) # XXX assumes non-moving
+ self.mc.CMP_mi((eax.value, _offset), value)
# patched later
self.mc.J_il8(rx86.Conditions['E'], 0) # goto B if we get 'done_with_this_frame'
je_location = self.mc.get_relative_pos()
@@ -2420,29 +2428,23 @@
fielddescr = jd.vable_token_descr
assert isinstance(fielddescr, FieldDescr)
ofs = fielddescr.offset
- self.mc.MOV(eax, arglocs[1])
- self.mc.MOV_mi((eax.value, ofs), 0)
+ self.mc.MOV(edx, arglocs[1])
+ self.mc.MOV_mi((edx.value, ofs), 0)
# in the line above, TOKEN_NONE = 0
#
if op.result is not None:
- # load the return value from fail_boxes_xxx[0]
+ # load the return value from the dead frame's value index 0
+ # (use descrs.as_int here, which is valid too for descrs.as_ref)
+ t = unpack_interiorfielddescr(descrs.as_int)
+ load_from = (eax.value, t[0])
kind = op.result.type
if kind == FLOAT:
- xmmtmp = xmm0
- adr = self.fail_boxes_float.get_addr_for_num(0)
- self.mc.MOVSD(xmmtmp, heap(adr))
- self.mc.MOVSD(result_loc, xmmtmp)
+ self.mc.MOVSD_xm(xmm0.value, load_from)
+ if result_loc is not xmm0:
+ self.mc.MOVSD(result_loc, xmm0)
else:
assert result_loc is eax
- if kind == INT:
- adr = self.fail_boxes_int.get_addr_for_num(0)
- self.mc.MOV(eax, heap(adr))
- elif kind == REF:
- adr = self.fail_boxes_ptr.get_addr_for_num(0)
- self.mc.MOV(eax, heap(adr))
- self.mc.MOV(heap(adr), imm0)
- else:
- raise AssertionError(kind)
+ self.mc.MOV_rm(eax.value, load_from)
#
# Here we join Path A and Path B again
offset = self.mc.get_relative_pos() - jmp_location
More information about the pypy-commit
mailing list