[pypy-commit] pypy s390x-backend: implementing realloc frame

plan_rich pypy.commits at gmail.com
Thu Dec 31 03:50:52 EST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r81505:35dcb2c4de31
Date: 2015-12-31 09:50 +0100
http://bitbucket.org/pypy/pypy/changeset/35dcb2c4de31/

Log:	implementing realloc 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
@@ -298,10 +298,9 @@
         # g) restore registers and return
         mc = InstrBuilder()
         self.mc = mc
-        return
 
         # signature of this _frame_realloc_slowpath function:
-        #   * on entry, r0 is the new size
+        #   * on entry, r3 is the new size
         #   * on entry, r2 is the gcmap
         #   * no managed register must be modified
 
@@ -311,38 +310,43 @@
         self._push_core_regs_to_jitframe(mc)
         self._push_fp_regs_to_jitframe(mc)
 
-        # Save away the LR inside r30
-        #mc.mflr(r.RCS1.value)
+        self.mc.store_link()
 
         # First argument is SPP (= r31), which is the jitframe
-        mc.mr(r.r3.value, r.SPP.value)
+        mc.LGR(r.r2, r.SPP)
 
-        # Second argument is the new size, which is still in r0 here
-        mc.mr(r.r4.value, r.r0.value)
+        # no need to move second argument (frame_depth),
+        # it is already in register r3!
+
+        RCS2 = r.r10
+        RCS3 = r.r12
 
         # This trashes r0 and r2
-        self._store_and_reset_exception(mc, r.RCS2, r.RCS3)
+        self._store_and_reset_exception(mc, RCS2, RCS3)
 
         # Do the call
         adr = rffi.cast(lltype.Signed, self.cpu.realloc_frame)
+        mc.push_std_frame()
         mc.load_imm(mc.RAW_CALL_REG, adr)
         mc.raw_call()
+        mc.pop_std_frame()
 
         # The result is stored back into SPP (= r31)
-        mc.mr(r.SPP.value, r.r3.value)
+        mc.LGR(r.SPP, r.r2)
 
-        self._restore_exception(mc, r.RCS2, r.RCS3)
+        self._restore_exception(mc, RCS2, RCS3)
 
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
+            xxx
             diff = mc.load_imm_plus(r.r5, gcrootmap.get_root_stack_top_addr())
             mc.load(r.r5.value, r.r5.value, diff)
             mc.store(r.r3.value, r.r5.value, -WORD)
 
-        mc.mtlr(r.RCS1.value)     # restore LR
+        mc.restore_link()
         self._pop_core_regs_from_jitframe(mc)
         self._pop_fp_regs_from_jitframe(mc)
-        mc.blr()
+        mc.BCR(c.ANY, r.RETURN)
 
         self._frame_realloc_slowpath = mc.materialize(self.cpu, [])
         self.mc = None
@@ -492,17 +496,19 @@
         """
         descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
         ofs = self.cpu.unpack_fielddescr(descrs.arraydescr.lendescr)
-        #mc.LG(r.r2, l.addr(ofs, r.SPP))
+        mc.LG(r.r2, l.addr(ofs, r.SPP))
         patch_pos = mc.currpos()
-        # XXX TODO
-        #self.mc.trap()
-        #mc.TRAP2()     # placeholder for cmpdi(0, r2, ...)
-        #mc.TRAP2()     # placeholder for bge
-        #mc.TRAP2()     # placeholder for li(r0, ...)
-        #mc.load_imm(r.SCRATCH2, self._frame_realloc_slowpath)
-        #mc.mtctr(r.SCRATCH2.value)
-        #self.load_gcmap(mc, r.r2, gcmap)
-        #mc.bctrl()
+        # placeholder for the following instructions
+        # CGRL r2, ... (6  bytes)
+        # BRC  c, ...  (4  bytes)
+        # LGHI r3, ... (4  bytes)
+        #       sum -> (14 bytes)
+        mc.write('\x00'*14)
+        mc.load_imm(r.RETURN, self._frame_realloc_slowpath)
+        self.load_gcmap(mc, r.r2, gcmap)
+        self.mc.push_std_frame()
+        mc.BCR(c.ANY, r.RETURN)
+        self.mc.pop_std_frame()
 
         self.frame_depth_to_patch.append((patch_pos, mc.currpos()))
 
@@ -846,10 +852,10 @@
         for traps_pos, jmp_target in self.frame_depth_to_patch:
             pmc = OverwritingBuilder(self.mc, traps_pos, 3)
             # three traps, so exactly three instructions to patch here
-            #pmc.cmpdi(0, r.r2.value, frame_depth)         # 1
-            #pmc.bc(7, 0, jmp_target - (traps_pos + 4))    # 2   "bge+"
-            #pmc.li(r.r0.value, frame_depth)               # 3
-            #pmc.overwrite()
+            pmc.CGRL(r.r2, l.imm(frame_depth))
+            pmc.BRC(c.EQ, jmp_target - (traps_pos + 6))
+            pmc.LGHI(r.r3, frame_depth)
+            pmc.overwrite()
 
     def materialize_loop(self, looptoken):
         self.datablockwrapper.done()
diff --git a/rpython/jit/backend/zarch/codebuilder.py b/rpython/jit/backend/zarch/codebuilder.py
--- a/rpython/jit/backend/zarch/codebuilder.py
+++ b/rpython/jit/backend/zarch/codebuilder.py
@@ -10,6 +10,7 @@
 from rpython.rtyper.lltypesystem import lltype, rffi, llmemory
 from rpython.tool.udir import udir
 from rpython.jit.backend.detect_cpu import autodetect
+from rpython.jit.backend.zarch.arch import WORD
 
 clear_cache = rffi.llexternal(
     "__clear_cache",
@@ -197,11 +198,17 @@
         """
         self.BASR(r.RETURN, call_reg)
 
-    def alloc_std_frame(self):
+    def store_link(self):
+        self.STG(r.RETURN, l.addr(14*WORD, r.SP))
+
+    def restore_link(self):
+        self.LG(r.RETURN, l.addr(14*WORD, r.SP))
+
+    def push_std_frame(self):
         self.STG(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP))
         self.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
 
-    def restore_std_frame(self):
+    def pop_std_frame(self):
         self.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
 
 class OverwritingBuilder(BlockBuilderMixin, AbstractZARCHBuilder):
diff --git a/rpython/jit/backend/zarch/opassembler.py b/rpython/jit/backend/zarch/opassembler.py
--- a/rpython/jit/backend/zarch/opassembler.py
+++ b/rpython/jit/backend/zarch/opassembler.py
@@ -919,10 +919,10 @@
         self.mc.AGHI(r.r3, l.imm(basesize))
         self.mc.AGHI(r.r2, l.imm(basesize))
 
-        self.mc.alloc_std_frame()
+        self.mc.push_std_frame()
         self.mc.load_imm(self.mc.RAW_CALL_REG, self.memcpy_addr)
         self.mc.raw_call()
-        self.mc.restore_std_frame()
+        self.mc.pop_std_frame()
 
     def emit_zero_array(self, op, arglocs, regalloc):
         base_loc, startindex_loc, length_loc, \


More information about the pypy-commit mailing list