[pypy-svn] r34575 - pypy/dist/pypy/jit/codegen/ppc

mwh at codespeak.net mwh at codespeak.net
Mon Nov 13 17:20:15 CET 2006


Author: mwh
Date: Mon Nov 13 17:20:06 2006
New Revision: 34575

Modified:
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
an untested AddrConst implementation, and some other bits


Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py	Mon Nov 13 17:20:06 2006
@@ -60,6 +60,41 @@
     def fits_in_immediate(self):
         return abs(self.value) < 2**16
 
+class AddrConst(GenConst):
+
+    def __init__(self, addr):
+        self.addr = addr
+
+    @specialize.arg(1)
+    def revealconst(self, T):
+        if T is llmemory.Address:
+            return self.addr
+        elif isinstance(T, lltype.Ptr):
+            return llmemory.cast_adr_to_ptr(self.addr, T)
+        elif T is lltype.Signed:
+            return llmemory.cast_adr_to_int(self.addr)
+        else:
+            assert 0, "XXX not implemented"
+
+    def fits_in_immediate(self):
+        return False
+
+    def load(self, insns, var):
+        i = IntConst(llmemory.cast_adr_to_int(self.addr))
+        insns.append(
+            insn.Insn_GPR__IMM(RPPCAssembler.load_word,
+                               var, [i]))
+
+    def load_now(self, asm, loc):
+        value = llmemory.cast_adr_to_int(self.addr)
+        if loc.is_register:
+            assert isinstance(loc, insn.GPR)
+            asm.load_word(loc.number, value)
+        else:
+            asm.load_word(rSCRATCH, value)
+            asm.stw(rSCRATCH, rFP, loc.offset)
+
+
 class JumpPatchupGenerator(object):
 
     def __init__(self, asm, min_offset):
@@ -160,6 +195,9 @@
         genmethod = getattr(self, 'op_' + opname)
         return genmethod(gv_arg1, gv_arg2)
 
+    def genop_call(self, sigtoken, gv_fnptr, args_gv):
+        pass
+
 ##     def genop_getfield(self, fieldtoken, gv_ptr):
 ##     def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
 ##     def genop_getsubstruct(self, fieldtoken, gv_ptr):
@@ -168,7 +206,6 @@
 ##     def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
 ##     def genop_malloc_fixedsize(self, alloctoken):
 ##     def genop_malloc_varsize(self, varsizealloctoken, gv_size):
-##     def genop_call(self, sigtoken, gv_fnptr, args_gv):
 ##     def genop_same_as(self, kindtoken, gv_x):
 ##     def genop_debug_pdb(self):    # may take an args_gv later
 
@@ -492,6 +529,7 @@
 
     def __init__(self):
         self.mcs = []   # machine code blocks where no-one is currently writing
+        self.keepalive_gc_refs = [] 
 
     # ----------------------------------------------------------------
     # the public RGenOp interface
@@ -503,16 +541,18 @@
         inputargs_gv = builder._write_prologue(sigtoken)
         return builder, entrypoint, inputargs_gv
 
-    @staticmethod
-    @specialize.genconst(0)
-    def genconst(llvalue):
+    @specialize.genconst(1)
+    def genconst(self, llvalue):
         T = lltype.typeOf(llvalue)
         if isinstance(T, lltype.Primitive):
             return IntConst(lltype.cast_primitive(lltype.Signed, llvalue))
-##         elif T is llmemory.Address:
-##             return AddrConst(llvalue)
-##         elif isinstance(T, lltype.Ptr):
-##             return AddrConst(llmemory.cast_ptr_to_adr(llvalue))
+        elif T is llmemory.Address:
+            return AddrConst(llvalue)
+        elif isinstance(T, lltype.Ptr):
+            lladdr = llmemory.cast_ptr_to_adr(llvalue)
+            if T.TO._gckind == 'gc':
+                self.keepalive_gc_refs.append(lltype.cast_opaque_ptr(llmemory.GCREF, llvalue))
+            return AddrConst(lladdr)
         else:
             assert 0, "XXX not implemented"
 
@@ -646,3 +686,6 @@
         self.asm.mtctr(rSCRATCH)
         self.asm.bctr()
         self.asm.mc.setpos(pos)
+
+global_rgenop = RPPCGenOp()
+RPPCGenOp.constPrebuiltGlobal = global_rgenop.genconst



More information about the Pypy-commit mailing list