[pypy-commit] pypy dynamic-specialized-tuple: support for floats, except we need a convert_longlong_bytes_to_float llop
alex_gaynor
noreply at buildbot.pypy.org
Mon Mar 19 21:55:52 CET 2012
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: dynamic-specialized-tuple
Changeset: r53819:1454edb567a1
Date: 2012-03-19 15:55 -0500
http://bitbucket.org/pypy/pypy/changeset/1454edb567a1/
Log: support for floats, except we need a convert_longlong_bytes_to_float
llop
diff --git a/pypy/rlib/rerased_raw.py b/pypy/rlib/rerased_raw.py
--- a/pypy/rlib/rerased_raw.py
+++ b/pypy/rlib/rerased_raw.py
@@ -255,12 +255,14 @@
self._write_index(hop, v_addr)
def rtype_method_getfloat(self, hop):
- v_value = self._read_index(hop)
- return hop.genop("cast_adr_to_float", [v_value], resulttype=lltype.Float)
+ v_addr = self._read_index(hop)
+ v_longlong = hop.genop("force_cast", [v_addr], resulttype=lltype.SignedLongLong)
+ return hop.genop("convert_longlong_bytes_to_float", [v_longlong], resulttype=lltype.Float)
def rtype_method_setfloat(self, hop):
v_value = hop.inputarg(lltype.Float, arg=2)
- v_addr = hop.genop("cast_float_to_adr", [v_value], resulttype=llmemory.Address)
+ v_longlong = hop.genop("convert_float_bytes_to_longlong", [v_value], resulttype=lltype.SignedLongLong)
+ v_addr = hop.genop("force_cast", [v_longlong], resulttype=llmemory.Address)
self._write_index(hop, v_addr)
def rtype_method_getinstance(self, hop):
diff --git a/pypy/rlib/test/test_rerased_raw.py b/pypy/rlib/test/test_rerased_raw.py
--- a/pypy/rlib/test/test_rerased_raw.py
+++ b/pypy/rlib/test/test_rerased_raw.py
@@ -77,7 +77,6 @@
assert res == True
def test_float(self):
- py.test.skip("no float support yet")
def f(x):
storage = rerased_raw.UntypedStorage("f")
storage.setfloat(0, x)
diff --git a/pypy/rpython/llinterp.py b/pypy/rpython/llinterp.py
--- a/pypy/rpython/llinterp.py
+++ b/pypy/rpython/llinterp.py
@@ -776,6 +776,10 @@
checkadr(adr)
return llmemory.cast_adr_to_int(adr, mode)
+ def op_convert_float_bytes_to_longlong(self, f):
+ from pypy.rlib import longlong2float
+ return longlong2float.float2longlong(f)
+
def op_weakref_create(self, v_obj):
def objgetter(): # special support for gcwrapper.py
return self.getval(v_obj)
diff --git a/pypy/rpython/lltypesystem/lloperation.py b/pypy/rpython/lltypesystem/lloperation.py
--- a/pypy/rpython/lltypesystem/lloperation.py
+++ b/pypy/rpython/lltypesystem/lloperation.py
@@ -349,6 +349,7 @@
'cast_float_to_ulonglong':LLOp(canfold=True),
'truncate_longlong_to_int':LLOp(canfold=True),
'force_cast': LLOp(sideeffects=False), # only for rffi.cast()
+ 'convert_float_bytes_to_longlong': LLOp(canfold=True),
# __________ pointer operations __________
More information about the pypy-commit
mailing list