[pypy-svn] r48206 - in pypy/dist/pypy/translator/llvm: . test
rxe at codespeak.net
rxe at codespeak.net
Tue Oct 30 18:54:09 CET 2007
Author: rxe
Date: Tue Oct 30 18:54:08 2007
New Revision: 48206
Modified:
pypy/dist/pypy/translator/llvm/database.py
pypy/dist/pypy/translator/llvm/modwrapper.py
pypy/dist/pypy/translator/llvm/test/test_lltype.py
Log:
painfully support single float
Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py (original)
+++ pypy/dist/pypy/translator/llvm/database.py Tue Oct 30 18:54:08 2007
@@ -349,6 +349,7 @@
self.types = {
lltype.Char: "sbyte",
lltype.Bool: "bool",
+ lltype.SingleFloat: "float",
lltype.Float: "double",
lltype.UniChar: "uint",
lltype.Void: "void",
@@ -377,6 +378,7 @@
lltype.Signed : self.repr_signed,
lltype.UnsignedLongLong : self.repr_default,
lltype.Unsigned : self.repr_default,
+ lltype.SingleFloat: self.repr_singlefloat,
lltype.Float : self.repr_float,
lltype.Char : self.repr_char,
lltype.UniChar : self.repr_unichar,
@@ -463,6 +465,26 @@
return repr
+ def repr_singlefloat(self, type_, value):
+ from pypy.rlib.rarithmetic import isinf, isnan
+
+ # XXX this doesnt work on 1.9 -> only hex repr supported for single floats
+ f = float(value)
+ if isinf(f) or isnan(f):
+ import struct
+ packed = value._bytes
+ if sys.byteorder == 'little':
+ packed = packed[::-1]
+ assert len(packed) == 4
+ repr = "0x" + "".join([("%02x" % ord(ii)) for ii in packed])
+ else:
+ repr = "%f" % f
+
+ # llvm requires a . when using e notation
+ if "e" in repr and "." not in repr:
+ repr = repr.replace("e", ".0e")
+ return repr
+
def repr_address(self, type_, value):
if not value:
return 'null'
Modified: pypy/dist/pypy/translator/llvm/modwrapper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/modwrapper.py (original)
+++ pypy/dist/pypy/translator/llvm/modwrapper.py Tue Oct 30 18:54:08 2007
@@ -36,6 +36,7 @@
return code
TO_CTYPES = {lltype.Bool: "ctypes.c_int",
+ lltype.SingleFloat: "ctypes.c_float",
lltype.Float: "ctypes.c_double",
lltype.Char: "ctypes.c_char",
lltype.Signed: "ctypes.c_int",
Modified: pypy/dist/pypy/translator/llvm/test/test_lltype.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_lltype.py (original)
+++ pypy/dist/pypy/translator/llvm/test/test_lltype.py Tue Oct 30 18:54:08 2007
@@ -760,6 +760,34 @@
fn = compile_function(llf, [])
assert fn() is True
+def test_r_singlefloat():
+ z = r_singlefloat(0.4)
+
+ def llf():
+ return z
+
+ fn = compile_function(llf, [])
+ res = fn()
+ assert res != 0.4 # precision lost
+ assert abs(res - 0.4) < 1E-6
+
+ def g(n):
+ if n > 0:
+ return r_singlefloat(n * 0.1)
+ else:
+ return z
+
+ def llf(n):
+ return float(g(n))
+
+ fn = compile_function(llf, [int])
+ res = fn(21)
+ assert res != 2.1 # precision lost
+ assert abs(res - 2.1) < 1E-6
+ res = fn(-5)
+ assert res != 0.4 # precision lost
+ assert abs(res - 0.4) < 1E-6
+
class TestLowLevelType(object):
def getcompiled(self, f, args=[]):
return compile_function(f, args)
@@ -893,28 +921,6 @@
0, maxlonglong>>4, # rshift
))
- def test_r_singlefloat(self):
- py.test.skip("singlefloat")
-
- z = r_singlefloat(0.4)
-
- def g(n):
- if n > 0:
- return r_singlefloat(n * 0.1)
- else:
- return z
-
- def llf(n):
- return float(g(n))
-
- fn = self.getcompiled(llf, [int])
- res = fn(21)
- assert res != 2.1 # precision lost
- assert abs(res - 2.1) < 1E-6
- res = fn(-5)
- assert res != 0.4 # precision lost
- assert abs(res - 0.4) < 1E-6
-
def test_prebuilt_nolength_char_array(self):
py.test.skip("fails on the trunk too")
for lastchar in ('\x00', 'X'):
More information about the Pypy-commit
mailing list