[pypy-commit] pypy ppc-updated-backend: One test passes!

arigo noreply at buildbot.pypy.org
Fri Aug 21 10:50:47 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: ppc-updated-backend
Changeset: r79095:4865720d70df
Date: 2015-08-21 01:03 -0700
http://bitbucket.org/pypy/pypy/changeset/4865720d70df/

Log:	One test passes!

diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -282,6 +282,7 @@
                     ll_threadlocal_addr = rffi.cast(llmemory.Address,
                         self._debug_errno_container)
                 llop.gc_writebarrier(lltype.Void, ll_frame)
+                import pdb;pdb.set_trace()
                 ll_frame = func(ll_frame, ll_threadlocal_addr)
             finally:
                 if not self.translate_support_code:
diff --git a/rpython/jit/backend/ppc/opassembler.py b/rpython/jit/backend/ppc/opassembler.py
--- a/rpython/jit/backend/ppc/opassembler.py
+++ b/rpython/jit/backend/ppc/opassembler.py
@@ -346,10 +346,46 @@
 
     _mixin_ = True
 
+    def emit_increment_debug_counter(self, op, arglocs, regalloc):
+        [addr_loc, value_loc] = arglocs
+        self.mc.load(value_loc.value, addr_loc.value, 0)
+        self.mc.addi(value_loc.value, value_loc.value, 1)
+        self.mc.store(value_loc.value, addr_loc.value, 0)
+
     def emit_finish(self, op, arglocs, regalloc):
-        [argloc] = arglocs
-        self._gen_epilogue(self.mc)
-        # ARM has a fcond argument to this function, returned at the end
+        base_ofs = self.cpu.get_baseofs_of_frame_field()
+        if len(arglocs) == 2:
+            [return_val, fail_descr_loc] = arglocs
+            self.mc.std(return_val.value, r.SPP.value, base_ofs)
+        else:
+            [fail_descr_loc] = arglocs
+
+        ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
+        self.mc.load_imm(r.r5, fail_descr_loc.getint())
+        self.mc.std(r.r5.value, r.SPP.value, ofs)
+
+        ## arglist = op.getarglist()
+        ## if arglist and arglist[0].type == REF:
+        ##     if self._finish_gcmap:
+        ##         # we're returning with a guard_not_forced_2, and
+        ##         # additionally we need to say that eax/rax contains
+        ##         # a reference too:
+        ##         self._finish_gcmap[0] |= r_uint(1)
+        ##         gcmap = self._finish_gcmap
+        ##     else:
+        ##         gcmap = self.gcmap_for_finish
+        ##     self.push_gcmap(self.mc, gcmap, store=True)
+        ## elif self._finish_gcmap:
+        ##     # we're returning with a guard_not_forced_2
+        ##     gcmap = self._finish_gcmap
+        ##     self.push_gcmap(self.mc, gcmap, store=True)
+        ## else:
+        ##     # note that the 0 here is redundant, but I would rather
+        ##     # keep that one and kill all the others
+        ##     ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
+        ##     self.mc.MOV_bi(ofs, 0)
+        # exit function
+        self._call_footer()
 
     def emit_jump(self, op, arglocs, regalloc):
         # The backend's logic assumes that the target code is in a piece of
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
@@ -85,23 +85,11 @@
     #    OFFSET_STACK_ARGS += MAX_REG_PARAMS * WORD
 
     def __init__(self, cpu, translate_support_code=False):
-        self.cpu = cpu
-        self.mc = None
-        self.memcpy_addr = 0
-        self.pending_guards = None
-        self.fail_boxes_count = 0
-        self.current_clt = None
-        self.malloc_slowpath = 0
-        self.wb_slowpath = [0, 0, 0, 0]
-        self._regalloc = None
-        self.datablockwrapper = None
-        self.max_stack_params = 0
-        self.propagate_exception_path = 0
+        BaseAssembler.__init__(self, cpu, translate_support_code)
+        self.loop_run_counters = []
+        self.setup_failure_recovery()
         self.stack_check_slowpath = 0
-        self.setup_failure_recovery()
-        self._debug = False
-        self.loop_run_counters = []
-        self.debug_counter_descr = cpu.fielddescrof(DEBUG_COUNTER, 'i')
+        self.teardown()
 
     def set_debug(self, v):
         self._debug = v
@@ -645,11 +633,12 @@
         return mc.materialize(self.cpu, [], self.cpu.gc_ll_descr.gcrootmap)
 
     def _gen_epilogue(self, mc):
+        XXX
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
             self.gen_footer_shadowstack(gcrootmap, mc)
-        # save SPP in r5
-        # (assume that r5 has been written to failboxes)
+
+        # save SPP back in r3
         mc.mr(r.r5.value, r.SPP.value)
         self._restore_nonvolatiles(mc, r.r5)
         # load old backchain into r4
@@ -682,6 +671,12 @@
     #    self.mc.b_offset(loophead)
 
     def _call_header(self):
+        if IS_PPC_64:
+            # Reserve space for a function descriptor, 3 words
+            self.mc.write64(0)
+            self.mc.write64(0)
+            self.mc.write64(0)
+
         # Build a new stackframe of size STD_FRAME_SIZE_IN_BYTES
         self.mc.store_update(r.SP.value, r.SP.value, -STD_FRAME_SIZE_IN_BYTES)
         self.mc.mflr(r.SCRATCH.value)
@@ -758,6 +753,27 @@
             pmc.bc(4, 1, offset) # jump if SCRATCH <= r16, i. e. not(SCRATCH > r16)
             pmc.overwrite()
 
+    def _call_footer(self):
+        # the return value is the jitframe
+        self.mc.mr(r.r3.value, r.SPP.value)
+
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        if gcrootmap and gcrootmap.is_shadow_stack:
+            self._call_footer_shadowstack(gcrootmap)
+
+        # load old backchain into r4
+        self.mc.load(r.r4.value, r.SP.value,
+                     STD_FRAME_SIZE_IN_BYTES + LR_BC_OFFSET)
+
+        # restore registers r25 to r31
+        for i, reg in enumerate(REGISTERS_SAVED):
+            self.mc.load(reg.value, r.SP.value,
+                         GPR_SAVE_AREA_OFFSET + i * WORD)
+
+        self.mc.addi(r.SP.value, r.SP.value, STD_FRAME_SIZE_IN_BYTES)
+        self.mc.mtlr(r.r4.value)     # restore LR
+        self.mc.blr()
+
     def setup(self, looptoken):
         BaseAssembler.setup(self, looptoken)
         assert self.memcpy_addr != 0, "setup_once() not called?"
@@ -776,38 +792,6 @@
         self.frame_depth_to_patch = []
         #self.max_stack_params = 0
 
-    def _append_debugging_code(self, operations, tp, number, token):
-        counter = self._register_counter(tp, number, token)
-        c_adr = ConstInt(rffi.cast(lltype.Signed, counter))
-        box = BoxInt()
-        box2 = BoxInt()
-        ops = [ResOperation(rop.GETFIELD_RAW, [c_adr],
-                            box, descr=self.debug_counter_descr),
-               ResOperation(rop.INT_ADD, [box, ConstInt(1)], box2),
-               ResOperation(rop.SETFIELD_RAW, [c_adr, box2],
-                            None, descr=self.debug_counter_descr)]
-        operations.extend(ops)
-
-    @specialize.argtype(1)
-    def _inject_debugging_code(self, looptoken, operations, tp, number):
-        if self._debug:
-            # before doing anything, let's increase a counter
-            s = 0
-            for op in operations:
-                s += op.getopnum()
-            looptoken._ppc_debug_checksum = s
-
-            newoperations = []
-            self._append_debugging_code(newoperations, tp, number,
-                                        None)
-            for op in operations:
-                newoperations.append(op)
-                if op.getopnum() == rop.LABEL:
-                    self._append_debugging_code(newoperations, 'l', number,
-                                                op.getdescr())
-            operations = newoperations
-        return operations
-
     def update_frame_depth(self, frame_depth):
         baseofs = self.cpu.get_baseofs_of_frame_field()
         self.current_clt.frame_info.update_frame_depth(baseofs, frame_depth)
@@ -852,6 +836,9 @@
         full_size = self.mc.get_relative_pos()
         #
         rawstart = self.materialize_loop(looptoken)
+        if IS_PPC_64:    # fix the function descriptor (3 words)
+            rffi.cast(rffi.LONGP, rawstart)[0] = rawstart + 3 * WORD
+        #
         self.patch_stack_checks(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE,
                                 rawstart)
         looptoken._ll_loop_code = looppos + rawstart
@@ -1027,22 +1014,9 @@
         return size
 
     def teardown(self):
-        self.patch_list = None
-        self.pending_guards = None
+        self.pending_guard_tokens = None
+        self.mc = None
         self.current_clt = None
-        self.mc = None
-        self._regalloc = None
-        assert self.datablockwrapper is None
-        self.max_stack_params = 0
-
-    def gen_64_bit_func_descr(self):
-        return self.datablockwrapper.malloc_aligned(3*WORD, alignment=1)
-
-    def write_64_bit_func_descr(self, descr, start_addr):
-        data = rffi.cast(rffi.CArrayPtr(lltype.Signed), descr)
-        data[0] = start_addr
-        data[1] = 0
-        data[2] = 0
 
     def compute_frame_depth(self, spilling_area, param_depth):
         PARAMETER_AREA = param_depth * WORD
@@ -1433,8 +1407,5 @@
         func = getattr(AssemblerPPC, methname).im_func
         operations_with_guard[value] = func
 
-AssemblerPPC.operations = operations
-AssemblerPPC.operations_with_guard = operations_with_guard
-
 class BridgeAlreadyCompiled(Exception):
     pass
diff --git a/rpython/jit/backend/ppc/regalloc.py b/rpython/jit/backend/ppc/regalloc.py
--- a/rpython/jit/backend/ppc/regalloc.py
+++ b/rpython/jit/backend/ppc/regalloc.py
@@ -30,6 +30,7 @@
 from rpython.jit.backend.llsupport.descr import unpack_interiorfielddescr
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.rlib import rgc
 
 # xxx hack: set a default value for TargetToken._arm_loop_code.  If 0, we know
 # that it is a LABEL that was not compiled yet.
@@ -302,6 +303,9 @@
                         selected_reg=selected_reg)
 
     def walk_operations(self, inputargs, operations):
+        from rpython.jit.backend.ppc.ppc_assembler import (
+            operations_with_guard as asm_operations_with_guard,
+            operations as asm_operations)
         i = 0
         #self.operations = operations
         while i < len(operations):
@@ -314,13 +318,22 @@
                 self.possibly_free_vars_for_op(op)
                 continue
             if self.can_merge_with_next_guard(op, i, operations):
-                oplist_with_guard[op.getopnum()](self, op, operations[i + 1])
+                arglocs = oplist_with_guard[op.getopnum()](self, op,
+                                                           operations[i + 1])
+                assert arglocs is not None
+                asm_operations_with_guard[op.getopnum()](self.assembler, op,
+                                                     operations[i + 1],
+                                                     arglocs, self)
                 i += 1
             elif not we_are_translated() and op.getopnum() == -124:
                 self._consider_force_spill(op)
             else:
-                oplist[op.getopnum()](self, op)
+                arglocs = oplist[op.getopnum()](self, op)
+                if arglocs is not None:
+                    asm_operations[op.getopnum()](self.assembler, op,
+                                                  arglocs, self)
             self.possibly_free_vars_for_op(op)
+            self.free_temp_vars()
             self.rm._check_invariants()
             self.fprm._check_invariants()
             i += 1
@@ -530,15 +543,17 @@
         return [loc1, res]
 
     def prepare_finish(self, op):
-        if op.numargs() > 0:
-            loc = self.loc(op.getarg(0))
-            self.possibly_free_var(op.getarg(0))
+        descr = op.getdescr()
+        fail_descr = cast_instance_to_gcref(descr)
+        # we know it does not move, but well
+        rgc._make_sure_does_not_move(fail_descr)
+        fail_descr = rffi.cast(lltype.Signed, fail_descr)
+        if op.numargs() == 1:
+            loc = self.make_sure_var_in_reg(op.getarg(0))
+            locs = [loc, imm(fail_descr)]
         else:
-            descr = op.getdescr()
-            fail_descr = cast_instance_to_gcref(descr)
-            fail_descr = rffi.cast(lltype.Signed, fail_descr)
-            loc = imm(fail_descr)
-        return [loc]
+            locs = [imm(fail_descr)]
+        return locs
 
     def prepare_call_malloc_gc(self, op):
         return self._prepare_call(op)
@@ -748,6 +763,12 @@
     prepare_getfield_raw_pure = prepare_getfield_gc
     prepare_getfield_gc_pure = prepare_getfield_gc
 
+    def prepare_increment_debug_counter(self, op):
+        args = op.getarglist()
+        base_loc = self._ensure_value_is_boxed(args[0])
+        temp_loc = self.get_scratch_reg(INT, args)
+        return [base_loc, temp_loc]
+
     def prepare_getinteriorfield_gc(self, op):
         t = unpack_interiorfielddescr(op.getdescr())
         ofs, itemsize, fieldsize, sign = t


More information about the pypy-commit mailing list