[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