Home | History | Annotate | Line # | Download | only in testfloat
testFunction.c revision 1.1
      1  1.1  ross 
      2  1.1  ross /*
      3  1.1  ross ===============================================================================
      4  1.1  ross 
      5  1.1  ross This C source file is part of TestFloat, Release 2a, a package of programs
      6  1.1  ross for testing the correctness of floating-point arithmetic complying to the
      7  1.1  ross IEC/IEEE Standard for Floating-Point.
      8  1.1  ross 
      9  1.1  ross Written by John R. Hauser.  More information is available through the Web
     10  1.1  ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
     11  1.1  ross 
     12  1.1  ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
     13  1.1  ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
     14  1.1  ross TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
     15  1.1  ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
     16  1.1  ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
     17  1.1  ross 
     18  1.1  ross Derivative works are acceptable, even for commercial purposes, so long as
     19  1.1  ross (1) they include prominent notice that the work is derivative, and (2) they
     20  1.1  ross include prominent notice akin to these four paragraphs for those parts of
     21  1.1  ross this code that are retained.
     22  1.1  ross 
     23  1.1  ross ===============================================================================
     24  1.1  ross */
     25  1.1  ross 
     26  1.1  ross #include "milieu.h"
     27  1.1  ross #include "softfloat.h"
     28  1.1  ross #include "testCases.h"
     29  1.1  ross #include "testLoops.h"
     30  1.1  ross #include "systmodes.h"
     31  1.1  ross #include "systflags.h"
     32  1.1  ross #include "systfloat.h"
     33  1.1  ross #include "testFunction.h"
     34  1.1  ross 
     35  1.1  ross const functionT functions[ NUM_FUNCTIONS ] = {
     36  1.1  ross     { 0, 0, 0, 0 },
     37  1.1  ross     { "int32_to_float32",                1, FALSE, TRUE  },
     38  1.1  ross     { "int32_to_float64",                1, FALSE, FALSE },
     39  1.1  ross     { "int32_to_floatx80",               1, FALSE, FALSE },
     40  1.1  ross     { "int32_to_float128",               1, FALSE, FALSE },
     41  1.1  ross     { "int64_to_float32",                1, FALSE, TRUE  },
     42  1.1  ross     { "int64_to_float64",                1, FALSE, TRUE  },
     43  1.1  ross     { "int64_to_floatx80",               1, FALSE, FALSE },
     44  1.1  ross     { "int64_to_float128",               1, FALSE, FALSE },
     45  1.1  ross     { "float32_to_int32",                1, FALSE, TRUE  },
     46  1.1  ross     { "float32_to_int32_round_to_zero",  1, FALSE, FALSE },
     47  1.1  ross     { "float32_to_int64",                1, FALSE, TRUE  },
     48  1.1  ross     { "float32_to_int64_round_to_zero",  1, FALSE, FALSE },
     49  1.1  ross     { "float32_to_float64",              1, FALSE, FALSE },
     50  1.1  ross     { "float32_to_floatx80",             1, FALSE, FALSE },
     51  1.1  ross     { "float32_to_float128",             1, FALSE, FALSE },
     52  1.1  ross     { "float32_round_to_int",            1, FALSE, TRUE  },
     53  1.1  ross     { "float32_add",                     2, FALSE, TRUE  },
     54  1.1  ross     { "float32_sub",                     2, FALSE, TRUE  },
     55  1.1  ross     { "float32_mul",                     2, FALSE, TRUE  },
     56  1.1  ross     { "float32_div",                     2, FALSE, TRUE  },
     57  1.1  ross     { "float32_rem",                     2, FALSE, FALSE },
     58  1.1  ross     { "float32_sqrt",                    1, FALSE, TRUE  },
     59  1.1  ross     { "float32_eq",                      2, FALSE, FALSE },
     60  1.1  ross     { "float32_le",                      2, FALSE, FALSE },
     61  1.1  ross     { "float32_lt",                      2, FALSE, FALSE },
     62  1.1  ross     { "float32_eq_signaling",            2, FALSE, FALSE },
     63  1.1  ross     { "float32_le_quiet",                2, FALSE, FALSE },
     64  1.1  ross     { "float32_lt_quiet",                2, FALSE, FALSE },
     65  1.1  ross     { "float64_to_int32",                1, FALSE, TRUE  },
     66  1.1  ross     { "float64_to_int32_round_to_zero",  1, FALSE, FALSE },
     67  1.1  ross     { "float64_to_int64",                1, FALSE, TRUE  },
     68  1.1  ross     { "float64_to_int64_round_to_zero",  1, FALSE, FALSE },
     69  1.1  ross     { "float64_to_float32",              1, FALSE, TRUE  },
     70  1.1  ross     { "float64_to_floatx80",             1, FALSE, FALSE },
     71  1.1  ross     { "float64_to_float128",             1, FALSE, FALSE },
     72  1.1  ross     { "float64_round_to_int",            1, FALSE, TRUE  },
     73  1.1  ross     { "float64_add",                     2, FALSE, TRUE  },
     74  1.1  ross     { "float64_sub",                     2, FALSE, TRUE  },
     75  1.1  ross     { "float64_mul",                     2, FALSE, TRUE  },
     76  1.1  ross     { "float64_div",                     2, FALSE, TRUE  },
     77  1.1  ross     { "float64_rem",                     2, FALSE, FALSE },
     78  1.1  ross     { "float64_sqrt",                    1, FALSE, TRUE  },
     79  1.1  ross     { "float64_eq",                      2, FALSE, FALSE },
     80  1.1  ross     { "float64_le",                      2, FALSE, FALSE },
     81  1.1  ross     { "float64_lt",                      2, FALSE, FALSE },
     82  1.1  ross     { "float64_eq_signaling",            2, FALSE, FALSE },
     83  1.1  ross     { "float64_le_quiet",                2, FALSE, FALSE },
     84  1.1  ross     { "float64_lt_quiet",                2, FALSE, FALSE },
     85  1.1  ross     { "floatx80_to_int32",               1, FALSE, TRUE  },
     86  1.1  ross     { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE },
     87  1.1  ross     { "floatx80_to_int64",               1, FALSE, TRUE  },
     88  1.1  ross     { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE },
     89  1.1  ross     { "floatx80_to_float32",             1, FALSE, TRUE  },
     90  1.1  ross     { "floatx80_to_float64",             1, FALSE, TRUE  },
     91  1.1  ross     { "floatx80_to_float128",            1, FALSE, FALSE },
     92  1.1  ross     { "floatx80_round_to_int",           1, FALSE, TRUE  },
     93  1.1  ross     { "floatx80_add",                    2, TRUE,  TRUE  },
     94  1.1  ross     { "floatx80_sub",                    2, TRUE,  TRUE  },
     95  1.1  ross     { "floatx80_mul",                    2, TRUE,  TRUE  },
     96  1.1  ross     { "floatx80_div",                    2, TRUE,  TRUE  },
     97  1.1  ross     { "floatx80_rem",                    2, FALSE, FALSE },
     98  1.1  ross     { "floatx80_sqrt",                   1, TRUE,  TRUE  },
     99  1.1  ross     { "floatx80_eq",                     2, FALSE, FALSE },
    100  1.1  ross     { "floatx80_le",                     2, FALSE, FALSE },
    101  1.1  ross     { "floatx80_lt",                     2, FALSE, FALSE },
    102  1.1  ross     { "floatx80_eq_signaling",           2, FALSE, FALSE },
    103  1.1  ross     { "floatx80_le_quiet",               2, FALSE, FALSE },
    104  1.1  ross     { "floatx80_lt_quiet",               2, FALSE, FALSE },
    105  1.1  ross     { "float128_to_int32",               1, FALSE, TRUE  },
    106  1.1  ross     { "float128_to_int32_round_to_zero", 1, FALSE, FALSE },
    107  1.1  ross     { "float128_to_int64",               1, FALSE, TRUE  },
    108  1.1  ross     { "float128_to_int64_round_to_zero", 1, FALSE, FALSE },
    109  1.1  ross     { "float128_to_float32",             1, FALSE, TRUE  },
    110  1.1  ross     { "float128_to_float64",             1, FALSE, TRUE  },
    111  1.1  ross     { "float128_to_floatx80",            1, FALSE, TRUE  },
    112  1.1  ross     { "float128_round_to_int",           1, FALSE, TRUE  },
    113  1.1  ross     { "float128_add",                    2, FALSE, TRUE  },
    114  1.1  ross     { "float128_sub",                    2, FALSE, TRUE  },
    115  1.1  ross     { "float128_mul",                    2, FALSE, TRUE  },
    116  1.1  ross     { "float128_div",                    2, FALSE, TRUE  },
    117  1.1  ross     { "float128_rem",                    2, FALSE, FALSE },
    118  1.1  ross     { "float128_sqrt",                   1, FALSE, TRUE  },
    119  1.1  ross     { "float128_eq",                     2, FALSE, FALSE },
    120  1.1  ross     { "float128_le",                     2, FALSE, FALSE },
    121  1.1  ross     { "float128_lt",                     2, FALSE, FALSE },
    122  1.1  ross     { "float128_eq_signaling",           2, FALSE, FALSE },
    123  1.1  ross     { "float128_le_quiet",               2, FALSE, FALSE },
    124  1.1  ross     { "float128_lt_quiet",               2, FALSE, FALSE },
    125  1.1  ross };
    126  1.1  ross 
    127  1.1  ross const flag functionExists[ NUM_FUNCTIONS ] = {
    128  1.1  ross     0,
    129  1.1  ross #ifdef SYST_INT32_TO_FLOAT32
    130  1.1  ross     1,
    131  1.1  ross #else
    132  1.1  ross     0,
    133  1.1  ross #endif
    134  1.1  ross #ifdef SYST_INT32_TO_FLOAT64
    135  1.1  ross     1,
    136  1.1  ross #else
    137  1.1  ross     0,
    138  1.1  ross #endif
    139  1.1  ross #ifdef SYST_INT32_TO_FLOATX80
    140  1.1  ross     1,
    141  1.1  ross #else
    142  1.1  ross     0,
    143  1.1  ross #endif
    144  1.1  ross #ifdef SYST_INT32_TO_FLOAT128
    145  1.1  ross     1,
    146  1.1  ross #else
    147  1.1  ross     0,
    148  1.1  ross #endif
    149  1.1  ross #ifdef SYST_INT64_TO_FLOAT32
    150  1.1  ross     1,
    151  1.1  ross #else
    152  1.1  ross     0,
    153  1.1  ross #endif
    154  1.1  ross #ifdef SYST_INT64_TO_FLOAT64
    155  1.1  ross     1,
    156  1.1  ross #else
    157  1.1  ross     0,
    158  1.1  ross #endif
    159  1.1  ross #ifdef SYST_INT64_TO_FLOATX80
    160  1.1  ross     1,
    161  1.1  ross #else
    162  1.1  ross     0,
    163  1.1  ross #endif
    164  1.1  ross #ifdef SYST_INT64_TO_FLOAT128
    165  1.1  ross     1,
    166  1.1  ross #else
    167  1.1  ross     0,
    168  1.1  ross #endif
    169  1.1  ross #ifdef SYST_FLOAT32_TO_INT32
    170  1.1  ross     1,
    171  1.1  ross #else
    172  1.1  ross     0,
    173  1.1  ross #endif
    174  1.1  ross #ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO
    175  1.1  ross     1,
    176  1.1  ross #else
    177  1.1  ross     0,
    178  1.1  ross #endif
    179  1.1  ross #ifdef SYST_FLOAT32_TO_INT64
    180  1.1  ross     1,
    181  1.1  ross #else
    182  1.1  ross     0,
    183  1.1  ross #endif
    184  1.1  ross #ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO
    185  1.1  ross     1,
    186  1.1  ross #else
    187  1.1  ross     0,
    188  1.1  ross #endif
    189  1.1  ross #ifdef SYST_FLOAT32_TO_FLOAT64
    190  1.1  ross     1,
    191  1.1  ross #else
    192  1.1  ross     0,
    193  1.1  ross #endif
    194  1.1  ross #ifdef SYST_FLOAT32_TO_FLOATX80
    195  1.1  ross     1,
    196  1.1  ross #else
    197  1.1  ross     0,
    198  1.1  ross #endif
    199  1.1  ross #ifdef SYST_FLOAT32_TO_FLOAT128
    200  1.1  ross     1,
    201  1.1  ross #else
    202  1.1  ross     0,
    203  1.1  ross #endif
    204  1.1  ross #ifdef SYST_FLOAT32_ROUND_TO_INT
    205  1.1  ross     1,
    206  1.1  ross #else
    207  1.1  ross     0,
    208  1.1  ross #endif
    209  1.1  ross #ifdef SYST_FLOAT32_ADD
    210  1.1  ross     1,
    211  1.1  ross #else
    212  1.1  ross     0,
    213  1.1  ross #endif
    214  1.1  ross #ifdef SYST_FLOAT32_SUB
    215  1.1  ross     1,
    216  1.1  ross #else
    217  1.1  ross     0,
    218  1.1  ross #endif
    219  1.1  ross #ifdef SYST_FLOAT32_MUL
    220  1.1  ross     1,
    221  1.1  ross #else
    222  1.1  ross     0,
    223  1.1  ross #endif
    224  1.1  ross #ifdef SYST_FLOAT32_DIV
    225  1.1  ross     1,
    226  1.1  ross #else
    227  1.1  ross     0,
    228  1.1  ross #endif
    229  1.1  ross #ifdef SYST_FLOAT32_REM
    230  1.1  ross     1,
    231  1.1  ross #else
    232  1.1  ross     0,
    233  1.1  ross #endif
    234  1.1  ross #ifdef SYST_FLOAT32_SQRT
    235  1.1  ross     1,
    236  1.1  ross #else
    237  1.1  ross     0,
    238  1.1  ross #endif
    239  1.1  ross #ifdef SYST_FLOAT32_EQ
    240  1.1  ross     1,
    241  1.1  ross #else
    242  1.1  ross     0,
    243  1.1  ross #endif
    244  1.1  ross #ifdef SYST_FLOAT32_LE
    245  1.1  ross     1,
    246  1.1  ross #else
    247  1.1  ross     0,
    248  1.1  ross #endif
    249  1.1  ross #ifdef SYST_FLOAT32_LT
    250  1.1  ross     1,
    251  1.1  ross #else
    252  1.1  ross     0,
    253  1.1  ross #endif
    254  1.1  ross #ifdef SYST_FLOAT32_EQ_SIGNALING
    255  1.1  ross     1,
    256  1.1  ross #else
    257  1.1  ross     0,
    258  1.1  ross #endif
    259  1.1  ross #ifdef SYST_FLOAT32_LE_QUIET
    260  1.1  ross     1,
    261  1.1  ross #else
    262  1.1  ross     0,
    263  1.1  ross #endif
    264  1.1  ross #ifdef SYST_FLOAT32_LT_QUIET
    265  1.1  ross     1,
    266  1.1  ross #else
    267  1.1  ross     0,
    268  1.1  ross #endif
    269  1.1  ross #ifdef SYST_FLOAT64_TO_INT32
    270  1.1  ross     1,
    271  1.1  ross #else
    272  1.1  ross     0,
    273  1.1  ross #endif
    274  1.1  ross #ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO
    275  1.1  ross     1,
    276  1.1  ross #else
    277  1.1  ross     0,
    278  1.1  ross #endif
    279  1.1  ross #ifdef SYST_FLOAT64_TO_INT64
    280  1.1  ross     1,
    281  1.1  ross #else
    282  1.1  ross     0,
    283  1.1  ross #endif
    284  1.1  ross #ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO
    285  1.1  ross     1,
    286  1.1  ross #else
    287  1.1  ross     0,
    288  1.1  ross #endif
    289  1.1  ross #ifdef SYST_FLOAT64_TO_FLOAT32
    290  1.1  ross     1,
    291  1.1  ross #else
    292  1.1  ross     0,
    293  1.1  ross #endif
    294  1.1  ross #ifdef SYST_FLOAT64_TO_FLOATX80
    295  1.1  ross     1,
    296  1.1  ross #else
    297  1.1  ross     0,
    298  1.1  ross #endif
    299  1.1  ross #ifdef SYST_FLOAT64_TO_FLOAT128
    300  1.1  ross     1,
    301  1.1  ross #else
    302  1.1  ross     0,
    303  1.1  ross #endif
    304  1.1  ross #ifdef SYST_FLOAT64_ROUND_TO_INT
    305  1.1  ross     1,
    306  1.1  ross #else
    307  1.1  ross     0,
    308  1.1  ross #endif
    309  1.1  ross #ifdef SYST_FLOAT64_ADD
    310  1.1  ross     1,
    311  1.1  ross #else
    312  1.1  ross     0,
    313  1.1  ross #endif
    314  1.1  ross #ifdef SYST_FLOAT64_SUB
    315  1.1  ross     1,
    316  1.1  ross #else
    317  1.1  ross     0,
    318  1.1  ross #endif
    319  1.1  ross #ifdef SYST_FLOAT64_MUL
    320  1.1  ross     1,
    321  1.1  ross #else
    322  1.1  ross     0,
    323  1.1  ross #endif
    324  1.1  ross #ifdef SYST_FLOAT64_DIV
    325  1.1  ross     1,
    326  1.1  ross #else
    327  1.1  ross     0,
    328  1.1  ross #endif
    329  1.1  ross #ifdef SYST_FLOAT64_REM
    330  1.1  ross     1,
    331  1.1  ross #else
    332  1.1  ross     0,
    333  1.1  ross #endif
    334  1.1  ross #ifdef SYST_FLOAT64_SQRT
    335  1.1  ross     1,
    336  1.1  ross #else
    337  1.1  ross     0,
    338  1.1  ross #endif
    339  1.1  ross #ifdef SYST_FLOAT64_EQ
    340  1.1  ross     1,
    341  1.1  ross #else
    342  1.1  ross     0,
    343  1.1  ross #endif
    344  1.1  ross #ifdef SYST_FLOAT64_LE
    345  1.1  ross     1,
    346  1.1  ross #else
    347  1.1  ross     0,
    348  1.1  ross #endif
    349  1.1  ross #ifdef SYST_FLOAT64_LT
    350  1.1  ross     1,
    351  1.1  ross #else
    352  1.1  ross     0,
    353  1.1  ross #endif
    354  1.1  ross #ifdef SYST_FLOAT64_EQ_SIGNALING
    355  1.1  ross     1,
    356  1.1  ross #else
    357  1.1  ross     0,
    358  1.1  ross #endif
    359  1.1  ross #ifdef SYST_FLOAT64_LE_QUIET
    360  1.1  ross     1,
    361  1.1  ross #else
    362  1.1  ross     0,
    363  1.1  ross #endif
    364  1.1  ross #ifdef SYST_FLOAT64_LT_QUIET
    365  1.1  ross     1,
    366  1.1  ross #else
    367  1.1  ross     0,
    368  1.1  ross #endif
    369  1.1  ross #ifdef SYST_FLOATX80_TO_INT32
    370  1.1  ross     1,
    371  1.1  ross #else
    372  1.1  ross     0,
    373  1.1  ross #endif
    374  1.1  ross #ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO
    375  1.1  ross     1,
    376  1.1  ross #else
    377  1.1  ross     0,
    378  1.1  ross #endif
    379  1.1  ross #ifdef SYST_FLOATX80_TO_INT64
    380  1.1  ross     1,
    381  1.1  ross #else
    382  1.1  ross     0,
    383  1.1  ross #endif
    384  1.1  ross #ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO
    385  1.1  ross     1,
    386  1.1  ross #else
    387  1.1  ross     0,
    388  1.1  ross #endif
    389  1.1  ross #ifdef SYST_FLOATX80_TO_FLOAT32
    390  1.1  ross     1,
    391  1.1  ross #else
    392  1.1  ross     0,
    393  1.1  ross #endif
    394  1.1  ross #ifdef SYST_FLOATX80_TO_FLOAT64
    395  1.1  ross     1,
    396  1.1  ross #else
    397  1.1  ross     0,
    398  1.1  ross #endif
    399  1.1  ross #ifdef SYST_FLOATX80_TO_FLOAT128
    400  1.1  ross     1,
    401  1.1  ross #else
    402  1.1  ross     0,
    403  1.1  ross #endif
    404  1.1  ross #ifdef SYST_FLOATX80_ROUND_TO_INT
    405  1.1  ross     1,
    406  1.1  ross #else
    407  1.1  ross     0,
    408  1.1  ross #endif
    409  1.1  ross #ifdef SYST_FLOATX80_ADD
    410  1.1  ross     1,
    411  1.1  ross #else
    412  1.1  ross     0,
    413  1.1  ross #endif
    414  1.1  ross #ifdef SYST_FLOATX80_SUB
    415  1.1  ross     1,
    416  1.1  ross #else
    417  1.1  ross     0,
    418  1.1  ross #endif
    419  1.1  ross #ifdef SYST_FLOATX80_MUL
    420  1.1  ross     1,
    421  1.1  ross #else
    422  1.1  ross     0,
    423  1.1  ross #endif
    424  1.1  ross #ifdef SYST_FLOATX80_DIV
    425  1.1  ross     1,
    426  1.1  ross #else
    427  1.1  ross     0,
    428  1.1  ross #endif
    429  1.1  ross #ifdef SYST_FLOATX80_REM
    430  1.1  ross     1,
    431  1.1  ross #else
    432  1.1  ross     0,
    433  1.1  ross #endif
    434  1.1  ross #ifdef SYST_FLOATX80_SQRT
    435  1.1  ross     1,
    436  1.1  ross #else
    437  1.1  ross     0,
    438  1.1  ross #endif
    439  1.1  ross #ifdef SYST_FLOATX80_EQ
    440  1.1  ross     1,
    441  1.1  ross #else
    442  1.1  ross     0,
    443  1.1  ross #endif
    444  1.1  ross #ifdef SYST_FLOATX80_LE
    445  1.1  ross     1,
    446  1.1  ross #else
    447  1.1  ross     0,
    448  1.1  ross #endif
    449  1.1  ross #ifdef SYST_FLOATX80_LT
    450  1.1  ross     1,
    451  1.1  ross #else
    452  1.1  ross     0,
    453  1.1  ross #endif
    454  1.1  ross #ifdef SYST_FLOATX80_EQ_SIGNALING
    455  1.1  ross     1,
    456  1.1  ross #else
    457  1.1  ross     0,
    458  1.1  ross #endif
    459  1.1  ross #ifdef SYST_FLOATX80_LE_QUIET
    460  1.1  ross     1,
    461  1.1  ross #else
    462  1.1  ross     0,
    463  1.1  ross #endif
    464  1.1  ross #ifdef SYST_FLOATX80_LT_QUIET
    465  1.1  ross     1,
    466  1.1  ross #else
    467  1.1  ross     0,
    468  1.1  ross #endif
    469  1.1  ross #ifdef SYST_FLOAT128_TO_INT32
    470  1.1  ross     1,
    471  1.1  ross #else
    472  1.1  ross     0,
    473  1.1  ross #endif
    474  1.1  ross #ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO
    475  1.1  ross     1,
    476  1.1  ross #else
    477  1.1  ross     0,
    478  1.1  ross #endif
    479  1.1  ross #ifdef SYST_FLOAT128_TO_INT64
    480  1.1  ross     1,
    481  1.1  ross #else
    482  1.1  ross     0,
    483  1.1  ross #endif
    484  1.1  ross #ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO
    485  1.1  ross     1,
    486  1.1  ross #else
    487  1.1  ross     0,
    488  1.1  ross #endif
    489  1.1  ross #ifdef SYST_FLOAT128_TO_FLOAT32
    490  1.1  ross     1,
    491  1.1  ross #else
    492  1.1  ross     0,
    493  1.1  ross #endif
    494  1.1  ross #ifdef SYST_FLOAT128_TO_FLOAT64
    495  1.1  ross     1,
    496  1.1  ross #else
    497  1.1  ross     0,
    498  1.1  ross #endif
    499  1.1  ross #ifdef SYST_FLOAT128_TO_FLOATX80
    500  1.1  ross     1,
    501  1.1  ross #else
    502  1.1  ross     0,
    503  1.1  ross #endif
    504  1.1  ross #ifdef SYST_FLOAT128_ROUND_TO_INT
    505  1.1  ross     1,
    506  1.1  ross #else
    507  1.1  ross     0,
    508  1.1  ross #endif
    509  1.1  ross #ifdef SYST_FLOAT128_ADD
    510  1.1  ross     1,
    511  1.1  ross #else
    512  1.1  ross     0,
    513  1.1  ross #endif
    514  1.1  ross #ifdef SYST_FLOAT128_SUB
    515  1.1  ross     1,
    516  1.1  ross #else
    517  1.1  ross     0,
    518  1.1  ross #endif
    519  1.1  ross #ifdef SYST_FLOAT128_MUL
    520  1.1  ross     1,
    521  1.1  ross #else
    522  1.1  ross     0,
    523  1.1  ross #endif
    524  1.1  ross #ifdef SYST_FLOAT128_DIV
    525  1.1  ross     1,
    526  1.1  ross #else
    527  1.1  ross     0,
    528  1.1  ross #endif
    529  1.1  ross #ifdef SYST_FLOAT128_REM
    530  1.1  ross     1,
    531  1.1  ross #else
    532  1.1  ross     0,
    533  1.1  ross #endif
    534  1.1  ross #ifdef SYST_FLOAT128_SQRT
    535  1.1  ross     1,
    536  1.1  ross #else
    537  1.1  ross     0,
    538  1.1  ross #endif
    539  1.1  ross #ifdef SYST_FLOAT128_EQ
    540  1.1  ross     1,
    541  1.1  ross #else
    542  1.1  ross     0,
    543  1.1  ross #endif
    544  1.1  ross #ifdef SYST_FLOAT128_LE
    545  1.1  ross     1,
    546  1.1  ross #else
    547  1.1  ross     0,
    548  1.1  ross #endif
    549  1.1  ross #ifdef SYST_FLOAT128_LT
    550  1.1  ross     1,
    551  1.1  ross #else
    552  1.1  ross     0,
    553  1.1  ross #endif
    554  1.1  ross #ifdef SYST_FLOAT128_EQ_SIGNALING
    555  1.1  ross     1,
    556  1.1  ross #else
    557  1.1  ross     0,
    558  1.1  ross #endif
    559  1.1  ross #ifdef SYST_FLOAT128_LE_QUIET
    560  1.1  ross     1,
    561  1.1  ross #else
    562  1.1  ross     0,
    563  1.1  ross #endif
    564  1.1  ross #ifdef SYST_FLOAT128_LT_QUIET
    565  1.1  ross     1,
    566  1.1  ross #else
    567  1.1  ross     0,
    568  1.1  ross #endif
    569  1.1  ross };
    570  1.1  ross 
    571  1.1  ross static void
    572  1.1  ross  testFunctionVariety(
    573  1.1  ross      uint8 functionCode, int8 roundingPrecision, int8 roundingMode )
    574  1.1  ross {
    575  1.1  ross     uint8 roundingCode;
    576  1.1  ross 
    577  1.1  ross     functionName = functions[ functionCode ].name;
    578  1.1  ross #ifdef FLOATX80
    579  1.1  ross     if ( roundingPrecision == 32 ) {
    580  1.1  ross         roundingPrecisionName = "32";
    581  1.1  ross     }
    582  1.1  ross     else if ( roundingPrecision == 64 ) {
    583  1.1  ross         roundingPrecisionName = "64";
    584  1.1  ross     }
    585  1.1  ross     else if ( roundingPrecision == 80 ) {
    586  1.1  ross         roundingPrecisionName = "80";
    587  1.1  ross     }
    588  1.1  ross     else {
    589  1.1  ross         roundingPrecision = 80;
    590  1.1  ross         roundingPrecisionName = 0;
    591  1.1  ross     }
    592  1.1  ross     floatx80_rounding_precision = roundingPrecision;
    593  1.1  ross     syst_float_set_rounding_precision( roundingPrecision );
    594  1.1  ross #endif
    595  1.1  ross     switch ( roundingMode ) {
    596  1.1  ross      case 0:
    597  1.1  ross         roundingModeName = 0;
    598  1.1  ross         roundingCode = float_round_nearest_even;
    599  1.1  ross         break;
    600  1.1  ross      case ROUND_NEAREST_EVEN:
    601  1.1  ross         roundingModeName = "nearest_even";
    602  1.1  ross         roundingCode = float_round_nearest_even;
    603  1.1  ross         break;
    604  1.1  ross      case ROUND_TO_ZERO:
    605  1.1  ross         roundingModeName = "to_zero";
    606  1.1  ross         roundingCode = float_round_to_zero;
    607  1.1  ross         break;
    608  1.1  ross      case ROUND_DOWN:
    609  1.1  ross         roundingModeName = "down";
    610  1.1  ross         roundingCode = float_round_down;
    611  1.1  ross         break;
    612  1.1  ross      case ROUND_UP:
    613  1.1  ross         roundingModeName = "up";
    614  1.1  ross         roundingCode = float_round_up;
    615  1.1  ross         break;
    616  1.1  ross     }
    617  1.1  ross     float_rounding_mode = roundingCode;
    618  1.1  ross     syst_float_set_rounding_mode( roundingCode );
    619  1.1  ross     fputs( "Testing ", stderr );
    620  1.1  ross     writeFunctionName( stderr );
    621  1.1  ross     fputs( ".\n", stderr );
    622  1.1  ross     switch ( functionCode ) {
    623  1.1  ross #ifdef SYST_INT32_TO_FLOAT32
    624  1.1  ross      case INT32_TO_FLOAT32:
    625  1.1  ross         test_a_int32_z_float32( int32_to_float32, syst_int32_to_float32 );
    626  1.1  ross         break;
    627  1.1  ross #endif
    628  1.1  ross #ifdef SYST_INT32_TO_FLOAT64
    629  1.1  ross      case INT32_TO_FLOAT64:
    630  1.1  ross         test_a_int32_z_float64( int32_to_float64, syst_int32_to_float64 );
    631  1.1  ross         break;
    632  1.1  ross #endif
    633  1.1  ross #ifdef SYST_INT32_TO_FLOATX80
    634  1.1  ross      case INT32_TO_FLOATX80:
    635  1.1  ross         test_a_int32_z_floatx80( int32_to_floatx80, syst_int32_to_floatx80 );
    636  1.1  ross         break;
    637  1.1  ross #endif
    638  1.1  ross #ifdef SYST_INT32_TO_FLOAT128
    639  1.1  ross      case INT32_TO_FLOAT128:
    640  1.1  ross         test_a_int32_z_float128( int32_to_float128, syst_int32_to_float128 );
    641  1.1  ross         break;
    642  1.1  ross #endif
    643  1.1  ross #ifdef SYST_INT64_TO_FLOAT32
    644  1.1  ross      case INT64_TO_FLOAT32:
    645  1.1  ross         test_a_int64_z_float32( int64_to_float32, syst_int64_to_float32 );
    646  1.1  ross         break;
    647  1.1  ross #endif
    648  1.1  ross #ifdef SYST_INT64_TO_FLOAT64
    649  1.1  ross      case INT64_TO_FLOAT64:
    650  1.1  ross         test_a_int64_z_float64( int64_to_float64, syst_int64_to_float64 );
    651  1.1  ross         break;
    652  1.1  ross #endif
    653  1.1  ross #ifdef SYST_INT64_TO_FLOATX80
    654  1.1  ross      case INT64_TO_FLOATX80:
    655  1.1  ross         test_a_int64_z_floatx80( int64_to_floatx80, syst_int64_to_floatx80 );
    656  1.1  ross         break;
    657  1.1  ross #endif
    658  1.1  ross #ifdef SYST_INT64_TO_FLOAT128
    659  1.1  ross      case INT64_TO_FLOAT128:
    660  1.1  ross         test_a_int64_z_float128( int64_to_float128, syst_int64_to_float128 );
    661  1.1  ross         break;
    662  1.1  ross #endif
    663  1.1  ross #ifdef SYST_FLOAT32_TO_INT32
    664  1.1  ross      case FLOAT32_TO_INT32:
    665  1.1  ross         test_a_float32_z_int32( float32_to_int32, syst_float32_to_int32 );
    666  1.1  ross         break;
    667  1.1  ross #endif
    668  1.1  ross #ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO
    669  1.1  ross      case FLOAT32_TO_INT32_ROUND_TO_ZERO:
    670  1.1  ross         test_a_float32_z_int32(
    671  1.1  ross             float32_to_int32_round_to_zero,
    672  1.1  ross             syst_float32_to_int32_round_to_zero
    673  1.1  ross         );
    674  1.1  ross         break;
    675  1.1  ross #endif
    676  1.1  ross #ifdef SYST_FLOAT32_TO_INT64
    677  1.1  ross      case FLOAT32_TO_INT64:
    678  1.1  ross         test_a_float32_z_int64( float32_to_int64, syst_float32_to_int64 );
    679  1.1  ross         break;
    680  1.1  ross #endif
    681  1.1  ross #ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO
    682  1.1  ross      case FLOAT32_TO_INT64_ROUND_TO_ZERO:
    683  1.1  ross         test_a_float32_z_int64(
    684  1.1  ross             float32_to_int64_round_to_zero,
    685  1.1  ross             syst_float32_to_int64_round_to_zero
    686  1.1  ross         );
    687  1.1  ross         break;
    688  1.1  ross #endif
    689  1.1  ross #ifdef SYST_FLOAT32_TO_FLOAT64
    690  1.1  ross      case FLOAT32_TO_FLOAT64:
    691  1.1  ross         test_a_float32_z_float64(
    692  1.1  ross             float32_to_float64, syst_float32_to_float64 );
    693  1.1  ross         break;
    694  1.1  ross #endif
    695  1.1  ross #ifdef SYST_FLOAT32_TO_FLOATX80
    696  1.1  ross      case FLOAT32_TO_FLOATX80:
    697  1.1  ross         test_a_float32_z_floatx80(
    698  1.1  ross             float32_to_floatx80, syst_float32_to_floatx80 );
    699  1.1  ross         break;
    700  1.1  ross #endif
    701  1.1  ross #ifdef SYST_FLOAT32_TO_FLOAT128
    702  1.1  ross      case FLOAT32_TO_FLOAT128:
    703  1.1  ross         test_a_float32_z_float128(
    704  1.1  ross             float32_to_float128, syst_float32_to_float128 );
    705  1.1  ross         break;
    706  1.1  ross #endif
    707  1.1  ross #ifdef SYST_FLOAT32_ROUND_TO_INT
    708  1.1  ross      case FLOAT32_ROUND_TO_INT:
    709  1.1  ross         test_az_float32( float32_round_to_int, syst_float32_round_to_int );
    710  1.1  ross         break;
    711  1.1  ross #endif
    712  1.1  ross #ifdef SYST_FLOAT32_ADD
    713  1.1  ross      case FLOAT32_ADD:
    714  1.1  ross         test_abz_float32( float32_add, syst_float32_add );
    715  1.1  ross         break;
    716  1.1  ross #endif
    717  1.1  ross #ifdef SYST_FLOAT32_SUB
    718  1.1  ross      case FLOAT32_SUB:
    719  1.1  ross         test_abz_float32( float32_sub, syst_float32_sub );
    720  1.1  ross         break;
    721  1.1  ross #endif
    722  1.1  ross #ifdef SYST_FLOAT32_MUL
    723  1.1  ross      case FLOAT32_MUL:
    724  1.1  ross         test_abz_float32( float32_mul, syst_float32_mul );
    725  1.1  ross         break;
    726  1.1  ross #endif
    727  1.1  ross #ifdef SYST_FLOAT32_DIV
    728  1.1  ross      case FLOAT32_DIV:
    729  1.1  ross         test_abz_float32( float32_div, syst_float32_div );
    730  1.1  ross         break;
    731  1.1  ross #endif
    732  1.1  ross #ifdef SYST_FLOAT32_REM
    733  1.1  ross      case FLOAT32_REM:
    734  1.1  ross         test_abz_float32( float32_rem, syst_float32_rem );
    735  1.1  ross         break;
    736  1.1  ross #endif
    737  1.1  ross #ifdef SYST_FLOAT32_SQRT
    738  1.1  ross      case FLOAT32_SQRT:
    739  1.1  ross         test_az_float32( float32_sqrt, syst_float32_sqrt );
    740  1.1  ross         break;
    741  1.1  ross #endif
    742  1.1  ross #ifdef SYST_FLOAT32_EQ
    743  1.1  ross      case FLOAT32_EQ:
    744  1.1  ross         test_ab_float32_z_flag( float32_eq, syst_float32_eq );
    745  1.1  ross         break;
    746  1.1  ross #endif
    747  1.1  ross #ifdef SYST_FLOAT32_LE
    748  1.1  ross      case FLOAT32_LE:
    749  1.1  ross         test_ab_float32_z_flag( float32_le, syst_float32_le );
    750  1.1  ross         break;
    751  1.1  ross #endif
    752  1.1  ross #ifdef SYST_FLOAT32_LT
    753  1.1  ross      case FLOAT32_LT:
    754  1.1  ross         test_ab_float32_z_flag( float32_lt, syst_float32_lt );
    755  1.1  ross         break;
    756  1.1  ross #endif
    757  1.1  ross #ifdef SYST_FLOAT32_EQ_SIGNALING
    758  1.1  ross      case FLOAT32_EQ_SIGNALING:
    759  1.1  ross         test_ab_float32_z_flag(
    760  1.1  ross             float32_eq_signaling, syst_float32_eq_signaling );
    761  1.1  ross         break;
    762  1.1  ross #endif
    763  1.1  ross #ifdef SYST_FLOAT32_LE_QUIET
    764  1.1  ross      case FLOAT32_LE_QUIET:
    765  1.1  ross         test_ab_float32_z_flag( float32_le_quiet, syst_float32_le_quiet );
    766  1.1  ross         break;
    767  1.1  ross #endif
    768  1.1  ross #ifdef SYST_FLOAT32_LT_QUIET
    769  1.1  ross      case FLOAT32_LT_QUIET:
    770  1.1  ross         test_ab_float32_z_flag( float32_lt_quiet, syst_float32_lt_quiet );
    771  1.1  ross         break;
    772  1.1  ross #endif
    773  1.1  ross #ifdef SYST_FLOAT64_TO_INT32
    774  1.1  ross      case FLOAT64_TO_INT32:
    775  1.1  ross         test_a_float64_z_int32( float64_to_int32, syst_float64_to_int32 );
    776  1.1  ross         break;
    777  1.1  ross #endif
    778  1.1  ross #ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO
    779  1.1  ross      case FLOAT64_TO_INT32_ROUND_TO_ZERO:
    780  1.1  ross         test_a_float64_z_int32(
    781  1.1  ross             float64_to_int32_round_to_zero,
    782  1.1  ross             syst_float64_to_int32_round_to_zero
    783  1.1  ross         );
    784  1.1  ross         break;
    785  1.1  ross #endif
    786  1.1  ross #ifdef SYST_FLOAT64_TO_INT64
    787  1.1  ross      case FLOAT64_TO_INT64:
    788  1.1  ross         test_a_float64_z_int64( float64_to_int64, syst_float64_to_int64 );
    789  1.1  ross         break;
    790  1.1  ross #endif
    791  1.1  ross #ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO
    792  1.1  ross      case FLOAT64_TO_INT64_ROUND_TO_ZERO:
    793  1.1  ross         test_a_float64_z_int64(
    794  1.1  ross             float64_to_int64_round_to_zero,
    795  1.1  ross             syst_float64_to_int64_round_to_zero
    796  1.1  ross         );
    797  1.1  ross         break;
    798  1.1  ross #endif
    799  1.1  ross #ifdef SYST_FLOAT64_TO_FLOAT32
    800  1.1  ross      case FLOAT64_TO_FLOAT32:
    801  1.1  ross         test_a_float64_z_float32(
    802  1.1  ross             float64_to_float32, syst_float64_to_float32 );
    803  1.1  ross         break;
    804  1.1  ross #endif
    805  1.1  ross #ifdef SYST_FLOAT64_TO_FLOATX80
    806  1.1  ross      case FLOAT64_TO_FLOATX80:
    807  1.1  ross         test_a_float64_z_floatx80(
    808  1.1  ross             float64_to_floatx80, syst_float64_to_floatx80 );
    809  1.1  ross         break;
    810  1.1  ross #endif
    811  1.1  ross #ifdef SYST_FLOAT64_TO_FLOAT128
    812  1.1  ross      case FLOAT64_TO_FLOAT128:
    813  1.1  ross         test_a_float64_z_float128(
    814  1.1  ross             float64_to_float128, syst_float64_to_float128 );
    815  1.1  ross         break;
    816  1.1  ross #endif
    817  1.1  ross #ifdef SYST_FLOAT64_ROUND_TO_INT
    818  1.1  ross      case FLOAT64_ROUND_TO_INT:
    819  1.1  ross         test_az_float64( float64_round_to_int, syst_float64_round_to_int );
    820  1.1  ross         break;
    821  1.1  ross #endif
    822  1.1  ross #ifdef SYST_FLOAT64_ADD
    823  1.1  ross      case FLOAT64_ADD:
    824  1.1  ross         test_abz_float64( float64_add, syst_float64_add );
    825  1.1  ross         break;
    826  1.1  ross #endif
    827  1.1  ross #ifdef SYST_FLOAT64_SUB
    828  1.1  ross      case FLOAT64_SUB:
    829  1.1  ross         test_abz_float64( float64_sub, syst_float64_sub );
    830  1.1  ross         break;
    831  1.1  ross #endif
    832  1.1  ross #ifdef SYST_FLOAT64_MUL
    833  1.1  ross      case FLOAT64_MUL:
    834  1.1  ross         test_abz_float64( float64_mul, syst_float64_mul );
    835  1.1  ross         break;
    836  1.1  ross #endif
    837  1.1  ross #ifdef SYST_FLOAT64_DIV
    838  1.1  ross      case FLOAT64_DIV:
    839  1.1  ross         test_abz_float64( float64_div, syst_float64_div );
    840  1.1  ross         break;
    841  1.1  ross #endif
    842  1.1  ross #ifdef SYST_FLOAT64_REM
    843  1.1  ross      case FLOAT64_REM:
    844  1.1  ross         test_abz_float64( float64_rem, syst_float64_rem );
    845  1.1  ross         break;
    846  1.1  ross #endif
    847  1.1  ross #ifdef SYST_FLOAT64_SQRT
    848  1.1  ross      case FLOAT64_SQRT:
    849  1.1  ross         test_az_float64( float64_sqrt, syst_float64_sqrt );
    850  1.1  ross         break;
    851  1.1  ross #endif
    852  1.1  ross #ifdef SYST_FLOAT64_EQ
    853  1.1  ross      case FLOAT64_EQ:
    854  1.1  ross         test_ab_float64_z_flag( float64_eq, syst_float64_eq );
    855  1.1  ross         break;
    856  1.1  ross #endif
    857  1.1  ross #ifdef SYST_FLOAT64_LE
    858  1.1  ross      case FLOAT64_LE:
    859  1.1  ross         test_ab_float64_z_flag( float64_le, syst_float64_le );
    860  1.1  ross         break;
    861  1.1  ross #endif
    862  1.1  ross #ifdef SYST_FLOAT64_LT
    863  1.1  ross      case FLOAT64_LT:
    864  1.1  ross         test_ab_float64_z_flag( float64_lt, syst_float64_lt );
    865  1.1  ross         break;
    866  1.1  ross #endif
    867  1.1  ross #ifdef SYST_FLOAT64_EQ_SIGNALING
    868  1.1  ross      case FLOAT64_EQ_SIGNALING:
    869  1.1  ross         test_ab_float64_z_flag(
    870  1.1  ross             float64_eq_signaling, syst_float64_eq_signaling );
    871  1.1  ross         break;
    872  1.1  ross #endif
    873  1.1  ross #ifdef SYST_FLOAT64_LE_QUIET
    874  1.1  ross      case FLOAT64_LE_QUIET:
    875  1.1  ross         test_ab_float64_z_flag( float64_le_quiet, syst_float64_le_quiet );
    876  1.1  ross         break;
    877  1.1  ross #endif
    878  1.1  ross #ifdef SYST_FLOAT64_LT_QUIET
    879  1.1  ross      case FLOAT64_LT_QUIET:
    880  1.1  ross         test_ab_float64_z_flag( float64_lt_quiet, syst_float64_lt_quiet );
    881  1.1  ross         break;
    882  1.1  ross #endif
    883  1.1  ross #ifdef SYST_FLOATX80_TO_INT32
    884  1.1  ross      case FLOATX80_TO_INT32:
    885  1.1  ross         test_a_floatx80_z_int32( floatx80_to_int32, syst_floatx80_to_int32 );
    886  1.1  ross         break;
    887  1.1  ross #endif
    888  1.1  ross #ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO
    889  1.1  ross      case FLOATX80_TO_INT32_ROUND_TO_ZERO:
    890  1.1  ross         test_a_floatx80_z_int32(
    891  1.1  ross             floatx80_to_int32_round_to_zero,
    892  1.1  ross             syst_floatx80_to_int32_round_to_zero
    893  1.1  ross         );
    894  1.1  ross         break;
    895  1.1  ross #endif
    896  1.1  ross #ifdef SYST_FLOATX80_TO_INT64
    897  1.1  ross      case FLOATX80_TO_INT64:
    898  1.1  ross         test_a_floatx80_z_int64( floatx80_to_int64, syst_floatx80_to_int64 );
    899  1.1  ross         break;
    900  1.1  ross #endif
    901  1.1  ross #ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO
    902  1.1  ross      case FLOATX80_TO_INT64_ROUND_TO_ZERO:
    903  1.1  ross         test_a_floatx80_z_int64(
    904  1.1  ross             floatx80_to_int64_round_to_zero,
    905  1.1  ross             syst_floatx80_to_int64_round_to_zero
    906  1.1  ross         );
    907  1.1  ross         break;
    908  1.1  ross #endif
    909  1.1  ross #ifdef SYST_FLOATX80_TO_FLOAT32
    910  1.1  ross      case FLOATX80_TO_FLOAT32:
    911  1.1  ross         test_a_floatx80_z_float32(
    912  1.1  ross             floatx80_to_float32, syst_floatx80_to_float32 );
    913  1.1  ross         break;
    914  1.1  ross #endif
    915  1.1  ross #ifdef SYST_FLOATX80_TO_FLOAT64
    916  1.1  ross      case FLOATX80_TO_FLOAT64:
    917  1.1  ross         test_a_floatx80_z_float64(
    918  1.1  ross             floatx80_to_float64, syst_floatx80_to_float64 );
    919  1.1  ross         break;
    920  1.1  ross #endif
    921  1.1  ross #ifdef SYST_FLOATX80_TO_FLOAT128
    922  1.1  ross      case FLOATX80_TO_FLOAT128:
    923  1.1  ross         test_a_floatx80_z_float128(
    924  1.1  ross             floatx80_to_float128, syst_floatx80_to_float128 );
    925  1.1  ross         break;
    926  1.1  ross #endif
    927  1.1  ross #ifdef SYST_FLOATX80_ROUND_TO_INT
    928  1.1  ross      case FLOATX80_ROUND_TO_INT:
    929  1.1  ross         test_az_floatx80( floatx80_round_to_int, syst_floatx80_round_to_int );
    930  1.1  ross         break;
    931  1.1  ross #endif
    932  1.1  ross #ifdef SYST_FLOATX80_ADD
    933  1.1  ross      case FLOATX80_ADD:
    934  1.1  ross         test_abz_floatx80( floatx80_add, syst_floatx80_add );
    935  1.1  ross         break;
    936  1.1  ross #endif
    937  1.1  ross #ifdef SYST_FLOATX80_SUB
    938  1.1  ross      case FLOATX80_SUB:
    939  1.1  ross         test_abz_floatx80( floatx80_sub, syst_floatx80_sub );
    940  1.1  ross         break;
    941  1.1  ross #endif
    942  1.1  ross #ifdef SYST_FLOATX80_MUL
    943  1.1  ross      case FLOATX80_MUL:
    944  1.1  ross         test_abz_floatx80( floatx80_mul, syst_floatx80_mul );
    945  1.1  ross         break;
    946  1.1  ross #endif
    947  1.1  ross #ifdef SYST_FLOATX80_DIV
    948  1.1  ross      case FLOATX80_DIV:
    949  1.1  ross         test_abz_floatx80( floatx80_div, syst_floatx80_div );
    950  1.1  ross         break;
    951  1.1  ross #endif
    952  1.1  ross #ifdef SYST_FLOATX80_REM
    953  1.1  ross      case FLOATX80_REM:
    954  1.1  ross         test_abz_floatx80( floatx80_rem, syst_floatx80_rem );
    955  1.1  ross         break;
    956  1.1  ross #endif
    957  1.1  ross #ifdef SYST_FLOATX80_SQRT
    958  1.1  ross      case FLOATX80_SQRT:
    959  1.1  ross         test_az_floatx80( floatx80_sqrt, syst_floatx80_sqrt );
    960  1.1  ross         break;
    961  1.1  ross #endif
    962  1.1  ross #ifdef SYST_FLOATX80_EQ
    963  1.1  ross      case FLOATX80_EQ:
    964  1.1  ross         test_ab_floatx80_z_flag( floatx80_eq, syst_floatx80_eq );
    965  1.1  ross         break;
    966  1.1  ross #endif
    967  1.1  ross #ifdef SYST_FLOATX80_LE
    968  1.1  ross      case FLOATX80_LE:
    969  1.1  ross         test_ab_floatx80_z_flag( floatx80_le, syst_floatx80_le );
    970  1.1  ross         break;
    971  1.1  ross #endif
    972  1.1  ross #ifdef SYST_FLOATX80_LT
    973  1.1  ross      case FLOATX80_LT:
    974  1.1  ross         test_ab_floatx80_z_flag( floatx80_lt, syst_floatx80_lt );
    975  1.1  ross         break;
    976  1.1  ross #endif
    977  1.1  ross #ifdef SYST_FLOATX80_EQ_SIGNALING
    978  1.1  ross      case FLOATX80_EQ_SIGNALING:
    979  1.1  ross         test_ab_floatx80_z_flag(
    980  1.1  ross             floatx80_eq_signaling, syst_floatx80_eq_signaling );
    981  1.1  ross         break;
    982  1.1  ross #endif
    983  1.1  ross #ifdef SYST_FLOATX80_LE_QUIET
    984  1.1  ross      case FLOATX80_LE_QUIET:
    985  1.1  ross         test_ab_floatx80_z_flag( floatx80_le_quiet, syst_floatx80_le_quiet );
    986  1.1  ross         break;
    987  1.1  ross #endif
    988  1.1  ross #ifdef SYST_FLOATX80_LT_QUIET
    989  1.1  ross      case FLOATX80_LT_QUIET:
    990  1.1  ross         test_ab_floatx80_z_flag( floatx80_lt_quiet, syst_floatx80_lt_quiet );
    991  1.1  ross         break;
    992  1.1  ross #endif
    993  1.1  ross #ifdef SYST_FLOAT128_TO_INT32
    994  1.1  ross      case FLOAT128_TO_INT32:
    995  1.1  ross         test_a_float128_z_int32( float128_to_int32, syst_float128_to_int32 );
    996  1.1  ross         break;
    997  1.1  ross #endif
    998  1.1  ross #ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO
    999  1.1  ross      case FLOAT128_TO_INT32_ROUND_TO_ZERO:
   1000  1.1  ross         test_a_float128_z_int32(
   1001  1.1  ross             float128_to_int32_round_to_zero,
   1002  1.1  ross             syst_float128_to_int32_round_to_zero
   1003  1.1  ross         );
   1004  1.1  ross         break;
   1005  1.1  ross #endif
   1006  1.1  ross #ifdef SYST_FLOAT128_TO_INT64
   1007  1.1  ross      case FLOAT128_TO_INT64:
   1008  1.1  ross         test_a_float128_z_int64( float128_to_int64, syst_float128_to_int64 );
   1009  1.1  ross         break;
   1010  1.1  ross #endif
   1011  1.1  ross #ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO
   1012  1.1  ross      case FLOAT128_TO_INT64_ROUND_TO_ZERO:
   1013  1.1  ross         test_a_float128_z_int64(
   1014  1.1  ross             float128_to_int64_round_to_zero,
   1015  1.1  ross             syst_float128_to_int64_round_to_zero
   1016  1.1  ross         );
   1017  1.1  ross         break;
   1018  1.1  ross #endif
   1019  1.1  ross #ifdef SYST_FLOAT128_TO_FLOAT32
   1020  1.1  ross      case FLOAT128_TO_FLOAT32:
   1021  1.1  ross         test_a_float128_z_float32(
   1022  1.1  ross             float128_to_float32, syst_float128_to_float32 );
   1023  1.1  ross         break;
   1024  1.1  ross #endif
   1025  1.1  ross #ifdef SYST_FLOAT128_TO_FLOAT64
   1026  1.1  ross      case FLOAT128_TO_FLOAT64:
   1027  1.1  ross         test_a_float128_z_float64(
   1028  1.1  ross             float128_to_float64, syst_float128_to_float64 );
   1029  1.1  ross         break;
   1030  1.1  ross #endif
   1031  1.1  ross #ifdef SYST_FLOAT128_TO_FLOATX80
   1032  1.1  ross      case FLOAT128_TO_FLOATX80:
   1033  1.1  ross         test_a_float128_z_floatx80(
   1034  1.1  ross             float128_to_floatx80, syst_float128_to_floatx80 );
   1035  1.1  ross         break;
   1036  1.1  ross #endif
   1037  1.1  ross #ifdef SYST_FLOAT128_ROUND_TO_INT
   1038  1.1  ross      case FLOAT128_ROUND_TO_INT:
   1039  1.1  ross         test_az_float128( float128_round_to_int, syst_float128_round_to_int );
   1040  1.1  ross         break;
   1041  1.1  ross #endif
   1042  1.1  ross #ifdef SYST_FLOAT128_ADD
   1043  1.1  ross      case FLOAT128_ADD:
   1044  1.1  ross         test_abz_float128( float128_add, syst_float128_add );
   1045  1.1  ross         break;
   1046  1.1  ross #endif
   1047  1.1  ross #ifdef SYST_FLOAT128_SUB
   1048  1.1  ross      case FLOAT128_SUB:
   1049  1.1  ross         test_abz_float128( float128_sub, syst_float128_sub );
   1050  1.1  ross         break;
   1051  1.1  ross #endif
   1052  1.1  ross #ifdef SYST_FLOAT128_MUL
   1053  1.1  ross      case FLOAT128_MUL:
   1054  1.1  ross         test_abz_float128( float128_mul, syst_float128_mul );
   1055  1.1  ross         break;
   1056  1.1  ross #endif
   1057  1.1  ross #ifdef SYST_FLOAT128_DIV
   1058  1.1  ross      case FLOAT128_DIV:
   1059  1.1  ross         test_abz_float128( float128_div, syst_float128_div );
   1060  1.1  ross         break;
   1061  1.1  ross #endif
   1062  1.1  ross #ifdef SYST_FLOAT128_REM
   1063  1.1  ross      case FLOAT128_REM:
   1064  1.1  ross         test_abz_float128( float128_rem, syst_float128_rem );
   1065  1.1  ross         break;
   1066  1.1  ross #endif
   1067  1.1  ross #ifdef SYST_FLOAT128_SQRT
   1068  1.1  ross      case FLOAT128_SQRT:
   1069  1.1  ross         test_az_float128( float128_sqrt, syst_float128_sqrt );
   1070  1.1  ross         break;
   1071  1.1  ross #endif
   1072  1.1  ross #ifdef SYST_FLOAT128_EQ
   1073  1.1  ross      case FLOAT128_EQ:
   1074  1.1  ross         test_ab_float128_z_flag( float128_eq, syst_float128_eq );
   1075  1.1  ross         break;
   1076  1.1  ross #endif
   1077  1.1  ross #ifdef SYST_FLOAT128_LE
   1078  1.1  ross      case FLOAT128_LE:
   1079  1.1  ross         test_ab_float128_z_flag( float128_le, syst_float128_le );
   1080  1.1  ross         break;
   1081  1.1  ross #endif
   1082  1.1  ross #ifdef SYST_FLOAT128_LT
   1083  1.1  ross      case FLOAT128_LT:
   1084  1.1  ross         test_ab_float128_z_flag( float128_lt, syst_float128_lt );
   1085  1.1  ross         break;
   1086  1.1  ross #endif
   1087  1.1  ross #ifdef SYST_FLOAT128_EQ_SIGNALING
   1088  1.1  ross      case FLOAT128_EQ_SIGNALING:
   1089  1.1  ross         test_ab_float128_z_flag(
   1090  1.1  ross             float128_eq_signaling, syst_float128_eq_signaling );
   1091  1.1  ross         break;
   1092  1.1  ross #endif
   1093  1.1  ross #ifdef SYST_FLOAT128_LE_QUIET
   1094  1.1  ross      case FLOAT128_LE_QUIET:
   1095  1.1  ross         test_ab_float128_z_flag( float128_le_quiet, syst_float128_le_quiet );
   1096  1.1  ross         break;
   1097  1.1  ross #endif
   1098  1.1  ross #ifdef SYST_FLOAT128_LT_QUIET
   1099  1.1  ross      case FLOAT128_LT_QUIET:
   1100  1.1  ross         test_ab_float128_z_flag( float128_lt_quiet, syst_float128_lt_quiet );
   1101  1.1  ross         break;
   1102  1.1  ross #endif
   1103  1.1  ross     }
   1104  1.1  ross     if ( ( errorStop && anyErrors ) || stop ) exitWithStatus();
   1105  1.1  ross 
   1106  1.1  ross }
   1107  1.1  ross 
   1108  1.1  ross void
   1109  1.1  ross  testFunction(
   1110  1.1  ross      uint8 functionCode, int8 roundingPrecisionIn, int8 roundingModeIn )
   1111  1.1  ross {
   1112  1.1  ross     int8 roundingPrecision, roundingMode;
   1113  1.1  ross 
   1114  1.1  ross     roundingPrecision = 32;
   1115  1.1  ross     for (;;) {
   1116  1.1  ross         if ( ! functions[ functionCode ].roundingPrecision ) {
   1117  1.1  ross             roundingPrecision = 0;
   1118  1.1  ross         }
   1119  1.1  ross         else if ( roundingPrecisionIn ) {
   1120  1.1  ross             roundingPrecision = roundingPrecisionIn;
   1121  1.1  ross         }
   1122  1.1  ross         for ( roundingMode = 1;
   1123  1.1  ross               roundingMode < NUM_ROUNDINGMODES;
   1124  1.1  ross               ++roundingMode
   1125  1.1  ross             ) {
   1126  1.1  ross             if ( ! functions[ functionCode ].roundingMode ) {
   1127  1.1  ross                 roundingMode = 0;
   1128  1.1  ross             }
   1129  1.1  ross             else if ( roundingModeIn ) {
   1130  1.1  ross                 roundingMode = roundingModeIn;
   1131  1.1  ross             }
   1132  1.1  ross             testFunctionVariety(
   1133  1.1  ross                 functionCode, roundingPrecision, roundingMode );
   1134  1.1  ross             if ( roundingModeIn || ! roundingMode ) break;
   1135  1.1  ross         }
   1136  1.1  ross         if ( roundingPrecisionIn || ! roundingPrecision ) break;
   1137  1.1  ross         if ( roundingPrecision == 80 ) {
   1138  1.1  ross             break;
   1139  1.1  ross         }
   1140  1.1  ross         else if ( roundingPrecision == 64 ) {
   1141  1.1  ross             roundingPrecision = 80;
   1142  1.1  ross         }
   1143  1.1  ross         else if ( roundingPrecision == 32 ) {
   1144  1.1  ross             roundingPrecision = 64;
   1145  1.1  ross         }
   1146  1.1  ross     }
   1147  1.1  ross 
   1148  1.1  ross }
   1149  1.1  ross 
   1150