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

fijal at codespeak.net fijal at codespeak.net
Sat Apr 5 05:23:42 CEST 2008


Author: fijal
Date: Sat Apr  5 05:23:41 2008
New Revision: 53373

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
Log:
Support get/set field with different types. Actually this is few lines
less than not supporting it, progress


Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py	Sat Apr  5 05:23:41 2008
@@ -58,7 +58,7 @@
         builder.mc.MOV(eax, self.operand(builder))
         builder.mc.MOV(dstop, eax)
 
-class AddressVar(IntVar):
+class AddrVar(IntVar):
     ll_type = llmemory.Address
     token = 'a'
     SIZE = 1
@@ -105,7 +105,7 @@
 LL_TO_GENVAR = {}
 TOKEN_TO_GENVAR = {}
 TOKEN_TO_SIZE = {}
-for value in [IntVar, FloatVar, BoolVar, AddressVar]:
+for value in [IntVar, FloatVar, BoolVar, AddrVar]:
     assert hasattr(value, 'll_type')
     LL_TO_GENVAR[value.ll_type] = value.token
     TOKEN_TO_GENVAR[value.token] = value

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	Sat Apr  5 05:23:41 2008
@@ -9,7 +9,7 @@
 from pypy.rpython.annlowlevel import llhelper
 from pypy.jit.codegen.ia32.objmodel import IntVar, FloatVar, Var,\
      BoolVar, IntConst, AddrConst, BoolConst, FloatConst,\
-     LL_TO_GENVAR, TOKEN_TO_SIZE, token_to_genvar, WORD
+     LL_TO_GENVAR, TOKEN_TO_SIZE, token_to_genvar, WORD, AddrVar
 
 DEBUG_CALL_ALIGN = True
 if sys.platform == 'darwin':
@@ -42,10 +42,10 @@
 def map_arg(arg):
     # a small helper that provides correct type signature
     if isinstance(arg, lltype.Ptr):
-        return llmemory.Address
+        arg = llmemory.Address
     if isinstance(arg, (lltype.Array, lltype.Struct)):
-        return lltype.Void
-    return arg
+        arg = lltype.Void
+    return LL_TO_GENVAR[arg]
 
 class Label(GenLabel):
 
@@ -275,8 +275,10 @@
         genmethod = getattr(self, 'op_' + opname)
         return genmethod(gv_arg)
 
-    def genop_getfield(self, (offset, fieldsize), gv_ptr):
+    def genop_getfield(self, (offset, fieldsize, kindtoken), gv_ptr):
         self.mc.MOV(edx, gv_ptr.operand(self))
+        return self.newvarfromaddr(kindtoken, (edx, None, 0, offset))
+        
         if fieldsize == WORD:
             op = mem(edx, offset)
         else:
@@ -298,21 +300,11 @@
     def get_frame_info(self, vars_gv):
         return vars_gv
 
-    def genop_setfield(self, (offset, fieldsize), gv_ptr, gv_value):
-        self.mc.MOV(eax, gv_value.operand(self))
+    def genop_setfield(self, (offset, fieldsize, kt), gv_ptr, gv_value):
         self.mc.MOV(edx, gv_ptr.operand(self))
-        if fieldsize == 1:
-            self.mc.MOV(mem8(edx, offset), al)
-        else:
-            if fieldsize == 2:
-                self.mc.o16()    # followed by the MOV below
-            elif fieldsize == WORD:
-                pass
-            else:
-                raise NotImplementedError("fieldsize != 1,2,4")
-            self.mc.MOV(mem(edx, offset), eax)
+        gv_value.movetonewaddr(self, (edx, None, 0, offset))
 
-    def genop_getsubstruct(self, (offset, fieldsize), gv_ptr):
+    def genop_getsubstruct(self, (offset, fieldsize, kt), gv_ptr):
         self.mc.MOV(edx, gv_ptr.operand(self))
         self.mc.LEA(eax, mem(edx, offset))
         return self.returnintvar(eax)
@@ -521,6 +513,14 @@
             self.push(op)
         return res
 
+    def returnaddrvar(self, op):
+        res = AddrVar(self.stackdepth)
+        if op is None:
+            self.push(imm(0))
+        else:
+            self.push(op)
+        return res
+
     def returnboolvar(self, op):
         if op is eax:
             pass
@@ -546,6 +546,8 @@
         #     iterable, but let's not be too smart...
         if kindtoken == 'i':
             return self.returnintvar(self.mem_access(addr))
+        elif kindtoken == 'a':
+            return self.returnaddrvar(self.mem_access(addr))
         elif kindtoken == 'b':
             return self.returnboolvar(self.mem_access(addr))
         elif kindtoken == 'f':
@@ -1251,7 +1253,7 @@
             fieldsize = 0      # not useful for getsubstruct
         else:
             fieldsize = llmemory.sizeof(FIELD)
-        return (llmemory.offsetof(T, name), fieldsize)
+        return (llmemory.offsetof(T, name), fieldsize, map_arg(FIELD))
 
     @staticmethod
     @specialize.memo()
@@ -1286,14 +1288,13 @@
         return (llmemory.ArrayLengthOffset(A),
                 llmemory.ArrayItemsOffset(A),
                 llmemory.ItemOffset(A.OF),
-                LL_TO_GENVAR[map_arg(A.OF)])
+                map_arg(A.OF))
 
     @staticmethod
     @specialize.memo()
     def sigToken(FUNCTYPE):
-        return ([LL_TO_GENVAR[map_arg(arg)] for arg in FUNCTYPE.ARGS if arg
-                 is not lltype.Void],
-                LL_TO_GENVAR[map_arg(FUNCTYPE.RESULT)])
+        return ([map_arg(arg) for arg in FUNCTYPE.ARGS if arg
+                 is not lltype.Void], map_arg(FUNCTYPE.RESULT))
 
     @staticmethod
     def erasedType(T):



More information about the Pypy-commit mailing list