[pypy-commit] pypy ppc-jit-backend: Renamed class MyPPCAssembler to PPCBuilder, added some methods for code generation.

hager noreply at buildbot.pypy.org
Fri Jul 22 16:57:31 CEST 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r45884:762f25673182
Date: 2011-07-22 16:54 +0200
http://bitbucket.org/pypy/pypy/changeset/762f25673182/

Log:	Renamed class MyPPCAssembler to PPCBuilder, added some methods for
	code generation.

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
@@ -7,6 +7,7 @@
 from pypy.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
 from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
 from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.jit.metainterp.resoperation import rop
 
 A = Form("frD", "frA", "frB", "XO3", "Rc")
 A1 = Form("frD", "frB", "XO3", "Rc")
@@ -802,7 +803,7 @@
         return -((v ^ 0xFFFF) + 1) # "sign extend" to 32 bits
     return v
 
-class MyPPCAssembler(PPCAssembler):
+class PPCBuilder(PPCAssembler):
     def __init__(self):
         PPCAssembler.__init__(self)
         self.init_block_builder()
@@ -816,40 +817,39 @@
         self.addis(rD, 0, ha(addr))
         self.lwz(rD, rD, la(addr))
 
+    def store_reg(self, source_reg, addr):
+        self.load_word(10, addr)
+        self.stw(source_reg, 10, 0)
+
     def nop(self):
         self.ori(0, 0, 0)
 
-    #def bl(self, addr):
-    #    offset = 4 * len(self.insts)
-    #    self.nop()
-    #    self.patch_list.append((offset, addr))
+    # translate a trace operation to corresponding machine code
+    def build_op(self, trace_op, cpu):
+        opnum = trace_op.getopnum()
+        if opnum == rop.INT_ADD:
+            self.emit_int_add(trace_op, cpu)
+        elif opnum == rop.FINISH:
+            self.emit_finish(cpu)
 
-    #def assemble(self, dump=os.environ.has_key('PYPY_DEBUG')):
-    #    insns = self.assemble0(dump)
-    #    for i in insns:
-    #        self.emit(i)
-    #    i = self.materialize(AsmMemoryManager(), [])
-    #    t = lltype.FuncType([], lltype.Signed)
-    #    self.patch_jumps(i)
-    #    return rffi.cast(lltype.Ptr(t), i)
-    #   
-    #def patch_jumps(self, rawstart):
-    #    #import pdb; pdb.set_trace()
+    # --------------------------------------- #
+    #             CODE GENERATION             #
+    # --------------------------------------- #
 
-    #    for offset, addr in self.patch_list:
-    #        #delta = (rawstart + offset) - addr
-    #        delta = addr - (rawstart + offset)
-    #        delta >>= 2
-    #        print "delta =", delta
-    #        #assert (delta >> 24) == -1
+    def emit_int_add(self, op, cpu):
+        arg0 = op.getarg(0)
+        arg1 = op.getarg(1)
 
-    #        updater = BranchUpdater()
-    #        #updater.bl(delta)
-    #        self.load_word(reg, h)
+        arg0_index = cpu.get_box_index(arg0)
+        addr_box_0 = cpu.fail_boxes_int.get_addr_for_num(arg0_index)
 
+        self.load_from(3, addr_box_0)
+        self.addi(3, 3, arg1.value)
+        self.store_reg(3, addr_box_0)
 
-    #        updater.bctrl()
-    #        updater.write_to_mem(rawstart + offset)
+    def emit_finish(self, cpu):
+        self.load_word(3, 0)
+        self.blr()
 
 class BranchUpdater(PPCAssembler):
     def __init__(self):
diff --git a/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py b/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
--- a/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
+++ b/pypy/jit/backend/ppc/ppcgen/test/test_ppc.py
@@ -1,7 +1,7 @@
 import py
 import random, sys, os
 
-from pypy.jit.backend.ppc.ppcgen.ppc_assembler import BasicPPCAssembler, MyPPCAssembler
+from pypy.jit.backend.ppc.ppcgen.ppc_assembler import BasicPPCAssembler, PPCBuilder
 from pypy.jit.backend.ppc.ppcgen.symbol_lookup import lookup
 from pypy.jit.backend.ppc.ppcgen.regname import *
 from pypy.jit.backend.ppc.ppcgen import form, pystructs
@@ -21,7 +21,7 @@
 
 """
 Creates the boilerplate code for the tests.
-- Make an MyPPCAssembler object
+- Make an PPCBuilder object
 - Let the given test create the machine code
 - Create a function and call it
 - Compare the return value with the expected result
@@ -29,7 +29,7 @@
 def asmtest(expected=-1):
     def testmaker(test):
         def newtest(self):
-            a = MyPPCAssembler()
+            a = PPCBuilder()
             test(self, a)
             f = a.assemble()
             assert f() == expected
@@ -173,7 +173,7 @@
     def test_call_function(self):
         functype =  lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed))
         call_addr = rffi.cast(lltype.Signed, llhelper(functype, func))
-        a = MyPPCAssembler()
+        a = PPCBuilder()
 
         # NOW EXPLICITLY:
         # 
@@ -245,7 +245,7 @@
         a.blr()
 
     def test_neg(self):
-        a = MyPPCAssembler()
+        a = PPCBuilder()
         a.load_word(10, 0x0000F0F0)
         a.neg(3, 10)
         a.blr()
@@ -253,7 +253,7 @@
         assert f() == hex_to_signed_int("FFFF0F10")
 
     def test_load_and_store(self):
-        a = MyPPCAssembler()
+        a = PPCBuilder()
         word1 = 1000
         word2 = 2000
         a.load_word(10, word1)


More information about the pypy-commit mailing list