[pypy-commit] pypy s390x-backend: saving the last used constant pool below the stack pointer

plan_rich noreply at buildbot.pypy.org
Tue Nov 3 11:50:01 EST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80516:2e5796108f90
Date: 2015-11-03 17:50 +0100
http://bitbucket.org/pypy/pypy/changeset/2e5796108f90/

Log:	saving the last used constant pool below the stack pointer

diff --git a/rpython/jit/backend/zarch/arch.py b/rpython/jit/backend/zarch/arch.py
--- a/rpython/jit/backend/zarch/arch.py
+++ b/rpython/jit/backend/zarch/arch.py
@@ -5,17 +5,19 @@
 #                                                 OFFSET
 #     +------------------------------+            0
 #     |  gpr save are (int+float)    |
-#     +------------------------------+            8
-#     |  local vars                  |
-#     +------------------------------+            0
+#     +------------------------------+            GPR_STACK_SAVE_IN_BYTES | 120
+#     |  last base pointer           |
+#     +------------------------------+            BSP_STACK_OFFSET        | 128
 #     |                              |
 #     +------------------------------+
 #     |                              |
-#     +------------------------------+ <- SP      0         (r15)
+#     +------------------------------+                                    | 140
+#
 #
 
 GPR_STACK_SAVE_IN_BYTES = 120
 STD_FRAME_SIZE_IN_BYTES = 140
+BSP_STACK_OFFSET = 128
 THREADLOCAL_ADDR_OFFSET = 8
 
 assert STD_FRAME_SIZE_IN_BYTES % 2 == 0
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
@@ -517,9 +517,10 @@
         # Build a new stackframe of size STD_FRAME_SIZE_IN_BYTES
         self.mc.STMG(r.r6, r.r15, l.addr(-GPR_STACK_SAVE_IN_BYTES, r.SP))
         self.mc.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
+        self.mc.LGR(r.BSP, r.SP)
 
         # save r4, the second argument, to THREADLOCAL_ADDR_OFFSET
-        self.mc.STG(r.r3, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP))
+        #self.mc.STG(r.r3, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP))
 
         # move the first argument to SPP: the jitframe object
         self.mc.LGR(r.SPP, r.r2)
@@ -579,7 +580,10 @@
         else:
             # restore the pool address
             offset = self.pool.get_descr_offset(descr)
-            self.mc.b_abs(l.pool(offset), restore_pool=True)
+            self.mc.LG(r.SCRATCH, l.pool(offset))
+            self.mc.LG(r.POOL, l.addr(0, r.BSP))
+            self.mc.AGHI(r.BSP, l.imm(8))
+            self.mc.BCR(c.ANY, r.SCRATCH)
             print "writing", hex(descr._ll_loop_code)
             self.pool.overwrite_64(self.mc, offset, descr._ll_loop_code)
 
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
@@ -117,11 +117,6 @@
         offset = reladdr - self.get_relative_pos()
         self.BRC(c.ANY, l.imm(offset))
 
-    def b_abs(self, pooled, restore_pool=False):
-        self.LG(r.r10, pooled)
-        self.LG(r.POOL, l.pool(0))
-        self.BCR(c.ANY, r.r10)
-
     def reserve_guard_branch(self):
         print "reserve!", self.get_relative_pos()
         self.BRC(l.imm(0x0), l.imm(0))
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
@@ -52,7 +52,7 @@
         self.size = 0
         self.offset_map.clear()
 
-    def pre_assemble(self, asm, operations, bridge=True):
+    def pre_assemble(self, asm, operations, bridge=False):
         self.reset()
         # O(len(operations)). I do not think there is a way
         # around this.
@@ -68,25 +68,24 @@
         # the current solution (gcc does the same), use a literal pool
         # located at register r13. This one can easily offset with 20
         # bit signed values (should be enough)
-        if bridge:
-            self.reserve_literal(8)
         for op in operations:
             self.ensure_can_hold_constants(asm, op)
         if self.size == 0:
             # no pool needed!
             return
-        self.size += 8
         assert self.size % 2 == 0
         #if self.size % 2 == 1:
         #    self.size += 1
-        assert self.size < 2**16-1
+        jump_offset = self.size+asm.mc.BRAS_byte_count
+        assert jump_offset < 2**15-1
         if bridge:
-            asm.mc.LGR(r.SCRATCH, r.r13)
-        asm.mc.BRAS(r.POOL, l.imm(self.size+asm.mc.BRAS_byte_count))
+            asm.mc.LGR(r.SCRATCH, r.POOL)
+        asm.mc.BRAS(r.POOL, l.imm(jump_offset))
         self.pool_start = asm.mc.get_relative_pos()
         asm.mc.write('\xFF' * self.size)
         if bridge:
-            asm.mc.STG(r.SCRATCH, l.pool(0))
+            asm.mc.STG(r.SCRATCH, l.addr(-8, r.BSP))
+            asm.mc.AGHI(r.BSP, l.imm(-8))
         print "pool with %d quad words" % (self.size // 8)
 
     def overwrite_64(self, mc, index, value):
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
@@ -7,13 +7,14 @@
 [r0,r1,r2,r3,r4,r5,r6,r7,r8,
  r9,r10,r11,r12,r13,r14,r15] = registers
 
-MANAGED_REGS = [r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10]
+MANAGED_REGS = [r0,r2,r3,r4,r5,r6,r7,r8,r9,r10]
 VOLATILES = [r6,r7,r8,r9,r10]
 SP = r15
+BSP = r12
 RETURN = r14
 POOL = r13
 SPP = r11
-SCRATCH = r12
+SCRATCH = r1
 
 [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