Author: Armin Rigo <ar...@tunes.org>
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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to