about summary refs log tree commit diff
path: root/REORG.TODO/math/gen-fromfp-tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/math/gen-fromfp-tests.py')
-rwxr-xr-xREORG.TODO/math/gen-fromfp-tests.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/REORG.TODO/math/gen-fromfp-tests.py b/REORG.TODO/math/gen-fromfp-tests.py
new file mode 100755
index 0000000000..8a626cb9f2
--- /dev/null
+++ b/REORG.TODO/math/gen-fromfp-tests.py
@@ -0,0 +1,143 @@
+#!/usr/bin/python3
+# Expand test inputs for fromfp functions into text to edit into libm-test.inc.
+# Copyright (C) 2016-2017 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+#
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+# Take test inputs on stdin, in format:
+#
+# i <value>:width [int-value]
+#
+# for integer inputs, or
+#
+# t <value> <pos> <z> <a>
+#
+# for noninteger inputs, where <pos> is "a" for fractional part
+# between 0 and 0.5, "be" for 0.5 with even integer part, "bo" for 0.5
+# with odd integer part and "c" for between 0.5 and 1; <z> is the
+# value truncated towards zero, <a> is the value rounded away from
+# zero, both being in the form <value>:<width>.  Width values are for
+# the smallest type that can hold the value; for positive values, this
+# is an unsigned type.
+#
+# Command-line argument is function to generate tests for.  Any input
+# lines not of the above form are just passed through unchanged.
+#
+# Note that the output of this script forms the largest part of the
+# tests for the fromfp functions, but not the whole of those tests.
+
+import sys
+
+func = sys.argv[1]
+
+invalid_res = 'IGNORE, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM'
+exact_res = 'NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED'
+if func == 'fromfpx' or func == 'ufromfpx':
+    inexact_res = 'INEXACT_EXCEPTION|ERRNO_UNCHANGED'
+else:
+    inexact_res = exact_res
+unsigned = func.startswith('ufromfp')
+rm_list = ['FP_INT_UPWARD', 'FP_INT_DOWNWARD', 'FP_INT_TOWARDZERO',
+           'FP_INT_TONEARESTFROMZERO', 'FP_INT_TONEAREST']
+rm_away_pos = {'FP_INT_UPWARD': 'a',
+               'FP_INT_DOWNWARD': 'z',
+               'FP_INT_TOWARDZERO': 'z',
+               'FP_INT_TONEARESTFROMZERO': 'be',
+               'FP_INT_TONEAREST': 'bo'}
+rm_away_neg = {'FP_INT_UPWARD': 'z',
+               'FP_INT_DOWNWARD': 'a',
+               'FP_INT_TOWARDZERO': 'z',
+               'FP_INT_TONEARESTFROMZERO': 'be',
+               'FP_INT_TONEAREST': 'bo'}
+if unsigned:
+    test_macro = 'TEST_fiu_U'
+else:
+    test_macro = 'TEST_fiu_M'
+
+for line in sys.stdin:
+    if line.startswith('i'):
+        data = line.split()
+        val_width = data[1]
+        val, width = val_width.split(':')
+        negative = val.startswith('-')
+        if unsigned and negative:
+            continue
+        width = int(width)
+        if not unsigned and not negative:
+            width += 1
+        width_list = [0, 1]
+        if width > 2:
+            width_list.append(width - 1)
+        if width > 1 and width <= 64:
+            width_list.append(width)
+        if width < 64:
+            width_list.append(width + 1)
+        if width < 63:
+            width_list.append(64)
+        width_list = [(w, str(w)) for w in width_list]
+        width_list.append((64, 'UINT_MAX'))
+        for rm in rm_list:
+            for we in width_list:
+                w, ws = we
+                if w < width:
+                    print('    %s (%s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, invalid_res))
+                else:
+                    print('    %s (%s, %s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, val, exact_res))
+    elif line.startswith('t'):
+        data = line.split()
+        val = data[1]
+        pos = data[2]
+        z, z_width = data[3].split(':')
+        z_width = int(z_width)
+        a, a_width = data[4].split(':')
+        a_width = int(a_width)
+        if unsigned and z.startswith('-'):
+            continue
+        negative = val.startswith('-')
+        if negative:
+            rm_away = rm_away_neg
+        else:
+            rm_away = rm_away_pos
+        for rm in rm_list:
+            if pos >= rm_away[rm]:
+                res, width = a, a_width
+            else:
+                res, width = z, z_width
+            if not unsigned and not negative and res != '0':
+                width += 1
+            width_list = [0, 1]
+            if width > 2:
+                width_list.append(width - 1)
+            if width > 1 and width <= 64:
+                width_list.append(width)
+            if width < 64:
+                width_list.append(width + 1)
+            if width < 63:
+                width_list.append(64)
+            width_list = [(w, str(w)) for w in width_list]
+            width_list.append((64, 'UINT_MAX'))
+            for we in width_list:
+                w, ws = we
+                if w < width or (unsigned and res.startswith('-')):
+                    print('    %s (%s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, invalid_res))
+                else:
+                    print('    %s (%s, %s, %s, %s, %s, %s),' %
+                          (test_macro, func, val, rm, ws, res, inexact_res))
+    else:
+        print(line.rstrip())