[pypy-svn] r13179 - in pypy/dist/pypy/translator/llvm: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Jun 8 14:28:31 CEST 2005


Author: cfbolz
Date: Wed Jun  8 14:28:31 2005
New Revision: 13179

Modified:
   pypy/dist/pypy/translator/llvm/funcrepr.py
   pypy/dist/pypy/translator/llvm/genllvm.py
   pypy/dist/pypy/translator/llvm/pbcrepr.py
   pypy/dist/pypy/translator/llvm/pointerrepr.py
   pypy/dist/pypy/translator/llvm/representation.py
   pypy/dist/pypy/translator/llvm/test/test_genllvm.py
   pypy/dist/pypy/translator/llvm/typerepr.py
Log:
more fixes. most functions with arithmetic only work again. enabled respective tests


Modified: pypy/dist/pypy/translator/llvm/funcrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/funcrepr.py	Wed Jun  8 14:28:31 2005
@@ -217,6 +217,9 @@
         l_func.dependencies.update(l_args)
         lblock.call(l_target, l_args[0], l_args[1:])
 
+    op_direct_call = op_simple_call #XXX is simple_call still used?
+
+
 class BlockRepr(object):
     def __init__(self, l_func, pyblock, gen):
         if debug:
@@ -274,6 +277,7 @@
             return
         try:
             l_arg0.op(op.opname, l_target, op.args, self.lblock, self.l_func)
+            return
         except NotImplementedError:
             pass
         except CompileError:

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Wed Jun  8 14:28:31 2005
@@ -26,7 +26,7 @@
 from pypy.translator.llvm.test import llvmsnippet as test2
 
 from pypy.translator.llvm import representation, funcrepr, typerepr, seqrepr
-from pypy.translator.llvm import classrepr, pbcrepr
+from pypy.translator.llvm import classrepr, pbcrepr, pointerrepr
 
 from pypy.translator.llvm.representation import LLVMRepr, TmpVariableRepr
 from pypy.translator.llvm.representation import CompileError
@@ -74,7 +74,7 @@
         self.local_counts = {}
         self.repr_classes = []
         for mod in [representation, funcrepr, typerepr, seqrepr, classrepr,
-                    pbcrepr]:
+                    pbcrepr, pointerrepr]:
             self.repr_classes += [getattr(mod, s)
                                   for s in dir(mod) if "Repr" in s]
         #if debug:
@@ -156,6 +156,8 @@
                     self.llvm_reprs[key] = result
                     self.depth -= 1
                     return result
+                if isinstance(concretetype, lltype.Ptr):
+                    return pointerrepr.PointerRepr(obj.value, self)
                 #XXX find the right type if it is not a Primitive
             except AttributeError:
                 pass

Modified: pypy/dist/pypy/translator/llvm/pbcrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/pbcrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/pbcrepr.py	Wed Jun  8 14:28:31 2005
@@ -25,6 +25,7 @@
 
 class PBCTypeRepr(TypeRepr):
     def get(obj, gen):
+        return None #disabling for now: this class will go away
         if (isinstance(obj, annmodel.SomePBC) and
             len(obj.prebuiltinstances) == 1 and   #only one pb instance for now
             not isinstance(obj.prebuiltinstances.keys()[0],

Modified: pypy/dist/pypy/translator/llvm/pointerrepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/pointerrepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/pointerrepr.py	Wed Jun  8 14:28:31 2005
@@ -8,3 +8,52 @@
 
 from pypy.annotation import model as annmodel
 
+from pypy.translator.llvm import representation
+from pypy.translator.llvm import typerepr
+
+debug = True
+
+class PointerRepr(representation.LLVMRepr):
+    def __init__(self, ptr, gen):
+        if debug:
+            print "PointerRepr(%s)" % ptr
+        self.ptr = ptr
+        self.gen = gen
+        self.type = gen.get_repr(ptr._TYPE)
+        self.l_obj = gen.get_repr(ptr._obj)
+        print self.l_obj, ptr._obj
+        self.dependencies = sets.Set([self.l_obj, self.type])
+    
+    def llvmname(self):
+        return self.l_obj.llvmname()
+
+    def __getattr__(self, name):
+        if debug:
+            print "getattr called", name, self.l_obj.llvmname()
+        if name.startswith("op_"):
+            attr = getattr(self.l_obj, name, None)
+            if attr is not None:
+                return attr
+        raise AttributeError, ("PointerRepr instance has no attribute %s" %
+                               repr(name))
+
+
+class PointerTypeRepr(typerepr.TypeRepr):
+    def get(obj, gen):
+        if obj.__class__ is lltype.Ptr:
+            return PointerTypeRepr(obj, gen)
+        return None
+    get = staticmethod(get)
+    
+    def __init__(self, ptrtype, gen):
+        if debug:
+            print "PointerTypeRepr(%s)" % ptrtype
+        self.ptrtype = ptrtype
+        self.gen = gen
+        self.l_to = gen.get_repr(ptrtype.TO)
+        self.dependencies = sets.Set([self.l_to])
+
+    def typename(self):
+        return self.l_to.typename()
+
+        
\ No newline at end of file

Modified: pypy/dist/pypy/translator/llvm/representation.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/representation.py	(original)
+++ pypy/dist/pypy/translator/llvm/representation.py	Wed Jun  8 14:28:31 2005
@@ -94,12 +94,17 @@
         self.value = value
         self.gen = gen
         self.type = self.gen.get_repr(lltype.Signed)
+        self.dependencies = sets.Set([self.type])
 
     def llvmname(self):
         return str(self.value)
 
-    def get_dependencies(self):
-        return sets.Set([self.type])
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("SignedRepr instance has no attribute %s" %
+                                   repr(name))
 
 class UnsignedRepr(LLVMRepr):
     def __init__(self, value, gen):
@@ -108,12 +113,17 @@
         self.value = value
         self.gen = gen
         self.type = self.gen.get_repr(lltype.Unsigned)
+        self.dependencies = sets.Set([self.type])
 
     def llvmname(self):
         return str(self.value)
 
-    def get_dependencies(self):
-        return sets.Set([self.type])
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("UnsignedRepr instance has no attribute %s"
+                                   % repr(name))
 
 class BoolRepr(LLVMRepr):
     def __init__(self, value, gen):
@@ -122,12 +132,17 @@
         self.value = bool(value)
         self.gen = gen
         self.type = self.gen.get_repr(lltype.Bool)
+        self.dependencies = sets.Set([self.type])
 
     def llvmname(self):
         return str(self.value).lower()
-        
-    def get_dependencies(self):
-        return sets.Set([self.type])
+
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("BoolRepr instance has no attribute %s"
+                                   % repr(name))
 
 class FloatRepr(LLVMRepr):
     def __init__(self, value, gen):
@@ -136,12 +151,17 @@
         self.value = float(value)
         self.gen = gen
         self.type = self.gen.get_repr(lltype.Float)
+        self.dependencies = sets.Set([self.type])
 
     def llvmname(self):
         return str(self.value).lower()
-        
-    def get_dependencies(self):
-        return sets.Set([self.type])
+
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("FloatRepr instance has no attribute %s"
+                                   % repr(name))
 
 class CharRepr(LLVMRepr):
     def __init__(self, value, gen):
@@ -151,6 +171,7 @@
         self.value = value
         self.gen = gen
         self.type = self.gen.get_repr(lltype.Char)
+        self.dependencies = sets.Set([self.type])
 
     def llvmname(self):
         value = value
@@ -158,9 +179,13 @@
             return "'%s'" % (value.replace("'", r"\'"),)
         else:
             return '%d' % ord(value)
-        
-    def get_dependencies(self):
-        return sets.Set([self.type])
+
+    def __getattr__(self, name):
+        if name.startswith("op_"):
+            return getattr(self.type, "t_" + name, None)
+        else:
+            raise AttributeError, ("CharRepr instance has no attribute %s"
+                                   % repr(name))
 
        
 class SimpleRepr(LLVMRepr):
@@ -256,14 +281,15 @@
         except AttributeError:
             type_ = gen.annotator.binding(var.c)
         self.type = gen.get_repr(type_)
-        print "XXXXXXXXXXXXXXXX", self.type
+        if debug:
+            print "XXXXXXXXXXXXXXXX", self.type
         self.dependencies = sets.Set([self.type])
 
     def llvmname(self):
         return "%" + self.var.name
 
     def __getattr__(self, name):
-        print "$%%%%%%%%%%%%%%%%%getattr called", name, self.type.typename()
+        print "getattr called", name, self.type.typename()
         if name.startswith("op_"):
             return getattr(self.type, "t_" + name, None)
         elif name.startswith("cast_"):

Modified: pypy/dist/pypy/translator/llvm/test/test_genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/test/test_genllvm.py	Wed Jun  8 14:28:31 2005
@@ -62,7 +62,7 @@
         f = compile_function(llvmsnippet.simple2, [])
         assert f() == 0
 
-    def DONOTtest_simple4(self):
+    def test_simple4(self):
         f = compile_function(llvmsnippet.simple4, [])
         assert f() == 4
 
@@ -71,7 +71,7 @@
         assert f(1) == 12
         assert f(0) == 13
 
-    def DONOTtest_ackermann(self):
+    def test_ackermann(self):
         f = compile_function(llvmsnippet.ackermann, [int, int])
         for i in range(10):
             assert f(0, i) == i + 1
@@ -79,7 +79,7 @@
             assert f(2, i) == 2 * i + 3
             assert f(3, i) == 2 ** (i + 3) - 3
 
-    def DONOTtest_calling(self):
+    def test_calling(self):
         f = compile_function(llvmsnippet.calling1, [int])
         assert f(10) == 1
 
@@ -99,7 +99,6 @@
 
 class TestFloat(object):
     def setup_method(self, method):
-        py.test.skip("nothing works for now")
         if not llvm_found:
             py.test.skip("llvm-as not found on path.")
 

Modified: pypy/dist/pypy/translator/llvm/typerepr.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/typerepr.py	(original)
+++ pypy/dist/pypy/translator/llvm/typerepr.py	Wed Jun  8 14:28:31 2005
@@ -142,6 +142,21 @@
         return 1
 
 class FloatTypeRepr(TypeRepr):
+    directly_supported_ops = {
+        "float_add": "add",
+        "float_sub": "sub",
+        "float_mul": "mul",
+        "float_div": "div",
+        "float_mod": "rem",
+        "float_xor": "xor",
+        "float_and_": "and",
+        "float_eq": "seteq",
+        "float_ne": "setne",
+        "float_gt": "setgt",
+        "float_ge": "setge",
+        "float_lt": "setlt",
+        "float_le": "setle"}
+        
     def __init__(self, gen):
         if debug:
             print "FloatTypeRepr"
@@ -150,6 +165,15 @@
     def typename(self):
         return "double"
 
+    def t_op(self, opname, l_target, args, lblock, l_func):
+        if opname in FloatTypeRepr.directly_supported_ops:
+            assert len(args) == 2
+            l_args = [self.gen.get_repr(arg) for arg in args]
+            l_func.dependencies.update(l_args)
+            lblock.binary_instruction(
+                FloatTypeRepr.directly_supported_ops[opname], l_target,
+                l_args[0], l_args[1])
+
     def llvmsize(self):
         return 8
 



More information about the Pypy-commit mailing list