[pypy-svn] r53531 - pypy/branch/jit-hotpath/pypy/jit/codegen/ia32

fijal at codespeak.net fijal at codespeak.net
Mon Apr 7 18:47:32 CEST 2008


Author: fijal
Date: Mon Apr  7 18:47:32 2008
New Revision: 53531

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
Log:
Fix test method_call_promote. I promise I'll run tests all the time,
I promise I'll run tests all the time, I promise I'll run tests all the time,
...


Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py	Mon Apr  7 18:47:32 2008
@@ -294,9 +294,9 @@
         return genmethod(gv_arg)
 
     def genop_getfield(self, (offset, fieldsize, kindtoken), gv_ptr):
-        assert fieldsize != 2
         self.mc.MOV(edx, gv_ptr.operand(self))
-        return self.newvarfromaddr(kindtoken, (edx, None, 0, offset))
+        return self.newvarfromaddr(kindtoken, (edx, None, 0, offset),
+                                   fieldsize)
         
         if fieldsize == WORD:
             op = mem(edx, offset)
@@ -362,7 +362,7 @@
         self.mc.MOV(edx, gv_ptr.operand(self))
         _, _, itemsize, kindtoken = arraytoken
         addr = self._compute_itemaddr(edx, arraytoken, gv_index)
-        return self.newvarfromaddr(kindtoken, addr)
+        return self.newvarfromaddr(kindtoken, addr, itemsize)
 
     def genop_getarraysubstruct(self, arraytoken, gv_ptr, gv_index):
         self.mc.MOV(edx, gv_ptr.operand(self))
@@ -565,10 +565,19 @@
             raise NotImplementedError("Return float var not on fp stack")
         return res
 
-    def newvarfromaddr(self, kindtoken, addr):
+    def newvarfromaddr(self, kindtoken, addr, size):
         # XXX probably we can still do something here with unrolling
         #     iterable, but let's not be too smart...
         if kindtoken == 'i':
+            # XXX kind of a hack
+            if size == 1:
+                self.mc.MOVZX(eax, self.mem_access8(addr))
+                return self.returnintvar(eax)
+            elif size == 2:
+                # XXX never tested
+                self.mc.MOV(eax, self.mem_access(addr))
+                self.mc.o16()
+                return self.returnintvar(eax)
             return self.returnintvar(self.mem_access(addr))
         elif kindtoken == 'a':
             return self.returnaddrvar(self.mem_access(addr))



More information about the Pypy-commit mailing list