[pypy-svn] r34100 - in pypy/dist/pypy: jit/codegen/ppc translator/asm/ppcgen translator/asm/ppcgen/test

niko at codespeak.net niko at codespeak.net
Fri Nov 3 14:14:48 CET 2006


Author: niko
Date: Fri Nov  3 14:14:47 2006
New Revision: 34100

Modified:
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
   pypy/dist/pypy/translator/asm/ppcgen/rassemblermaker.py
   pypy/dist/pypy/translator/asm/ppcgen/test/test_rassemblermaker.py
Log:
(mwh,niko)

insert a simple prologue, uncovering an annoying annotation problem in the
meantime



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	Fri Nov  3 14:14:47 2006
@@ -249,6 +249,11 @@
 
 RPPCAssembler = make_rassembler(MyPPCAssembler)
 
+r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, \
+    r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, \
+    r23, r24, r25, r26, r27, r28, r29, r30, r31 = range(32)
+rSP = r1
+
 def emit(self, value):
     self.mc.write(value)
 RPPCAssembler.emit = emit
@@ -361,6 +366,12 @@
         self.initial_varmapping = {}
         for arg in self.inputargs:
             self.initial_varmapping[arg] = gprs[3+len(self.initial_varmapping)]
+
+        # Emit standard prologue
+        self.asm.mflr(r0)      
+        self.asm.stw(r0,rSP,8)
+        self.asm.stwu(rSP,rSP,-64)
+            
         return self.inputargs
 
     def _close(self):
@@ -388,7 +399,13 @@
         allocator = self.emit()
         reg = allocator.var2reg[gv_returnvar]
         if reg.number != 3:
-            self.asm.mr(3, reg.number)
+            self.asm.mr(r3, reg.number)
+
+        # Emit standard epilogue:
+        #   TODO rewrite to handle varying size stack?
+        self.asm.lwz(r0,rSP,64+8)
+        self.asm.mtlr(r0)
+        self.asm.addi(rSP,rSP,64)
         self.asm.blr()
         self._close()
 

Modified: pypy/dist/pypy/translator/asm/ppcgen/rassemblermaker.py
==============================================================================
--- pypy/dist/pypy/translator/asm/ppcgen/rassemblermaker.py	(original)
+++ pypy/dist/pypy/translator/asm/ppcgen/rassemblermaker.py	Fri Nov  3 14:14:47 2006
@@ -1,5 +1,5 @@
 from pypy.tool.sourcetools import compile2
-
+from pypy.rlib.rarithmetic import r_uint
 from pypy.translator.asm.ppcgen.form import IDesc, IDupDesc
 
 ##     "opcode": ( 0,  5),
@@ -32,19 +32,19 @@
     if isinstance(desc, IDupDesc):
         for destfield, srcfield in desc.dupfields.iteritems():
             fieldvalues.append((destfield, srcfield.name))
-    body = ['v = 0']
+    body = ['v = r_uint(0)']
     assert 'v' not in sig # that wouldn't be funny
     #body.append('print %r'%name + ', ' + ', '.join(["'%s:', %s"%(s, s) for s in sig]))
     for field, value in fieldvalues:
         if field.name == 'spr':
             body.append('spr = (%s&31) << 5 | (%s >> 5 & 31)'%(value, value))
             value = 'spr'
-        body.append('v |= (%3s & %#05x) << %d'%(value,
+        body.append('v |= (%3s & r_uint(%#05x)) << %d'%(value,
                                            field.mask,
                                            (32 - field.right - 1)))
     body.append('self.emit(v)')
     src = 'def %s(self, %s):\n    %s'%(name, ', '.join(sig), '\n    '.join(body))
-    d = {}
+    d = {'r_uint':r_uint}
     #print src
     exec compile2(src) in d
     return d[name]

Modified: pypy/dist/pypy/translator/asm/ppcgen/test/test_rassemblermaker.py
==============================================================================
--- pypy/dist/pypy/translator/asm/ppcgen/test/test_rassemblermaker.py	(original)
+++ pypy/dist/pypy/translator/asm/ppcgen/test/test_rassemblermaker.py	Fri Nov  3 14:14:47 2006
@@ -17,6 +17,7 @@
     def f():
         ra = RPPCAssembler()
         ra.add(3, 3, 4)
+        ra.lwz(1, 1, 1)  # ensure that high bit doesn't produce long but r_uint
         return ra.insts[0]
     res = interpret(f, [])
     assert res == add_r3_r3_r4
@@ -36,4 +37,3 @@
         a.mtctr(3)
         mrs.append(a.insts[0])
     assert mrs[0].assemble() == mrs[1]
-



More information about the Pypy-commit mailing list