[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