Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80630:a45f6bccf61b
Date: 2015-11-05 11:27 +0100
http://bitbucket.org/pypy/pypy/changeset/a45f6bccf61b/
Log: freed r12 of its burden as a base pointer, saving the pool address
(it is known when jumping to a label) to the bridge pool instead of
on the stack
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
@@ -17,7 +17,6 @@
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
@@ -63,3 +62,6 @@
RECOVERY_TARGET_POOL_OFFSET = 0
RECOVERY_GCMAP_POOL_OFFSET = 8
+
+JUMPABS_TARGET_ADDR__POOL_OFFSET = 0
+JUMPABS_POOL_ADDR_POOL_OFFSET = 8
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
@@ -12,7 +12,8 @@
from rpython.jit.backend.zarch.arch import (WORD,
STD_FRAME_SIZE_IN_BYTES, GPR_STACK_SAVE_IN_BYTES,
THREADLOCAL_ADDR_OFFSET, RECOVERY_GCMAP_POOL_OFFSET,
- RECOVERY_TARGET_POOL_OFFSET)
+ RECOVERY_TARGET_POOL_OFFSET, JUMPABS_TARGET_ADDR__POOL_OFFSET,
+ JUMPABS_POOL_ADDR_POOL_OFFSET)
from rpython.jit.backend.zarch.opassembler import (IntOpAssembler,
FloatOpAssembler, GuardOpAssembler)
from rpython.jit.backend.zarch.regalloc import Regalloc
@@ -352,6 +353,7 @@
def fixup_target_tokens(self, rawstart):
for targettoken in self.target_tokens_currently_compiling:
targettoken._ll_loop_code += rawstart
+ targettoken._ll_loop_pool += rawstart
self.target_tokens_currently_compiling = None
def _assemble(self, regalloc, inputargs, operations):
@@ -516,7 +518,6 @@
# 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))
@@ -578,13 +579,16 @@
self.mc.b_offset(descr._ll_loop_code)
else:
# restore the pool address
- offset = self.pool.get_descr_offset(descr)
+ offset = self.pool.get_descr_offset(descr) + \
+ JUMPABS_TARGET_ADDR__POOL_OFFSET
+ offset_pool = offset + JUMPABS_POOL_ADDR_POOL_OFFSET
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))
+ # the pool address of the target is saved in the bridge's pool
+ self.mc.LG(r.POOL, l.pool(offset_pool))
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)
+ self.pool.overwrite_64(self.mc, offset_pool, descr._ll_loop_pool)
def emit_finish(self, op, arglocs, regalloc):
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
@@ -27,12 +27,12 @@
if descr not in asm.target_tokens_currently_compiling:
# this is a 'long' jump instead of a relative jump
self.offset_map[descr] = self.size
- self.reserve_literal(8)
+ self.reserve_literal(16)
elif op.getopnum() == rop.LABEL:
descr = op.getdescr()
+ descr._ll_loop_pool = self.pool_start
if descr not in asm.target_tokens_currently_compiling:
# this is a 'long' jump instead of a relative jump
- descr._ll_loop_code = self.pool_start
self.offset_map[descr] = self.size
for arg in op.getarglist():
if arg.is_constant():
@@ -68,6 +68,8 @@
# 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)
+ self.pool_start = asm.mc.get_relative_pos() + \
+ asm.mc.BRAS_byte_count
for op in operations:
self.ensure_can_hold_constants(asm, op)
if self.size == 0:
@@ -78,14 +80,8 @@
# self.size += 1
jump_offset = self.size+asm.mc.BRAS_byte_count
assert jump_offset < 2**15-1
- if bridge:
- 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.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,10 +7,9 @@
[r0,r1,r2,r3,r4,r5,r6,r7,r8,
r9,r10,r11,r12,r13,r14,r15] = registers
-MANAGED_REGS = [r0,r1,r4,r5,r6,r7,r8,r9,r10]
-VOLATILES = [r6,r7,r8,r9,r10]
+MANAGED_REGS = [r0,r1,r4,r5,r6,r7,r8,r9,r10,r12]
+VOLATILES = [r6,r7,r8,r9,r10,r12]
SP = r15
-BSP = r12
RETURN = r14
POOL = r13
SPP = r11
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit