[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