Author: Alex Gaynor <[email protected]>
Branch: jit-codewriter-force-cast-refactor
Changeset: r46836:1388b50690d7
Date: 2011-08-27 18:59 -0400
http://bitbucket.org/pypy/pypy/changeset/1388b50690d7/
Log: and finally add back the handling for long long results.
diff --git a/pypy/jit/codewriter/jtransform.py
b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -807,6 +807,8 @@
def _int_to_int_cast(self, v_arg, v_result):
longlong_arg = longlong.is_longlong(v_arg.concretetype)
longlong_res = longlong.is_longlong(v_result.concretetype)
+ size1, unsigned1 = rffi.size_and_sign(v_arg.concretetype)
+ size2, unsigned2 = rffi.size_and_sign(v_result.concretetype)
if longlong_arg and longlong_res:
return
@@ -822,10 +824,27 @@
oplist = []
return [op1] + oplist
elif longlong_res:
- assert False
+ if unsigned1:
+ INTERMEDIATE = lltype.Unsigned
+ else:
+ INTERMEDIATE = lltype.Signed
+ v = varoftype(INTERMEDIATE)
+ op1 = SpaceOperation('force_cast', [v_arg], v)
+ oplist = self.rewrite_operation(op1)
+ if not oplist:
+ v = v_arg
+ oplist = []
+ if unsigned1:
+ opname = 'cast_uint_to_longlong'
+ else:
+ opname = 'cast_int_to_longlong'
+ op2 = self.rewrite_operation(
+ SpaceOperation(opname [v], v_result)
+ )
+ return oplist + [op2]
- size1, unsigned1 = rffi.size_and_sign(v_arg.concretetype)
- size2, unsigned2 = rffi.size_and_sign(v_result.concretetype)
+ # We've now, ostensibly, dealt with the longlongs, everything should be
+ # a Signed or smaller
assert size1 <= rffi.sizeof(lltype.Signed)
assert size2 <= rffi.sizeof(lltype.Signed)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit