[pypy-commit] pypy ppc-jit-backend: implement method to call an address in a register

hager noreply at buildbot.pypy.org
Tue Mar 13 18:35:28 CET 2012


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r53448:ffa102113953
Date: 2012-03-13 10:26 -0700
http://bitbucket.org/pypy/pypy/changeset/ffa102113953/

Log:	implement method to call an address in a register

diff --git a/pypy/jit/backend/ppc/codebuilder.py b/pypy/jit/backend/ppc/codebuilder.py
--- a/pypy/jit/backend/ppc/codebuilder.py
+++ b/pypy/jit/backend/ppc/codebuilder.py
@@ -1,5 +1,6 @@
 import os
 from pypy.jit.backend.ppc.ppc_form import PPCForm as Form
+from pypy.jit.backend.ppc.locations import RegisterLocation
 from pypy.jit.backend.ppc.ppc_field import ppc_fields
 from pypy.jit.backend.ppc.assembler import Assembler
 from pypy.jit.backend.ppc.arch import (IS_PPC_32, WORD, IS_PPC_64)
@@ -1046,6 +1047,25 @@
         if IS_PPC_64:
             self.load(r.TOC.value, r.SP.value, 5 * WORD)
 
+    def call_register(self, call_reg):
+        """ do a call to an address given in a register
+        """
+        assert isinstance(call_reg, RegisterLocation)
+        with scratch_reg(self):
+            if IS_PPC_32:
+                self.mr(r.SCRATCH.value, call_reg.value)
+            else:
+                self.store(r.TOC.value, r.SP.value, 5 * WORD)
+                self.mr(r.r11.value, call_reg.value)
+                self.load(r.SCRATCH.value, r.r11.value, 0)
+                self.load(r.r2.value, r.r11.value, WORD)
+                self.load(r.r11.value, r.r11.value, 2 * WORD)
+            self.mtctr(r.SCRATCH.value)
+        self.bctrl()
+
+        if IS_PPC_64:
+            self.load(r.TOC.value, r.SP.value, 5 * WORD)
+
     def load(self, target_reg, base_reg, offset):
         if IS_PPC_32:
             self.lwz(target_reg, base_reg, offset)


More information about the pypy-commit mailing list