[pypy-commit] pypy s390x-backend: malloc_cond ported to s390x

plan_rich pypy.commits at gmail.com
Thu Jan 7 05:26:09 EST 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r81605:e16953ea7521
Date: 2016-01-07 11:11 +0100
http://bitbucket.org/pypy/pypy/changeset/e16953ea7521/

Log:	malloc_cond ported to s390x

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
@@ -942,7 +942,7 @@
         return start
 
     def _reload_frame_if_necessary(self, mc, shadowstack_reg=None):
-        # might trash the VOLATILE registers different from r3 and f1
+        # might trash the VOLATILE registers different from r2 and f0
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap:
             if gcrootmap.is_shadow_stack:
@@ -1013,18 +1013,6 @@
         self.mc.LMG(r.r6, r.r15, l.addr(6*WORD, r.SP))
         self.jmpto(r.r14)
 
-    def _push_all_regs_to_stack(self, mc, withfloats, callee_only=False):
-        # not used!!
-        # TODO remove if not needed
-        base_ofs = 2*WORD
-        if callee_only:
-            regs = ZARCHRegisterManager.save_around_call_regs
-        else:
-            regs = r.registers[2:]
-        mc.STMG(regs[0], regs[1], l.addr(base_ofs, r.SP))
-        if withfloats:
-            xxx
-
     def _push_all_regs_to_frame(self, mc, ignored_regs, withfloats, callee_only=False):
         # Push all general purpose registers
         base_ofs = self.cpu.get_baseofs_of_frame_field()
@@ -1193,6 +1181,56 @@
         ptr = rffi.cast(lltype.Signed, gcmap)
         mc.load_imm(reg, ptr)
 
+    def malloc_cond(self, nursery_free_adr, nursery_top_adr, size, gcmap):
+        assert size & (WORD-1) == 0     # must be correctly aligned
+
+        # We load into RES the address stored at nursery_free_adr. We
+        # calculate the new value for nursery_free_adr and store it in
+        # RSZ.  Then we load the address stored in nursery_top_adr
+        # into SCRATCH.  In the rare case where the value in RSZ is
+        # (unsigned) bigger than the one in SCRATCH we call
+        # malloc_slowpath.  In the common case where malloc_slowpath
+        # is not called, we must still write RSZ back into
+        # nursery_free_adr (r1); so we do it always, even if we called
+        # malloc_slowpath.
+
+        diff = nursery_top_adr - nursery_free_adr
+        assert check_imm_value(diff)
+        mc = self.mc
+        mc.load_imm(r.r1, nursery_free_adr)
+
+        mc.load(r.RES, r.r1, 0)          # load nursery_free
+        mc.load(r.SCRATCH2, r.r1, diff)  # load nursery_top
+
+        mc.LGR(r.RSZ, r.RES)
+        if check_imm_value(size):
+            mc.AGHI(r.RSZ, l.imm(size))
+        else:
+            mc.load_imm(r.SCRATCH, l.imm(size))
+            mc.AGR(r.RSZ, r.SCRATCH)
+
+        mc.cmp_op(r.RSZ, r.SCRATCH2, signed=False)
+
+        fast_jmp_pos = mc.currpos()
+        mc.reserve_cond_jump() # conditional jump, patched later
+
+
+        # new value of nursery_free_adr in RSZ and the adr of the new object
+        # in RES.
+        self.load_gcmap(mc, r.SCRATCH, gcmap)
+        # We are jumping to malloc_slowpath without a call through a function
+        # descriptor, because it is an internal call and "call" would trash
+        # r2 and r11
+        mc.branch_absolute(self.malloc_slowpath)
+
+        offset = mc.currpos() - fast_jmp_pos
+        pmc = OverwritingBuilder(mc, fast_jmp_pos, 1)
+        pmc.BRCL(c.LE, l.imm(offset))    # jump if LE (not GT), predicted to be true
+        pmc.overwrite()
+
+        mc.STG(r.RSZ, l.addr(0, r.r1))    # store into nursery_free
+
+
     def malloc_cond_varsize_frame(self, nursery_free_adr, nursery_top_adr,
                                   sizeloc, gcmap):
         xxx
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
@@ -198,6 +198,14 @@
         """
         self.BASR(r.RETURN, call_reg)
 
+    def reserve_cond_jump(self):
+        self.trap()        # conditional jump, patched later
+        self.write('\x00'*4)
+
+    def branch_absolute(self, addr):
+        self.load_imm(r.r14, addr)
+        self.BASR(r.r14, r.r14)
+
     def store_link(self):
         self.STG(r.RETURN, l.addr(14*WORD, r.SP))
 
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
@@ -7,6 +7,7 @@
         gen_emit_imm_pool_rr)
 from rpython.jit.backend.zarch.helper.regalloc import (check_imm,
         check_imm_value)
+from rpython.jit.metainterp.history import (ConstInt)
 from rpython.jit.backend.zarch.codebuilder import ZARCHGuardToken, InstrBuilder
 from rpython.jit.backend.llsupport import symbolic, jitframe
 import rpython.jit.backend.zarch.conditions as c
diff --git a/rpython/jit/backend/zarch/regalloc.py b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -748,7 +748,6 @@
         return self._prepare_call_default(op)
 
     def prepare_call_malloc_nursery(self, op):
-        xxx
         self.rm.force_allocate_reg(op, selected_reg=r.RES)
         self.rm.temp_boxes.append(op)
         tmp_box = TempInt()
diff --git a/rpython/jit/backend/zarch/registers.py b/rpython/jit/backend/zarch/registers.py
--- a/rpython/jit/backend/zarch/registers.py
+++ b/rpython/jit/backend/zarch/registers.py
@@ -17,7 +17,7 @@
 SCRATCH2 = r0
 GPR_RETURN = r2
 RES = r2
-RSZ = r3
+RSZ = r6
 
 [f0,f1,f2,f3,f4,f5,f6,f7,f8,
  f9,f10,f11,f12,f13,f14,f15] = fpregisters


More information about the pypy-commit mailing list