[pypy-svn] pypy jit-longlong-2: In-progress.
arigo
commits-noreply at bitbucket.org
Sat Feb 12 17:40:32 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong-2
Changeset: r41850:39cdf1fcafcb
Date: 2011-02-12 14:33 +0100
http://bitbucket.org/pypy/pypy/changeset/39cdf1fcafcb/
Log: In-progress.
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -15,7 +15,7 @@
from pypy.jit.backend import model
from pypy.jit.backend.llgraph import llimpl, symbolic
from pypy.jit.metainterp.typesystem import llhelper, oohelper
-from pypy.jit.codewriter import heaptracker
+from pypy.jit.codewriter import heaptracker, longlong
from pypy.rlib import rgc
class MiniStats:
@@ -181,7 +181,7 @@
elif isinstance(x, self.ts.ConstRef):
llimpl.compile_add_ref_const(c, x.value, self.ts.BASETYPE)
elif isinstance(x, history.ConstFloat):
- llimpl.compile_add_float_const(c, x.valuestorage)
+ llimpl.compile_add_float_const(c, x.value)
else:
raise Exception("'%s' args contain: %r" % (op.getopname(),
x))
@@ -305,8 +305,12 @@
for ARG in ARGS:
token = history.getkind(ARG)
if token != 'void':
+ if token == 'float' and longlong.is_longlong(ARG):
+ token = 'L'
arg_types.append(token[0])
token = history.getkind(RESULT)
+ if token == 'float' and longlong.is_longlong(RESULT):
+ token = 'L'
return self.getdescr(0, token[0], extrainfo=extrainfo,
arg_types=''.join(arg_types))
@@ -464,7 +468,7 @@
self._prepare_call(REF, calldescr, args_i, args_r, args_f)
return llimpl.do_call_ptr(func)
def bh_call_f(self, func, calldescr, args_i, args_r, args_f):
- self._prepare_call(FLOAT, calldescr, args_i, args_r, args_f)
+ self._prepare_call(FLOAT + 'L', calldescr, args_i, args_r, args_f)
return llimpl.do_call_float(func)
def bh_call_v(self, func, calldescr, args_i, args_r, args_f):
self._prepare_call('v', calldescr, args_i, args_r, args_f)
@@ -472,7 +476,7 @@
def _prepare_call(self, resulttypeinfo, calldescr, args_i, args_r, args_f):
assert isinstance(calldescr, Descr)
- assert calldescr.typeinfo == resulttypeinfo
+ assert calldescr.typeinfo in resulttypeinfo
if args_i is not None:
for x in args_i:
llimpl.do_call_pushint(x)
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -144,6 +144,7 @@
def get_return_type(self):
""" Implement in call descr.
Must return INT, REF, FLOAT, or 'v' for void.
+ On 32-bit (hack) it can also be 'L' for longlongs.
"""
raise NotImplementedError
@@ -308,38 +309,34 @@
class ConstFloat(Const):
type = FLOAT
- valuestorage = longlong.getfloatstorage(0.0)
- _attrs_ = ('valuestorage',)
-
- @property
- def value(self):
- XXX # temporary
+ value = longlong.getfloatstorage(0.0)
+ _attrs_ = ('value',)
def __init__(self, valuestorage):
assert isinstance(valuestorage, longlong.r_float_storage)
- self.valuestorage = valuestorage
+ self.value = valuestorage
def clonebox(self):
- return BoxFloat(self.valuestorage)
+ return BoxFloat(self.value)
nonconstbox = clonebox
def getfloatstorage(self):
- return self.valuestorage
+ return self.value
def _get_hash_(self):
- return longlong.gethash(self.valuestorage)
+ return longlong.gethash(self.value)
def set_future_value(self, cpu, j):
- cpu.set_future_value_float(j, self.valuestorage)
+ cpu.set_future_value_float(j, self.value)
def same_constant(self, other):
if isinstance(other, ConstFloat):
- return self.valuestorage == other.valuestorage
+ return self.value == other.value
return False
def nonnull(self):
- return self.valuestorage != 0
+ return self.value != 0
def _getrepr_(self):
return self.getfloat()
@@ -555,36 +552,32 @@
class BoxFloat(Box):
type = FLOAT
- _attrs_ = ('valuestorage',)
-
- @property
- def value(self):
- XXX # temporary
+ _attrs_ = ('value',)
def __init__(self, valuestorage=longlong.getfloatstorage(0.0)):
assert isinstance(valuestorage, longlong.r_float_storage)
- self.valuestorage = valuestorage
+ self.value = valuestorage
def forget_value(self):
- self.valuestorage = longlong.getfloatstorage(0.0)
+ self.value = longlong.getfloatstorage(0.0)
def clonebox(self):
- return BoxFloat(self.valuestorage)
+ return BoxFloat(self.value)
def constbox(self):
- return ConstFloat(self.valuestorage)
+ return ConstFloat(self.value)
def getfloatstorage(self):
- return self.valuestorage
+ return self.value
def _get_hash_(self):
- return longlong.gethash(self.valuestorage)
+ return longlong.gethash(self.value)
def set_future_value(self, cpu, j):
- cpu.set_future_value_float(j, self.valuestorage)
+ cpu.set_future_value_float(j, self.value)
def nonnull(self):
- return self.valuestorage != 0
+ return self.value != 0
def _getrepr_(self):
return self.getfloat()
diff --git a/pypy/jit/metainterp/test/test_resume.py b/pypy/jit/metainterp/test/test_resume.py
--- a/pypy/jit/metainterp/test/test_resume.py
+++ b/pypy/jit/metainterp/test/test_resume.py
@@ -8,7 +8,7 @@
from pypy.jit.metainterp.history import ConstPtr, ConstFloat
from pypy.jit.metainterp.test.test_optimizeutil import LLtypeMixin
from pypy.jit.metainterp import executor
-from pypy.jit.codewriter import heaptracker
+from pypy.jit.codewriter import heaptracker, longlong
class Storage:
rd_frame_info_list = None
@@ -114,7 +114,7 @@
callback_i(index, count_i); count_i += 1
elif ARG == llmemory.GCREF:
callback_r(index, count_r); count_r += 1
- elif ARG == lltype.Float:
+ elif ARG == longlong.FLOATSTORAGE:
callback_f(index, count_f); count_f += 1
else:
assert 0
@@ -137,7 +137,8 @@
reader.consume_one_section(bh)
expected_i = [x for x in expected if lltype.typeOf(x) == lltype.Signed]
expected_r = [x for x in expected if lltype.typeOf(x) == llmemory.GCREF]
- expected_f = [x for x in expected if lltype.typeOf(x) == lltype.Float]
+ expected_f = [x for x in expected if lltype.typeOf(x) ==
+ longlong.FLOATSTORAGE]
assert bh.written_i == expected_i
assert bh.written_r == expected_r
assert bh.written_f == expected_f
@@ -749,7 +750,7 @@
def test_ResumeDataLoopMemo_other():
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- const = ConstFloat(-1.0)
+ const = ConstFloat(longlong.getfloatstorage(-1.0))
tagged = memo.getconst(const)
index, tagbits = untag(tagged)
assert tagbits == TAGCONST
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -71,11 +71,13 @@
def convert_to_imm(self, c):
adr = self.assembler.datablockwrapper.malloc_aligned(8, 8)
+ xxxxxxxxx
rffi.cast(rffi.CArrayPtr(rffi.DOUBLE), adr)[0] = c.getfloat()
return ConstFloatLoc(adr)
def convert_to_imm_16bytes_align(self, c):
adr = self.assembler.datablockwrapper.malloc_aligned(16, 16)
+ xxxxxxxxx
rffi.cast(rffi.CArrayPtr(rffi.DOUBLE), adr)[0] = c.getfloat()
rffi.cast(rffi.CArrayPtr(rffi.DOUBLE), adr)[1] = 0.0
return ConstFloatLoc(adr)
@@ -221,6 +223,7 @@
selected_reg=None, need_lower_byte=False):
if var.type == FLOAT:
if isinstance(var, ConstFloat):
+ xxxxxxxxxxxxxx
return FloatImmedLoc(var.getfloat())
return self.xrm.make_sure_var_in_reg(var, forbidden_vars,
selected_reg, need_lower_byte)
@@ -703,8 +706,7 @@
self.xrm.possibly_free_var(op.getarg(1))
def _loc_of_const_longlong(self, value64):
- from pypy.rlib.longlong2float import longlong2float
- c = ConstFloat(longlong2float(value64))
+ c = ConstFloat(value64)
return self.xrm.convert_to_imm(c)
def _consider_llong_from_int(self, op):
diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py
--- a/pypy/jit/metainterp/warmstate.py
+++ b/pypy/jit/metainterp/warmstate.py
@@ -142,8 +142,7 @@
if lltype.typeOf(value) is lltype.Float:
value = longlong.getfloatstorage(value)
else:
- assert lltype.typeOf(value) in (lltype.SignedLongLong,
- lltype.UnsignedLongLong)
+ assert longlong.is_longlong(lltype.typeOf(value))
value = rffi.cast(lltype.SignedLongLong, value)
cpu.set_future_value_float(j, value)
else:
diff --git a/pypy/jit/metainterp/test/test_executor.py b/pypy/jit/metainterp/test/test_executor.py
--- a/pypy/jit/metainterp/test/test_executor.py
+++ b/pypy/jit/metainterp/test/test_executor.py
@@ -112,13 +112,13 @@
box2 = boxfloat(222.2)
fielddescr = FakeFieldDescr()
execute_nonspec(cpu, None, rop.SETFIELD_GC, [box1, box2], fielddescr)
- assert cpu.fakesetfield == (box1.value, box2.valuestorage, fielddescr)
+ assert cpu.fakesetfield == (box1.value, box2.value, fielddescr)
# arity == 3
box3 = BoxInt(33)
arraydescr = FakeArrayDescr()
execute_nonspec(cpu, None, rop.SETARRAYITEM_GC, [box1, box3, box2],
arraydescr)
- assert cpu.fakesetarrayitem == (box1.value, box3.value, box2.valuestorage,
+ assert cpu.fakesetarrayitem == (box1.value, box3.value, box2.value,
arraydescr)
# cases without descr
# arity == 1
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -425,6 +425,8 @@
assert x == ord('B')
if cpu.supports_floats:
def func(f, i):
+ assert isinstance(f, float)
+ assert isinstance(i, int)
return f - float(i)
FPTR = self.Ptr(self.FuncType([lltype.Float, lltype.Signed],
lltype.Float))
diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -5,9 +5,8 @@
from pypy.jit.metainterp.history import BasicFailDescr, LoopToken, BoxFloat
from pypy.jit.metainterp import history
from pypy.jit.metainterp.resoperation import ResOperation, rop
-from pypy.jit.codewriter import heaptracker
+from pypy.jit.codewriter import heaptracker, longlong
from pypy.rlib.rarithmetic import r_longlong, r_ulonglong
-from pypy.rlib.longlong2float import longlong2float, float2longlong
# The point of the class organization in this file is to make instances
# as compact as possible. This is done by not storing the field size or
@@ -275,7 +274,10 @@
def create_call_stub(self, rtyper, RESULT):
def process(c):
if c == 'L':
- return 'float2longlong(%s)' % (process('f'),)
+ assert longlong.supports_longlong
+ c = 'f'
+ elif c == 'f' and longlong.supports_longlong:
+ return 'longlong.getrealfloat(%s)' % (process('L'),)
arg = 'args_%s[%d]' % (c, seen[c])
seen[c] += 1
return arg
@@ -302,7 +304,9 @@
elif self.get_return_type() == history.REF:
result = 'lltype.cast_opaque_ptr(llmemory.GCREF, res)'
elif self.get_return_type() == history.FLOAT:
- result = 'cast_to_float(res)'
+ result = 'longlong.getfloatstorage(res)'
+ elif self.get_return_type() == 'L':
+ result = 'rffi.cast(lltype.SignedLongLong, res)'
elif self.get_return_type() == history.VOID:
result = 'None'
else:
@@ -330,15 +334,6 @@
def repr_of_descr(self):
return '<%s>' % self._clsname
-def cast_to_float(x):
- if isinstance(x, r_longlong):
- return longlong2float(x)
- if isinstance(x, r_ulonglong):
- return longlong2float(rffi.cast(lltype.SignedLongLong, x))
- assert isinstance(x, float)
- return x
-cast_to_float._annspecialcase_ = 'specialize:argtype(0)'
-
class BaseIntCallDescr(BaseCallDescr):
# Base class of the various subclasses of descrs corresponding to
@@ -399,6 +394,7 @@
class LongLongCallDescr(FloatCallDescr):
_clsname = 'LongLongCallDescr'
+ _return_type = 'L'
class VoidCallDescr(BaseCallDescr):
_clsname = 'VoidCallDescr'
diff --git a/pypy/jit/codewriter/longlong.py b/pypy/jit/codewriter/longlong.py
--- a/pypy/jit/codewriter/longlong.py
+++ b/pypy/jit/codewriter/longlong.py
@@ -23,6 +23,7 @@
getfloatstorage = lambda x: x
getrealfloat = lambda x: x
gethash = compute_hash
+ is_longlong = lambda TYPE: False
# -------------------------------------
else:
@@ -38,5 +39,7 @@
getfloatstorage = longlong2float.float2longlong
getrealfloat = longlong2float.longlong2float
gethash = lambda xll: xll - (xll >> 32)
+ is_longlong = lambda TYPE: (TYPE == lltype.SignedLongLong or
+ TYPE == lltype.UnsignedLongLong)
# -------------------------------------
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -9,6 +9,7 @@
from pypy.jit.metainterp.resoperation import rop, ResOperation, ResOpWithDescr, N_aryOp
from pypy.jit.metainterp.typesystem import llhelper
from pypy.jit.codewriter.heaptracker import adr2int
+from pypy.jit.codewriter import longlong
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.ootypesystem import ootype
@@ -160,7 +161,7 @@
return ConstInt(int(arg))
except ValueError:
if self.is_float(arg):
- return ConstFloat(float(arg))
+ return ConstFloat(longlong.getfloatstorage(float(arg)))
if (arg.startswith('"') or arg.startswith("'") or
arg.startswith('s"')):
# XXX ootype
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -1088,12 +1088,8 @@
assert isinstance(x, longlong.r_float_storage)
if TYPE is lltype.Float:
return longlong.getrealfloat(x)
- if IS_32_BIT:
- assert longlong.supports_longlong
- if TYPE is lltype.SignedLongLong:
- return x
- if TYPE is lltype.UnsignedLongLong:
- return r_ulonglong(x)
+ if longlong.is_longlong(TYPE):
+ return rffi.cast(TYPE, x)
raise TypeError(TYPE)
@@ -1465,7 +1461,8 @@
kind2TYPE = {
'i': lltype.Signed,
- 'f': longlong.FLOATSTORAGE,
+ 'f': lltype.Float,
+ 'L': lltype.SignedLongLong,
'v': lltype.Void,
}
@@ -1535,9 +1532,7 @@
assert n == 'r'
x = argsiter_r.next()
x = cast_from_ptr(TYPE, x)
- elif TYPE is lltype.Float or (
- IS_32_BIT and TYPE in (lltype.SignedLongLong,
- lltype.UnsignedLongLong)):
+ elif TYPE is lltype.Float or longlong.is_longlong(TYPE):
if args_in_order is not None:
n = orderiter.next()
assert n == 'f'
@@ -1646,6 +1641,13 @@
s_CompiledLoop = annmodel.SomePtr(COMPILEDLOOP)
s_Frame = annmodel.SomePtr(FRAME)
+if longlong.FLOATSTORAGE is lltype.Float:
+ s_FloatStorage = annmodel.SomeFloat()
+elif longlong.FLOATSTORAGE is lltype.SignedLongLong:
+ s_FloatStorage = annmodel.SomeInteger(knowntype=longlong.r_float_storage)
+else:
+ assert 0
+
setannotation(compile_start, s_CompiledLoop)
setannotation(compile_start_int_var, annmodel.SomeInteger())
setannotation(compile_start_ref_var, annmodel.SomeInteger())
@@ -1674,7 +1676,7 @@
setannotation(frame_execute, annmodel.SomeInteger())
setannotation(frame_int_getvalue, annmodel.SomeInteger())
setannotation(frame_ptr_getvalue, annmodel.SomePtr(llmemory.GCREF))
-setannotation(frame_float_getvalue, annmodel.SomeFloat())
+setannotation(frame_float_getvalue, s_FloatStorage)
setannotation(frame_get_value_count, annmodel.SomeInteger())
setannotation(frame_clear_latest_values, annmodel.s_None)
@@ -1690,15 +1692,15 @@
setannotation(do_unicodegetitem, annmodel.SomeInteger())
setannotation(do_getarrayitem_gc_int, annmodel.SomeInteger())
setannotation(do_getarrayitem_gc_ptr, annmodel.SomePtr(llmemory.GCREF))
-setannotation(do_getarrayitem_gc_float, annmodel.SomeFloat())
+setannotation(do_getarrayitem_gc_float, s_FloatStorage)
setannotation(do_getarrayitem_raw_int, annmodel.SomeInteger())
-setannotation(do_getarrayitem_raw_float, annmodel.SomeFloat())
+setannotation(do_getarrayitem_raw_float, s_FloatStorage)
setannotation(do_getfield_gc_int, annmodel.SomeInteger())
setannotation(do_getfield_gc_ptr, annmodel.SomePtr(llmemory.GCREF))
-setannotation(do_getfield_gc_float, annmodel.SomeFloat())
+setannotation(do_getfield_gc_float, s_FloatStorage)
setannotation(do_getfield_raw_int, annmodel.SomeInteger())
setannotation(do_getfield_raw_ptr, annmodel.SomePtr(llmemory.GCREF))
-setannotation(do_getfield_raw_float, annmodel.SomeFloat())
+setannotation(do_getfield_raw_float, s_FloatStorage)
setannotation(do_new, annmodel.SomePtr(llmemory.GCREF))
setannotation(do_new_array, annmodel.SomePtr(llmemory.GCREF))
setannotation(do_setarrayitem_gc_int, annmodel.s_None)
@@ -1720,5 +1722,5 @@
setannotation(do_call_pushptr, annmodel.s_None)
setannotation(do_call_int, annmodel.SomeInteger())
setannotation(do_call_ptr, annmodel.SomePtr(llmemory.GCREF))
-setannotation(do_call_float, annmodel.SomeFloat())
+setannotation(do_call_float, s_FloatStorage)
setannotation(do_call_void, annmodel.s_None)
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -38,6 +38,7 @@
from pypy.jit.backend.x86.jump import remap_frame_layout
from pypy.jit.metainterp.history import ConstInt, BoxInt
from pypy.jit.codewriter.effectinfo import EffectInfo
+from pypy.jit.codewriter import longlong
# darwin requires the stack to be 16 bytes aligned on calls. Same for gcc 4.5.0,
# better safe than sorry
@@ -71,7 +72,8 @@
self.malloc_unicode_func_addr = 0
self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
- self.fail_boxes_float = values_array(lltype.Float, failargs_limit)
+ self.fail_boxes_float = values_array(longlong.FLOATSTORAGE,
+ failargs_limit)
self.fail_ebp = 0
self.loop_run_counters = []
self.float_const_neg_addr = 0
@@ -1801,11 +1803,13 @@
if IS_X86_32 and isinstance(resloc, StackLoc) and resloc.width == 8:
# a float or a long long return
- from pypy.jit.backend.llsupport.descr import LongLongCallDescr
- if isinstance(op.getdescr(), LongLongCallDescr):
+ if op.getdescr().get_return_type() == 'L':
self.mc.MOV_br(resloc.value, eax.value) # long long
self.mc.MOV_br(resloc.value + 4, edx.value)
- # XXX should ideally not move the result on the stack
+ # XXX should ideally not move the result on the stack,
+ # but it's a mess to load eax/edx into a xmm register
+ # and this way is simpler also because the result loc
+ # can just be always a stack location
else:
self.mc.FSTP_b(resloc.value) # float return
elif size == WORD:
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
@@ -5,7 +5,7 @@
from pypy.objspace.flow.model import SpaceOperation, Variable, Constant
from pypy.objspace.flow.model import Block, Link, c_last_exception
from pypy.jit.codewriter.flatten import ListOfKind, IndirectCallTargets
-from pypy.jit.codewriter import support, heaptracker
+from pypy.jit.codewriter import support, heaptracker, longlong
from pypy.jit.codewriter.effectinfo import EffectInfo
from pypy.jit.codewriter.policy import log
from pypy.jit.metainterp.typesystem import deref, arrayItem
@@ -791,17 +791,6 @@
# and unsupported ones are turned into a call to a function from
# jit.codewriter.support.
- if lltype.SignedLongLong != lltype.Signed:
- @staticmethod
- def _is_longlong(TYPE):
- return (TYPE == lltype.SignedLongLong or
- TYPE == lltype.UnsignedLongLong)
- else:
- # on 64-bit, _is_longlong() returns always False
- @staticmethod
- def _is_longlong(TYPE):
- return False
-
for _op, _oopspec in [('llong_invert', 'INVERT'),
('ullong_invert', 'INVERT'),
('llong_lt', 'LT'),
@@ -878,8 +867,8 @@
rewrite_op_ullong_is_true = rewrite_op_llong_is_true
def rewrite_op_cast_primitive(self, op):
- fromll = self._is_longlong(op.args[0].concretetype)
- toll = self._is_longlong(op.result.concretetype)
+ fromll = longlong.is_longlong(op.args[0].concretetype)
+ toll = longlong.is_longlong(op.result.concretetype)
if fromll != toll:
args = op.args
if fromll:
diff --git a/pypy/jit/codewriter/assembler.py b/pypy/jit/codewriter/assembler.py
--- a/pypy/jit/codewriter/assembler.py
+++ b/pypy/jit/codewriter/assembler.py
@@ -89,13 +89,9 @@
elif kind == 'float':
if const.concretetype == lltype.Float:
value = longlong.getfloatstorage(value)
- elif const.concretetype == lltype.SignedLongLong:
- assert longlong.supports_longlong
- elif const.concretetype == lltype.UnsignedLongLong:
- assert longlong.supports_longlong
+ else:
+ assert longlong.is_longlong(const.concretetype)
value = rffi.cast(lltype.SignedLongLong, value)
- else:
- raise AssertionError(const.concretetype)
constants = self.constants_f
else:
raise AssemblerError('unimplemented %r in %r' %
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -7,7 +7,7 @@
from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values,\
BoxFloat
from pypy.jit.metainterp import history
-from pypy.jit.codewriter import heaptracker
+from pypy.jit.codewriter import heaptracker, longlong
from pypy.jit.backend.model import AbstractCPU
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.llsupport.symbolic import WORD, unroll_basic_sizes
@@ -315,7 +315,7 @@
ofs = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
- items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+ items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
fval = items[itemindex]
# --- end of GC unsafe code ---
return fval
@@ -348,7 +348,7 @@
ofs = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
- items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+ items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
items[itemindex] = newvalue
# --- end of GC unsafe code ---
@@ -410,7 +410,7 @@
ofs = self.unpack_fielddescr(fielddescr)
# --- start of GC unsafe code (no GC operation!) ---
fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
- fval = rffi.cast(rffi.CArrayPtr(lltype.Float), fieldptr)[0]
+ fval = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), fieldptr)[0]
# --- end of GC unsafe code ---
return fval
@@ -452,7 +452,7 @@
ofs = self.unpack_fielddescr(fielddescr)
# --- start of GC unsafe code (no GC operation!) ---
fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
- fieldptr = rffi.cast(rffi.CArrayPtr(lltype.Float), fieldptr)
+ fieldptr = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), fieldptr)
fieldptr[0] = newvalue
# --- end of GC unsafe code ---
@@ -509,7 +509,7 @@
return calldescr.call_stub(func, args_i, args_r, args_f)
def bh_call_f(self, func, calldescr, args_i, args_r, args_f):
- assert isinstance(calldescr, FloatCallDescr)
+ assert isinstance(calldescr, FloatCallDescr) # or LongLongCallDescr
if not we_are_translated():
calldescr.verify_types(args_i, args_r, args_f, history.FLOAT)
return calldescr.call_stub(func, args_i, args_r, args_f)
diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py
--- a/pypy/jit/codewriter/support.py
+++ b/pypy/jit/codewriter/support.py
@@ -300,7 +300,7 @@
def _ll_1_llong_from_int(x):
return r_longlong(intmask(x))
-def _ll_2_llong_from_uint(x):
+def _ll_1_llong_from_uint(x):
return r_longlong(r_uint(x))
def _ll_1_llong_to_int(xll):
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -63,7 +63,7 @@
metainterp.execute_raised(e)
result = NULL
return BoxPtr(result)
- if rettype == FLOAT:
+ if rettype == FLOAT or rettype == 'L':
try:
result = cpu.bh_call_f(func, descr, args_i, args_r, args_f)
except Exception, e:
More information about the Pypy-commit
mailing list