xref: /qemu/tests/fp/fp-test.c (revision 8da5f1dbb0d7b97686d54584c70b55cb05f89007)
13ac1f813SEmilio G. Cota /*
23ac1f813SEmilio G. Cota  * fp-test.c - test QEMU's softfloat implementation using Berkeley's Testfloat
33ac1f813SEmilio G. Cota  *
43ac1f813SEmilio G. Cota  * Copyright (C) 2018, Emilio G. Cota <cota@braap.org>
53ac1f813SEmilio G. Cota  *
63ac1f813SEmilio G. Cota  * License: GNU GPL, version 2 or later.
73ac1f813SEmilio G. Cota  *   See the COPYING file in the top-level directory.
83ac1f813SEmilio G. Cota  *
93ac1f813SEmilio G. Cota  * This file is derived from testfloat/source/testsoftfloat.c. Its copyright
103ac1f813SEmilio G. Cota  * info follows:
113ac1f813SEmilio G. Cota  *
123ac1f813SEmilio G. Cota  * Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
133ac1f813SEmilio G. Cota  * University of California.  All rights reserved.
143ac1f813SEmilio G. Cota  *
153ac1f813SEmilio G. Cota  * Redistribution and use in source and binary forms, with or without
163ac1f813SEmilio G. Cota  * modification, are permitted provided that the following conditions are met:
173ac1f813SEmilio G. Cota  *
183ac1f813SEmilio G. Cota  *  1. Redistributions of source code must retain the above copyright notice,
193ac1f813SEmilio G. Cota  *     this list of conditions, and the following disclaimer.
203ac1f813SEmilio G. Cota  *
213ac1f813SEmilio G. Cota  *  2. Redistributions in binary form must reproduce the above copyright notice,
223ac1f813SEmilio G. Cota  *     this list of conditions, and the following disclaimer in the
233ac1f813SEmilio G. Cota  *     documentation and/or other materials provided with the distribution.
243ac1f813SEmilio G. Cota  *
253ac1f813SEmilio G. Cota  *  3. Neither the name of the University nor the names of its contributors may
263ac1f813SEmilio G. Cota  *     be used to endorse or promote products derived from this software without
273ac1f813SEmilio G. Cota  *     specific prior written permission.
283ac1f813SEmilio G. Cota  *
293ac1f813SEmilio G. Cota  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
303ac1f813SEmilio G. Cota  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
313ac1f813SEmilio G. Cota  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
323ac1f813SEmilio G. Cota  * DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
333ac1f813SEmilio G. Cota  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
343ac1f813SEmilio G. Cota  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
353ac1f813SEmilio G. Cota  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
363ac1f813SEmilio G. Cota  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
373ac1f813SEmilio G. Cota  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
383ac1f813SEmilio G. Cota  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
393ac1f813SEmilio G. Cota  */
403ac1f813SEmilio G. Cota #ifndef HW_POISON_H
413ac1f813SEmilio G. Cota #error Must define HW_POISON_H to work around TARGET_* poisoning
423ac1f813SEmilio G. Cota #endif
433ac1f813SEmilio G. Cota 
443ac1f813SEmilio G. Cota #include "qemu/osdep.h"
453ac1f813SEmilio G. Cota #include "qemu/cutils.h"
463ac1f813SEmilio G. Cota #include <math.h>
473ac1f813SEmilio G. Cota #include "fpu/softfloat.h"
483ac1f813SEmilio G. Cota #include "platform.h"
493ac1f813SEmilio G. Cota 
503ac1f813SEmilio G. Cota #include "fail.h"
513ac1f813SEmilio G. Cota #include "slowfloat.h"
523ac1f813SEmilio G. Cota #include "functions.h"
533ac1f813SEmilio G. Cota #include "genCases.h"
543ac1f813SEmilio G. Cota #include "verCases.h"
553ac1f813SEmilio G. Cota #include "writeCase.h"
563ac1f813SEmilio G. Cota #include "testLoops.h"
573ac1f813SEmilio G. Cota 
583ac1f813SEmilio G. Cota typedef float16_t (*abz_f16)(float16_t, float16_t);
593ac1f813SEmilio G. Cota typedef bool (*ab_f16_z_bool)(float16_t, float16_t);
603ac1f813SEmilio G. Cota typedef float32_t (*abz_f32)(float32_t, float32_t);
613ac1f813SEmilio G. Cota typedef bool (*ab_f32_z_bool)(float32_t, float32_t);
623ac1f813SEmilio G. Cota typedef float64_t (*abz_f64)(float64_t, float64_t);
633ac1f813SEmilio G. Cota typedef bool (*ab_f64_z_bool)(float64_t, float64_t);
643ac1f813SEmilio G. Cota typedef void (*abz_extF80M)(const extFloat80_t *, const extFloat80_t *,
653ac1f813SEmilio G. Cota                             extFloat80_t *);
663ac1f813SEmilio G. Cota typedef bool (*ab_extF80M_z_bool)(const extFloat80_t *, const extFloat80_t *);
673ac1f813SEmilio G. Cota typedef void (*abz_f128M)(const float128_t *, const float128_t *, float128_t *);
683ac1f813SEmilio G. Cota typedef bool (*ab_f128M_z_bool)(const float128_t *, const float128_t *);
693ac1f813SEmilio G. Cota 
703ac1f813SEmilio G. Cota static const char * const round_mode_names[] = {
713ac1f813SEmilio G. Cota     [ROUND_NEAR_EVEN] = "even",
723ac1f813SEmilio G. Cota     [ROUND_MINMAG] = "zero",
733ac1f813SEmilio G. Cota     [ROUND_MIN] = "down",
743ac1f813SEmilio G. Cota     [ROUND_MAX] = "up",
753ac1f813SEmilio G. Cota     [ROUND_NEAR_MAXMAG] = "tieaway",
763ac1f813SEmilio G. Cota     [ROUND_ODD] = "odd",
773ac1f813SEmilio G. Cota };
783ac1f813SEmilio G. Cota static unsigned int *test_ops;
793ac1f813SEmilio G. Cota static unsigned int n_test_ops;
803ac1f813SEmilio G. Cota static unsigned int n_max_errors = 20;
813ac1f813SEmilio G. Cota static unsigned int test_round_mode = ROUND_NEAR_EVEN;
823ac1f813SEmilio G. Cota static unsigned int *round_modes;
833ac1f813SEmilio G. Cota static unsigned int n_round_modes;
843ac1f813SEmilio G. Cota static int test_level = 1;
853ac1f813SEmilio G. Cota static uint8_t slow_init_flags;
863ac1f813SEmilio G. Cota static uint8_t qemu_init_flags;
873ac1f813SEmilio G. Cota 
883ac1f813SEmilio G. Cota /* qemu softfloat status */
893ac1f813SEmilio G. Cota static float_status qsf;
903ac1f813SEmilio G. Cota 
913ac1f813SEmilio G. Cota static const char commands_string[] =
923ac1f813SEmilio G. Cota     "operations:\n"
933ac1f813SEmilio G. Cota     "    <int>_to_<float>            <float>_add      <float>_eq\n"
943ac1f813SEmilio G. Cota     "    <float>_to_<int>            <float>_sub      <float>_le\n"
953ac1f813SEmilio G. Cota     "    <float>_to_<int>_r_minMag   <float>_mul      <float>_lt\n"
963ac1f813SEmilio G. Cota     "    <float>_to_<float>          <float>_mulAdd   <float>_eq_signaling\n"
973ac1f813SEmilio G. Cota     "    <float>_roundToInt          <float>_div      <float>_le_quiet\n"
983ac1f813SEmilio G. Cota     "                                <float>_rem      <float>_lt_quiet\n"
993ac1f813SEmilio G. Cota     "                                <float>_sqrt\n"
1003ac1f813SEmilio G. Cota     "    Where <int>: ui32, ui64, i32, i64\n"
1013ac1f813SEmilio G. Cota     "          <float>: f16, f32, f64, extF80, f128\n"
1023ac1f813SEmilio G. Cota     "    If no operation is provided, all the above are tested\n"
1033ac1f813SEmilio G. Cota     "options:\n"
1043ac1f813SEmilio G. Cota     " -e = max error count per test. Default: 20. Set no limit with 0\n"
1053ac1f813SEmilio G. Cota     " -f = initial FP exception flags (vioux). Default: none\n"
1063ac1f813SEmilio G. Cota     " -l = thoroughness level (1 (default), 2)\n"
1073ac1f813SEmilio G. Cota     " -r = rounding mode (even (default), zero, down, up, tieaway, odd)\n"
1083ac1f813SEmilio G. Cota     "      Set to 'all' to test all rounding modes, if applicable\n"
1093ac1f813SEmilio G. Cota     " -s = stop when a test fails";
1103ac1f813SEmilio G. Cota 
1113ac1f813SEmilio G. Cota static void usage_complete(int argc, char *argv[])
1123ac1f813SEmilio G. Cota {
1133ac1f813SEmilio G. Cota     fprintf(stderr, "Usage: %s [options] [operation1 ...]\n", argv[0]);
1143ac1f813SEmilio G. Cota     fprintf(stderr, "%s\n", commands_string);
1153ac1f813SEmilio G. Cota     exit(EXIT_FAILURE);
1163ac1f813SEmilio G. Cota }
1173ac1f813SEmilio G. Cota 
1183ac1f813SEmilio G. Cota /* keep wrappers separate but do not bother defining headers for all of them */
119139c1837SPaolo Bonzini #include "wrap.c.inc"
1203ac1f813SEmilio G. Cota 
1213ac1f813SEmilio G. Cota static void not_implemented(void)
1223ac1f813SEmilio G. Cota {
1233ac1f813SEmilio G. Cota     fprintf(stderr, "Not implemented.\n");
1243ac1f813SEmilio G. Cota }
1253ac1f813SEmilio G. Cota 
126d5f84681SPhilippe Mathieu-Daudé static bool is_allowed(unsigned op, int rmode)
1273ac1f813SEmilio G. Cota {
1285d64abb3SRichard Henderson     /* odd has not been implemented for any 80-bit ops */
1293ac1f813SEmilio G. Cota     if (rmode == softfloat_round_odd) {
1303ac1f813SEmilio G. Cota         switch (op) {
1315d64abb3SRichard Henderson         case EXTF80_TO_UI32:
1325d64abb3SRichard Henderson         case EXTF80_TO_UI64:
1335d64abb3SRichard Henderson         case EXTF80_TO_I32:
1345d64abb3SRichard Henderson         case EXTF80_TO_I64:
1355d64abb3SRichard Henderson         case EXTF80_TO_UI32_R_MINMAG:
1365d64abb3SRichard Henderson         case EXTF80_TO_UI64_R_MINMAG:
1375d64abb3SRichard Henderson         case EXTF80_TO_I32_R_MINMAG:
1385d64abb3SRichard Henderson         case EXTF80_TO_I64_R_MINMAG:
1395d64abb3SRichard Henderson         case EXTF80_TO_F16:
1405d64abb3SRichard Henderson         case EXTF80_TO_F32:
1415d64abb3SRichard Henderson         case EXTF80_TO_F64:
1425d64abb3SRichard Henderson         case EXTF80_TO_F128:
1435d64abb3SRichard Henderson         case EXTF80_ROUNDTOINT:
1445d64abb3SRichard Henderson         case EXTF80_ADD:
1455d64abb3SRichard Henderson         case EXTF80_SUB:
1465d64abb3SRichard Henderson         case EXTF80_MUL:
1475d64abb3SRichard Henderson         case EXTF80_DIV:
1485d64abb3SRichard Henderson         case EXTF80_REM:
1495d64abb3SRichard Henderson         case EXTF80_SQRT:
1505d64abb3SRichard Henderson         case EXTF80_EQ:
1515d64abb3SRichard Henderson         case EXTF80_LE:
1525d64abb3SRichard Henderson         case EXTF80_LT:
1535d64abb3SRichard Henderson         case EXTF80_EQ_SIGNALING:
1545d64abb3SRichard Henderson         case EXTF80_LE_QUIET:
1555d64abb3SRichard Henderson         case EXTF80_LT_QUIET:
1565d64abb3SRichard Henderson         case UI32_TO_EXTF80:
1575d64abb3SRichard Henderson         case UI64_TO_EXTF80:
1585d64abb3SRichard Henderson         case I32_TO_EXTF80:
1595d64abb3SRichard Henderson         case I64_TO_EXTF80:
1605d64abb3SRichard Henderson         case F16_TO_EXTF80:
1615d64abb3SRichard Henderson         case F32_TO_EXTF80:
1625d64abb3SRichard Henderson         case F64_TO_EXTF80:
1635d64abb3SRichard Henderson         case F128_TO_EXTF80:
1643ac1f813SEmilio G. Cota             return false;
1653ac1f813SEmilio G. Cota         }
166d5f84681SPhilippe Mathieu-Daudé     }
167d5f84681SPhilippe Mathieu-Daudé     return true;
168d5f84681SPhilippe Mathieu-Daudé }
1693ac1f813SEmilio G. Cota 
1703ac1f813SEmilio G. Cota static void do_testfloat(int op, int rmode, bool exact)
1713ac1f813SEmilio G. Cota {
1723ac1f813SEmilio G. Cota     abz_f16 true_abz_f16;
1733ac1f813SEmilio G. Cota     abz_f16 subj_abz_f16;
1743ac1f813SEmilio G. Cota     ab_f16_z_bool true_f16_z_bool;
1753ac1f813SEmilio G. Cota     ab_f16_z_bool subj_f16_z_bool;
1763ac1f813SEmilio G. Cota     abz_f32 true_abz_f32;
1773ac1f813SEmilio G. Cota     abz_f32 subj_abz_f32;
1783ac1f813SEmilio G. Cota     ab_f32_z_bool true_ab_f32_z_bool;
1793ac1f813SEmilio G. Cota     ab_f32_z_bool subj_ab_f32_z_bool;
1803ac1f813SEmilio G. Cota     abz_f64 true_abz_f64;
1813ac1f813SEmilio G. Cota     abz_f64 subj_abz_f64;
1823ac1f813SEmilio G. Cota     ab_f64_z_bool true_ab_f64_z_bool;
1833ac1f813SEmilio G. Cota     ab_f64_z_bool subj_ab_f64_z_bool;
1843ac1f813SEmilio G. Cota     abz_extF80M true_abz_extF80M;
1853ac1f813SEmilio G. Cota     abz_extF80M subj_abz_extF80M;
1863ac1f813SEmilio G. Cota     ab_extF80M_z_bool true_ab_extF80M_z_bool;
1873ac1f813SEmilio G. Cota     ab_extF80M_z_bool subj_ab_extF80M_z_bool;
1883ac1f813SEmilio G. Cota     abz_f128M true_abz_f128M;
1893ac1f813SEmilio G. Cota     abz_f128M subj_abz_f128M;
1903ac1f813SEmilio G. Cota     ab_f128M_z_bool true_ab_f128M_z_bool;
1913ac1f813SEmilio G. Cota     ab_f128M_z_bool subj_ab_f128M_z_bool;
1923ac1f813SEmilio G. Cota 
1933ac1f813SEmilio G. Cota     fputs(">> Testing ", stderr);
1943ac1f813SEmilio G. Cota     verCases_writeFunctionName(stderr);
1953ac1f813SEmilio G. Cota     fputs("\n", stderr);
1963ac1f813SEmilio G. Cota 
197d5f84681SPhilippe Mathieu-Daudé     if (!is_allowed(op, rmode)) {
1983ac1f813SEmilio G. Cota         not_implemented();
1993ac1f813SEmilio G. Cota         return;
2003ac1f813SEmilio G. Cota     }
2013ac1f813SEmilio G. Cota 
2023ac1f813SEmilio G. Cota     switch (op) {
2033ac1f813SEmilio G. Cota     case UI32_TO_F16:
2043ac1f813SEmilio G. Cota         test_a_ui32_z_f16(slow_ui32_to_f16, qemu_ui32_to_f16);
2053ac1f813SEmilio G. Cota         break;
2063ac1f813SEmilio G. Cota     case UI32_TO_F32:
2073ac1f813SEmilio G. Cota         test_a_ui32_z_f32(slow_ui32_to_f32, qemu_ui32_to_f32);
2083ac1f813SEmilio G. Cota         break;
2093ac1f813SEmilio G. Cota     case UI32_TO_F64:
2103ac1f813SEmilio G. Cota         test_a_ui32_z_f64(slow_ui32_to_f64, qemu_ui32_to_f64);
2113ac1f813SEmilio G. Cota         break;
2123ac1f813SEmilio G. Cota     case UI32_TO_EXTF80:
2133ac1f813SEmilio G. Cota         not_implemented();
2143ac1f813SEmilio G. Cota         break;
2153ac1f813SEmilio G. Cota     case UI32_TO_F128:
2163ac1f813SEmilio G. Cota         not_implemented();
2173ac1f813SEmilio G. Cota         break;
2183ac1f813SEmilio G. Cota     case UI64_TO_F16:
2193ac1f813SEmilio G. Cota         test_a_ui64_z_f16(slow_ui64_to_f16, qemu_ui64_to_f16);
2203ac1f813SEmilio G. Cota         break;
2213ac1f813SEmilio G. Cota     case UI64_TO_F32:
2223ac1f813SEmilio G. Cota         test_a_ui64_z_f32(slow_ui64_to_f32, qemu_ui64_to_f32);
2233ac1f813SEmilio G. Cota         break;
2243ac1f813SEmilio G. Cota     case UI64_TO_F64:
2253ac1f813SEmilio G. Cota         test_a_ui64_z_f64(slow_ui64_to_f64, qemu_ui64_to_f64);
2263ac1f813SEmilio G. Cota         break;
2273ac1f813SEmilio G. Cota     case UI64_TO_EXTF80:
2283ac1f813SEmilio G. Cota         not_implemented();
2293ac1f813SEmilio G. Cota         break;
2303ac1f813SEmilio G. Cota     case UI64_TO_F128:
2313ac1f813SEmilio G. Cota         test_a_ui64_z_f128(slow_ui64_to_f128M, qemu_ui64_to_f128M);
2323ac1f813SEmilio G. Cota         break;
2333ac1f813SEmilio G. Cota     case I32_TO_F16:
2343ac1f813SEmilio G. Cota         test_a_i32_z_f16(slow_i32_to_f16, qemu_i32_to_f16);
2353ac1f813SEmilio G. Cota         break;
2363ac1f813SEmilio G. Cota     case I32_TO_F32:
2373ac1f813SEmilio G. Cota         test_a_i32_z_f32(slow_i32_to_f32, qemu_i32_to_f32);
2383ac1f813SEmilio G. Cota         break;
2393ac1f813SEmilio G. Cota     case I32_TO_F64:
2403ac1f813SEmilio G. Cota         test_a_i32_z_f64(slow_i32_to_f64, qemu_i32_to_f64);
2413ac1f813SEmilio G. Cota         break;
2423ac1f813SEmilio G. Cota     case I32_TO_EXTF80:
2433ac1f813SEmilio G. Cota         test_a_i32_z_extF80(slow_i32_to_extF80M, qemu_i32_to_extF80M);
2443ac1f813SEmilio G. Cota         break;
2453ac1f813SEmilio G. Cota     case I32_TO_F128:
2463ac1f813SEmilio G. Cota         test_a_i32_z_f128(slow_i32_to_f128M, qemu_i32_to_f128M);
2473ac1f813SEmilio G. Cota         break;
2483ac1f813SEmilio G. Cota     case I64_TO_F16:
2493ac1f813SEmilio G. Cota         test_a_i64_z_f16(slow_i64_to_f16, qemu_i64_to_f16);
2503ac1f813SEmilio G. Cota         break;
2513ac1f813SEmilio G. Cota     case I64_TO_F32:
2523ac1f813SEmilio G. Cota         test_a_i64_z_f32(slow_i64_to_f32, qemu_i64_to_f32);
2533ac1f813SEmilio G. Cota         break;
2543ac1f813SEmilio G. Cota     case I64_TO_F64:
2553ac1f813SEmilio G. Cota         test_a_i64_z_f64(slow_i64_to_f64, qemu_i64_to_f64);
2563ac1f813SEmilio G. Cota         break;
2573ac1f813SEmilio G. Cota     case I64_TO_EXTF80:
2583ac1f813SEmilio G. Cota         test_a_i64_z_extF80(slow_i64_to_extF80M, qemu_i64_to_extF80M);
2593ac1f813SEmilio G. Cota         break;
2603ac1f813SEmilio G. Cota     case I64_TO_F128:
2613ac1f813SEmilio G. Cota         test_a_i64_z_f128(slow_i64_to_f128M, qemu_i64_to_f128M);
2623ac1f813SEmilio G. Cota         break;
2633ac1f813SEmilio G. Cota     case F16_TO_UI32:
2643ac1f813SEmilio G. Cota         test_a_f16_z_ui32_rx(slow_f16_to_ui32, qemu_f16_to_ui32, rmode, exact);
2653ac1f813SEmilio G. Cota         break;
2663ac1f813SEmilio G. Cota     case F16_TO_UI64:
2673ac1f813SEmilio G. Cota         test_a_f16_z_ui64_rx(slow_f16_to_ui64, qemu_f16_to_ui64, rmode, exact);
2683ac1f813SEmilio G. Cota         break;
2693ac1f813SEmilio G. Cota     case F16_TO_I32:
2703ac1f813SEmilio G. Cota         test_a_f16_z_i32_rx(slow_f16_to_i32, qemu_f16_to_i32, rmode, exact);
2713ac1f813SEmilio G. Cota         break;
2723ac1f813SEmilio G. Cota     case F16_TO_I64:
2733ac1f813SEmilio G. Cota         test_a_f16_z_i64_rx(slow_f16_to_i64, qemu_f16_to_i64, rmode, exact);
2743ac1f813SEmilio G. Cota         break;
2753ac1f813SEmilio G. Cota     case F16_TO_UI32_R_MINMAG:
2763ac1f813SEmilio G. Cota         test_a_f16_z_ui32_x(slow_f16_to_ui32_r_minMag,
2773ac1f813SEmilio G. Cota                             qemu_f16_to_ui32_r_minMag, exact);
2783ac1f813SEmilio G. Cota         break;
2793ac1f813SEmilio G. Cota     case F16_TO_UI64_R_MINMAG:
2803ac1f813SEmilio G. Cota         test_a_f16_z_ui64_x(slow_f16_to_ui64_r_minMag,
2813ac1f813SEmilio G. Cota                             qemu_f16_to_ui64_r_minMag, exact);
2823ac1f813SEmilio G. Cota         break;
2833ac1f813SEmilio G. Cota     case F16_TO_I32_R_MINMAG:
2843ac1f813SEmilio G. Cota         test_a_f16_z_i32_x(slow_f16_to_i32_r_minMag, qemu_f16_to_i32_r_minMag,
2853ac1f813SEmilio G. Cota                            exact);
2863ac1f813SEmilio G. Cota         break;
2873ac1f813SEmilio G. Cota     case F16_TO_I64_R_MINMAG:
2883ac1f813SEmilio G. Cota         test_a_f16_z_i64_x(slow_f16_to_i64_r_minMag, qemu_f16_to_i64_r_minMag,
2893ac1f813SEmilio G. Cota                            exact);
2903ac1f813SEmilio G. Cota         break;
2913ac1f813SEmilio G. Cota     case F16_TO_F32:
2923ac1f813SEmilio G. Cota         test_a_f16_z_f32(slow_f16_to_f32, qemu_f16_to_f32);
2933ac1f813SEmilio G. Cota         break;
2943ac1f813SEmilio G. Cota     case F16_TO_F64:
2953ac1f813SEmilio G. Cota         test_a_f16_z_f64(slow_f16_to_f64, qemu_f16_to_f64);
2963ac1f813SEmilio G. Cota         break;
2973ac1f813SEmilio G. Cota     case F16_TO_EXTF80:
2983ac1f813SEmilio G. Cota         not_implemented();
2993ac1f813SEmilio G. Cota         break;
3003ac1f813SEmilio G. Cota     case F16_TO_F128:
3013ac1f813SEmilio G. Cota         not_implemented();
3023ac1f813SEmilio G. Cota         break;
3033ac1f813SEmilio G. Cota     case F16_ROUNDTOINT:
3043ac1f813SEmilio G. Cota         test_az_f16_rx(slow_f16_roundToInt, qemu_f16_roundToInt, rmode, exact);
3053ac1f813SEmilio G. Cota         break;
3063ac1f813SEmilio G. Cota     case F16_ADD:
3073ac1f813SEmilio G. Cota         true_abz_f16 = slow_f16_add;
3083ac1f813SEmilio G. Cota         subj_abz_f16 = qemu_f16_add;
3093ac1f813SEmilio G. Cota         goto test_abz_f16;
3103ac1f813SEmilio G. Cota     case F16_SUB:
3113ac1f813SEmilio G. Cota         true_abz_f16 = slow_f16_sub;
3123ac1f813SEmilio G. Cota         subj_abz_f16 = qemu_f16_sub;
3133ac1f813SEmilio G. Cota         goto test_abz_f16;
3143ac1f813SEmilio G. Cota     case F16_MUL:
3153ac1f813SEmilio G. Cota         true_abz_f16 = slow_f16_mul;
3163ac1f813SEmilio G. Cota         subj_abz_f16 = qemu_f16_mul;
3173ac1f813SEmilio G. Cota         goto test_abz_f16;
3183ac1f813SEmilio G. Cota     case F16_DIV:
3193ac1f813SEmilio G. Cota         true_abz_f16 = slow_f16_div;
3203ac1f813SEmilio G. Cota         subj_abz_f16 = qemu_f16_div;
3213ac1f813SEmilio G. Cota         goto test_abz_f16;
3223ac1f813SEmilio G. Cota     case F16_REM:
3233ac1f813SEmilio G. Cota         not_implemented();
3243ac1f813SEmilio G. Cota         break;
3253ac1f813SEmilio G. Cota     test_abz_f16:
3263ac1f813SEmilio G. Cota         test_abz_f16(true_abz_f16, subj_abz_f16);
3273ac1f813SEmilio G. Cota         break;
3283ac1f813SEmilio G. Cota     case F16_MULADD:
3293ac1f813SEmilio G. Cota         test_abcz_f16(slow_f16_mulAdd, qemu_f16_mulAdd);
3303ac1f813SEmilio G. Cota         break;
3313ac1f813SEmilio G. Cota     case F16_SQRT:
3323ac1f813SEmilio G. Cota         test_az_f16(slow_f16_sqrt, qemu_f16_sqrt);
3333ac1f813SEmilio G. Cota         break;
3343ac1f813SEmilio G. Cota     case F16_EQ:
3353ac1f813SEmilio G. Cota         true_f16_z_bool = slow_f16_eq;
3363ac1f813SEmilio G. Cota         subj_f16_z_bool = qemu_f16_eq;
3373ac1f813SEmilio G. Cota         goto test_ab_f16_z_bool;
3383ac1f813SEmilio G. Cota     case F16_LE:
3393ac1f813SEmilio G. Cota         true_f16_z_bool = slow_f16_le;
3403ac1f813SEmilio G. Cota         subj_f16_z_bool = qemu_f16_le;
3413ac1f813SEmilio G. Cota         goto test_ab_f16_z_bool;
3423ac1f813SEmilio G. Cota     case F16_LT:
3433ac1f813SEmilio G. Cota         true_f16_z_bool = slow_f16_lt;
3443ac1f813SEmilio G. Cota         subj_f16_z_bool = qemu_f16_lt;
3453ac1f813SEmilio G. Cota         goto test_ab_f16_z_bool;
3463ac1f813SEmilio G. Cota     case F16_EQ_SIGNALING:
3473ac1f813SEmilio G. Cota         true_f16_z_bool = slow_f16_eq_signaling;
3483ac1f813SEmilio G. Cota         subj_f16_z_bool = qemu_f16_eq_signaling;
3493ac1f813SEmilio G. Cota         goto test_ab_f16_z_bool;
3503ac1f813SEmilio G. Cota     case F16_LE_QUIET:
3513ac1f813SEmilio G. Cota         true_f16_z_bool = slow_f16_le_quiet;
3523ac1f813SEmilio G. Cota         subj_f16_z_bool = qemu_f16_le_quiet;
3533ac1f813SEmilio G. Cota         goto test_ab_f16_z_bool;
3543ac1f813SEmilio G. Cota     case F16_LT_QUIET:
3553ac1f813SEmilio G. Cota         true_f16_z_bool = slow_f16_lt_quiet;
3563ac1f813SEmilio G. Cota         subj_f16_z_bool = qemu_f16_lt_quiet;
3573ac1f813SEmilio G. Cota     test_ab_f16_z_bool:
3583ac1f813SEmilio G. Cota         test_ab_f16_z_bool(true_f16_z_bool, subj_f16_z_bool);
3593ac1f813SEmilio G. Cota         break;
3603ac1f813SEmilio G. Cota     case F32_TO_UI32:
3613ac1f813SEmilio G. Cota         test_a_f32_z_ui32_rx(slow_f32_to_ui32, qemu_f32_to_ui32, rmode, exact);
3623ac1f813SEmilio G. Cota         break;
3633ac1f813SEmilio G. Cota     case F32_TO_UI64:
3643ac1f813SEmilio G. Cota         test_a_f32_z_ui64_rx(slow_f32_to_ui64, qemu_f32_to_ui64, rmode, exact);
3653ac1f813SEmilio G. Cota         break;
3663ac1f813SEmilio G. Cota     case F32_TO_I32:
3673ac1f813SEmilio G. Cota         test_a_f32_z_i32_rx(slow_f32_to_i32, qemu_f32_to_i32, rmode, exact);
3683ac1f813SEmilio G. Cota         break;
3693ac1f813SEmilio G. Cota     case F32_TO_I64:
3703ac1f813SEmilio G. Cota         test_a_f32_z_i64_rx(slow_f32_to_i64, qemu_f32_to_i64, rmode, exact);
3713ac1f813SEmilio G. Cota         break;
3723ac1f813SEmilio G. Cota     case F32_TO_UI32_R_MINMAG:
3733ac1f813SEmilio G. Cota         test_a_f32_z_ui32_x(slow_f32_to_ui32_r_minMag,
3743ac1f813SEmilio G. Cota                             qemu_f32_to_ui32_r_minMag, exact);
3753ac1f813SEmilio G. Cota         break;
3763ac1f813SEmilio G. Cota     case F32_TO_UI64_R_MINMAG:
3773ac1f813SEmilio G. Cota         test_a_f32_z_ui64_x(slow_f32_to_ui64_r_minMag,
3783ac1f813SEmilio G. Cota                             qemu_f32_to_ui64_r_minMag, exact);
3793ac1f813SEmilio G. Cota         break;
3803ac1f813SEmilio G. Cota     case F32_TO_I32_R_MINMAG:
3813ac1f813SEmilio G. Cota         test_a_f32_z_i32_x(slow_f32_to_i32_r_minMag, qemu_f32_to_i32_r_minMag,
3823ac1f813SEmilio G. Cota                            exact);
3833ac1f813SEmilio G. Cota         break;
3843ac1f813SEmilio G. Cota     case F32_TO_I64_R_MINMAG:
3853ac1f813SEmilio G. Cota         test_a_f32_z_i64_x(slow_f32_to_i64_r_minMag, qemu_f32_to_i64_r_minMag,
3863ac1f813SEmilio G. Cota                            exact);
3873ac1f813SEmilio G. Cota         break;
3883ac1f813SEmilio G. Cota     case F32_TO_F16:
3893ac1f813SEmilio G. Cota         test_a_f32_z_f16(slow_f32_to_f16, qemu_f32_to_f16);
3903ac1f813SEmilio G. Cota         break;
3913ac1f813SEmilio G. Cota     case F32_TO_F64:
3923ac1f813SEmilio G. Cota         test_a_f32_z_f64(slow_f32_to_f64, qemu_f32_to_f64);
3933ac1f813SEmilio G. Cota         break;
3943ac1f813SEmilio G. Cota     case F32_TO_EXTF80:
3953ac1f813SEmilio G. Cota         test_a_f32_z_extF80(slow_f32_to_extF80M, qemu_f32_to_extF80M);
3963ac1f813SEmilio G. Cota         break;
3973ac1f813SEmilio G. Cota     case F32_TO_F128:
3983ac1f813SEmilio G. Cota         test_a_f32_z_f128(slow_f32_to_f128M, qemu_f32_to_f128M);
3993ac1f813SEmilio G. Cota         break;
4003ac1f813SEmilio G. Cota     case F32_ROUNDTOINT:
4013ac1f813SEmilio G. Cota         test_az_f32_rx(slow_f32_roundToInt, qemu_f32_roundToInt, rmode, exact);
4023ac1f813SEmilio G. Cota         break;
4033ac1f813SEmilio G. Cota     case F32_ADD:
4043ac1f813SEmilio G. Cota         true_abz_f32 = slow_f32_add;
4053ac1f813SEmilio G. Cota         subj_abz_f32 = qemu_f32_add;
4063ac1f813SEmilio G. Cota         goto test_abz_f32;
4073ac1f813SEmilio G. Cota     case F32_SUB:
4083ac1f813SEmilio G. Cota         true_abz_f32 = slow_f32_sub;
4093ac1f813SEmilio G. Cota         subj_abz_f32 = qemu_f32_sub;
4103ac1f813SEmilio G. Cota         goto test_abz_f32;
4113ac1f813SEmilio G. Cota     case F32_MUL:
4123ac1f813SEmilio G. Cota         true_abz_f32 = slow_f32_mul;
4133ac1f813SEmilio G. Cota         subj_abz_f32 = qemu_f32_mul;
4143ac1f813SEmilio G. Cota         goto test_abz_f32;
4153ac1f813SEmilio G. Cota     case F32_DIV:
4163ac1f813SEmilio G. Cota         true_abz_f32 = slow_f32_div;
4173ac1f813SEmilio G. Cota         subj_abz_f32 = qemu_f32_div;
4183ac1f813SEmilio G. Cota         goto test_abz_f32;
4193ac1f813SEmilio G. Cota     case F32_REM:
4203ac1f813SEmilio G. Cota         true_abz_f32 = slow_f32_rem;
4213ac1f813SEmilio G. Cota         subj_abz_f32 = qemu_f32_rem;
4223ac1f813SEmilio G. Cota     test_abz_f32:
4233ac1f813SEmilio G. Cota         test_abz_f32(true_abz_f32, subj_abz_f32);
4243ac1f813SEmilio G. Cota         break;
4253ac1f813SEmilio G. Cota     case F32_MULADD:
4263ac1f813SEmilio G. Cota         test_abcz_f32(slow_f32_mulAdd, qemu_f32_mulAdd);
4273ac1f813SEmilio G. Cota         break;
4283ac1f813SEmilio G. Cota     case F32_SQRT:
4293ac1f813SEmilio G. Cota         test_az_f32(slow_f32_sqrt, qemu_f32_sqrt);
4303ac1f813SEmilio G. Cota         break;
4313ac1f813SEmilio G. Cota     case F32_EQ:
4323ac1f813SEmilio G. Cota         true_ab_f32_z_bool = slow_f32_eq;
4333ac1f813SEmilio G. Cota         subj_ab_f32_z_bool = qemu_f32_eq;
4343ac1f813SEmilio G. Cota         goto test_ab_f32_z_bool;
4353ac1f813SEmilio G. Cota     case F32_LE:
4363ac1f813SEmilio G. Cota         true_ab_f32_z_bool = slow_f32_le;
4373ac1f813SEmilio G. Cota         subj_ab_f32_z_bool = qemu_f32_le;
4383ac1f813SEmilio G. Cota         goto test_ab_f32_z_bool;
4393ac1f813SEmilio G. Cota     case F32_LT:
4403ac1f813SEmilio G. Cota         true_ab_f32_z_bool = slow_f32_lt;
4413ac1f813SEmilio G. Cota         subj_ab_f32_z_bool = qemu_f32_lt;
4423ac1f813SEmilio G. Cota         goto test_ab_f32_z_bool;
4433ac1f813SEmilio G. Cota     case F32_EQ_SIGNALING:
4443ac1f813SEmilio G. Cota         true_ab_f32_z_bool = slow_f32_eq_signaling;
4453ac1f813SEmilio G. Cota         subj_ab_f32_z_bool = qemu_f32_eq_signaling;
4463ac1f813SEmilio G. Cota         goto test_ab_f32_z_bool;
4473ac1f813SEmilio G. Cota     case F32_LE_QUIET:
4483ac1f813SEmilio G. Cota         true_ab_f32_z_bool = slow_f32_le_quiet;
4493ac1f813SEmilio G. Cota         subj_ab_f32_z_bool = qemu_f32_le_quiet;
4503ac1f813SEmilio G. Cota         goto test_ab_f32_z_bool;
4513ac1f813SEmilio G. Cota     case F32_LT_QUIET:
4523ac1f813SEmilio G. Cota         true_ab_f32_z_bool = slow_f32_lt_quiet;
4533ac1f813SEmilio G. Cota         subj_ab_f32_z_bool = qemu_f32_lt_quiet;
4543ac1f813SEmilio G. Cota     test_ab_f32_z_bool:
4553ac1f813SEmilio G. Cota         test_ab_f32_z_bool(true_ab_f32_z_bool, subj_ab_f32_z_bool);
4563ac1f813SEmilio G. Cota         break;
4573ac1f813SEmilio G. Cota     case F64_TO_UI32:
4583ac1f813SEmilio G. Cota         test_a_f64_z_ui32_rx(slow_f64_to_ui32, qemu_f64_to_ui32, rmode, exact);
4593ac1f813SEmilio G. Cota         break;
4603ac1f813SEmilio G. Cota     case F64_TO_UI64:
4613ac1f813SEmilio G. Cota         test_a_f64_z_ui64_rx(slow_f64_to_ui64, qemu_f64_to_ui64, rmode, exact);
4623ac1f813SEmilio G. Cota         break;
4633ac1f813SEmilio G. Cota     case F64_TO_I32:
4643ac1f813SEmilio G. Cota         test_a_f64_z_i32_rx(slow_f64_to_i32, qemu_f64_to_i32, rmode, exact);
4653ac1f813SEmilio G. Cota         break;
4663ac1f813SEmilio G. Cota     case F64_TO_I64:
4673ac1f813SEmilio G. Cota         test_a_f64_z_i64_rx(slow_f64_to_i64, qemu_f64_to_i64, rmode, exact);
4683ac1f813SEmilio G. Cota         break;
4693ac1f813SEmilio G. Cota     case F64_TO_UI32_R_MINMAG:
4703ac1f813SEmilio G. Cota         test_a_f64_z_ui32_x(slow_f64_to_ui32_r_minMag,
4713ac1f813SEmilio G. Cota                             qemu_f64_to_ui32_r_minMag, exact);
4723ac1f813SEmilio G. Cota         break;
4733ac1f813SEmilio G. Cota     case F64_TO_UI64_R_MINMAG:
4743ac1f813SEmilio G. Cota         test_a_f64_z_ui64_x(slow_f64_to_ui64_r_minMag,
4753ac1f813SEmilio G. Cota                             qemu_f64_to_ui64_r_minMag, exact);
4763ac1f813SEmilio G. Cota         break;
4773ac1f813SEmilio G. Cota     case F64_TO_I32_R_MINMAG:
4783ac1f813SEmilio G. Cota         test_a_f64_z_i32_x(slow_f64_to_i32_r_minMag, qemu_f64_to_i32_r_minMag,
4793ac1f813SEmilio G. Cota                            exact);
4803ac1f813SEmilio G. Cota         break;
4813ac1f813SEmilio G. Cota     case F64_TO_I64_R_MINMAG:
4823ac1f813SEmilio G. Cota         test_a_f64_z_i64_x(slow_f64_to_i64_r_minMag, qemu_f64_to_i64_r_minMag,
4833ac1f813SEmilio G. Cota                            exact);
4843ac1f813SEmilio G. Cota         break;
4853ac1f813SEmilio G. Cota     case F64_TO_F16:
4863ac1f813SEmilio G. Cota         test_a_f64_z_f16(slow_f64_to_f16, qemu_f64_to_f16);
4873ac1f813SEmilio G. Cota         break;
4883ac1f813SEmilio G. Cota     case F64_TO_F32:
4893ac1f813SEmilio G. Cota         test_a_f64_z_f32(slow_f64_to_f32, qemu_f64_to_f32);
4903ac1f813SEmilio G. Cota         break;
4913ac1f813SEmilio G. Cota     case F64_TO_EXTF80:
4923ac1f813SEmilio G. Cota         test_a_f64_z_extF80(slow_f64_to_extF80M, qemu_f64_to_extF80M);
4933ac1f813SEmilio G. Cota         break;
4943ac1f813SEmilio G. Cota     case F64_TO_F128:
4953ac1f813SEmilio G. Cota         test_a_f64_z_f128(slow_f64_to_f128M, qemu_f64_to_f128M);
4963ac1f813SEmilio G. Cota         break;
4973ac1f813SEmilio G. Cota     case F64_ROUNDTOINT:
4983ac1f813SEmilio G. Cota         test_az_f64_rx(slow_f64_roundToInt, qemu_f64_roundToInt, rmode, exact);
4993ac1f813SEmilio G. Cota         break;
5003ac1f813SEmilio G. Cota     case F64_ADD:
5013ac1f813SEmilio G. Cota         true_abz_f64 = slow_f64_add;
5023ac1f813SEmilio G. Cota         subj_abz_f64 = qemu_f64_add;
5033ac1f813SEmilio G. Cota         goto test_abz_f64;
5043ac1f813SEmilio G. Cota     case F64_SUB:
5053ac1f813SEmilio G. Cota         true_abz_f64 = slow_f64_sub;
5063ac1f813SEmilio G. Cota         subj_abz_f64 = qemu_f64_sub;
5073ac1f813SEmilio G. Cota         goto test_abz_f64;
5083ac1f813SEmilio G. Cota     case F64_MUL:
5093ac1f813SEmilio G. Cota         true_abz_f64 = slow_f64_mul;
5103ac1f813SEmilio G. Cota         subj_abz_f64 = qemu_f64_mul;
5113ac1f813SEmilio G. Cota         goto test_abz_f64;
5123ac1f813SEmilio G. Cota     case F64_DIV:
5133ac1f813SEmilio G. Cota         true_abz_f64 = slow_f64_div;
5143ac1f813SEmilio G. Cota         subj_abz_f64 = qemu_f64_div;
5153ac1f813SEmilio G. Cota         goto test_abz_f64;
5163ac1f813SEmilio G. Cota     case F64_REM:
5173ac1f813SEmilio G. Cota         true_abz_f64 = slow_f64_rem;
5183ac1f813SEmilio G. Cota         subj_abz_f64 = qemu_f64_rem;
5193ac1f813SEmilio G. Cota     test_abz_f64:
5203ac1f813SEmilio G. Cota         test_abz_f64(true_abz_f64, subj_abz_f64);
5213ac1f813SEmilio G. Cota         break;
5223ac1f813SEmilio G. Cota     case F64_MULADD:
5233ac1f813SEmilio G. Cota         test_abcz_f64(slow_f64_mulAdd, qemu_f64_mulAdd);
5243ac1f813SEmilio G. Cota         break;
5253ac1f813SEmilio G. Cota     case F64_SQRT:
5263ac1f813SEmilio G. Cota         test_az_f64(slow_f64_sqrt, qemu_f64_sqrt);
5273ac1f813SEmilio G. Cota         break;
5283ac1f813SEmilio G. Cota     case F64_EQ:
5293ac1f813SEmilio G. Cota         true_ab_f64_z_bool = slow_f64_eq;
5303ac1f813SEmilio G. Cota         subj_ab_f64_z_bool = qemu_f64_eq;
5313ac1f813SEmilio G. Cota         goto test_ab_f64_z_bool;
5323ac1f813SEmilio G. Cota     case F64_LE:
5333ac1f813SEmilio G. Cota         true_ab_f64_z_bool = slow_f64_le;
5343ac1f813SEmilio G. Cota         subj_ab_f64_z_bool = qemu_f64_le;
5353ac1f813SEmilio G. Cota         goto test_ab_f64_z_bool;
5363ac1f813SEmilio G. Cota     case F64_LT:
5373ac1f813SEmilio G. Cota         true_ab_f64_z_bool = slow_f64_lt;
5383ac1f813SEmilio G. Cota         subj_ab_f64_z_bool = qemu_f64_lt;
5393ac1f813SEmilio G. Cota         goto test_ab_f64_z_bool;
5403ac1f813SEmilio G. Cota     case F64_EQ_SIGNALING:
5413ac1f813SEmilio G. Cota         true_ab_f64_z_bool = slow_f64_eq_signaling;
5423ac1f813SEmilio G. Cota         subj_ab_f64_z_bool = qemu_f64_eq_signaling;
5433ac1f813SEmilio G. Cota         goto test_ab_f64_z_bool;
5443ac1f813SEmilio G. Cota     case F64_LE_QUIET:
5453ac1f813SEmilio G. Cota         true_ab_f64_z_bool = slow_f64_le_quiet;
5463ac1f813SEmilio G. Cota         subj_ab_f64_z_bool = qemu_f64_le_quiet;
5473ac1f813SEmilio G. Cota         goto test_ab_f64_z_bool;
5483ac1f813SEmilio G. Cota     case F64_LT_QUIET:
5493ac1f813SEmilio G. Cota         true_ab_f64_z_bool = slow_f64_lt_quiet;
5503ac1f813SEmilio G. Cota         subj_ab_f64_z_bool = qemu_f64_lt_quiet;
5513ac1f813SEmilio G. Cota     test_ab_f64_z_bool:
5523ac1f813SEmilio G. Cota         test_ab_f64_z_bool(true_ab_f64_z_bool, subj_ab_f64_z_bool);
5533ac1f813SEmilio G. Cota         break;
5543ac1f813SEmilio G. Cota     case EXTF80_TO_UI32:
5553ac1f813SEmilio G. Cota         not_implemented();
5563ac1f813SEmilio G. Cota         break;
5573ac1f813SEmilio G. Cota     case EXTF80_TO_UI64:
5583ac1f813SEmilio G. Cota         not_implemented();
5593ac1f813SEmilio G. Cota         break;
5603ac1f813SEmilio G. Cota     case EXTF80_TO_I32:
5613ac1f813SEmilio G. Cota         test_a_extF80_z_i32_rx(slow_extF80M_to_i32, qemu_extF80M_to_i32, rmode,
5623ac1f813SEmilio G. Cota                                exact);
5633ac1f813SEmilio G. Cota         break;
5643ac1f813SEmilio G. Cota     case EXTF80_TO_I64:
5653ac1f813SEmilio G. Cota         test_a_extF80_z_i64_rx(slow_extF80M_to_i64, qemu_extF80M_to_i64, rmode,
5663ac1f813SEmilio G. Cota                                exact);
5673ac1f813SEmilio G. Cota         break;
5683ac1f813SEmilio G. Cota     case EXTF80_TO_UI32_R_MINMAG:
5693ac1f813SEmilio G. Cota         not_implemented();
5703ac1f813SEmilio G. Cota         break;
5713ac1f813SEmilio G. Cota     case EXTF80_TO_UI64_R_MINMAG:
5723ac1f813SEmilio G. Cota         not_implemented();
5733ac1f813SEmilio G. Cota         break;
5743ac1f813SEmilio G. Cota     case EXTF80_TO_I32_R_MINMAG:
5753ac1f813SEmilio G. Cota         test_a_extF80_z_i32_x(slow_extF80M_to_i32_r_minMag,
5763ac1f813SEmilio G. Cota                               qemu_extF80M_to_i32_r_minMag, exact);
5773ac1f813SEmilio G. Cota         break;
5783ac1f813SEmilio G. Cota     case EXTF80_TO_I64_R_MINMAG:
5793ac1f813SEmilio G. Cota         test_a_extF80_z_i64_x(slow_extF80M_to_i64_r_minMag,
5803ac1f813SEmilio G. Cota                               qemu_extF80M_to_i64_r_minMag, exact);
5813ac1f813SEmilio G. Cota         break;
5823ac1f813SEmilio G. Cota     case EXTF80_TO_F16:
5833ac1f813SEmilio G. Cota         not_implemented();
5843ac1f813SEmilio G. Cota         break;
5853ac1f813SEmilio G. Cota     case EXTF80_TO_F32:
5863ac1f813SEmilio G. Cota         test_a_extF80_z_f32(slow_extF80M_to_f32, qemu_extF80M_to_f32);
5873ac1f813SEmilio G. Cota         break;
5883ac1f813SEmilio G. Cota     case EXTF80_TO_F64:
5893ac1f813SEmilio G. Cota         test_a_extF80_z_f64(slow_extF80M_to_f64, qemu_extF80M_to_f64);
5903ac1f813SEmilio G. Cota         break;
5913ac1f813SEmilio G. Cota     case EXTF80_TO_F128:
5923ac1f813SEmilio G. Cota         test_a_extF80_z_f128(slow_extF80M_to_f128M, qemu_extF80M_to_f128M);
5933ac1f813SEmilio G. Cota         break;
5943ac1f813SEmilio G. Cota     case EXTF80_ROUNDTOINT:
5953ac1f813SEmilio G. Cota         test_az_extF80_rx(slow_extF80M_roundToInt, qemu_extF80M_roundToInt,
5963ac1f813SEmilio G. Cota                           rmode, exact);
5973ac1f813SEmilio G. Cota         break;
5983ac1f813SEmilio G. Cota     case EXTF80_ADD:
5993ac1f813SEmilio G. Cota         true_abz_extF80M = slow_extF80M_add;
6003ac1f813SEmilio G. Cota         subj_abz_extF80M = qemu_extF80M_add;
6013ac1f813SEmilio G. Cota         goto test_abz_extF80;
6023ac1f813SEmilio G. Cota     case EXTF80_SUB:
6033ac1f813SEmilio G. Cota         true_abz_extF80M = slow_extF80M_sub;
6043ac1f813SEmilio G. Cota         subj_abz_extF80M = qemu_extF80M_sub;
6053ac1f813SEmilio G. Cota         goto test_abz_extF80;
6063ac1f813SEmilio G. Cota     case EXTF80_MUL:
6073ac1f813SEmilio G. Cota         true_abz_extF80M = slow_extF80M_mul;
6083ac1f813SEmilio G. Cota         subj_abz_extF80M = qemu_extF80M_mul;
6093ac1f813SEmilio G. Cota         goto test_abz_extF80;
6103ac1f813SEmilio G. Cota     case EXTF80_DIV:
6113ac1f813SEmilio G. Cota         true_abz_extF80M = slow_extF80M_div;
6123ac1f813SEmilio G. Cota         subj_abz_extF80M = qemu_extF80M_div;
6133ac1f813SEmilio G. Cota         goto test_abz_extF80;
6143ac1f813SEmilio G. Cota     case EXTF80_REM:
6153ac1f813SEmilio G. Cota         true_abz_extF80M = slow_extF80M_rem;
6163ac1f813SEmilio G. Cota         subj_abz_extF80M = qemu_extF80M_rem;
6173ac1f813SEmilio G. Cota     test_abz_extF80:
6183ac1f813SEmilio G. Cota         test_abz_extF80(true_abz_extF80M, subj_abz_extF80M);
6193ac1f813SEmilio G. Cota         break;
6203ac1f813SEmilio G. Cota     case EXTF80_SQRT:
6213ac1f813SEmilio G. Cota         test_az_extF80(slow_extF80M_sqrt, qemu_extF80M_sqrt);
6223ac1f813SEmilio G. Cota         break;
6233ac1f813SEmilio G. Cota     case EXTF80_EQ:
6243ac1f813SEmilio G. Cota         true_ab_extF80M_z_bool = slow_extF80M_eq;
6253ac1f813SEmilio G. Cota         subj_ab_extF80M_z_bool = qemu_extF80M_eq;
6263ac1f813SEmilio G. Cota         goto test_ab_extF80_z_bool;
6273ac1f813SEmilio G. Cota     case EXTF80_LE:
6283ac1f813SEmilio G. Cota         true_ab_extF80M_z_bool = slow_extF80M_le;
6293ac1f813SEmilio G. Cota         subj_ab_extF80M_z_bool = qemu_extF80M_le;
6303ac1f813SEmilio G. Cota         goto test_ab_extF80_z_bool;
6313ac1f813SEmilio G. Cota     case EXTF80_LT:
6323ac1f813SEmilio G. Cota         true_ab_extF80M_z_bool = slow_extF80M_lt;
6333ac1f813SEmilio G. Cota         subj_ab_extF80M_z_bool = qemu_extF80M_lt;
6343ac1f813SEmilio G. Cota         goto test_ab_extF80_z_bool;
6353ac1f813SEmilio G. Cota     case EXTF80_EQ_SIGNALING:
6363ac1f813SEmilio G. Cota         true_ab_extF80M_z_bool = slow_extF80M_eq_signaling;
6373ac1f813SEmilio G. Cota         subj_ab_extF80M_z_bool = qemu_extF80M_eq_signaling;
6383ac1f813SEmilio G. Cota         goto test_ab_extF80_z_bool;
6393ac1f813SEmilio G. Cota     case EXTF80_LE_QUIET:
6403ac1f813SEmilio G. Cota         true_ab_extF80M_z_bool = slow_extF80M_le_quiet;
6413ac1f813SEmilio G. Cota         subj_ab_extF80M_z_bool = qemu_extF80M_le_quiet;
6423ac1f813SEmilio G. Cota         goto test_ab_extF80_z_bool;
6433ac1f813SEmilio G. Cota     case EXTF80_LT_QUIET:
6443ac1f813SEmilio G. Cota         true_ab_extF80M_z_bool = slow_extF80M_lt_quiet;
6453ac1f813SEmilio G. Cota         subj_ab_extF80M_z_bool = qemu_extF80M_lt_quiet;
6463ac1f813SEmilio G. Cota     test_ab_extF80_z_bool:
6473ac1f813SEmilio G. Cota         test_ab_extF80_z_bool(true_ab_extF80M_z_bool, subj_ab_extF80M_z_bool);
6483ac1f813SEmilio G. Cota         break;
6493ac1f813SEmilio G. Cota     case F128_TO_UI32:
65080d491feSAlex Bennée         test_a_f128_z_ui32_rx(slow_f128M_to_ui32, qemu_f128M_to_ui32, rmode,
65180d491feSAlex Bennée                               exact);
6523ac1f813SEmilio G. Cota         break;
6533ac1f813SEmilio G. Cota     case F128_TO_UI64:
6543ac1f813SEmilio G. Cota         test_a_f128_z_ui64_rx(slow_f128M_to_ui64, qemu_f128M_to_ui64, rmode,
6553ac1f813SEmilio G. Cota                               exact);
6563ac1f813SEmilio G. Cota         break;
6573ac1f813SEmilio G. Cota     case F128_TO_I32:
6583ac1f813SEmilio G. Cota         test_a_f128_z_i32_rx(slow_f128M_to_i32, qemu_f128M_to_i32, rmode,
6593ac1f813SEmilio G. Cota                              exact);
6603ac1f813SEmilio G. Cota         break;
6613ac1f813SEmilio G. Cota     case F128_TO_I64:
6623ac1f813SEmilio G. Cota         test_a_f128_z_i64_rx(slow_f128M_to_i64, qemu_f128M_to_i64, rmode,
6633ac1f813SEmilio G. Cota                              exact);
6643ac1f813SEmilio G. Cota         break;
6653ac1f813SEmilio G. Cota     case F128_TO_UI32_R_MINMAG:
6663ac1f813SEmilio G. Cota         test_a_f128_z_ui32_x(slow_f128M_to_ui32_r_minMag,
6673ac1f813SEmilio G. Cota                              qemu_f128M_to_ui32_r_minMag, exact);
6683ac1f813SEmilio G. Cota         break;
6693ac1f813SEmilio G. Cota     case F128_TO_UI64_R_MINMAG:
6703ac1f813SEmilio G. Cota         test_a_f128_z_ui64_x(slow_f128M_to_ui64_r_minMag,
6713ac1f813SEmilio G. Cota                              qemu_f128M_to_ui64_r_minMag, exact);
6723ac1f813SEmilio G. Cota         break;
6733ac1f813SEmilio G. Cota     case F128_TO_I32_R_MINMAG:
6743ac1f813SEmilio G. Cota         test_a_f128_z_i32_x(slow_f128M_to_i32_r_minMag,
6753ac1f813SEmilio G. Cota                             qemu_f128M_to_i32_r_minMag, exact);
6763ac1f813SEmilio G. Cota         break;
6773ac1f813SEmilio G. Cota     case F128_TO_I64_R_MINMAG:
6783ac1f813SEmilio G. Cota         test_a_f128_z_i64_x(slow_f128M_to_i64_r_minMag,
6793ac1f813SEmilio G. Cota                             qemu_f128M_to_i64_r_minMag, exact);
6803ac1f813SEmilio G. Cota         break;
6813ac1f813SEmilio G. Cota     case F128_TO_F16:
6823ac1f813SEmilio G. Cota         not_implemented();
6833ac1f813SEmilio G. Cota         break;
6843ac1f813SEmilio G. Cota     case F128_TO_F32:
6853ac1f813SEmilio G. Cota         test_a_f128_z_f32(slow_f128M_to_f32, qemu_f128M_to_f32);
6863ac1f813SEmilio G. Cota         break;
6873ac1f813SEmilio G. Cota     case F128_TO_F64:
6883ac1f813SEmilio G. Cota         test_a_f128_z_f64(slow_f128M_to_f64, qemu_f128M_to_f64);
6893ac1f813SEmilio G. Cota         break;
6903ac1f813SEmilio G. Cota     case F128_TO_EXTF80:
6913ac1f813SEmilio G. Cota         test_a_f128_z_extF80(slow_f128M_to_extF80M, qemu_f128M_to_extF80M);
6923ac1f813SEmilio G. Cota         break;
6933ac1f813SEmilio G. Cota     case F128_ROUNDTOINT:
6943ac1f813SEmilio G. Cota         test_az_f128_rx(slow_f128M_roundToInt, qemu_f128M_roundToInt, rmode,
6953ac1f813SEmilio G. Cota                         exact);
6963ac1f813SEmilio G. Cota         break;
6973ac1f813SEmilio G. Cota     case F128_ADD:
6983ac1f813SEmilio G. Cota         true_abz_f128M = slow_f128M_add;
6993ac1f813SEmilio G. Cota         subj_abz_f128M = qemu_f128M_add;
7003ac1f813SEmilio G. Cota         goto test_abz_f128;
7013ac1f813SEmilio G. Cota     case F128_SUB:
7023ac1f813SEmilio G. Cota         true_abz_f128M = slow_f128M_sub;
7033ac1f813SEmilio G. Cota         subj_abz_f128M = qemu_f128M_sub;
7043ac1f813SEmilio G. Cota         goto test_abz_f128;
7053ac1f813SEmilio G. Cota     case F128_MUL:
7063ac1f813SEmilio G. Cota         true_abz_f128M = slow_f128M_mul;
7073ac1f813SEmilio G. Cota         subj_abz_f128M = qemu_f128M_mul;
7083ac1f813SEmilio G. Cota         goto test_abz_f128;
7093ac1f813SEmilio G. Cota     case F128_DIV:
7103ac1f813SEmilio G. Cota         true_abz_f128M = slow_f128M_div;
7113ac1f813SEmilio G. Cota         subj_abz_f128M = qemu_f128M_div;
7123ac1f813SEmilio G. Cota         goto test_abz_f128;
7133ac1f813SEmilio G. Cota     case F128_REM:
7143ac1f813SEmilio G. Cota         true_abz_f128M = slow_f128M_rem;
7153ac1f813SEmilio G. Cota         subj_abz_f128M = qemu_f128M_rem;
7163ac1f813SEmilio G. Cota     test_abz_f128:
7173ac1f813SEmilio G. Cota         test_abz_f128(true_abz_f128M, subj_abz_f128M);
7183ac1f813SEmilio G. Cota         break;
7193ac1f813SEmilio G. Cota     case F128_MULADD:
720dedd123cSRichard Henderson         test_abcz_f128(slow_f128M_mulAdd, qemu_f128M_mulAdd);
7213ac1f813SEmilio G. Cota         break;
7223ac1f813SEmilio G. Cota     case F128_SQRT:
7233ac1f813SEmilio G. Cota         test_az_f128(slow_f128M_sqrt, qemu_f128M_sqrt);
7243ac1f813SEmilio G. Cota         break;
7253ac1f813SEmilio G. Cota     case F128_EQ:
7263ac1f813SEmilio G. Cota         true_ab_f128M_z_bool = slow_f128M_eq;
7273ac1f813SEmilio G. Cota         subj_ab_f128M_z_bool = qemu_f128M_eq;
7283ac1f813SEmilio G. Cota         goto test_ab_f128_z_bool;
7293ac1f813SEmilio G. Cota     case F128_LE:
7303ac1f813SEmilio G. Cota         true_ab_f128M_z_bool = slow_f128M_le;
7313ac1f813SEmilio G. Cota         subj_ab_f128M_z_bool = qemu_f128M_le;
7323ac1f813SEmilio G. Cota         goto test_ab_f128_z_bool;
7333ac1f813SEmilio G. Cota     case F128_LT:
7343ac1f813SEmilio G. Cota         true_ab_f128M_z_bool = slow_f128M_lt;
7353ac1f813SEmilio G. Cota         subj_ab_f128M_z_bool = qemu_f128M_lt;
7363ac1f813SEmilio G. Cota         goto test_ab_f128_z_bool;
7373ac1f813SEmilio G. Cota     case F128_EQ_SIGNALING:
7383ac1f813SEmilio G. Cota         true_ab_f128M_z_bool = slow_f128M_eq_signaling;
7393ac1f813SEmilio G. Cota         subj_ab_f128M_z_bool = qemu_f128M_eq_signaling;
7403ac1f813SEmilio G. Cota         goto test_ab_f128_z_bool;
7413ac1f813SEmilio G. Cota     case F128_LE_QUIET:
7423ac1f813SEmilio G. Cota         true_ab_f128M_z_bool = slow_f128M_le_quiet;
7433ac1f813SEmilio G. Cota         subj_ab_f128M_z_bool = qemu_f128M_le_quiet;
7443ac1f813SEmilio G. Cota         goto test_ab_f128_z_bool;
7453ac1f813SEmilio G. Cota     case F128_LT_QUIET:
7463ac1f813SEmilio G. Cota         true_ab_f128M_z_bool = slow_f128M_lt_quiet;
7473ac1f813SEmilio G. Cota         subj_ab_f128M_z_bool = qemu_f128M_lt_quiet;
7483ac1f813SEmilio G. Cota     test_ab_f128_z_bool:
7493ac1f813SEmilio G. Cota         test_ab_f128_z_bool(true_ab_f128M_z_bool, subj_ab_f128M_z_bool);
7503ac1f813SEmilio G. Cota         break;
7513ac1f813SEmilio G. Cota     }
7523ac1f813SEmilio G. Cota     if ((verCases_errorStop && verCases_anyErrors)) {
7533ac1f813SEmilio G. Cota         verCases_exitWithStatus();
7543ac1f813SEmilio G. Cota     }
7553ac1f813SEmilio G. Cota }
7563ac1f813SEmilio G. Cota 
7573ac1f813SEmilio G. Cota static unsigned int test_name_to_op(const char *arg)
7583ac1f813SEmilio G. Cota {
7593ac1f813SEmilio G. Cota     unsigned int i;
7603ac1f813SEmilio G. Cota 
7613ac1f813SEmilio G. Cota     /* counting begins at 1 */
7623ac1f813SEmilio G. Cota     for (i = 1; i < NUM_FUNCTIONS; i++) {
7633ac1f813SEmilio G. Cota         const char *name = functionInfos[i].namePtr;
7643ac1f813SEmilio G. Cota 
7653ac1f813SEmilio G. Cota         if (name && !strcmp(name, arg)) {
7663ac1f813SEmilio G. Cota             return i;
7673ac1f813SEmilio G. Cota         }
7683ac1f813SEmilio G. Cota     }
7693ac1f813SEmilio G. Cota     return 0;
7703ac1f813SEmilio G. Cota }
7713ac1f813SEmilio G. Cota 
7723ac1f813SEmilio G. Cota static unsigned int round_name_to_mode(const char *name)
7733ac1f813SEmilio G. Cota {
7743ac1f813SEmilio G. Cota     int i;
7753ac1f813SEmilio G. Cota 
7763ac1f813SEmilio G. Cota     /* counting begins at 1 */
7773ac1f813SEmilio G. Cota     for (i = 1; i < NUM_ROUNDINGMODES; i++) {
7783ac1f813SEmilio G. Cota         if (!strcmp(round_mode_names[i], name)) {
7793ac1f813SEmilio G. Cota             return i;
7803ac1f813SEmilio G. Cota         }
7813ac1f813SEmilio G. Cota     }
7823ac1f813SEmilio G. Cota     return 0;
7833ac1f813SEmilio G. Cota }
7843ac1f813SEmilio G. Cota 
7853ac1f813SEmilio G. Cota static int set_init_flags(const char *flags)
7863ac1f813SEmilio G. Cota {
7873ac1f813SEmilio G. Cota     const char *p;
7883ac1f813SEmilio G. Cota 
7893ac1f813SEmilio G. Cota     for (p = flags; *p != '\0'; p++) {
7903ac1f813SEmilio G. Cota         switch (*p) {
7913ac1f813SEmilio G. Cota         case 'v':
7923ac1f813SEmilio G. Cota             slow_init_flags |= softfloat_flag_invalid;
7933ac1f813SEmilio G. Cota             qemu_init_flags |= float_flag_invalid;
7943ac1f813SEmilio G. Cota             break;
7953ac1f813SEmilio G. Cota         case 'i':
7963ac1f813SEmilio G. Cota             slow_init_flags |= softfloat_flag_infinite;
7973ac1f813SEmilio G. Cota             qemu_init_flags |= float_flag_divbyzero;
7983ac1f813SEmilio G. Cota             break;
7993ac1f813SEmilio G. Cota         case 'o':
8003ac1f813SEmilio G. Cota             slow_init_flags |= softfloat_flag_overflow;
8013ac1f813SEmilio G. Cota             qemu_init_flags |= float_flag_overflow;
8023ac1f813SEmilio G. Cota             break;
8033ac1f813SEmilio G. Cota         case 'u':
8043ac1f813SEmilio G. Cota             slow_init_flags |= softfloat_flag_underflow;
8053ac1f813SEmilio G. Cota             qemu_init_flags |= float_flag_underflow;
8063ac1f813SEmilio G. Cota             break;
8073ac1f813SEmilio G. Cota         case 'x':
8083ac1f813SEmilio G. Cota             slow_init_flags |= softfloat_flag_inexact;
8093ac1f813SEmilio G. Cota             qemu_init_flags |= float_flag_inexact;
8103ac1f813SEmilio G. Cota             break;
8113ac1f813SEmilio G. Cota         default:
8123ac1f813SEmilio G. Cota             return 1;
8133ac1f813SEmilio G. Cota         }
8143ac1f813SEmilio G. Cota     }
8153ac1f813SEmilio G. Cota     return 0;
8163ac1f813SEmilio G. Cota }
8173ac1f813SEmilio G. Cota 
818710fbcd2SEmilio G. Cota static uint_fast8_t slow_clear_flags(void)
8193ac1f813SEmilio G. Cota {
8203ac1f813SEmilio G. Cota     uint8_t prev = slowfloat_exceptionFlags;
8213ac1f813SEmilio G. Cota 
8223ac1f813SEmilio G. Cota     slowfloat_exceptionFlags = slow_init_flags;
8233ac1f813SEmilio G. Cota     return prev;
8243ac1f813SEmilio G. Cota }
8253ac1f813SEmilio G. Cota 
826710fbcd2SEmilio G. Cota static uint_fast8_t qemu_clear_flags(void)
8273ac1f813SEmilio G. Cota {
8283ac1f813SEmilio G. Cota     uint8_t prev = qemu_flags_to_sf(qsf.float_exception_flags);
8293ac1f813SEmilio G. Cota 
8303ac1f813SEmilio G. Cota     qsf.float_exception_flags = qemu_init_flags;
8313ac1f813SEmilio G. Cota     return prev;
8323ac1f813SEmilio G. Cota }
8333ac1f813SEmilio G. Cota 
8343ac1f813SEmilio G. Cota static void parse_args(int argc, char *argv[])
8353ac1f813SEmilio G. Cota {
8363ac1f813SEmilio G. Cota     unsigned int i;
8373ac1f813SEmilio G. Cota     int c;
8383ac1f813SEmilio G. Cota 
8393ac1f813SEmilio G. Cota     for (;;) {
8403ac1f813SEmilio G. Cota         c = getopt(argc, argv, "he:f:l:r:s");
8413ac1f813SEmilio G. Cota         if (c < 0) {
8423ac1f813SEmilio G. Cota             break;
8433ac1f813SEmilio G. Cota         }
8443ac1f813SEmilio G. Cota         switch (c) {
8453ac1f813SEmilio G. Cota         case 'h':
8463ac1f813SEmilio G. Cota             usage_complete(argc, argv);
8473ac1f813SEmilio G. Cota             exit(EXIT_SUCCESS);
8483ac1f813SEmilio G. Cota         case 'e':
8493ac1f813SEmilio G. Cota             if (qemu_strtoui(optarg, NULL, 0, &n_max_errors)) {
8503ac1f813SEmilio G. Cota                 fprintf(stderr, "fatal: invalid max error count\n");
8513ac1f813SEmilio G. Cota                 exit(EXIT_FAILURE);
8523ac1f813SEmilio G. Cota             }
8533ac1f813SEmilio G. Cota             break;
8543ac1f813SEmilio G. Cota         case 'f':
8553ac1f813SEmilio G. Cota             if (set_init_flags(optarg)) {
8563ac1f813SEmilio G. Cota                 fprintf(stderr, "fatal: flags must be a subset of 'vioux'\n");
8573ac1f813SEmilio G. Cota                 exit(EXIT_FAILURE);
8583ac1f813SEmilio G. Cota             }
8593ac1f813SEmilio G. Cota             break;
8603ac1f813SEmilio G. Cota         case 'l':
8613ac1f813SEmilio G. Cota             if (qemu_strtoi(optarg, NULL, 0, &test_level)) {
8623ac1f813SEmilio G. Cota                 fprintf(stderr, "fatal: invalid test level\n");
8633ac1f813SEmilio G. Cota                 exit(EXIT_FAILURE);
8643ac1f813SEmilio G. Cota             }
8653ac1f813SEmilio G. Cota             break;
8663ac1f813SEmilio G. Cota         case 'r':
8673ac1f813SEmilio G. Cota             if (!strcmp(optarg, "all")) {
8683ac1f813SEmilio G. Cota                 test_round_mode = 0;
8693ac1f813SEmilio G. Cota             } else {
8703ac1f813SEmilio G. Cota                 test_round_mode = round_name_to_mode(optarg);
8713ac1f813SEmilio G. Cota                 if (test_round_mode == 0) {
8723ac1f813SEmilio G. Cota                     fprintf(stderr, "fatal: invalid rounding mode\n");
8733ac1f813SEmilio G. Cota                     exit(EXIT_FAILURE);
8743ac1f813SEmilio G. Cota                 }
8753ac1f813SEmilio G. Cota             }
8763ac1f813SEmilio G. Cota             break;
8773ac1f813SEmilio G. Cota         case 's':
8783ac1f813SEmilio G. Cota             verCases_errorStop = true;
8793ac1f813SEmilio G. Cota             break;
8803ac1f813SEmilio G. Cota         case '?':
8813ac1f813SEmilio G. Cota             /* invalid option or missing argument; getopt prints error info */
8823ac1f813SEmilio G. Cota             exit(EXIT_FAILURE);
8833ac1f813SEmilio G. Cota         }
8843ac1f813SEmilio G. Cota     }
8853ac1f813SEmilio G. Cota 
8863ac1f813SEmilio G. Cota     /* set rounding modes */
8873ac1f813SEmilio G. Cota     if (test_round_mode == 0) {
8883ac1f813SEmilio G. Cota         /* test all rounding modes; note that counting begins at 1 */
8893ac1f813SEmilio G. Cota         n_round_modes = NUM_ROUNDINGMODES - 1;
8903ac1f813SEmilio G. Cota         round_modes = g_malloc_n(n_round_modes, sizeof(*round_modes));
8913ac1f813SEmilio G. Cota         for (i = 0; i < n_round_modes; i++) {
8923ac1f813SEmilio G. Cota             round_modes[i] = i + 1;
8933ac1f813SEmilio G. Cota         }
8943ac1f813SEmilio G. Cota     } else {
8953ac1f813SEmilio G. Cota         n_round_modes = 1;
8963ac1f813SEmilio G. Cota         round_modes = g_malloc(sizeof(*round_modes));
8973ac1f813SEmilio G. Cota         round_modes[0] = test_round_mode;
8983ac1f813SEmilio G. Cota     }
8993ac1f813SEmilio G. Cota 
9003ac1f813SEmilio G. Cota     /* set test ops */
9013ac1f813SEmilio G. Cota     if (optind == argc) {
9023ac1f813SEmilio G. Cota         /* test all ops; note that counting begins at 1 */
9033ac1f813SEmilio G. Cota         n_test_ops = NUM_FUNCTIONS - 1;
9043ac1f813SEmilio G. Cota         test_ops = g_malloc_n(n_test_ops, sizeof(*test_ops));
9053ac1f813SEmilio G. Cota         for (i = 0; i < n_test_ops; i++) {
9063ac1f813SEmilio G. Cota             test_ops[i] = i + 1;
9073ac1f813SEmilio G. Cota         }
9083ac1f813SEmilio G. Cota     } else {
9093ac1f813SEmilio G. Cota         n_test_ops = argc - optind;
9103ac1f813SEmilio G. Cota         test_ops = g_malloc_n(n_test_ops, sizeof(*test_ops));
9113ac1f813SEmilio G. Cota         for (i = 0; i < n_test_ops; i++) {
9123ac1f813SEmilio G. Cota             const char *name = argv[i + optind];
9133ac1f813SEmilio G. Cota             unsigned int op = test_name_to_op(name);
9143ac1f813SEmilio G. Cota 
9153ac1f813SEmilio G. Cota             if (op == 0) {
9163ac1f813SEmilio G. Cota                 fprintf(stderr, "fatal: invalid op '%s'\n", name);
9173ac1f813SEmilio G. Cota                 exit(EXIT_FAILURE);
9183ac1f813SEmilio G. Cota             }
9193ac1f813SEmilio G. Cota             test_ops[i] = op;
9203ac1f813SEmilio G. Cota         }
9213ac1f813SEmilio G. Cota     }
9223ac1f813SEmilio G. Cota }
9233ac1f813SEmilio G. Cota 
9243ac1f813SEmilio G. Cota static void QEMU_NORETURN run_test(void)
9253ac1f813SEmilio G. Cota {
9263ac1f813SEmilio G. Cota     unsigned int i;
9273ac1f813SEmilio G. Cota 
9283ac1f813SEmilio G. Cota     genCases_setLevel(test_level);
9293ac1f813SEmilio G. Cota     verCases_maxErrorCount = n_max_errors;
9303ac1f813SEmilio G. Cota 
9313ac1f813SEmilio G. Cota     testLoops_trueFlagsFunction = slow_clear_flags;
9323ac1f813SEmilio G. Cota     testLoops_subjFlagsFunction = qemu_clear_flags;
9333ac1f813SEmilio G. Cota 
9343ac1f813SEmilio G. Cota     for (i = 0; i < n_test_ops; i++) {
9353ac1f813SEmilio G. Cota         unsigned int op = test_ops[i];
9363ac1f813SEmilio G. Cota         int j;
9373ac1f813SEmilio G. Cota 
9383ac1f813SEmilio G. Cota         if (functionInfos[op].namePtr == NULL) {
9393ac1f813SEmilio G. Cota             continue;
9403ac1f813SEmilio G. Cota         }
9413ac1f813SEmilio G. Cota         verCases_functionNamePtr = functionInfos[op].namePtr;
9423ac1f813SEmilio G. Cota 
9433ac1f813SEmilio G. Cota         for (j = 0; j < n_round_modes; j++) {
9443ac1f813SEmilio G. Cota             int attrs = functionInfos[op].attribs;
9453ac1f813SEmilio G. Cota             int round = round_modes[j];
9463ac1f813SEmilio G. Cota             int rmode = roundingModes[round];
9473ac1f813SEmilio G. Cota             int k;
9483ac1f813SEmilio G. Cota 
9493ac1f813SEmilio G. Cota             verCases_roundingCode = 0;
9503ac1f813SEmilio G. Cota             slowfloat_roundingMode = rmode;
9513ac1f813SEmilio G. Cota             qsf.float_rounding_mode = sf_rounding_to_qemu(rmode);
9523ac1f813SEmilio G. Cota 
9533ac1f813SEmilio G. Cota             if (attrs & (FUNC_ARG_ROUNDINGMODE | FUNC_EFF_ROUNDINGMODE)) {
9543ac1f813SEmilio G. Cota                 /* print rounding mode if the op is affected by it */
9553ac1f813SEmilio G. Cota                 verCases_roundingCode = round;
9563ac1f813SEmilio G. Cota             } else if (j > 0) {
9573ac1f813SEmilio G. Cota                 /* if the op is not sensitive to rounding, move on */
9583ac1f813SEmilio G. Cota                 break;
9593ac1f813SEmilio G. Cota             }
9603ac1f813SEmilio G. Cota 
9613ac1f813SEmilio G. Cota             /* QEMU doesn't have !exact */
9623ac1f813SEmilio G. Cota             verCases_exact = true;
9633ac1f813SEmilio G. Cota             verCases_usesExact = !!(attrs & FUNC_ARG_EXACT);
9643ac1f813SEmilio G. Cota 
9653ac1f813SEmilio G. Cota             for (k = 0; k < 3; k++) {
966*8da5f1dbSRichard Henderson                 FloatX80RoundPrec qsf_prec80 = floatx80_precision_s;
9673ac1f813SEmilio G. Cota                 int prec80 = 32;
9683ac1f813SEmilio G. Cota                 int l;
9693ac1f813SEmilio G. Cota 
9703ac1f813SEmilio G. Cota                 if (k == 1) {
9713ac1f813SEmilio G. Cota                     prec80 = 64;
972*8da5f1dbSRichard Henderson                     qsf_prec80 = floatx80_precision_d;
9733ac1f813SEmilio G. Cota                 } else if (k == 2) {
9743ac1f813SEmilio G. Cota                     prec80 = 80;
975*8da5f1dbSRichard Henderson                     qsf_prec80 = floatx80_precision_x;
9763ac1f813SEmilio G. Cota                 }
9773ac1f813SEmilio G. Cota 
9783ac1f813SEmilio G. Cota                 verCases_roundingPrecision = 0;
9793ac1f813SEmilio G. Cota                 slow_extF80_roundingPrecision = prec80;
980*8da5f1dbSRichard Henderson                 qsf.floatx80_rounding_precision = qsf_prec80;
9813ac1f813SEmilio G. Cota 
9823ac1f813SEmilio G. Cota                 if (attrs & FUNC_EFF_ROUNDINGPRECISION) {
9833ac1f813SEmilio G. Cota                     verCases_roundingPrecision = prec80;
9843ac1f813SEmilio G. Cota                 } else if (k > 0) {
9853ac1f813SEmilio G. Cota                     /* if the op is not sensitive to prec80, move on */
9863ac1f813SEmilio G. Cota                     break;
9873ac1f813SEmilio G. Cota                 }
9883ac1f813SEmilio G. Cota 
9893ac1f813SEmilio G. Cota                 /* note: the count begins at 1 */
9903ac1f813SEmilio G. Cota                 for (l = 1; l < NUM_TININESSMODES; l++) {
9913ac1f813SEmilio G. Cota                     int tmode = tininessModes[l];
9923ac1f813SEmilio G. Cota 
9933ac1f813SEmilio G. Cota                     verCases_tininessCode = 0;
9943ac1f813SEmilio G. Cota                     slowfloat_detectTininess = tmode;
995a828b373SRichard Henderson                     qsf.tininess_before_rounding = sf_tininess_to_qemu(tmode);
9963ac1f813SEmilio G. Cota 
9973ac1f813SEmilio G. Cota                     if (attrs & FUNC_EFF_TININESSMODE ||
9983ac1f813SEmilio G. Cota                         ((attrs & FUNC_EFF_TININESSMODE_REDUCEDPREC) &&
9993ac1f813SEmilio G. Cota                          prec80 && prec80 < 80)) {
10003ac1f813SEmilio G. Cota                         verCases_tininessCode = l;
10013ac1f813SEmilio G. Cota                     } else if (l > 1) {
10023ac1f813SEmilio G. Cota                         /* if the op is not sensitive to tininess, move on */
10033ac1f813SEmilio G. Cota                         break;
10043ac1f813SEmilio G. Cota                     }
10053ac1f813SEmilio G. Cota 
10063ac1f813SEmilio G. Cota                     do_testfloat(op, rmode, true);
10073ac1f813SEmilio G. Cota                 }
10083ac1f813SEmilio G. Cota             }
10093ac1f813SEmilio G. Cota         }
10103ac1f813SEmilio G. Cota     }
10113ac1f813SEmilio G. Cota     verCases_exitWithStatus();
10123ac1f813SEmilio G. Cota     /* old compilers might miss that we exited */
10133ac1f813SEmilio G. Cota     g_assert_not_reached();
10143ac1f813SEmilio G. Cota }
10153ac1f813SEmilio G. Cota 
10163ac1f813SEmilio G. Cota int main(int argc, char *argv[])
10173ac1f813SEmilio G. Cota {
10183ac1f813SEmilio G. Cota     parse_args(argc, argv);
10193ac1f813SEmilio G. Cota     fail_programName = argv[0];
10203ac1f813SEmilio G. Cota     run_test(); /* does not return */
10213ac1f813SEmilio G. Cota }
1022