Author: Armin Rigo <[email protected]>
Branch: stmgc-c4
Changeset: r66097:977c929b6804
Date: 2013-08-12 19:24 +0200
http://bitbucket.org/pypy/pypy/changeset/977c929b6804/
Log: merge heads
diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -90,7 +90,7 @@
v = elem # --- more compactly: " ".join(e[2:])
if not start:
start = int(adr.strip(":"), 16)
- ofs = int(adr.strip(":"), 16) - start
+ ofs = int(adr.strip(":"), 16)
# add symbols to addresses:
for addr in lineaddresses(v):
sym = symbols.get(addr)
@@ -100,6 +100,7 @@
if ofs >= 0:
asm.append((ofs, v.strip("\n")))
#
+ prefix = hex(dump_start)[:-8]
asm_index = 0
for i, op in enumerate(loop.operations):
end = 0
@@ -113,12 +114,14 @@
else:
end = loop.operations[j].offset
if op.offset is not None:
- while asm[asm_index][0] < op.offset:
+ while asm[asm_index][0] - start < op.offset:
asm_index += 1
end_index = asm_index
- while asm[end_index][0] < end and end_index < len(asm) - 1:
+ while asm[end_index][0] - start < end and end_index <
len(asm) - 1:
end_index += 1
- op.asm = '\n'.join([asm[i][1] for i in range(asm_index,
end_index)])
+ op.asm = '\n'.join([
+ prefix+hex(asm[i][0])[2:] + ": " + asm[i][1]
+ for i in range(asm_index, end_index)])
return loop
def _asm_disassemble(self, d, origin_addr, tp):
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -172,10 +172,8 @@
break
exc = guardtok.exc
target = self.failure_recovery_code[exc + 2 * withfloats]
- fail_descr = rgc.cast_instance_to_gcref(guardtok.faildescr)
- # already done by gc.py record_constptrs, just to be safe:
- fail_descr = rgc._make_sure_does_not_move(fail_descr)
- fail_descr = rgc.cast_gcref_to_int(fail_descr)
+ fail_descr = cast_instance_to_gcref(guardtok.faildescr)
+ fail_descr = rffi.cast(lltype.Signed, fail_descr)
base_ofs = self.cpu.get_baseofs_of_frame_field()
positions = [0] * len(guardtok.fail_locs)
for i, loc in enumerate(guardtok.fail_locs):
@@ -228,10 +226,10 @@
else:
raise AssertionError(kind)
- gcref = rgc.cast_instance_to_gcref(value)
+ import pdb;pdb.set_trace()
+ gcref = cast_instance_to_gcref(value)
gcref = rgc._make_sure_does_not_move(gcref)
- value = rgc.cast_gcref_to_int(gcref)
-
+ value = rffi.cast(lltype.Signed, gcref)
je_location = self._call_assembler_check_descr(value, tmploc)
#
# Path A: use assembler_helper_adr
diff --git a/rpython/jit/backend/tool/viewcode.py
b/rpython/jit/backend/tool/viewcode.py
--- a/rpython/jit/backend/tool/viewcode.py
+++ b/rpython/jit/backend/tool/viewcode.py
@@ -59,7 +59,7 @@
'arm_32': 'arm',
}
cmd = find_objdump()
- objdump = ('%(command)s -M %(backend)s -b binary -m %(machine)s '
+ objdump = ('%(command)s -w -M %(backend)s -b binary -m %(machine)s '
'--disassembler-options=intel-mnemonics '
'--adjust-vma=%(origin)d -D %(file)s')
#
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -260,6 +260,21 @@
self.propagate_exception_path = rawstart
self.mc = None
+ def _get_stm_tl(self, adr):
+ """Makes 'adr' relative to threadlocal-base if we run in STM.
+ Before using such a relative address, call
+ self._stm_tl_segment_prefix_if_necessary."""
+ if self.cpu.gc_ll_descr.stm and we_are_translated():
+ # also not during tests
+ result = adr - stmtlocal.threadlocal_base()
+ assert rx86.fits_in_32bits(result)
+ return result
+ return adr
+
+ def _stm_tl_segment_prefix_if_necessary(self, mc):
+ if self.cpu.gc_ll_descr.stm and we_are_translated():
+ stmtlocal.tl_segment_prefix(mc)
+
def _build_stack_check_slowpath(self):
_, _, slowpathaddr = self.cpu.insert_stack_check()
if slowpathaddr == 0 or not self.cpu.propagate_exception_descr:
@@ -294,7 +309,9 @@
else:
mc.ADD_ri(esp.value, WORD)
#
- mc.MOV(eax, heap(self.cpu.pos_exception()))
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(eax, heap(ea))
mc.TEST_rr(eax.value, eax.value)
mc.J_il8(rx86.Conditions['NZ'], 0)
jnz_location = mc.get_relative_pos()
@@ -1740,7 +1757,9 @@
def genop_guard_guard_no_exception(self, ign_1, guard_op, guard_token,
locs, ign_2):
- self.mc.CMP(heap(self.cpu.pos_exception()), imm0)
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(self.mc)
+ self.mc.CMP(heap(ea), imm0)
self.implement_guard(guard_token, 'NZ')
def genop_guard_guard_not_invalidated(self, ign_1, guard_op, guard_token,
@@ -1753,7 +1772,9 @@
locs, resloc):
loc = locs[0]
loc1 = locs[1]
- self.mc.MOV(loc1, heap(self.cpu.pos_exception()))
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(self.mc)
+ self.mc.MOV(loc1, heap(ea))
self.mc.CMP(loc1, loc)
self.implement_guard(guard_token, 'NE')
self._store_and_reset_exception(self.mc, resloc)
@@ -1763,30 +1784,43 @@
""" Resest the exception. If excvalloc is None, then store it on the
frame in jf_guard_exc
"""
+ eva = self._get_stm_tl(self.cpu.pos_exc_value())
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ #
+ self._stm_tl_segment_prefix_if_necessary(mc)
if excvalloc is not None:
assert excvalloc.is_core_reg()
- mc.MOV(excvalloc, heap(self.cpu.pos_exc_value()))
+ mc.MOV(excvalloc, heap(eva))
elif tmploc is not None: # if both are None, just ignore
ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
- mc.MOV(tmploc, heap(self.cpu.pos_exc_value()))
+ mc.MOV(tmploc, heap(eva))
mc.MOV(RawEbpLoc(ofs), tmploc)
+ #
if exctploc is not None:
assert exctploc.is_core_reg()
- mc.MOV(exctploc, heap(self.cpu.pos_exception()))
-
- mc.MOV(heap(self.cpu.pos_exception()), imm0)
- mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(exctploc, heap(ea))
+ #
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(ea), imm0)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), imm0)
def _restore_exception(self, mc, excvalloc, exctploc, tmploc=None):
+ eva = self._get_stm_tl(self.cpu.pos_exc_value())
+ ea = self._get_stm_tl(self.cpu.pos_exception())
if excvalloc is not None:
- mc.MOV(heap(self.cpu.pos_exc_value()), excvalloc)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), excvalloc)
else:
assert tmploc is not None
ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
mc.MOV(tmploc, RawEbpLoc(ofs))
mc.MOV_bi(ofs, 0)
- mc.MOV(heap(self.cpu.pos_exc_value()), tmploc)
- mc.MOV(heap(self.cpu.pos_exception()), exctploc)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), tmploc)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(ea), exctploc)
def _gen_guard_overflow(self, guard_op, guard_token):
guard_opnum = guard_op.getopnum()
@@ -1983,9 +2017,14 @@
if exc:
# We might have an exception pending. Load it into ebx...
- mc.MOV(ebx, heap(self.cpu.pos_exc_value()))
- mc.MOV(heap(self.cpu.pos_exception()), imm0)
- mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
+ eva = self._get_stm_tl(self.cpu.pos_exc_value())
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(ebx, heap(eva))
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(ea), imm0)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), imm0)
# ...and save ebx into 'jf_guard_exc'
offset = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
mc.MOV_br(offset, ebx.value)
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py
b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -320,6 +320,7 @@
self.cpu.execute_token(looptoken, sgcref)
self.assert_in(called_on, [sgcref])
+
def test_ptr_eq_fastpath(self):
cpu = self.cpu
cpu.gc_ll_descr.init_nursery(100)
@@ -339,20 +340,28 @@
ConstPtr(s1),
ConstPtr(s2)]
for p1, p2 in itertools.combinations(ps, 2):
- for guard in [None, rop.GUARD_TRUE, rop.GUARD_FALSE]:
+ for guard in [None, rop.GUARD_TRUE, rop.GUARD_FALSE,
+ rop.GUARD_VALUE]:
cpu.gc_ll_descr.clear_lists()
# BUILD OPERATIONS:
i = i0
guarddescr = BasicFailDescr()
finaldescr = BasicFinalDescr()
- operations = [ResOperation(rop.PTR_EQ, [p1, p2], i0)]
- if guard is not None:
- gop = ResOperation(guard, [i0], None,
+ if guard == rop.GUARD_VALUE:
+ gop = ResOperation(rop.GUARD_VALUE, [p1, p2], None,
descr=guarddescr)
gop.setfailargs([])
- operations.append(gop)
+ operations = [gop]
i = i1
+ else:
+ operations = [ResOperation(rop.PTR_EQ, [p1, p2], i0)]
+ if guard is not None:
+ gop = ResOperation(guard, [i0], None,
+ descr=guarddescr)
+ gop.setfailargs([])
+ operations.append(gop)
+ i = i1
# finish must depend on result of ptr_eq if no guard
# is inbetween (otherwise ptr_eq gets deleted)
# if there is a guard, the result of ptr_eq must not
@@ -393,7 +402,7 @@
if guard is not None:
if s1 == s2:
- if guard == rop.GUARD_TRUE:
+ if guard in (rop.GUARD_TRUE, rop.GUARD_VALUE):
assert not guard_failed
else:
assert guard_failed
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit