[pypy-commit] pypy s390x-backend: copy copy copy. adding the skeleton structure for the assembler, regalloc and various other modules needed for assembly
plan_rich
noreply at buildbot.pypy.org
Mon Oct 26 04:49:43 EDT 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80456:2fc81cd2ea51
Date: 2015-10-26 09:49 +0100
http://bitbucket.org/pypy/pypy/changeset/2fc81cd2ea51/
Log: copy copy copy. adding the skeleton structure for the assembler,
regalloc and various other modules needed for assembly
diff --git a/rpython/doc/index.rst b/rpython/doc/index.rst
--- a/rpython/doc/index.rst
+++ b/rpython/doc/index.rst
@@ -37,6 +37,7 @@
arm
logging
+ s390x
Writing your own interpreter in RPython
diff --git a/rpython/jit/backend/detect_cpu.py b/rpython/jit/backend/detect_cpu.py
--- a/rpython/jit/backend/detect_cpu.py
+++ b/rpython/jit/backend/detect_cpu.py
@@ -146,7 +146,7 @@
MODEL_X86_64_SSE4: ['floats', 'singlefloats'],
MODEL_ARM: ['floats', 'singlefloats', 'longlong'],
MODEL_PPC_64: [], # we don't even have PPC directory, so no
- MODEL_S390_64: [],
+ MODEL_S390_64: ['floats', 'longlong'],
}[backend_name]
if __name__ == '__main__':
diff --git a/rpython/jit/backend/ppc/ppc_assembler.py b/rpython/jit/backend/ppc/ppc_assembler.py
--- a/rpython/jit/backend/ppc/ppc_assembler.py
+++ b/rpython/jit/backend/ppc/ppc_assembler.py
@@ -820,7 +820,7 @@
frame_depth = regalloc.get_final_frame_depth()
jump_target_descr = regalloc.jump_target_descr
if jump_target_descr is not None:
- tgt_depth = jump_target_descr._ppc_clt.frame_info.jfi_frame_depth
+ tgt_depth = jump_target_descr._zarch_clt.frame_info.jfi_frame_depth
target_frame_depth = tgt_depth - JITFRAME_FIXED_SIZE
frame_depth = max(frame_depth, target_frame_depth)
return frame_depth
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
@@ -1,5 +1,4 @@
-# TODO
-WORD = 8
+WORD = 4
JITFRAME_FIXED_SIZE = 48
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
@@ -1,10 +1,17 @@
from rpython.jit.backend.llsupport.assembler import GuardToken, BaseAssembler
from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
-from rpython.jit.backend.zarch import registers as reg
+from rpython.jit.backend.llsupport import jitframe, rewrite
+from rpython.jit.backend.model import CompiledLoopToken
+from rpython.jit.backend.zarch import conditions as c
+from rpython.jit.backend.zarch import registers as r
from rpython.jit.backend.zarch import locations as loc
from rpython.jit.backend.zarch.codebuilder import InstrBuilder
+from rpython.jit.backend.zarch.arch import WORD
+from rpython.jit.backend.zarch.regalloc import Regalloc
from rpython.jit.metainterp.resoperation import rop
from rpython.rlib.objectmodel import we_are_translated, specialize, compute_unique_id
+from rpython.rlib import rgc
+from rpython.rtyper.lltypesystem import lltype, rffi, llmemory
class AssemblerZARCH(BaseAssembler):
@@ -51,12 +58,12 @@
def gen_func_prolog(self):
STACK_FRAME_SIZE = 40
- self.mc.STMG(reg.r11, reg.r15, loc.addr(-STACK_FRAME_SIZE, reg.sp))
- self.mc.AHI(reg.sp, loc.imm(-STACK_FRAME_SIZE))
+ self.mc.STMG(r.r11, r.r15, loc.addr(-STACK_FRAME_SIZE, r.sp))
+ self.mc.AHI(r.sp, loc.imm(-STACK_FRAME_SIZE))
def gen_func_epilog(self):
- self.mc.LMG(reg.r11, reg.r15, loc.addr(0, reg.sp))
- self.jmpto(reg.r14)
+ self.mc.LMG(r.r11, r.r15, loc.addr(0, r.SPP))
+ self.jmpto(r.r14)
def jmpto(self, register):
# TODO, manual says this is a performance killer, there
@@ -92,6 +99,85 @@
def _build_stack_check_slowpath(self):
pass # TODO
+
+ def _call_header_with_stack_check(self):
+ pass # TODO
+
+ @rgc.no_release_gil
+ def assemble_loop(self, jd_id, unique_id, logger, loopname, inputargs,
+ operations, looptoken, log):
+ clt = CompiledLoopToken(self.cpu, looptoken.number)
+ looptoken.compiled_loop_token = clt
+ clt._debug_nbargs = len(inputargs)
+ if not we_are_translated():
+ # Arguments should be unique
+ assert len(set(inputargs)) == len(inputargs)
+
+ self.setup(looptoken)
+ frame_info = self.datablockwrapper.malloc_aligned(
+ jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
+ clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info)
+ clt.allgcrefs = []
+ clt.frame_info.clear() # for now
+
+ if log:
+ operations = self._inject_debugging_code(looptoken, operations,
+ 'e', looptoken.number)
+
+ regalloc = Regalloc(assembler=self)
+ #
+ self._call_header_with_stack_check()
+ operations = regalloc.prepare_loop(inputargs, operations,
+ looptoken, clt.allgcrefs)
+ looppos = self.mc.get_relative_pos()
+ frame_depth_no_fixed_size = self._assemble(regalloc, inputargs,
+ operations)
+ self.update_frame_depth(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE)
+ #
+ size_excluding_failure_stuff = self.mc.get_relative_pos()
+ self.write_pending_failure_recoveries()
+ full_size = self.mc.get_relative_pos()
+ #
+ self.patch_stack_checks(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE)
+ rawstart = self.materialize_loop(looptoken)
+ #
+ looptoken._ll_loop_code = looppos + rawstart
+ debug_start("jit-backend-addr")
+ debug_print("Loop %d (%s) has address 0x%x to 0x%x (bootstrap 0x%x)" % (
+ looptoken.number, loopname,
+ r_uint(rawstart + looppos),
+ r_uint(rawstart + size_excluding_failure_stuff),
+ r_uint(rawstart)))
+ debug_stop("jit-backend-addr")
+ self.patch_pending_failure_recoveries(rawstart)
+ #
+ ops_offset = self.mc.ops_offset
+ if not we_are_translated():
+ # used only by looptoken.dump() -- useful in tests
+ looptoken._ppc_rawstart = rawstart
+ looptoken._ppc_fullsize = full_size
+ looptoken._ppc_ops_offset = ops_offset
+ looptoken._ll_function_addr = rawstart
+ if logger:
+ logger.log_loop(inputargs, operations, 0, "rewritten",
+ name=loopname, ops_offset=ops_offset)
+
+ def _assemble(self, regalloc, inputargs, operations):
+ self._regalloc = regalloc
+ self.guard_success_cc = c.cond_none
+ regalloc.compute_hint_frame_locations(operations)
+ regalloc.walk_operations(inputargs, operations)
+ assert self.guard_success_cc == c.cond_none
+ if 1: # we_are_translated() or self.cpu.dont_keepalive_stuff:
+ self._regalloc = None # else keep it around for debugging
+ frame_depth = regalloc.get_final_frame_depth()
+ jump_target_descr = regalloc.jump_target_descr
+ if jump_target_descr is not None:
+ tgt_depth = jump_target_descr._ppc_clt.frame_info.jfi_frame_depth
+ target_frame_depth = tgt_depth - JITFRAME_FIXED_SIZE
+ frame_depth = max(frame_depth, target_frame_depth)
+ return frame_depth
+
# ________________________________________
# ASSEMBLER EMISSION
diff --git a/rpython/jit/backend/zarch/conditions.py b/rpython/jit/backend/zarch/conditions.py
--- a/rpython/jit/backend/zarch/conditions.py
+++ b/rpython/jit/backend/zarch/conditions.py
@@ -7,3 +7,5 @@
LE = loc.imm(EQ.value | LT.value)
GE = loc.imm(EQ.value | GT.value)
OVERFLOW = loc.imm(0x1)
+
+cond_none = loc.imm(0x0)
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
@@ -9,8 +9,13 @@
[r0,r1,r2,r3,r4,r5,r6,r7,r8,
r9,r10,r11,r12,r13,r14,r15] = registers
-sp = r15
-raddr = r14
+MANAGED_REGS = [r0,r1,r2,r3,r4]
+VOLATILES = [r0,r1,r2,r3,r4]
+SPP = r15
+RETURN = r14
[f0,f1,f2,f3,f4,f5,f6,f7,f8,
f9,f10,f11,f12,f13,f14,f15] = fpregisters
+
+MANAGED_FP_REGS = fpregisters
+VOLATILES_FLOAT = []
diff --git a/rpython/jit/backend/zarch/runner.py b/rpython/jit/backend/zarch/runner.py
--- a/rpython/jit/backend/zarch/runner.py
+++ b/rpython/jit/backend/zarch/runner.py
@@ -1,5 +1,7 @@
from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU
+from rpython.jit.backend.zarch.assembler import AssemblerZARCH
from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.rlib import rgc
class AbstractZARCHCPU(AbstractLLCPU):
def __init__(self, rtyper, stats, opts=None, translate_support_code=False,
@@ -14,4 +16,13 @@
cast_ptr_to_int = staticmethod(cast_ptr_to_int)
class CPU_S390_64(AbstractZARCHCPU):
- pass
+ def setup(self):
+ self.assembler = AssemblerZARCH(self)
+
+ @rgc.no_release_gil
+ def setup_once(self):
+ self.assembler.setup_once()
+
+ @rgc.no_release_gil
+ def finish_once(self):
+ self.assembler.finish_once()
More information about the pypy-commit
mailing list