[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