[pypy-commit] pypy ppc-jit-backend: Can now compile bridges, first test passes.
hager
noreply at buildbot.pypy.org
Mon Aug 8 16:22:00 CEST 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r46367:1c457b7d1e1a
Date: 2011-08-08 16:23 +0200
http://bitbucket.org/pypy/pypy/changeset/1c457b7d1e1a/
Log: Can now compile bridges, first test passes.
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -954,7 +954,9 @@
self.cmpi(0, 1, regnum, 0) # result of comparison
fail_index = len(cpu.saved_descr)
- cpu.saved_descr[fail_index] = op.getdescr()
+ fail_descr = op.getdescr()
+ fail_descr.index = fail_index
+ cpu.saved_descr[fail_index] = fail_descr
numops = self.get_number_of_ops()
self.beq(0)
diff --git a/pypy/jit/backend/ppc/runner.py b/pypy/jit/backend/ppc/runner.py
--- a/pypy/jit/backend/ppc/runner.py
+++ b/pypy/jit/backend/ppc/runner.py
@@ -33,14 +33,15 @@
# floats are not supported yet
self.supports_floats = False
+ self.total_compiled_loops = 0
+ self.total_compiled_bridges = 0
# compile a given trace
def compile_loop(self, inputargs, operations, looptoken, log=True):
self.saved_descr = {}
self.patch_list = []
self.reg_map = {}
- self.inputargs = inputargs
-
+
codebuilder = PPCBuilder()
self.next_free_register = 3
@@ -55,8 +56,38 @@
self._walk_trace_ops(codebuilder, operations)
self._make_epilogue(codebuilder)
+ f = codebuilder.assemble()
+ looptoken.ppc_code = f
+ looptoken.codebuilder = codebuilder
+ self.total_compiled_loops += 1
+ self.teardown()
+
+ def compile_bridge(self, descr, inputargs, operations, looptoken):
+ self.saved_descr = {}
+ self.patch_list = []
+ self.reg_map = {}
+
+ codebuilder = looptoken.codebuilder
+ current_pos = codebuilder.get_relative_pos()
+ offset = current_pos - descr.patch_pos
+ codebuilder.b(offset)
+ codebuilder.patch_op(descr.patch_op)
+
+ self.next_free_register = 3
+ for index, arg in enumerate(inputargs):
+ self.reg_map[arg] = self.next_free_register
+ addr = self.fail_boxes_int.get_addr_for_num(index)
+ codebuilder.load_from(self.next_free_register, addr)
+ self.next_free_register += 1
+
+ self._walk_trace_ops(codebuilder, operations)
+ self._make_epilogue(codebuilder)
+
f = codebuilder.assemble(True)
looptoken.ppc_code = f
+ looptoken.codebuilder = codebuilder
+
+ self.total_compiled_bridges += 1
self.teardown()
def _make_epilogue(self, codebuilder):
@@ -74,6 +105,12 @@
addr = self.fail_boxes_int.get_addr_for_num(index)
codebuilder.store_reg(reg, addr)
+ patch_op = codebuilder.get_number_of_ops()
+ patch_pos = codebuilder.get_relative_pos()
+ descr = self.saved_descr[fail_index]
+ descr.patch_op = patch_op
+ descr.patch_pos = patch_pos
+
codebuilder.li(3, fail_index)
codebuilder.blr()
@@ -101,4 +138,3 @@
def teardown(self):
self.patch_list = None
self.reg_map = None
- self.inputargs = None
More information about the pypy-commit
mailing list