[pypy-commit] pypy unsigned-dtypes: updated binop dtype promotion
justinpeel
noreply at buildbot.pypy.org
Thu Sep 1 20:42:06 CEST 2011
Author: Justin Peel <notmuchtotell at gmail.com>
Branch: unsigned-dtypes
Changeset: r46998:af44aa788a0c
Date: 2011-09-01 12:39 -0600
http://bitbucket.org/pypy/pypy/changeset/af44aa788a0c/
Log: updated binop dtype promotion
diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -4,6 +4,7 @@
from pypy.interpreter.typedef import TypeDef, GetSetProperty, interp_attrproperty
from pypy.module.micronumpy import interp_dtype, signature
from pypy.rlib import jit
+from pypy.rlib.rarithmetic import LONG_BIT
from pypy.tool.sourcetools import func_with_new_name
@@ -172,9 +173,25 @@
# Everything promotes to float, and bool promotes to everything.
if dt2.kind == interp_dtype.FLOATINGLTR or dt1.kind == interp_dtype.BOOLLTR:
+ if dt2.num == 11 and dt1.num_bytes >= 4:
+ return interp_dtype.W_Float64Dtype
return dt2
- assert False
+ # for now this means mixing signed and unsigned
+ if dt2.kind == interp_dtype.SIGNEDLTR
+ if dt1.num_bytes < dt2.num_bytes:
+ return dt2
+ # we need to promote both dtypes
+ dtypenum = dt2.num + 2
+ else:
+ dtypenum = dt2.num + 1
+ newdtype = interp_dtype.ALL_DTYPE[dtypenum]
+
+ if newdtype.num_bytes > dt2.num_bytes or newdtype.kind == interp_dtype.FLOATINGLTR:
+ return newdtype
+ else:
+ # we only promoted to long on 32-bit or to longlong on 64-bit
+ return interp_dtype.ALL_DTYPE[dtypenum + 2]
def find_unaryop_result_dtype(space, dt, promote_to_float=False,
promote_bools=False, promote_to_largest=False):
More information about the pypy-commit
mailing list