123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #!/usr/bin/python3
- # Expand test inputs for fromfp functions into text to edit into libm-test.inc.
- # Copyright (C) 2016-2019 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())
|