]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/gen-fromfp-tests.py
math: Add math-use-builtinds-fmin.h
[thirdparty/glibc.git] / math / gen-fromfp-tests.py
CommitLineData
423c2b9d
JM
1#!/usr/bin/python3
2# Expand test inputs for fromfp functions into text to edit into libm-test.inc.
2b778ceb 3# Copyright (C) 2016-2021 Free Software Foundation, Inc.
423c2b9d
JM
4# This file is part of the GNU C Library.
5#
6# The GNU C Library is free software; you can redistribute it and/or
7# modify it under the terms of the GNU Lesser General Public
8# License as published by the Free Software Foundation; either
9# version 2.1 of the License, or (at your option) any later version.
10#
11# The GNU C Library is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14# Lesser General Public License for more details.
15#
16# You should have received a copy of the GNU Lesser General Public
17# License along with the GNU C Library; if not, see
5a82c748 18# <https://www.gnu.org/licenses/>.
423c2b9d
JM
19
20# Take test inputs on stdin, in format:
21#
22# i <value>:width [int-value]
23#
24# for integer inputs, or
25#
26# t <value> <pos> <z> <a>
27#
28# for noninteger inputs, where <pos> is "a" for fractional part
29# between 0 and 0.5, "be" for 0.5 with even integer part, "bo" for 0.5
30# with odd integer part and "c" for between 0.5 and 1; <z> is the
31# value truncated towards zero, <a> is the value rounded away from
32# zero, both being in the form <value>:<width>. Width values are for
33# the smallest type that can hold the value; for positive values, this
34# is an unsigned type.
35#
36# Command-line argument is function to generate tests for. Any input
37# lines not of the above form are just passed through unchanged.
38#
39# Note that the output of this script forms the largest part of the
40# tests for the fromfp functions, but not the whole of those tests.
41
42import sys
43
44func = sys.argv[1]
45
46invalid_res = 'IGNORE, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM'
47exact_res = 'NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED'
48if func == 'fromfpx' or func == 'ufromfpx':
49 inexact_res = 'INEXACT_EXCEPTION|ERRNO_UNCHANGED'
50else:
51 inexact_res = exact_res
52unsigned = func.startswith('ufromfp')
53rm_list = ['FP_INT_UPWARD', 'FP_INT_DOWNWARD', 'FP_INT_TOWARDZERO',
54 'FP_INT_TONEARESTFROMZERO', 'FP_INT_TONEAREST']
55rm_away_pos = {'FP_INT_UPWARD': 'a',
56 'FP_INT_DOWNWARD': 'z',
57 'FP_INT_TOWARDZERO': 'z',
58 'FP_INT_TONEARESTFROMZERO': 'be',
59 'FP_INT_TONEAREST': 'bo'}
60rm_away_neg = {'FP_INT_UPWARD': 'z',
61 'FP_INT_DOWNWARD': 'a',
62 'FP_INT_TOWARDZERO': 'z',
63 'FP_INT_TONEARESTFROMZERO': 'be',
64 'FP_INT_TONEAREST': 'bo'}
65if unsigned:
66 test_macro = 'TEST_fiu_U'
67else:
68 test_macro = 'TEST_fiu_M'
69
70for line in sys.stdin:
71 if line.startswith('i'):
72 data = line.split()
73 val_width = data[1]
74 val, width = val_width.split(':')
75 negative = val.startswith('-')
76 if unsigned and negative:
77 continue
78 width = int(width)
79 if not unsigned and not negative:
80 width += 1
81 width_list = [0, 1]
82 if width > 2:
83 width_list.append(width - 1)
84 if width > 1 and width <= 64:
85 width_list.append(width)
86 if width < 64:
87 width_list.append(width + 1)
88 if width < 63:
89 width_list.append(64)
90 width_list = [(w, str(w)) for w in width_list]
91 width_list.append((64, 'UINT_MAX'))
92 for rm in rm_list:
93 for we in width_list:
94 w, ws = we
95 if w < width:
96 print(' %s (%s, %s, %s, %s, %s),' %
97 (test_macro, func, val, rm, ws, invalid_res))
98 else:
99 print(' %s (%s, %s, %s, %s, %s, %s),' %
100 (test_macro, func, val, rm, ws, val, exact_res))
101 elif line.startswith('t'):
102 data = line.split()
103 val = data[1]
104 pos = data[2]
105 z, z_width = data[3].split(':')
106 z_width = int(z_width)
107 a, a_width = data[4].split(':')
108 a_width = int(a_width)
109 if unsigned and z.startswith('-'):
110 continue
111 negative = val.startswith('-')
112 if negative:
113 rm_away = rm_away_neg
114 else:
115 rm_away = rm_away_pos
116 for rm in rm_list:
117 if pos >= rm_away[rm]:
118 res, width = a, a_width
119 else:
120 res, width = z, z_width
121 if not unsigned and not negative and res != '0':
122 width += 1
123 width_list = [0, 1]
124 if width > 2:
125 width_list.append(width - 1)
126 if width > 1 and width <= 64:
127 width_list.append(width)
128 if width < 64:
129 width_list.append(width + 1)
130 if width < 63:
131 width_list.append(64)
132 width_list = [(w, str(w)) for w in width_list]
133 width_list.append((64, 'UINT_MAX'))
134 for we in width_list:
135 w, ws = we
136 if w < width or (unsigned and res.startswith('-')):
137 print(' %s (%s, %s, %s, %s, %s),' %
138 (test_macro, func, val, rm, ws, invalid_res))
139 else:
140 print(' %s (%s, %s, %s, %s, %s, %s),' %
141 (test_macro, func, val, rm, ws, res, inexact_res))
142 else:
143 print(line.rstrip())