[pypy-svn] r14048 - in pypy/dist/pypy/translator/llvm2: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Fri Jul 1 19:35:37 CEST 2005
Author: cfbolz
Date: Fri Jul 1 19:35:37 2005
New Revision: 14048
Modified:
pypy/dist/pypy/translator/llvm2/database.py
pypy/dist/pypy/translator/llvm2/funcnode.py
pypy/dist/pypy/translator/llvm2/pyxwrapper.py
pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
Log:
(cfbolz, ludal)
implementation of unsigned ints. refactoring of OpWriter.
Modified: pypy/dist/pypy/translator/llvm2/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/database.py (original)
+++ pypy/dist/pypy/translator/llvm2/database.py Fri Jul 1 19:35:37 2005
@@ -7,6 +7,7 @@
log = log.database
PRIMITIVES_TO_LLVM = {lltype.Signed: "int",
+ lltype.Unsigned: "uint",
lltype.Bool: "bool"}
class Database(object):
Modified: pypy/dist/pypy/translator/llvm2/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/funcnode.py (original)
+++ pypy/dist/pypy/translator/llvm2/funcnode.py Fri Jul 1 19:35:37 2005
@@ -100,10 +100,7 @@
def write_block_operations(self, codewriter, block):
opwriter = OpWriter(self.db, codewriter)
for op in block.operations:
- meth = getattr(opwriter, op.opname, None)
- assert meth is not None, "operation %r not found" %(op.opname,)
- meth(op)
-
+ opwriter.write_operation(op)
def write_startblock(self, codewriter, block):
self.write_block_operations(codewriter, block)
@@ -117,51 +114,52 @@
codewriter.ret(inputargtype, inputarg)
class OpWriter(object):
+ binary_operations = {'int_mul': 'mul',
+ 'int_add': 'add',
+ 'int_sub': 'sub',
+ 'int_floordiv': 'div',
+ 'int_mod': 'rem',
+ 'int_lt': 'setlt',
+ 'int_le': 'setle',
+ 'int_eq': 'seteq',
+ 'int_ne': 'setne',
+ 'int_ge': 'setge',
+ 'int_gt': 'setgt',
+
+ 'uint_mul': 'mul',
+ 'uint_add': 'add',
+ 'uint_sub': 'sub',
+ 'uint_floordiv': 'div',
+ 'uint_mod': 'rem',
+ 'uint_lt': 'setlt',
+ 'uint_le': 'setle',
+ 'uint_eq': 'seteq',
+ 'uint_ne': 'setne',
+ 'uint_ge': 'setge',
+ 'uint_gt': 'setgt'}
+
def __init__(self, db, codewriter):
self.db = db
self.codewriter = codewriter
- def binaryop(self, name, op):
+ def write_operation(self, op):
+ if op.opname in self.binary_operations:
+ self.binaryop(op)
+ else:
+ meth = getattr(self, op.opname, None)
+ assert meth is not None, "operation %r not found" %(op.opname,)
+ meth(op)
+
+ def binaryop(self, op):
+ name = self.binary_operations[op.opname]
assert len(op.args) == 2
self.codewriter.binaryop(name,
self.db.repr_arg(op.result),
self.db.repr_arg_type(op.args[0]),
self.db.repr_arg(op.args[0]),
self.db.repr_arg(op.args[1]))
- def int_mul(self, op):
- self.binaryop('mul', op)
-
- def int_floordiv(self, op):
- self.binaryop('div', op)
-
- def int_add(self, op):
- self.binaryop('add', op)
-
- def int_sub(self, op):
- self.binaryop('sub', op)
-
- def int_mod(self, op):
- self.binaryop('rem', op)
-
- def int_eq(self, op):
- self.binaryop('seteq', op)
-
- def int_ne(self, op):
- self.binaryop('setne', op)
-
- def int_lt(self, op):
- self.binaryop('setlt', op)
-
- def int_le(self, op):
- self.binaryop('setle', op)
-
- def int_gt(self, op):
- self.binaryop('setgt', op)
-
- def int_ge(self, op):
- self.binaryop('setge', op)
- def cast_bool_to_int(self, op):
+ def cast_primitive(self, op): #works for all primitives
assert len(op.args) == 1
targetvar = self.db.repr_arg(op.result)
targettype = self.db.repr_arg_type(op.result)
@@ -169,7 +167,8 @@
fromtype = self.db.repr_arg_type(op.args[0])
self.codewriter.cast(targetvar, fromtype, fromvar, targettype)
- int_is_true = cast_bool_to_int
+ int_is_true = cast_bool_to_int = cast_primitive
+ cast_bool_to_uint = uint_is_true = cast_primitive
def direct_call(self, op):
assert len(op.args) >= 1
Modified: pypy/dist/pypy/translator/llvm2/pyxwrapper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/pyxwrapper.py (original)
+++ pypy/dist/pypy/translator/llvm2/pyxwrapper.py Fri Jul 1 19:35:37 2005
@@ -3,6 +3,7 @@
log = log.pyrex
PRIMITIVES_TO_C = {lltype.Signed: "int",
+ lltype.Unsigned: "unsigned int",
lltype.Bool: "char"}
def write_pyx_wrapper(funcgen, targetpath):
Modified: pypy/dist/pypy/translator/llvm2/test/test_genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm2/test/test_genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm2/test/test_genllvm.py Fri Jul 1 19:35:37 2005
@@ -9,6 +9,7 @@
from pypy.objspace.flow.model import Constant, Variable
from pypy.rpython.rtyper import RPythonTyper
+from pypy.rpython.rarithmetic import r_uint
py.log.setconsumer("genllvm", py.log.STDOUT)
py.log.setconsumer("genllvm database prepare", None)
@@ -59,6 +60,24 @@
assert f(1) == 1
assert f(2) == 2
+def test_uint_ops():
+ def ops(i):
+ x = r_uint(0)
+ x += i < i
+ x += i <= i
+ x += i == i
+ x += i != i
+ x += i >= i
+ x += i > i
+ x += x % i
+ #x += i is not None
+ #x += i is None
+ return i + 1 * i // i - 1
+ f = compile_function(ops, [r_uint])
+ assert f(1) == 1
+ assert f(2) == 2
+
+
def test_function_call():
def callee():
return 1
@@ -99,3 +118,20 @@
return l[i]
f = compile_function(string_test, [int])
assert f(0) == ord("H")
+
+class TestException(Exception):
+ pass
+
+def DONOTtest_exception():
+ def raise_(i):
+ if i:
+ raise TestException()
+ else:
+ return 1
+ def catch(i):
+ try:
+ return raise_(i)
+ except TestException:
+ return 0
+ f = compile_function(catch, [int])
+
More information about the Pypy-commit
mailing list