[pypy-commit] pypy jitframe-on-heap: Kill two copies of the same code for make_execute_token

fijal noreply at buildbot.pypy.org
Wed Feb 13 19:18:51 CET 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: jitframe-on-heap
Changeset: r61179:33f35592a600
Date: 2013-02-13 20:17 +0200
http://bitbucket.org/pypy/pypy/changeset/33f35592a600/

Log:	Kill two copies of the same code for make_execute_token

diff --git a/rpython/jit/backend/arm/assembler.py b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -641,7 +641,7 @@
         self.write_pending_failure_recoveries()
 
         rawstart = self.materialize_loop(looptoken)
-        looptoken._function_addr = looptoken._arm_func_addr = rawstart
+        looptoken._function_addr = looptoken._ll_function_addr = rawstart
 
         self.process_pending_guards(rawstart)
         self.fixup_target_tokens(rawstart)
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
@@ -1112,7 +1112,7 @@
         assert isinstance(descr, JitCellToken)
         # check value
         assert tmploc is r.r0
-        self._emit_call(imm(descr._arm_func_addr),
+        self._emit_call(imm(descr._ll_function_addr),
                                 callargs, fcond, resloc=tmploc)
         if op.result is None:
             value = self.cpu.done_with_this_frame_void_v
@@ -1243,12 +1243,12 @@
         new_nbargs = newlooptoken.compiled_loop_token._debug_nbargs
         assert old_nbargs == new_nbargs
         # we overwrite the instructions at the old _arm_func_adddr
-        # to start with a JMP to the new _arm_func_addr.
+        # to start with a JMP to the new _ll_function_addr.
         # Ideally we should rather patch all existing CALLs, but well.
         XXX # this is wrong, copy the logic from x86, but also, shouldn't
         # it live on a base class instead?
-        oldadr = oldlooptoken._arm_func_addr
-        target = newlooptoken._arm_func_addr
+        oldadr = oldlooptoken._ll_function_addr
+        target = newlooptoken._ll_function_addr
         mc = ARMv7Builder()
         mc.B(target)
         mc.copy_to_raw_memory(oldadr)
diff --git a/rpython/jit/backend/arm/runner.py b/rpython/jit/backend/arm/runner.py
--- a/rpython/jit/backend/arm/runner.py
+++ b/rpython/jit/backend/arm/runner.py
@@ -65,52 +65,6 @@
         for index in range(count):
             setitem(index, null)
 
-    def make_execute_token(self, *ARGS):
-        FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF],
-                                             llmemory.GCREF))
-
-        lst = [(i, history.getkind(ARG)[0]) for i, ARG in enumerate(ARGS)]
-        kinds = unrolling_iterable(lst)
-
-        def execute_token(executable_token, *args):
-            clt = executable_token.compiled_loop_token
-            assert len(args) == clt._debug_nbargs
-            #
-            addr = executable_token._arm_func_addr
-            assert addr % 8 == 0
-            func = rffi.cast(FUNCPTR, addr)
-            #llop.debug_print(lltype.Void, ">>>> Entering", addr)
-            frame_info = clt.frame_info
-            frame = self.gc_ll_descr.malloc_jitframe(frame_info)
-            ll_frame = lltype.cast_opaque_ptr(llmemory.GCREF, frame)
-            prev_interpreter = None   # help flow space
-            if not self.translate_support_code:
-                prev_interpreter = LLInterpreter.current_interpreter
-                LLInterpreter.current_interpreter = self.debug_ll_interpreter
-            try:
-                num = JITFRAME_FIXED_SIZE * WORD
-                for i, kind in kinds:
-                    arg = args[i]
-                    if kind == history.INT:
-                        self.set_int_value(ll_frame, num, arg)
-                    elif kind == history.FLOAT:
-                        self.set_float_value(ll_frame, num, arg)
-                        num += WORD # on ARM(32 bit) a FLOAT needs two words
-                    else:
-                        assert kind == history.REF
-                        self.set_ref_value(ll_frame, num, arg)
-                    num += WORD
-                # no GC operation between gc_assume_young_pointers and
-                # the actual call to assembler!
-                llop.gc_assume_young_pointers(lltype.Void, frame)
-                ll_frame = func(ll_frame)
-            finally:
-                if not self.translate_support_code:
-                    LLInterpreter.current_interpreter = prev_interpreter
-            #llop.debug_print(lltype.Void, "<<<< Back")
-            return ll_frame
-        return execute_token
-
     def cast_ptr_to_int(x):
         adr = llmemory.cast_ptr_to_adr(x)
         return ArmCPU.cast_adr_to_int(adr)
diff --git a/rpython/jit/backend/arm/test/test_regalloc.py b/rpython/jit/backend/arm/test/test_regalloc.py
--- a/rpython/jit/backend/arm/test/test_regalloc.py
+++ b/rpython/jit/backend/arm/test/test_regalloc.py
@@ -791,7 +791,7 @@
         large = self.interpret(loop1, range(11), run=False)
         large._jitcelltoken.outermost_jitdriver_sd = FakeJitDriverSD()
         self.namespace['looptoken'] = large._jitcelltoken
-        assert self.namespace['looptoken']._arm_func_addr != 0
+        assert self.namespace['looptoken']._ll_function_addr != 0
         loop2 = """
         [i0]
         i1 = force_token()
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
@@ -15,6 +15,7 @@
     FLAG_POINTER, FLAG_FLOAT)
 from rpython.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
 from rpython.annotator import model as annmodel
+from rpython.rlib.unroll import unrolling_iterable
 
 
 class AbstractLLCPU(AbstractCPU):
@@ -187,6 +188,47 @@
         frame.jf_descr = frame.jf_force_descr
         return lltype.cast_opaque_ptr(llmemory.GCREF, frame)
 
+    def make_execute_token(self, *ARGS):
+        FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF],
+                                             llmemory.GCREF))
+
+        lst = [(i, history.getkind(ARG)[0]) for i, ARG in enumerate(ARGS)]
+        kinds = unrolling_iterable(lst)
+
+        def execute_token(executable_token, *args):
+            clt = executable_token.compiled_loop_token
+            assert len(args) == clt._debug_nbargs
+            #
+            addr = executable_token._ll_function_addr
+            func = rffi.cast(FUNCPTR, addr)
+            #llop.debug_print(lltype.Void, ">>>> Entering", addr)
+            frame_info = clt.frame_info
+            frame = self.gc_ll_descr.malloc_jitframe(frame_info)
+            ll_frame = lltype.cast_opaque_ptr(llmemory.GCREF, frame)
+            locs = executable_token.compiled_loop_token._ll_initial_locs
+            prev_interpreter = None   # help flow space
+            if not self.translate_support_code:
+                prev_interpreter = LLInterpreter.current_interpreter
+                LLInterpreter.current_interpreter = self.debug_ll_interpreter
+            try:
+                for i, kind in kinds:
+                    arg = args[i]
+                    num = locs[i]
+                    if kind == history.INT:
+                        self.set_int_value(ll_frame, num, arg)
+                    elif kind == history.FLOAT:
+                        self.set_float_value(ll_frame, num, arg)
+                    else:
+                        assert kind == history.REF
+                        self.set_ref_value(ll_frame, num, arg)
+                ll_frame = func(ll_frame)
+            finally:
+                if not self.translate_support_code:
+                    LLInterpreter.current_interpreter = prev_interpreter
+            #llop.debug_print(lltype.Void, "<<<< Back")
+            return ll_frame
+        return execute_token
+
     # ------------------- helpers and descriptions --------------------
 
     @staticmethod
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -472,7 +472,7 @@
 
     def assemble_loop(self, loopname, inputargs, operations, looptoken, log):
         '''adds the following attributes to looptoken:
-               _x86_function_addr   (address of the generated func, as an int)
+               _ll_function_addr    (address of the generated func, as an int)
                _x86_loop_code       (debug: addr of the start of the ResOps)
                _x86_fullsize        (debug: full size including failure)
                _x86_debug_checksum
@@ -531,7 +531,7 @@
             looptoken._x86_rawstart = rawstart
             looptoken._x86_fullsize = full_size
             looptoken._x86_ops_offset = ops_offset
-        looptoken._x86_function_addr = rawstart
+        looptoken._ll_function_addr = rawstart
 
         self.fixup_target_tokens(rawstart)
         self.teardown()
@@ -865,11 +865,11 @@
         old_nbargs = oldlooptoken.compiled_loop_token._debug_nbargs
         new_nbargs = newlooptoken.compiled_loop_token._debug_nbargs
         assert old_nbargs == new_nbargs
-        # we overwrite the instructions at the old _x86_function_addr
-        # to start with a JMP to the new _x86_function_addr.
+        # we overwrite the instructions at the old _ll_function_addr
+        # to start with a JMP to the new _ll_function_addr.
         # Ideally we should rather patch all existing CALLs, but well.
-        oldadr = oldlooptoken._x86_function_addr
-        target = newlooptoken._x86_function_addr
+        oldadr = oldlooptoken._ll_function_addr
+        target = newlooptoken._ll_function_addr
         # copy frame-info data
         baseofs = self.cpu.get_baseofs_of_frame_field()
         newlooptoken.compiled_loop_token.update_frame_info(
@@ -2274,7 +2274,7 @@
         # execute_token
         jd = descr.outermost_jitdriver_sd
         base_ofs = self.cpu.get_baseofs_of_frame_field()
-        self._emit_call(imm(descr._x86_function_addr),
+        self._emit_call(imm(descr._ll_function_addr),
                         [argloc], 0, tmp=eax)
         if op.result is None:
             assert result_loc is None
diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -1,9 +1,6 @@
 import py
-from rpython.rlib.unroll import unrolling_iterable
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
-from rpython.rtyper.llinterp import LLInterpreter
 from rpython.rlib.jit_hooks import LOOP_RUN_CONTAINER
-from rpython.jit.metainterp import history
 from rpython.jit.backend.x86.assembler import Assembler386
 from rpython.jit.backend.x86.profagent import ProfileAgent
 from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU
@@ -97,47 +94,6 @@
         for index in range(count):
             setitem(index, null)
 
-    def make_execute_token(self, *ARGS):
-        FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF],
-                                             llmemory.GCREF))
-
-        lst = [(i, history.getkind(ARG)[0]) for i, ARG in enumerate(ARGS)]
-        kinds = unrolling_iterable(lst)
-
-        def execute_token(executable_token, *args):
-            clt = executable_token.compiled_loop_token
-            assert len(args) == clt._debug_nbargs
-            #
-            addr = executable_token._x86_function_addr
-            func = rffi.cast(FUNCPTR, addr)
-            #llop.debug_print(lltype.Void, ">>>> Entering", addr)
-            frame_info = clt.frame_info
-            frame = self.gc_ll_descr.malloc_jitframe(frame_info)
-            ll_frame = lltype.cast_opaque_ptr(llmemory.GCREF, frame)
-            locs = executable_token.compiled_loop_token._ll_initial_locs
-            prev_interpreter = None   # help flow space
-            if not self.translate_support_code:
-                prev_interpreter = LLInterpreter.current_interpreter
-                LLInterpreter.current_interpreter = self.debug_ll_interpreter
-            try:
-                for i, kind in kinds:
-                    arg = args[i]
-                    num = locs[i]
-                    if kind == history.INT:
-                        self.set_int_value(ll_frame, num, arg)
-                    elif kind == history.FLOAT:
-                        self.set_float_value(ll_frame, num, arg)
-                    else:
-                        assert kind == history.REF
-                        self.set_ref_value(ll_frame, num, arg)
-                ll_frame = func(ll_frame)
-            finally:
-                if not self.translate_support_code:
-                    LLInterpreter.current_interpreter = prev_interpreter
-            #llop.debug_print(lltype.Void, "<<<< Back")
-            return ll_frame
-        return execute_token
-
     def cast_ptr_to_int(x):
         adr = llmemory.cast_ptr_to_adr(x)
         return CPU386.cast_adr_to_int(adr)


More information about the pypy-commit mailing list