Author: Armin Rigo <[email protected]>
Branch:
Changeset: r83658:911126fe2131
Date: 2016-04-13 22:28 +0200
http://bitbucket.org/pypy/pypy/changeset/911126fe2131/
Log: fix ppc for jit-constptr-2
diff --git a/rpython/jit/backend/arm/assembler.py
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -994,18 +994,6 @@
else:
clt.invalidate_positions.append((guard_pos, relative_offset))
- def get_asmmemmgr_blocks(self, looptoken):
- clt = looptoken.compiled_loop_token
- if clt.asmmemmgr_blocks is None:
- clt.asmmemmgr_blocks = []
- return clt.asmmemmgr_blocks
-
- def get_asmmemmgr_gcreftracers(self, looptoken):
- clt = looptoken.compiled_loop_token
- if clt.asmmemmgr_gcreftracers is None:
- clt.asmmemmgr_gcreftracers = []
- return clt.asmmemmgr_gcreftracers
-
def _walk_operations(self, inputargs, operations, regalloc):
fcond = c.AL
self._regalloc = regalloc
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
@@ -161,6 +161,18 @@
assert self._allgcrefs_faildescr_next < len(self._allgcrefs)
return self._allgcrefs_faildescr_next
+ def get_asmmemmgr_blocks(self, looptoken):
+ clt = looptoken.compiled_loop_token
+ if clt.asmmemmgr_blocks is None:
+ clt.asmmemmgr_blocks = []
+ return clt.asmmemmgr_blocks
+
+ def get_asmmemmgr_gcreftracers(self, looptoken):
+ clt = looptoken.compiled_loop_token
+ if clt.asmmemmgr_gcreftracers is None:
+ clt.asmmemmgr_gcreftracers = []
+ return clt.asmmemmgr_gcreftracers
+
def set_debug(self, v):
r = self._debug
self._debug = v
diff --git a/rpython/jit/backend/ppc/codebuilder.py
b/rpython/jit/backend/ppc/codebuilder.py
--- a/rpython/jit/backend/ppc/codebuilder.py
+++ b/rpython/jit/backend/ppc/codebuilder.py
@@ -936,9 +936,9 @@
class PPCGuardToken(GuardToken):
def __init__(self, cpu, gcmap, descr, failargs, faillocs,
- guard_opnum, frame_depth, fcond=c.cond_none):
+ guard_opnum, frame_depth, faildescrindex, fcond=c.cond_none):
GuardToken.__init__(self, cpu, gcmap, descr, failargs, faillocs,
- guard_opnum, frame_depth)
+ guard_opnum, frame_depth, faildescrindex)
self.fcond = fcond
@@ -1012,13 +1012,15 @@
self.load_imm(dest_reg, word)
return diff
- def load_from_addr(self, rD, addr):
- assert rD is not r.r0
- diff = self.load_imm_plus(rD, addr)
+ def load_from_addr(self, rD, rT, addr):
+ # load [addr] into rD. rT is a temporary register which can be
+ # equal to rD, but can't be r0.
+ assert rT is not r.r0
+ diff = self.load_imm_plus(rT, addr)
if IS_PPC_32:
- self.lwz(rD.value, rD.value, diff)
+ self.lwz(rD.value, rT.value, diff)
else:
- self.ld(rD.value, rD.value, diff)
+ self.ld(rD.value, rT.value, diff)
def b_offset(self, target):
curpos = self.currpos()
@@ -1279,7 +1281,7 @@
oplist = [None] * (rop._LAST + 1)
for key, val in rop.__dict__.items():
- if key.startswith("_"):
+ if key.startswith("_") or not isinstance(val, int):
continue
opname = key.lower()
methname = "emit_%s" % opname
diff --git a/rpython/jit/backend/ppc/opassembler.py
b/rpython/jit/backend/ppc/opassembler.py
--- a/rpython/jit/backend/ppc/opassembler.py
+++ b/rpython/jit/backend/ppc/opassembler.py
@@ -291,8 +291,10 @@
def build_guard_token(self, op, frame_depth, arglocs, fcond):
descr = op.getdescr()
gcmap = allocate_gcmap(self, frame_depth, r.JITFRAME_FIXED_SIZE)
+ faildescrindex = self.get_gcref_from_faildescr(descr)
token = PPCGuardToken(self.cpu, gcmap, descr, op.getfailargs(),
arglocs, op.getopnum(), frame_depth,
+ faildescrindex,
fcond)
return token
@@ -474,19 +476,19 @@
def emit_finish(self, op, arglocs, regalloc):
base_ofs = self.cpu.get_baseofs_of_frame_field()
- if len(arglocs) > 1:
- [return_val, fail_descr_loc] = arglocs
+ if len(arglocs) > 0:
+ [return_val] = arglocs
if op.getarg(0).type == FLOAT:
self.mc.stfd(return_val.value, r.SPP.value, base_ofs)
else:
self.mc.std(return_val.value, r.SPP.value, base_ofs)
- else:
- [fail_descr_loc] = arglocs
ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
ofs2 = self.cpu.get_ofs_of_frame_field('jf_gcmap')
- self.mc.load_imm(r.r5, fail_descr_loc.getint())
+ descr = op.getdescr()
+ faildescrindex = self.get_gcref_from_faildescr(descr)
+ self._load_from_gc_table(r.r5, r.r5, faildescrindex)
# gcmap logic here:
arglist = op.getarglist()
@@ -541,7 +543,7 @@
emit_cast_int_to_ptr = _genop_same_as
def emit_guard_no_exception(self, op, arglocs, regalloc):
- self.mc.load_from_addr(r.SCRATCH2, self.cpu.pos_exception())
+ self.mc.load_from_addr(r.SCRATCH2, r.SCRATCH2,
self.cpu.pos_exception())
self.mc.cmp_op(0, r.SCRATCH2.value, 0, imm=True)
self.guard_success_cc = c.EQ
self._emit_guard(op, arglocs)
@@ -586,6 +588,17 @@
mc.store(r.SCRATCH.value, r.SCRATCH2.value, 0)
mc.store(r.SCRATCH.value, r.SCRATCH2.value, diff)
+ def _load_from_gc_table(self, rD, rT, index):
+ # rT is a temporary, may be equal to rD, must be != r0
+ addr = self.gc_table_addr + index * WORD
+ self.mc.load_from_addr(rD, rT, addr)
+
+ def emit_load_from_gc_table(self, op, arglocs, regalloc):
+ index = op.getarg(0).getint()
+ [resloc] = arglocs
+ assert resloc.is_reg()
+ self._load_from_gc_table(resloc, resloc, index)
+
class CallOpAssembler(object):
@@ -646,9 +659,9 @@
guard_op.getopnum() == rop.GUARD_NOT_FORCED_2)
faildescr = guard_op.getdescr()
ofs = self.cpu.get_ofs_of_frame_field('jf_force_descr')
- self.mc.load_imm(r.SCRATCH, rffi.cast(lltype.Signed,
- cast_instance_to_gcref(faildescr)))
- self.mc.store(r.SCRATCH.value, r.SPP.value, ofs)
+ faildescrindex = self.get_gcref_from_faildescr(faildescr)
+ self._load_from_gc_table(r.r2, r.r2, faildescrindex)
+ self.mc.store(r.r2.value, r.SPP.value, ofs)
def _find_nearby_operation(self, regalloc, delta):
return regalloc.operations[regalloc.rm.position + delta]
diff --git a/rpython/jit/backend/ppc/ppc_assembler.py
b/rpython/jit/backend/ppc/ppc_assembler.py
--- a/rpython/jit/backend/ppc/ppc_assembler.py
+++ b/rpython/jit/backend/ppc/ppc_assembler.py
@@ -752,7 +752,6 @@
frame_info = self.datablockwrapper.malloc_aligned(
jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info)
- clt.allgcrefs = []
clt.frame_info.clear() # for now
if log:
@@ -762,8 +761,10 @@
regalloc = Regalloc(assembler=self)
#
self._call_header_with_stack_check()
+ allgcrefs = []
operations = regalloc.prepare_loop(inputargs, operations,
- looptoken, clt.allgcrefs)
+ looptoken, allgcrefs)
+ self.reserve_gcref_table(allgcrefs)
looppos = self.mc.get_relative_pos()
frame_depth_no_fixed_size = self._assemble(regalloc, inputargs,
operations)
@@ -786,6 +787,7 @@
r_uint(rawstart + size_excluding_failure_stuff),
r_uint(rawstart)))
debug_stop("jit-backend-addr")
+ self.patch_gcref_table(looptoken, rawstart)
self.patch_pending_failure_recoveries(rawstart)
#
ops_offset = self.mc.ops_offset
@@ -840,11 +842,14 @@
arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs)
regalloc = Regalloc(assembler=self)
- startpos = self.mc.get_relative_pos()
+ allgcrefs = []
operations = regalloc.prepare_bridge(inputargs, arglocs,
operations,
- self.current_clt.allgcrefs,
+ allgcrefs,
self.current_clt.frame_info)
+ self.reserve_gcref_table(allgcrefs)
+ startpos = self.mc.get_relative_pos()
+
self._check_frame_depth(self.mc, regalloc.get_gcmap())
frame_depth_no_fixed_size = self._assemble(regalloc, inputargs,
operations)
codeendpos = self.mc.get_relative_pos()
@@ -854,6 +859,7 @@
self.patch_stack_checks(frame_depth_no_fixed_size +
JITFRAME_FIXED_SIZE)
rawstart = self.materialize_loop(original_loop_token)
debug_bridge(descr_number, rawstart, codeendpos)
+ self.patch_gcref_table(original_loop_token, rawstart)
self.patch_pending_failure_recoveries(rawstart)
# patch the jump from original guard
self.patch_jump_for_descr(faildescr, rawstart)
@@ -868,6 +874,22 @@
self.teardown()
return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos)
+ def reserve_gcref_table(self, allgcrefs):
+ # allocate the gc table right now. We write absolute loads in
+ # each load_from_gc_table instruction for now. XXX improve,
+ # but it's messy.
+ self.gc_table_addr = self.datablockwrapper.malloc_aligned(
+ len(allgcrefs) * WORD, alignment=WORD)
+ self.setup_gcrefs_list(allgcrefs)
+
+ def patch_gcref_table(self, looptoken, rawstart):
+ rawstart = self.gc_table_addr
+ tracer = self.cpu.gc_ll_descr.make_gcref_tracer(rawstart,
+ self._allgcrefs)
+ gcreftracers = self.get_asmmemmgr_gcreftracers(looptoken)
+ gcreftracers.append(tracer) # keepalive
+ self.teardown_gcrefs_list()
+
def teardown(self):
self.pending_guard_tokens = None
self.mc = None
@@ -921,12 +943,12 @@
def generate_quick_failure(self, guardtok):
startpos = self.mc.currpos()
- fail_descr, target = self.store_info_on_descr(startpos, guardtok)
+ faildescrindex, target = self.store_info_on_descr(startpos, guardtok)
assert target != 0
- self.load_gcmap(self.mc, r.r2, gcmap=guardtok.gcmap)
- self.mc.load_imm(r.r0, target)
- self.mc.mtctr(r.r0.value)
- self.mc.load_imm(r.r0, fail_descr)
+ self.mc.load_imm(r.r2, target)
+ self.mc.mtctr(r.r2.value)
+ self._load_from_gc_table(r.r0, r.r2, faildescrindex)
+ self.load_gcmap(self.mc, r.r2, gcmap=guardtok.gcmap) # preserves r0
self.mc.bctr()
# we need to write at least 6 insns here, for patch_jump_for_descr()
while self.mc.currpos() < startpos + 6 * 4:
diff --git a/rpython/jit/backend/ppc/regalloc.py
b/rpython/jit/backend/ppc/regalloc.py
--- a/rpython/jit/backend/ppc/regalloc.py
+++ b/rpython/jit/backend/ppc/regalloc.py
@@ -523,18 +523,17 @@
return [loc1, res]
def prepare_finish(self, op):
- descr = op.getdescr()
- fail_descr = cast_instance_to_gcref(descr)
- # we know it does not move, but well
- rgc._make_sure_does_not_move(fail_descr)
- fail_descr = rffi.cast(lltype.Signed, fail_descr)
if op.numargs() > 0:
loc = self.ensure_reg(op.getarg(0))
- locs = [loc, imm(fail_descr)]
+ locs = [loc]
else:
- locs = [imm(fail_descr)]
+ locs = []
return locs
+ def prepare_load_from_gc_table(self, op):
+ res = self.rm.force_allocate_reg(op)
+ return [res]
+
def prepare_call_malloc_gc(self, op):
return self._prepare_call(op)
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
@@ -838,18 +838,6 @@
mc.writeimm32(allocated_depth)
mc.copy_to_raw_memory(adr)
- def get_asmmemmgr_blocks(self, looptoken):
- clt = looptoken.compiled_loop_token
- if clt.asmmemmgr_blocks is None:
- clt.asmmemmgr_blocks = []
- return clt.asmmemmgr_blocks
-
- def get_asmmemmgr_gcreftracers(self, looptoken):
- clt = looptoken.compiled_loop_token
- if clt.asmmemmgr_gcreftracers is None:
- clt.asmmemmgr_gcreftracers = []
- return clt.asmmemmgr_gcreftracers
-
def materialize_loop(self, looptoken):
self.datablockwrapper.done() # finish using cpu.asmmemmgr
self.datablockwrapper = None
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit