[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