[pypy-commit] pypy ppc-jit-backend: Some steps more to be more similar to the ARm backend.
hager
noreply at buildbot.pypy.org
Wed Oct 12 14:59:14 CEST 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r47964:e5cfb842c91b
Date: 2011-10-12 14:58 +0200
http://bitbucket.org/pypy/pypy/changeset/e5cfb842c91b/
Log: Some steps more to be more similar to the ARm backend.
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -10,12 +10,15 @@
from pypy.jit.backend.ppc.ppcgen.codebuilder import PPCBuilder
from pypy.jit.backend.ppc.ppcgen.arch import (IS_PPC_32, WORD, NONVOLATILES,
GPR_SAVE_AREA)
-from pypy.jit.backend.ppc.ppcgen.helper.assembler import gen_emit_cmp_op
+from pypy.jit.backend.ppc.ppcgen.helper.assembler import (gen_emit_cmp_op,
+ encode32)
import pypy.jit.backend.ppc.ppcgen.register as r
import pypy.jit.backend.ppc.ppcgen.condition as c
from pypy.jit.metainterp.history import (Const, ConstPtr, LoopToken,
AbstractFailDescr)
-from pypy.jit.backend.llsupport.asmmemmgr import (BlockBuilderMixin, AsmMemoryManager, MachineDataBlockWrapper)
+from pypy.jit.backend.llsupport.asmmemmgr import (BlockBuilderMixin,
+ AsmMemoryManager,
+ MachineDataBlockWrapper)
from pypy.jit.backend.llsupport.regalloc import (RegisterManager,
compute_vars_longevity)
from pypy.jit.backend.llsupport import symbolic
@@ -58,6 +61,16 @@
class AssemblerPPC(OpAssembler):
+ FLOAT_TYPE = '\xED'
+ REF_TYPE = '\xEE'
+ INT_TYPE = '\xEF'
+
+ STACK_LOC = '\xFC'
+ IMM_LOC = '\xFD'
+ # REG_LOC is empty
+ EMPTY_LOC = '\xFE'
+ END_OF_LOCS = '\xFF'
+
def __init__(self, cpu, failargs_limit=1000):
self.cpu = cpu
self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
@@ -66,7 +79,6 @@
self.memcpy_addr = 0
def load_imm(self, rD, word):
- rD = rD.as_key()
if word <= 32767 and word >= -32768:
self.mc.li(rD, word)
elif IS_PPC_32 or (word <= 2147483647 and word >= -2147483648):
@@ -89,7 +101,7 @@
self.mc.ld(rD, rD, 0)
def store_reg(self, source_reg, addr):
- self.load_imm(r.r0, addr)
+ self.load_imm(r.r0.value, addr)
if IS_PPC_32:
self.mc.stwx(source_reg.value, 0, 0)
else:
@@ -137,9 +149,10 @@
# XXX adjust for 64 bit
def _make_prologue(self, target_pos, frame_depth):
if IS_PPC_32:
+ # save it in previous frame (Backchain)
self.mc.stwu(r.SP.value, r.SP.value, -frame_depth)
self.mc.mflr(r.r0.value) # move old link register
- # save it in previous frame (Backchain)
+ # save old link register in previous frame
self.mc.stw(r.r0.value, r.SP.value, frame_depth + WORD)
# save r31 at the bottom of the stack frame
self.mc.stw(r.SPP.value, r.SP.value, WORD)
@@ -198,7 +211,20 @@
# #self.mc.li(r.r3.value, fail_index)
# #self.mc.blr()
- def gen_exit_code(self):
+ def _gen_leave_jitted_hook_code(self, save_exc=False):
+ mc = PPCBuilder()
+ ### XXX add a check if cpu supports floats
+ #with saved_registers(mc, r.caller_resp + [r.ip], r.caller_vfp_resp):
+ # addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
+ # mc.BL(addr)
+ #assert self._exit_code_addr != 0
+ #mc.B(self._exit_code_addr)
+ mc.b_abs(self.exit_code_adr)
+ mc.prepare_insts_blocks()
+ return mc.materialize(self.cpu.asmmemmgr, [],
+ self.cpu.gc_ll_descr.gcrootmap)
+
+ def _gen_exit_path(self):
mc = PPCBuilder()
# save SPP in r5
# (assume that r5 has been written to failboxes)
@@ -242,12 +268,14 @@
self.pending_guards = []
assert self.datablockwrapper is None
allblocks = self.get_asmmemmgr_blocks(looptoken)
- self.exit_code_adr = self.gen_exit_code()
self.datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr,
allblocks)
def setup_once(self):
self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
+ self.exit_code_adr = self._gen_exit_path()
+ #self._leave_jitted_hook_save_exc = self._gen_leave_jitted_hook_code(True)
+ self._leave_jitted_hook = self._gen_leave_jitted_hook_code(False)
def assemble_loop(self, inputargs, operations, looptoken, log):
@@ -255,8 +283,6 @@
looptoken.compiled_loop_token = clt
self.setup(looptoken, operations)
- self.patch_list = []
- self.pending_guards = []
self.startpos = self.mc.currpos()
longevity = compute_vars_longevity(inputargs, operations)
@@ -267,7 +293,7 @@
regalloc_head = self.mc.currpos()
self.gen_bootstrap_code(nonfloatlocs, inputargs)
- loophead = self.mc.currpos()
+ loophead = self.mc.currpos() # address of actual loop
looptoken._ppc_loop_code = loophead
looptoken._ppc_arglocs = [nonfloatlocs]
looptoken._ppc_bootstrap_code = 0
@@ -277,9 +303,11 @@
start_pos = self.mc.currpos()
self.framesize = frame_depth = self.compute_frame_depth(regalloc)
self._make_prologue(regalloc_head, frame_depth)
-
- loop_start = self.materialize_loop(looptoken)
+
+ self.write_pending_failure_recoveries()
+ loop_start = self.materialize_loop(looptoken, True)
looptoken.ppc_code = loop_start + start_pos
+ self.process_pending_guards(loop_start)
self._teardown()
# For an explanation of the encoding, see
@@ -365,14 +393,60 @@
+ regalloc.frame_manager.frame_depth * WORD)
return frame_depth
- def materialize_loop(self, looptoken):
- self.mc.prepare_insts_blocks()
+ def materialize_loop(self, looptoken, show):
+ self.mc.prepare_insts_blocks(show)
self.datablockwrapper.done()
self.datablockwrapper = None
allblocks = self.get_asmmemmgr_blocks(looptoken)
return self.mc.materialize(self.cpu.asmmemmgr, allblocks,
self.cpu.gc_ll_descr.gcrootmap)
+ def write_pending_failure_recoveries(self):
+ for tok in self.pending_guards:
+ descr = tok.descr
+ #generate the exit stub and the encoded representation
+ pos = self.mc.currpos()
+ tok.pos_recovery_stub = pos
+
+ memaddr = self.gen_exit_stub(descr, tok.failargs,
+ tok.faillocs, save_exc=tok.save_exc)
+ # store info on the descr
+ descr._ppc_frame_depth = tok.faillocs[0].getint()
+ descr._failure_recovery_code = memaddr
+ descr._ppc_guard_pos = pos
+
+ def gen_exit_stub(self, descr, args, arglocs, fcond=c.NE,
+ save_exc=False):
+ memaddr = self.gen_descr_encoding(descr, args, arglocs)
+
+ # store addr in force index field
+ self.mc.load_imm(r.r0, memaddr)
+ self.mc.stw(r.r0.value, r.SPP.value, 0)
+
+ if save_exc:
+ path = self._leave_jitted_hook_save_exc
+ else:
+ path = self._leave_jitted_hook
+ self.mc.trap()
+ #self.mc.ba(path)
+ self.branch_abs(path)
+ return memaddr
+
+ def process_pending_guards(self, block_start):
+ clt = self.current_clt
+ for tok in self.pending_guards:
+ descr = tok.descr
+ assert isinstance(descr, AbstractFailDescr)
+ descr._ppc_block_start = block_start
+
+ if not tok.is_invalidate:
+ mc = PPCBuilder()
+ mc.b_cond_offset(descr._ppc_guard_pos - tok.offset, tok.fcond)
+ mc.prepare_insts_blocks(True)
+ mc.copy_to_raw_memory(block_start + tok.offset)
+ else:
+ assert 0, "not implemented yet"
+
def get_asmmemmgr_blocks(self, looptoken):
clt = looptoken.compiled_loop_token
if clt.asmmemmgr_blocks is None:
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -213,7 +213,7 @@
def _prepare_guard(self, op, args=None):
if args is None:
args = []
- #args.append(imm(self.frame_manager.frame_depth))
+ args.append(imm(self.frame_manager.frame_depth))
for arg in op.getfailargs():
if arg:
args.append(self.loc(arg))
More information about the pypy-commit
mailing list