[pypy-commit] pypy jitframe-on-heap: Backed out changeset 1dd0aa6c631a

fijal noreply at buildbot.pypy.org
Fri Feb 15 10:49:32 CET 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: jitframe-on-heap
Changeset: r61247:9fee4b350dff
Date: 2013-02-14 19:51 +0200
http://bitbucket.org/pypy/pypy/changeset/9fee4b350dff/

Log:	Backed out changeset 1dd0aa6c631a

diff --git a/rpython/jit/backend/arm/opassembler.py b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -1104,52 +1104,59 @@
     # XXX Split into some helper methods
     def emit_guard_call_assembler(self, op, guard_op, arglocs, regalloc,
                                                                     fcond):
+        tmploc = arglocs[1]
+        resloc = arglocs[2]
+        callargs = arglocs[3:]
+
         self._store_force_index(guard_op)
         descr = op.getdescr()
         assert isinstance(descr, JitCellToken)
-        if len(arglocs) == 4:
-            [frame_loc, vloc, result_loc, argloc] = arglocs
-        else:
-            [frame_loc, result_loc, argloc] = arglocs
-            vloc = imm(0)
-
-        #
-        # Write a call to the target assembler
-        # we need to allocate the frame, keep in sync with runner's
-        # execute_token
-        jd = descr.outermost_jitdriver_sd
-        base_ofs = self.cpu.get_baseofs_of_frame_field()
-        self._emit_call(imm(descr._ll_function_addr), [argloc], fcond)
+        # check value
+        assert tmploc is r.r0
+        self._emit_call(imm(descr._ll_function_addr),
+                                callargs, fcond, resloc=tmploc)
         if op.result is None:
-            assert result_loc is None
-            value = self.cpu.done_with_this_frame_descr_void
+            value = self.cpu.done_with_this_frame_void_v
         else:
             kind = op.result.type
             if kind == INT:
-                assert result_loc is r.r0
-                value = self.cpu.done_with_this_frame_descr_int
+                value = self.cpu.done_with_this_frame_int_v
             elif kind == REF:
-                assert result_loc is r.r0
-                value = self.cpu.done_with_this_frame_descr_ref
+                value = self.cpu.done_with_this_frame_ref_v
             elif kind == FLOAT:
-                value = self.cpu.done_with_this_frame_descr_float
+                value = self.cpu.done_with_this_frame_float_v
             else:
                 raise AssertionError(kind)
+        from rpython.jit.backend.llsupport.descr import unpack_fielddescr
+        from rpython.jit.backend.llsupport.descr import unpack_interiorfielddescr
+        descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
+        _offset, _size, _ = unpack_fielddescr(descrs.jf_descr)
+        fail_descr = self.cpu.get_fail_descr_from_number(value)
+        value = fail_descr.hide(self.cpu)
+        rgc._make_sure_does_not_move(value)
+        value = rffi.cast(lltype.Signed, value)
 
-
-        gcref = cast_instance_to_gcref(value)
-        rgc._make_sure_does_not_move(gcref)
-        value = rffi.cast(lltype.Signed, gcref)
-        ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
-        assert check_imm_arg(ofs)
-        self.mc.LDR_ri(r.ip.value, r.r0.value, imm=ofs)
-
+        if check_imm_arg(_offset):
+            self.mc.LDR_ri(r.ip.value, tmploc.value, imm=_offset)
+        else:
+            self.mc.gen_load_int(r.ip.value, _offset)
+            self.mc.LDR_rr(r.ip.value, tmploc.value, r.ip.value)
         if check_imm_arg(value):
             self.mc.CMP_ri(r.ip.value, imm=value)
         else:
             self.mc.gen_load_int(r.lr.value, value)
             self.mc.CMP_rr(r.lr.value, r.ip.value)
-        # Path 1: Fast Path
+
+
+        #if values are equal we take the fast path
+        # Slow path, calling helper
+        # jump to merge point
+
+        jd = descr.outermost_jitdriver_sd
+        assert jd is not None
+
+        # Path A: load return value and reset token
+        # Fast Path using result boxes
 
         fast_path_cond = c.EQ
         # Reset the vable token --- XXX really too much special logic here:-(
@@ -1157,40 +1164,45 @@
             from rpython.jit.backend.llsupport.descr import FieldDescr
             fielddescr = jd.vable_token_descr
             assert isinstance(fielddescr, FieldDescr)
-            assert isinstance(fielddescr, FieldDescr)
-            vtoken_ofs = fielddescr.offset
-            assert check_imm_arg(vtoken_ofs)
-            self.mov_loc_loc(vloc, r.ip, cond=fast_path_cond)
-            self.mc.MOV_ri(r.lr.value, 0, cond=fast_path_cond)
-            self.mc.STR_ri(tmploc.value, r.ip.value, vtoken_ofs, cond=fast_path_cond)
-            # in the line above, TOKEN_NONE = 0
+            ofs = fielddescr.offset
+            tmploc = regalloc.get_scratch_reg(INT)
+            self.mov_loc_loc(arglocs[0], r.ip, cond=fast_path_cond)
+            self.mc.MOV_ri(tmploc.value, 0, cond=fast_path_cond)
+            self.mc.STR_ri(tmploc.value, r.ip.value, ofs, cond=fast_path_cond)
 
         if op.result is not None:
-            # load the return value from the dead frame's value index 0
+            # load the return value from fail_boxes_xxx[0]
             kind = op.result.type
             if kind == FLOAT:
-                descr = self.cpu.getarraydescr_for_frame(kind)
-                ofs = self.cpu.unpack_arraydescr(descr)
-                if not check_imm_arg(ofs):
-                    self.mc.gen_load_int(r.ip.value, ofs, cond=fast_path_cond)
+                t = unpack_interiorfielddescr(descrs.as_float)[0]
+                if not check_imm_arg(t):
+                    self.mc.gen_load_int(r.ip.value, t, cond=fast_path_cond)
                     self.mc.ADD_rr(r.ip.value, r.r0.value, r.ip.value,
                                           cond=fast_path_cond)
-                    ofs = 0
+                    t = 0
                     base = r.ip
                 else:
                     base = r.r0
-                self.mc.VLDR(result_loc.value, base.value, imm=ofs,
-                                                     cond=fast_path_cond)
+                self.mc.VLDR(resloc.value, base.value, imm=t,
+                                          cond=fast_path_cond)
             else:
-                assert result_loc is r.r0
-                descr = self.cpu.getarraydescr_for_frame(kind)
-                ofs = self.cpu.unpack_arraydescr(descr)
-                self.load_reg(self.mc, r.r0, r.r0, ofs, cond=fast_path_cond)
+                assert resloc is r.r0
+                if kind == INT:
+                    t = unpack_interiorfielddescr(descrs.as_int)[0]
+                else:
+                    t = unpack_interiorfielddescr(descrs.as_ref)[0]
+                if not check_imm_arg(t):
+                    self.mc.gen_load_int(r.ip.value, t, cond=fast_path_cond)
+                    self.mc.LDR_rr(resloc.value, resloc.value, r.ip.value,
+                                          cond=fast_path_cond)
+                else:
+                    self.mc.LDR_ri(resloc.value, resloc.value, imm=t,
+                                          cond=fast_path_cond)
         # jump to merge point
         jmp_pos = self.mc.currpos()
         self.mc.BKPT()
 
-        # Path 2: use assembler helper
+        # Path B: use assembler helper
         asm_helper_adr = self.cpu.cast_adr_to_int(jd.assembler_helper_adr)
         if self.cpu.supports_floats:
             floats = r.caller_vfp_resp
@@ -1201,24 +1213,28 @@
         # the result
         core = r.caller_resp
         if op.result:
-            if result_loc.is_vfp_reg():
+            if resloc.is_vfp_reg():
                 floats = r.caller_vfp_resp[1:]
             else:
                 core = r.caller_resp[1:] + [r.ip]  # keep alignment
         with saved_registers(self.mc, core, floats):
             # result of previous call is in r0
-            self.mov_loc_loc(vloc, r.r1)
+            self.mov_loc_loc(arglocs[0], r.r1)
             self.mc.BL(asm_helper_adr)
-            if not self.cpu.use_hf_abi and op.result and result_loc.is_vfp_reg():
+            if not self.cpu.use_hf_abi and op.result and resloc.is_vfp_reg():
                 # move result to the allocated register
-                self.mov_to_vfp_loc(r.r0, r.r1, result_loc)
+                self.mov_to_vfp_loc(r.r0, r.r1, resloc)
 
         # merge point
         currpos = self.mc.currpos()
         pmc = OverwritingBuilder(self.mc, jmp_pos, WORD)
         pmc.B_offs(currpos, fast_path_cond)
 
-        self._emit_guard_may_force(guard_op, arglocs, op.numargs())
+        self.mc.LDR_ri(r.ip.value, r.fp.value)
+        self.mc.CMP_ri(r.ip.value, 0)
+
+        self._emit_guard(guard_op, regalloc._prepare_guard(guard_op),
+                                                    c.GE, save_exc=True)
         return fcond
 
     # ../x86/assembler.py:668
diff --git a/rpython/jit/backend/arm/regalloc.py b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -1101,18 +1101,20 @@
     prepare_guard_call_release_gil = prepare_guard_call_may_force
 
     def prepare_guard_call_assembler(self, op, guard_op, fcond):
-
         descr = op.getdescr()
         assert isinstance(descr, JitCellToken)
-        arglist = op.getarglist()
-        self.rm._sync_var(arglist[0])
-        frame_loc = self.fm.loc(op.getarg(0))
-        if len(arglist) == 2:
-            self.rm._sync_var(arglist[1])
-            locs = [frame_loc, self.fm.loc(arglist[1])]
+        jd = descr.outermost_jitdriver_sd
+        assert jd is not None
+        vable_index = jd.index_of_virtualizable
+        if vable_index >= 0:
+            self._sync_var(op.getarg(vable_index))
+            vable = self.frame_manager.loc(op.getarg(vable_index))
         else:
-            locs = [frame_loc]
-        return locs + self._prepare_call(op, save_all_regs=True)
+            vable = imm(0)
+        # make sure the call result location is free
+        tmploc = self.get_scratch_reg(INT, selected_reg=r.r0)
+        self.possibly_free_vars(guard_op.getfailargs())
+        return [vable, tmploc] + self._prepare_call(op, save_all_regs=True)
 
     def _prepare_args_for_new_op(self, new_args):
         gc_ll_descr = self.cpu.gc_ll_descr


More information about the pypy-commit mailing list