Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80481:b39bf57b3e2f
Date: 2015-10-29 16:18 +0100
http://bitbucket.org/pypy/pypy/changeset/b39bf57b3e2f/
Log: correctly jumping out of the program after guard failure, but there
is something wrong with the saving to the dead frame
diff --git a/rpython/jit/backend/zarch/assembler.py
b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -138,18 +138,17 @@
# overwrite the gcmap in the pool
offset = pool_offset + RECOVERY_GCMAP_POOL_OFFSET
- self.pool.overwrite_64(self.mc, offset, target)
- self.mc.LG(r.r2, l.pool(offset))
+ self.mc.LG(r.r3, l.pool(offset))
# overwrite the target in pool
offset = pool_offset + RECOVERY_TARGET_POOL_OFFSET
self.pool.overwrite_64(self.mc, offset, target)
- self.mc.LG(r.r0, l.pool(offset))
+ self.mc.LG(r.r14, l.pool(offset))
# TODO what is the biggest integer an opaque pointer
# can have? if not < 2**15-1 then we need to put it on the pool
- self.mc.LGHI(r.r3, l.imm(fail_descr))
- self.mc.BCR(l.imm(0xf), r.r0)
+ self.mc.LGHI(r.r2, l.imm(fail_descr))
+ self.mc.BCR(l.imm(0xf), r.r14)
# TODO do we need to patch this memory region?
# we need to write at least 6 insns here, for patch_jump_for_descr()
#while self.mc.currpos() < startpos + 6 * 4:
@@ -406,7 +405,6 @@
if not tok.guard_not_invalidated():
mc = InstrBuilder()
mc.b_cond_offset(relative_target, tok.fcond)
- import pdb; pdb.set_trace()
mc.copy_to_raw_memory(addr)
else:
# GUARD_NOT_INVALIDATED, record an entry in
diff --git a/rpython/jit/backend/zarch/locations.py
b/rpython/jit/backend/zarch/locations.py
--- a/rpython/jit/backend/zarch/locations.py
+++ b/rpython/jit/backend/zarch/locations.py
@@ -217,6 +217,7 @@
return ImmLocation(i)
def pool(off, float=False):
+ print "loading pool", off
return PoolLoc(off, float)
def get_fp_offset(base_ofs, position):
diff --git a/rpython/jit/backend/zarch/pool.py
b/rpython/jit/backend/zarch/pool.py
--- a/rpython/jit/backend/zarch/pool.py
+++ b/rpython/jit/backend/zarch/pool.py
@@ -3,6 +3,8 @@
from rpython.jit.metainterp.history import (INT, REF, FLOAT,
TargetToken)
from rpython.rtyper.lltypesystem import lltype, rffi, llmemory
+from rpython.jit.backend.zarch.arch import (WORD,
+ RECOVERY_GCMAP_POOL_OFFSET, RECOVERY_TARGET_POOL_OFFSET)
class LiteralPool(object):
def __init__(self):
@@ -24,10 +26,12 @@
def reserve_literal(self, size):
self.size += size
+ print "resized to", self.size, "(+",size,")"
def reset(self):
+ self.pool_start = 0
self.size = 0
- self.rel_offset = 0
+ self.offset = 0
def walk_operations(self, operations):
# O(len(operations)). I do not think there is a way
@@ -57,12 +61,13 @@
self.size += 1
assert self.size < 2**16-1
mc.BRAS(r.POOL, l.imm(self.size+mc.BRAS._byte_count))
- self.pool_offset = mc.get_relative_pos()
+ self.pool_start = mc.get_relative_pos()
mc.write('\x00' * self.size)
- print "pool with %d bytes %d // 8" % (self.size, self.size // 8)
+ print "pool with %d quad words" % (self.size // 8)
def overwrite_64(self, mc, index, value):
- print("value", hex(value), "at", index)
+ index += self.pool_start
+ print("value", hex(value), "at", index - self.pool_start)
mc.overwrite(index, chr(value >> 56 & 0xff))
mc.overwrite(index+1, chr(value >> 48 & 0xff))
mc.overwrite(index+2, chr(value >> 40 & 0xff))
@@ -76,6 +81,7 @@
if self.size == 0:
return
for val, offset in self.offset_map.items():
+ print val, offset
if val.is_constant():
if val.type == FLOAT:
self.overwrite_64(mc, offset, float2longlong(val.value))
@@ -91,6 +97,6 @@
offset = self.offset_map[descr]
guard_token._pool_offset = offset
ptr = rffi.cast(lltype.Signed, guard_token.gcmap)
- self.overwrite_64(mc, offset + 8, ptr)
+ self.overwrite_64(mc, offset + RECOVERY_GCMAP_POOL_OFFSET, ptr)
self.offset_map.clear()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit