[pypy-svn] r12836 - pypy/dist/pypy/rpython
ericvrp at codespeak.net
ericvrp at codespeak.net
Fri May 27 13:16:41 CEST 2005
Author: ericvrp
Date: Fri May 27 13:16:41 2005
New Revision: 12836
Added:
pypy/dist/pypy/rpython/rbool.py
pypy/dist/pypy/rpython/rfloat.py
Modified:
pypy/dist/pypy/rpython/rint.py
pypy/dist/pypy/rpython/rtyper.py
Log:
fixed lshift,rshift,pow,abs,eq,ne
refactored a little to cut down on the amount of duplicate code. needs more work.
added more of the same.
Added: pypy/dist/pypy/rpython/rbool.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/rbool.py Fri May 27 13:16:41 2005
@@ -0,0 +1,10 @@
+from pypy.annotation.model import SomeBool
+from pypy.rpython.lltype import Bool
+from pypy.rpython.rtyper import receive
+
+
+class __extend__(SomeBool):
+
+ def rtype_is_true(s_bool):
+ v_bool = receive(Bool, arg=0)
+ return v_bool
Added: pypy/dist/pypy/rpython/rfloat.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/rfloat.py Fri May 27 13:16:41 2005
@@ -0,0 +1,17 @@
+from pypy.annotation.pairtype import pair, pairtype
+from pypy.annotation.model import SomeFloat, SomeInteger, SomeBool
+from pypy.rpython.lltype import Signed, Unsigned, Bool
+from pypy.rpython.rtyper import peek_at_result_annotation, receive, direct_op
+from pypy.rpython.rtyper import TyperError
+
+
+class __extend__(pairtype(SomeFloat, SomeFloat)):
+ pass
+
+
+class __extend__(pairtype(SomeFloat, SomeInteger)):
+ pass
+
+
+class __extend__(SomeFloat):
+ pass
Modified: pypy/dist/pypy/rpython/rint.py
==============================================================================
--- pypy/dist/pypy/rpython/rint.py (original)
+++ pypy/dist/pypy/rpython/rint.py Fri May 27 13:16:41 2005
@@ -1,5 +1,5 @@
from pypy.annotation.pairtype import pair, pairtype
-from pypy.annotation.model import SomeInteger, SomeBool
+from pypy.annotation.model import SomeInteger, SomeBool, SomePBC
from pypy.rpython.lltype import Signed, Unsigned, Bool
from pypy.rpython.rtyper import peek_at_result_annotation, receive, direct_op
from pypy.rpython.rtyper import TyperError
@@ -135,7 +135,7 @@
rtype_inplace_or = rtype_or_
def rtype_lshift((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
+ if s_int1.unsigned:
v_int1 = receive(Unsigned, arg=0)
v_int2 = receive(Unsigned, arg=1)
return direct_op('uint_lshift', [v_int1, v_int2], resulttype=Unsigned)
@@ -147,7 +147,7 @@
rtype_inplace_lshift = rtype_lshift
def rtype_rshift((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
+ if s_int1.unsigned:
v_int1 = receive(Unsigned, arg=0)
v_int2 = receive(Unsigned, arg=1)
return direct_op('uint_rshift', [v_int1, v_int2], resulttype=Unsigned)
@@ -159,7 +159,7 @@
rtype_inplace_rshift = rtype_rshift
def rtype_lshift_ovf((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
+ if s_int1.unsigned:
v_int1 = receive(Unsigned, arg=0)
v_int2 = receive(Unsigned, arg=1)
return direct_op('uint_lshift_ovf', [v_int1, v_int2], resulttype=Unsigned)
@@ -171,7 +171,7 @@
rtype_inplace_lshift_ovf = rtype_lshift_ovf
def rtype_rshift_ovf((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
+ if s_int1.unsigned:
v_int1 = receive(Unsigned, arg=0)
v_int2 = receive(Unsigned, arg=1)
return direct_op('uint_rshift_ovf', [v_int1, v_int2], resulttype=Unsigned)
@@ -182,81 +182,65 @@
rtype_inplace_rshift_ovf = rtype_rshift_ovf
- def rtype_pow((s_int1, s_int2)):
- #XXX RPythonTyper gives this error: TypeError: rtype_pow() takes exactly 1 argument (2 given)
+ def rtype_pow((s_int1, s_int2), s_int3=SomePBC({None: True})):
+ if isinstance(s_int3, SomeInteger):
+ if s_int3.unsigned:
+ v_int3_list = [receive(Unsigned, arg=2)]
+ else:
+ v_int3_list = [receive(Signed, arg=2)]
+ elif s_int3.is_constant() and s_int3.const is None:
+ v_int3_list = []
+ else:
+ raise TyperError("pow() 3rd argument must be int or None")
if s_int1.unsigned or s_int2.unsigned:
v_int1 = receive(Unsigned, arg=0)
v_int2 = receive(Unsigned, arg=1)
- return direct_op('uint_pow', [v_int1, v_int2], resulttype=Unsigned)
+ return direct_op('uint_pow', [v_int1, v_int2] + v_int3_list, resulttype=Unsigned)
else:
v_int1 = receive(Signed, arg=0)
v_int2 = receive(Signed, arg=1)
- return direct_op('int_pow', [v_int1, v_int2], resulttype=Signed)
+ return direct_op('int_pow', [v_int1, v_int2] + v_int3_list, resulttype=Signed)
rtype_inplace_pow = rtype_pow
#comparisons: eq is_ ne lt le gt ge
- def rtype_eq((s_int1, s_int2)):
- v_int1 = receive(Signed, arg=0)
- v_int2 = receive(Signed, arg=1)
- return direct_op('int_eq', [v_int1, v_int2], resulttype=Bool)
-
+ def rtype_eq(args):
+ return _rtype_compare_template(args, 'eq')
+
rtype_is_ = rtype_eq
- def rtype_ne((s_int1, s_int2)):
- v_int1 = receive(Signed, arg=0)
- v_int2 = receive(Signed, arg=1)
- return direct_op('int_ne', [v_int1, v_int2], resulttype=Bool)
+ def rtype_ne(args):
+ return _rtype_compare_template(args, 'ne')
- def rtype_lt((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
- if not s_int1.nonneg or not s_int2.nonneg:
- raise TyperError("comparing a signed and an unsigned number")
- v_int1 = receive(Unsigned, arg=0)
- v_int2 = receive(Unsigned, arg=1)
- return direct_op('uint_lt', [v_int1, v_int2], resulttype=Bool)
- else:
- v_int1 = receive(Signed, arg=0)
- v_int2 = receive(Signed, arg=1)
- return direct_op('int_lt', [v_int1, v_int2], resulttype=Bool)
+ def rtype_lt(args):
+ return _rtype_compare_template(args, 'lt')
- def rtype_le((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
- if not s_int1.nonneg or not s_int2.nonneg:
- raise TyperError("comparing a signed and an unsigned number")
- v_int1 = receive(Unsigned, arg=0)
- v_int2 = receive(Unsigned, arg=1)
- return direct_op('uint_le', [v_int1, v_int2], resulttype=Bool)
- else:
- v_int1 = receive(Signed, arg=0)
- v_int2 = receive(Signed, arg=1)
- return direct_op('int_le', [v_int1, v_int2], resulttype=Bool)
+ def rtype_le(args):
+ return _rtype_compare_template(args, 'le')
- def rtype_gt((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
- if not s_int1.nonneg or not s_int2.nonneg:
- raise TyperError("comparing a signed and an unsigned number")
- v_int1 = receive(Unsigned, arg=0)
- v_int2 = receive(Unsigned, arg=1)
- return direct_op('uint_gt', [v_int1, v_int2], resulttype=Bool)
- else:
- v_int1 = receive(Signed, arg=0)
- v_int2 = receive(Signed, arg=1)
- return direct_op('int_gt', [v_int1, v_int2], resulttype=Bool)
+ def rtype_gt(args):
+ return _rtype_compare_template(args, 'gt')
+
+ def rtype_ge(args):
+ return _rtype_compare_template(args, 'ge')
+
+#Helper functions for comparisons
+
+def _rtype_compare_template((s_int1, s_int2), func):
+ if s_int1.unsigned or s_int2.unsigned:
+ if not s_int1.nonneg or not s_int2.nonneg:
+ raise TyperError("comparing a signed and an unsigned number")
+ v_int1 = receive(Unsigned, arg=0)
+ v_int2 = receive(Unsigned, arg=1)
+ return direct_op('uint_'+func, [v_int1, v_int2], resulttype=Bool)
+ else:
+ v_int1 = receive(Signed, arg=0)
+ v_int2 = receive(Signed, arg=1)
+ return direct_op('int_'+func, [v_int1, v_int2], resulttype=Bool)
- def rtype_ge((s_int1, s_int2)):
- if s_int1.unsigned or s_int2.unsigned:
- if not s_int1.nonneg or not s_int2.nonneg:
- raise TyperError("comparing a signed and an unsigned number")
- v_int1 = receive(Unsigned, arg=0)
- v_int2 = receive(Unsigned, arg=1)
- return direct_op('uint_ge', [v_int1, v_int2], resulttype=Bool)
- else:
- v_int1 = receive(Signed, arg=0)
- v_int2 = receive(Signed, arg=1)
- return direct_op('int_ge', [v_int1, v_int2], resulttype=Bool)
+#
class __extend__(SomeInteger):
@@ -267,7 +251,10 @@
#Unary arithmetic operations
def rtype_abs(s_int):
- v_int = receive(Signed, arg=0)
+ if s_int.unsigned:
+ v_int = receive(Unsigned, arg=0)
+ else:
+ v_int = receive(Signed, arg=0)
return direct_op('int_abs', [v_int], resulttype=Signed)
def rtype_abs_ovf(s_int):
@@ -283,13 +270,7 @@
return direct_op('int_neg', [v_int], resulttype=Signed)
def rtype_pos(s_int):
- #XXX I think this is a nop and should really be removed from the graph
- v_int = receive(Signed, arg=0)
- return direct_op('int_pos', [v_int], resulttype=Signed)
-
-
-class __extend__(SomeBool):
-
- def rtype_is_true(s_bool):
- v_bool = receive(Bool, arg=0)
- return v_bool
+ if s_int.unsigned:
+ return receive(Unsigned, arg=0)
+ else:
+ return receive(Signed, arg=0)
Modified: pypy/dist/pypy/rpython/rtyper.py
==============================================================================
--- pypy/dist/pypy/rpython/rtyper.py (original)
+++ pypy/dist/pypy/rpython/rtyper.py Fri May 27 13:16:41 2005
@@ -306,4 +306,4 @@
# _______________________________________________________________________
# this has the side-effect of registering the unary and binary operations
-from pypy.rpython import robject, rlist, rptr, rbuiltin, rint
+from pypy.rpython import robject, rlist, rptr, rbuiltin, rint, rbool, rfloat
More information about the Pypy-commit
mailing list