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"
1096348a546SAlex Bennée " -s = stop when a test fails\n"
1106348a546SAlex Bennée " -q = minimise noise when testing, just show each function being tested";
1113ac1f813SEmilio G. Cota
usage_complete(int argc,char * argv[])1123ac1f813SEmilio G. Cota static void usage_complete(int argc, char *argv[])
1133ac1f813SEmilio G. Cota {
1143ac1f813SEmilio G. Cota fprintf(stderr, "Usage: %s [options] [operation1 ...]\n", argv[0]);
1153ac1f813SEmilio G. Cota fprintf(stderr, "%s\n", commands_string);
1163ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
1173ac1f813SEmilio G. Cota }
1183ac1f813SEmilio G. Cota
1193ac1f813SEmilio G. Cota /* keep wrappers separate but do not bother defining headers for all of them */
120139c1837SPaolo Bonzini #include "wrap.c.inc"
1213ac1f813SEmilio G. Cota
not_implemented(void)1223ac1f813SEmilio G. Cota static void not_implemented(void)
1233ac1f813SEmilio G. Cota {
1243ac1f813SEmilio G. Cota fprintf(stderr, "Not implemented.\n");
1253ac1f813SEmilio G. Cota }
1263ac1f813SEmilio G. Cota
is_allowed(unsigned op,int rmode)127d5f84681SPhilippe Mathieu-Daudé static bool is_allowed(unsigned op, int rmode)
1283ac1f813SEmilio G. Cota {
1295d64abb3SRichard Henderson /* odd has not been implemented for any 80-bit ops */
1303ac1f813SEmilio G. Cota if (rmode == softfloat_round_odd) {
1313ac1f813SEmilio G. Cota switch (op) {
1325d64abb3SRichard Henderson case EXTF80_TO_UI32:
1335d64abb3SRichard Henderson case EXTF80_TO_UI64:
1345d64abb3SRichard Henderson case EXTF80_TO_I32:
1355d64abb3SRichard Henderson case EXTF80_TO_I64:
1365d64abb3SRichard Henderson case EXTF80_TO_UI32_R_MINMAG:
1375d64abb3SRichard Henderson case EXTF80_TO_UI64_R_MINMAG:
1385d64abb3SRichard Henderson case EXTF80_TO_I32_R_MINMAG:
1395d64abb3SRichard Henderson case EXTF80_TO_I64_R_MINMAG:
1405d64abb3SRichard Henderson case EXTF80_TO_F16:
1415d64abb3SRichard Henderson case EXTF80_TO_F32:
1425d64abb3SRichard Henderson case EXTF80_TO_F64:
1435d64abb3SRichard Henderson case EXTF80_TO_F128:
1445d64abb3SRichard Henderson case EXTF80_ROUNDTOINT:
1455d64abb3SRichard Henderson case EXTF80_ADD:
1465d64abb3SRichard Henderson case EXTF80_SUB:
1475d64abb3SRichard Henderson case EXTF80_MUL:
1485d64abb3SRichard Henderson case EXTF80_DIV:
1495d64abb3SRichard Henderson case EXTF80_REM:
1505d64abb3SRichard Henderson case EXTF80_SQRT:
1515d64abb3SRichard Henderson case EXTF80_EQ:
1525d64abb3SRichard Henderson case EXTF80_LE:
1535d64abb3SRichard Henderson case EXTF80_LT:
1545d64abb3SRichard Henderson case EXTF80_EQ_SIGNALING:
1555d64abb3SRichard Henderson case EXTF80_LE_QUIET:
1565d64abb3SRichard Henderson case EXTF80_LT_QUIET:
1575d64abb3SRichard Henderson case UI32_TO_EXTF80:
1585d64abb3SRichard Henderson case UI64_TO_EXTF80:
1595d64abb3SRichard Henderson case I32_TO_EXTF80:
1605d64abb3SRichard Henderson case I64_TO_EXTF80:
1615d64abb3SRichard Henderson case F16_TO_EXTF80:
1625d64abb3SRichard Henderson case F32_TO_EXTF80:
1635d64abb3SRichard Henderson case F64_TO_EXTF80:
1645d64abb3SRichard Henderson case F128_TO_EXTF80:
1653ac1f813SEmilio G. Cota return false;
1663ac1f813SEmilio G. Cota }
167d5f84681SPhilippe Mathieu-Daudé }
168d5f84681SPhilippe Mathieu-Daudé return true;
169d5f84681SPhilippe Mathieu-Daudé }
1703ac1f813SEmilio G. Cota
do_testfloat(int op,int rmode,bool exact)1713ac1f813SEmilio G. Cota static void do_testfloat(int op, int rmode, bool exact)
1723ac1f813SEmilio G. Cota {
1733ac1f813SEmilio G. Cota abz_f16 true_abz_f16;
1743ac1f813SEmilio G. Cota abz_f16 subj_abz_f16;
1753ac1f813SEmilio G. Cota ab_f16_z_bool true_f16_z_bool;
1763ac1f813SEmilio G. Cota ab_f16_z_bool subj_f16_z_bool;
1773ac1f813SEmilio G. Cota abz_f32 true_abz_f32;
1783ac1f813SEmilio G. Cota abz_f32 subj_abz_f32;
1793ac1f813SEmilio G. Cota ab_f32_z_bool true_ab_f32_z_bool;
1803ac1f813SEmilio G. Cota ab_f32_z_bool subj_ab_f32_z_bool;
1813ac1f813SEmilio G. Cota abz_f64 true_abz_f64;
1823ac1f813SEmilio G. Cota abz_f64 subj_abz_f64;
1833ac1f813SEmilio G. Cota ab_f64_z_bool true_ab_f64_z_bool;
1843ac1f813SEmilio G. Cota ab_f64_z_bool subj_ab_f64_z_bool;
1853ac1f813SEmilio G. Cota abz_extF80M true_abz_extF80M;
1863ac1f813SEmilio G. Cota abz_extF80M subj_abz_extF80M;
1873ac1f813SEmilio G. Cota ab_extF80M_z_bool true_ab_extF80M_z_bool;
1883ac1f813SEmilio G. Cota ab_extF80M_z_bool subj_ab_extF80M_z_bool;
1893ac1f813SEmilio G. Cota abz_f128M true_abz_f128M;
1903ac1f813SEmilio G. Cota abz_f128M subj_abz_f128M;
1913ac1f813SEmilio G. Cota ab_f128M_z_bool true_ab_f128M_z_bool;
1923ac1f813SEmilio G. Cota ab_f128M_z_bool subj_ab_f128M_z_bool;
1933ac1f813SEmilio G. Cota
1946348a546SAlex Bennée if (verCases_verbosity) {
1953ac1f813SEmilio G. Cota fputs(">> Testing ", stderr);
1963ac1f813SEmilio G. Cota verCases_writeFunctionName(stderr);
1973ac1f813SEmilio G. Cota fputs("\n", stderr);
1986348a546SAlex Bennée }
1993ac1f813SEmilio G. Cota
200d5f84681SPhilippe Mathieu-Daudé if (!is_allowed(op, rmode)) {
2013ac1f813SEmilio G. Cota not_implemented();
2023ac1f813SEmilio G. Cota return;
2033ac1f813SEmilio G. Cota }
2043ac1f813SEmilio G. Cota
2053ac1f813SEmilio G. Cota switch (op) {
2063ac1f813SEmilio G. Cota case UI32_TO_F16:
2073ac1f813SEmilio G. Cota test_a_ui32_z_f16(slow_ui32_to_f16, qemu_ui32_to_f16);
2083ac1f813SEmilio G. Cota break;
2093ac1f813SEmilio G. Cota case UI32_TO_F32:
2103ac1f813SEmilio G. Cota test_a_ui32_z_f32(slow_ui32_to_f32, qemu_ui32_to_f32);
2113ac1f813SEmilio G. Cota break;
2123ac1f813SEmilio G. Cota case UI32_TO_F64:
2133ac1f813SEmilio G. Cota test_a_ui32_z_f64(slow_ui32_to_f64, qemu_ui32_to_f64);
2143ac1f813SEmilio G. Cota break;
2153ac1f813SEmilio G. Cota case UI32_TO_EXTF80:
2163ac1f813SEmilio G. Cota not_implemented();
2173ac1f813SEmilio G. Cota break;
2183ac1f813SEmilio G. Cota case UI32_TO_F128:
2193ac1f813SEmilio G. Cota not_implemented();
2203ac1f813SEmilio G. Cota break;
2213ac1f813SEmilio G. Cota case UI64_TO_F16:
2223ac1f813SEmilio G. Cota test_a_ui64_z_f16(slow_ui64_to_f16, qemu_ui64_to_f16);
2233ac1f813SEmilio G. Cota break;
2243ac1f813SEmilio G. Cota case UI64_TO_F32:
2253ac1f813SEmilio G. Cota test_a_ui64_z_f32(slow_ui64_to_f32, qemu_ui64_to_f32);
2263ac1f813SEmilio G. Cota break;
2273ac1f813SEmilio G. Cota case UI64_TO_F64:
2283ac1f813SEmilio G. Cota test_a_ui64_z_f64(slow_ui64_to_f64, qemu_ui64_to_f64);
2293ac1f813SEmilio G. Cota break;
2303ac1f813SEmilio G. Cota case UI64_TO_EXTF80:
2313ac1f813SEmilio G. Cota not_implemented();
2323ac1f813SEmilio G. Cota break;
2333ac1f813SEmilio G. Cota case UI64_TO_F128:
2343ac1f813SEmilio G. Cota test_a_ui64_z_f128(slow_ui64_to_f128M, qemu_ui64_to_f128M);
2353ac1f813SEmilio G. Cota break;
2363ac1f813SEmilio G. Cota case I32_TO_F16:
2373ac1f813SEmilio G. Cota test_a_i32_z_f16(slow_i32_to_f16, qemu_i32_to_f16);
2383ac1f813SEmilio G. Cota break;
2393ac1f813SEmilio G. Cota case I32_TO_F32:
2403ac1f813SEmilio G. Cota test_a_i32_z_f32(slow_i32_to_f32, qemu_i32_to_f32);
2413ac1f813SEmilio G. Cota break;
2423ac1f813SEmilio G. Cota case I32_TO_F64:
2433ac1f813SEmilio G. Cota test_a_i32_z_f64(slow_i32_to_f64, qemu_i32_to_f64);
2443ac1f813SEmilio G. Cota break;
2453ac1f813SEmilio G. Cota case I32_TO_EXTF80:
2463ac1f813SEmilio G. Cota test_a_i32_z_extF80(slow_i32_to_extF80M, qemu_i32_to_extF80M);
2473ac1f813SEmilio G. Cota break;
2483ac1f813SEmilio G. Cota case I32_TO_F128:
2493ac1f813SEmilio G. Cota test_a_i32_z_f128(slow_i32_to_f128M, qemu_i32_to_f128M);
2503ac1f813SEmilio G. Cota break;
2513ac1f813SEmilio G. Cota case I64_TO_F16:
2523ac1f813SEmilio G. Cota test_a_i64_z_f16(slow_i64_to_f16, qemu_i64_to_f16);
2533ac1f813SEmilio G. Cota break;
2543ac1f813SEmilio G. Cota case I64_TO_F32:
2553ac1f813SEmilio G. Cota test_a_i64_z_f32(slow_i64_to_f32, qemu_i64_to_f32);
2563ac1f813SEmilio G. Cota break;
2573ac1f813SEmilio G. Cota case I64_TO_F64:
2583ac1f813SEmilio G. Cota test_a_i64_z_f64(slow_i64_to_f64, qemu_i64_to_f64);
2593ac1f813SEmilio G. Cota break;
2603ac1f813SEmilio G. Cota case I64_TO_EXTF80:
2613ac1f813SEmilio G. Cota test_a_i64_z_extF80(slow_i64_to_extF80M, qemu_i64_to_extF80M);
2623ac1f813SEmilio G. Cota break;
2633ac1f813SEmilio G. Cota case I64_TO_F128:
2643ac1f813SEmilio G. Cota test_a_i64_z_f128(slow_i64_to_f128M, qemu_i64_to_f128M);
2653ac1f813SEmilio G. Cota break;
2663ac1f813SEmilio G. Cota case F16_TO_UI32:
2673ac1f813SEmilio G. Cota test_a_f16_z_ui32_rx(slow_f16_to_ui32, qemu_f16_to_ui32, rmode, exact);
2683ac1f813SEmilio G. Cota break;
2693ac1f813SEmilio G. Cota case F16_TO_UI64:
2703ac1f813SEmilio G. Cota test_a_f16_z_ui64_rx(slow_f16_to_ui64, qemu_f16_to_ui64, rmode, exact);
2713ac1f813SEmilio G. Cota break;
2723ac1f813SEmilio G. Cota case F16_TO_I32:
2733ac1f813SEmilio G. Cota test_a_f16_z_i32_rx(slow_f16_to_i32, qemu_f16_to_i32, rmode, exact);
2743ac1f813SEmilio G. Cota break;
2753ac1f813SEmilio G. Cota case F16_TO_I64:
2763ac1f813SEmilio G. Cota test_a_f16_z_i64_rx(slow_f16_to_i64, qemu_f16_to_i64, rmode, exact);
2773ac1f813SEmilio G. Cota break;
2783ac1f813SEmilio G. Cota case F16_TO_UI32_R_MINMAG:
2793ac1f813SEmilio G. Cota test_a_f16_z_ui32_x(slow_f16_to_ui32_r_minMag,
2803ac1f813SEmilio G. Cota qemu_f16_to_ui32_r_minMag, exact);
2813ac1f813SEmilio G. Cota break;
2823ac1f813SEmilio G. Cota case F16_TO_UI64_R_MINMAG:
2833ac1f813SEmilio G. Cota test_a_f16_z_ui64_x(slow_f16_to_ui64_r_minMag,
2843ac1f813SEmilio G. Cota qemu_f16_to_ui64_r_minMag, exact);
2853ac1f813SEmilio G. Cota break;
2863ac1f813SEmilio G. Cota case F16_TO_I32_R_MINMAG:
2873ac1f813SEmilio G. Cota test_a_f16_z_i32_x(slow_f16_to_i32_r_minMag, qemu_f16_to_i32_r_minMag,
2883ac1f813SEmilio G. Cota exact);
2893ac1f813SEmilio G. Cota break;
2903ac1f813SEmilio G. Cota case F16_TO_I64_R_MINMAG:
2913ac1f813SEmilio G. Cota test_a_f16_z_i64_x(slow_f16_to_i64_r_minMag, qemu_f16_to_i64_r_minMag,
2923ac1f813SEmilio G. Cota exact);
2933ac1f813SEmilio G. Cota break;
2943ac1f813SEmilio G. Cota case F16_TO_F32:
2953ac1f813SEmilio G. Cota test_a_f16_z_f32(slow_f16_to_f32, qemu_f16_to_f32);
2963ac1f813SEmilio G. Cota break;
2973ac1f813SEmilio G. Cota case F16_TO_F64:
2983ac1f813SEmilio G. Cota test_a_f16_z_f64(slow_f16_to_f64, qemu_f16_to_f64);
2993ac1f813SEmilio G. Cota break;
3003ac1f813SEmilio G. Cota case F16_TO_EXTF80:
3013ac1f813SEmilio G. Cota not_implemented();
3023ac1f813SEmilio G. Cota break;
3033ac1f813SEmilio G. Cota case F16_TO_F128:
3043ac1f813SEmilio G. Cota not_implemented();
3053ac1f813SEmilio G. Cota break;
3063ac1f813SEmilio G. Cota case F16_ROUNDTOINT:
3073ac1f813SEmilio G. Cota test_az_f16_rx(slow_f16_roundToInt, qemu_f16_roundToInt, rmode, exact);
3083ac1f813SEmilio G. Cota break;
3093ac1f813SEmilio G. Cota case F16_ADD:
3103ac1f813SEmilio G. Cota true_abz_f16 = slow_f16_add;
3113ac1f813SEmilio G. Cota subj_abz_f16 = qemu_f16_add;
3123ac1f813SEmilio G. Cota goto test_abz_f16;
3133ac1f813SEmilio G. Cota case F16_SUB:
3143ac1f813SEmilio G. Cota true_abz_f16 = slow_f16_sub;
3153ac1f813SEmilio G. Cota subj_abz_f16 = qemu_f16_sub;
3163ac1f813SEmilio G. Cota goto test_abz_f16;
3173ac1f813SEmilio G. Cota case F16_MUL:
3183ac1f813SEmilio G. Cota true_abz_f16 = slow_f16_mul;
3193ac1f813SEmilio G. Cota subj_abz_f16 = qemu_f16_mul;
3203ac1f813SEmilio G. Cota goto test_abz_f16;
3213ac1f813SEmilio G. Cota case F16_DIV:
3223ac1f813SEmilio G. Cota true_abz_f16 = slow_f16_div;
3233ac1f813SEmilio G. Cota subj_abz_f16 = qemu_f16_div;
3243ac1f813SEmilio G. Cota goto test_abz_f16;
3253ac1f813SEmilio G. Cota case F16_REM:
3263ac1f813SEmilio G. Cota not_implemented();
3273ac1f813SEmilio G. Cota break;
3283ac1f813SEmilio G. Cota test_abz_f16:
3293ac1f813SEmilio G. Cota test_abz_f16(true_abz_f16, subj_abz_f16);
3303ac1f813SEmilio G. Cota break;
3313ac1f813SEmilio G. Cota case F16_MULADD:
3323ac1f813SEmilio G. Cota test_abcz_f16(slow_f16_mulAdd, qemu_f16_mulAdd);
3333ac1f813SEmilio G. Cota break;
3343ac1f813SEmilio G. Cota case F16_SQRT:
3353ac1f813SEmilio G. Cota test_az_f16(slow_f16_sqrt, qemu_f16_sqrt);
3363ac1f813SEmilio G. Cota break;
3373ac1f813SEmilio G. Cota case F16_EQ:
3383ac1f813SEmilio G. Cota true_f16_z_bool = slow_f16_eq;
3393ac1f813SEmilio G. Cota subj_f16_z_bool = qemu_f16_eq;
3403ac1f813SEmilio G. Cota goto test_ab_f16_z_bool;
3413ac1f813SEmilio G. Cota case F16_LE:
3423ac1f813SEmilio G. Cota true_f16_z_bool = slow_f16_le;
3433ac1f813SEmilio G. Cota subj_f16_z_bool = qemu_f16_le;
3443ac1f813SEmilio G. Cota goto test_ab_f16_z_bool;
3453ac1f813SEmilio G. Cota case F16_LT:
3463ac1f813SEmilio G. Cota true_f16_z_bool = slow_f16_lt;
3473ac1f813SEmilio G. Cota subj_f16_z_bool = qemu_f16_lt;
3483ac1f813SEmilio G. Cota goto test_ab_f16_z_bool;
3493ac1f813SEmilio G. Cota case F16_EQ_SIGNALING:
3503ac1f813SEmilio G. Cota true_f16_z_bool = slow_f16_eq_signaling;
3513ac1f813SEmilio G. Cota subj_f16_z_bool = qemu_f16_eq_signaling;
3523ac1f813SEmilio G. Cota goto test_ab_f16_z_bool;
3533ac1f813SEmilio G. Cota case F16_LE_QUIET:
3543ac1f813SEmilio G. Cota true_f16_z_bool = slow_f16_le_quiet;
3553ac1f813SEmilio G. Cota subj_f16_z_bool = qemu_f16_le_quiet;
3563ac1f813SEmilio G. Cota goto test_ab_f16_z_bool;
3573ac1f813SEmilio G. Cota case F16_LT_QUIET:
3583ac1f813SEmilio G. Cota true_f16_z_bool = slow_f16_lt_quiet;
3593ac1f813SEmilio G. Cota subj_f16_z_bool = qemu_f16_lt_quiet;
3603ac1f813SEmilio G. Cota test_ab_f16_z_bool:
3613ac1f813SEmilio G. Cota test_ab_f16_z_bool(true_f16_z_bool, subj_f16_z_bool);
3623ac1f813SEmilio G. Cota break;
3633ac1f813SEmilio G. Cota case F32_TO_UI32:
3643ac1f813SEmilio G. Cota test_a_f32_z_ui32_rx(slow_f32_to_ui32, qemu_f32_to_ui32, rmode, exact);
3653ac1f813SEmilio G. Cota break;
3663ac1f813SEmilio G. Cota case F32_TO_UI64:
3673ac1f813SEmilio G. Cota test_a_f32_z_ui64_rx(slow_f32_to_ui64, qemu_f32_to_ui64, rmode, exact);
3683ac1f813SEmilio G. Cota break;
3693ac1f813SEmilio G. Cota case F32_TO_I32:
3703ac1f813SEmilio G. Cota test_a_f32_z_i32_rx(slow_f32_to_i32, qemu_f32_to_i32, rmode, exact);
3713ac1f813SEmilio G. Cota break;
3723ac1f813SEmilio G. Cota case F32_TO_I64:
3733ac1f813SEmilio G. Cota test_a_f32_z_i64_rx(slow_f32_to_i64, qemu_f32_to_i64, rmode, exact);
3743ac1f813SEmilio G. Cota break;
3753ac1f813SEmilio G. Cota case F32_TO_UI32_R_MINMAG:
3763ac1f813SEmilio G. Cota test_a_f32_z_ui32_x(slow_f32_to_ui32_r_minMag,
3773ac1f813SEmilio G. Cota qemu_f32_to_ui32_r_minMag, exact);
3783ac1f813SEmilio G. Cota break;
3793ac1f813SEmilio G. Cota case F32_TO_UI64_R_MINMAG:
3803ac1f813SEmilio G. Cota test_a_f32_z_ui64_x(slow_f32_to_ui64_r_minMag,
3813ac1f813SEmilio G. Cota qemu_f32_to_ui64_r_minMag, exact);
3823ac1f813SEmilio G. Cota break;
3833ac1f813SEmilio G. Cota case F32_TO_I32_R_MINMAG:
3843ac1f813SEmilio G. Cota test_a_f32_z_i32_x(slow_f32_to_i32_r_minMag, qemu_f32_to_i32_r_minMag,
3853ac1f813SEmilio G. Cota exact);
3863ac1f813SEmilio G. Cota break;
3873ac1f813SEmilio G. Cota case F32_TO_I64_R_MINMAG:
3883ac1f813SEmilio G. Cota test_a_f32_z_i64_x(slow_f32_to_i64_r_minMag, qemu_f32_to_i64_r_minMag,
3893ac1f813SEmilio G. Cota exact);
3903ac1f813SEmilio G. Cota break;
3913ac1f813SEmilio G. Cota case F32_TO_F16:
3923ac1f813SEmilio G. Cota test_a_f32_z_f16(slow_f32_to_f16, qemu_f32_to_f16);
3933ac1f813SEmilio G. Cota break;
3943ac1f813SEmilio G. Cota case F32_TO_F64:
3953ac1f813SEmilio G. Cota test_a_f32_z_f64(slow_f32_to_f64, qemu_f32_to_f64);
3963ac1f813SEmilio G. Cota break;
3973ac1f813SEmilio G. Cota case F32_TO_EXTF80:
3983ac1f813SEmilio G. Cota test_a_f32_z_extF80(slow_f32_to_extF80M, qemu_f32_to_extF80M);
3993ac1f813SEmilio G. Cota break;
4003ac1f813SEmilio G. Cota case F32_TO_F128:
4013ac1f813SEmilio G. Cota test_a_f32_z_f128(slow_f32_to_f128M, qemu_f32_to_f128M);
4023ac1f813SEmilio G. Cota break;
4033ac1f813SEmilio G. Cota case F32_ROUNDTOINT:
4043ac1f813SEmilio G. Cota test_az_f32_rx(slow_f32_roundToInt, qemu_f32_roundToInt, rmode, exact);
4053ac1f813SEmilio G. Cota break;
4063ac1f813SEmilio G. Cota case F32_ADD:
4073ac1f813SEmilio G. Cota true_abz_f32 = slow_f32_add;
4083ac1f813SEmilio G. Cota subj_abz_f32 = qemu_f32_add;
4093ac1f813SEmilio G. Cota goto test_abz_f32;
4103ac1f813SEmilio G. Cota case F32_SUB:
4113ac1f813SEmilio G. Cota true_abz_f32 = slow_f32_sub;
4123ac1f813SEmilio G. Cota subj_abz_f32 = qemu_f32_sub;
4133ac1f813SEmilio G. Cota goto test_abz_f32;
4143ac1f813SEmilio G. Cota case F32_MUL:
4153ac1f813SEmilio G. Cota true_abz_f32 = slow_f32_mul;
4163ac1f813SEmilio G. Cota subj_abz_f32 = qemu_f32_mul;
4173ac1f813SEmilio G. Cota goto test_abz_f32;
4183ac1f813SEmilio G. Cota case F32_DIV:
4193ac1f813SEmilio G. Cota true_abz_f32 = slow_f32_div;
4203ac1f813SEmilio G. Cota subj_abz_f32 = qemu_f32_div;
4213ac1f813SEmilio G. Cota goto test_abz_f32;
4223ac1f813SEmilio G. Cota case F32_REM:
4233ac1f813SEmilio G. Cota true_abz_f32 = slow_f32_rem;
4243ac1f813SEmilio G. Cota subj_abz_f32 = qemu_f32_rem;
4253ac1f813SEmilio G. Cota test_abz_f32:
4263ac1f813SEmilio G. Cota test_abz_f32(true_abz_f32, subj_abz_f32);
4273ac1f813SEmilio G. Cota break;
4283ac1f813SEmilio G. Cota case F32_MULADD:
4293ac1f813SEmilio G. Cota test_abcz_f32(slow_f32_mulAdd, qemu_f32_mulAdd);
4303ac1f813SEmilio G. Cota break;
4313ac1f813SEmilio G. Cota case F32_SQRT:
4323ac1f813SEmilio G. Cota test_az_f32(slow_f32_sqrt, qemu_f32_sqrt);
4333ac1f813SEmilio G. Cota break;
4343ac1f813SEmilio G. Cota case F32_EQ:
4353ac1f813SEmilio G. Cota true_ab_f32_z_bool = slow_f32_eq;
4363ac1f813SEmilio G. Cota subj_ab_f32_z_bool = qemu_f32_eq;
4373ac1f813SEmilio G. Cota goto test_ab_f32_z_bool;
4383ac1f813SEmilio G. Cota case F32_LE:
4393ac1f813SEmilio G. Cota true_ab_f32_z_bool = slow_f32_le;
4403ac1f813SEmilio G. Cota subj_ab_f32_z_bool = qemu_f32_le;
4413ac1f813SEmilio G. Cota goto test_ab_f32_z_bool;
4423ac1f813SEmilio G. Cota case F32_LT:
4433ac1f813SEmilio G. Cota true_ab_f32_z_bool = slow_f32_lt;
4443ac1f813SEmilio G. Cota subj_ab_f32_z_bool = qemu_f32_lt;
4453ac1f813SEmilio G. Cota goto test_ab_f32_z_bool;
4463ac1f813SEmilio G. Cota case F32_EQ_SIGNALING:
4473ac1f813SEmilio G. Cota true_ab_f32_z_bool = slow_f32_eq_signaling;
4483ac1f813SEmilio G. Cota subj_ab_f32_z_bool = qemu_f32_eq_signaling;
4493ac1f813SEmilio G. Cota goto test_ab_f32_z_bool;
4503ac1f813SEmilio G. Cota case F32_LE_QUIET:
4513ac1f813SEmilio G. Cota true_ab_f32_z_bool = slow_f32_le_quiet;
4523ac1f813SEmilio G. Cota subj_ab_f32_z_bool = qemu_f32_le_quiet;
4533ac1f813SEmilio G. Cota goto test_ab_f32_z_bool;
4543ac1f813SEmilio G. Cota case F32_LT_QUIET:
4553ac1f813SEmilio G. Cota true_ab_f32_z_bool = slow_f32_lt_quiet;
4563ac1f813SEmilio G. Cota subj_ab_f32_z_bool = qemu_f32_lt_quiet;
4573ac1f813SEmilio G. Cota test_ab_f32_z_bool:
4583ac1f813SEmilio G. Cota test_ab_f32_z_bool(true_ab_f32_z_bool, subj_ab_f32_z_bool);
4593ac1f813SEmilio G. Cota break;
4603ac1f813SEmilio G. Cota case F64_TO_UI32:
4613ac1f813SEmilio G. Cota test_a_f64_z_ui32_rx(slow_f64_to_ui32, qemu_f64_to_ui32, rmode, exact);
4623ac1f813SEmilio G. Cota break;
4633ac1f813SEmilio G. Cota case F64_TO_UI64:
4643ac1f813SEmilio G. Cota test_a_f64_z_ui64_rx(slow_f64_to_ui64, qemu_f64_to_ui64, rmode, exact);
4653ac1f813SEmilio G. Cota break;
4663ac1f813SEmilio G. Cota case F64_TO_I32:
4673ac1f813SEmilio G. Cota test_a_f64_z_i32_rx(slow_f64_to_i32, qemu_f64_to_i32, rmode, exact);
4683ac1f813SEmilio G. Cota break;
4693ac1f813SEmilio G. Cota case F64_TO_I64:
4703ac1f813SEmilio G. Cota test_a_f64_z_i64_rx(slow_f64_to_i64, qemu_f64_to_i64, rmode, exact);
4713ac1f813SEmilio G. Cota break;
4723ac1f813SEmilio G. Cota case F64_TO_UI32_R_MINMAG:
4733ac1f813SEmilio G. Cota test_a_f64_z_ui32_x(slow_f64_to_ui32_r_minMag,
4743ac1f813SEmilio G. Cota qemu_f64_to_ui32_r_minMag, exact);
4753ac1f813SEmilio G. Cota break;
4763ac1f813SEmilio G. Cota case F64_TO_UI64_R_MINMAG:
4773ac1f813SEmilio G. Cota test_a_f64_z_ui64_x(slow_f64_to_ui64_r_minMag,
4783ac1f813SEmilio G. Cota qemu_f64_to_ui64_r_minMag, exact);
4793ac1f813SEmilio G. Cota break;
4803ac1f813SEmilio G. Cota case F64_TO_I32_R_MINMAG:
4813ac1f813SEmilio G. Cota test_a_f64_z_i32_x(slow_f64_to_i32_r_minMag, qemu_f64_to_i32_r_minMag,
4823ac1f813SEmilio G. Cota exact);
4833ac1f813SEmilio G. Cota break;
4843ac1f813SEmilio G. Cota case F64_TO_I64_R_MINMAG:
4853ac1f813SEmilio G. Cota test_a_f64_z_i64_x(slow_f64_to_i64_r_minMag, qemu_f64_to_i64_r_minMag,
4863ac1f813SEmilio G. Cota exact);
4873ac1f813SEmilio G. Cota break;
4883ac1f813SEmilio G. Cota case F64_TO_F16:
4893ac1f813SEmilio G. Cota test_a_f64_z_f16(slow_f64_to_f16, qemu_f64_to_f16);
4903ac1f813SEmilio G. Cota break;
4913ac1f813SEmilio G. Cota case F64_TO_F32:
4923ac1f813SEmilio G. Cota test_a_f64_z_f32(slow_f64_to_f32, qemu_f64_to_f32);
4933ac1f813SEmilio G. Cota break;
4943ac1f813SEmilio G. Cota case F64_TO_EXTF80:
4953ac1f813SEmilio G. Cota test_a_f64_z_extF80(slow_f64_to_extF80M, qemu_f64_to_extF80M);
4963ac1f813SEmilio G. Cota break;
4973ac1f813SEmilio G. Cota case F64_TO_F128:
4983ac1f813SEmilio G. Cota test_a_f64_z_f128(slow_f64_to_f128M, qemu_f64_to_f128M);
4993ac1f813SEmilio G. Cota break;
5003ac1f813SEmilio G. Cota case F64_ROUNDTOINT:
5013ac1f813SEmilio G. Cota test_az_f64_rx(slow_f64_roundToInt, qemu_f64_roundToInt, rmode, exact);
5023ac1f813SEmilio G. Cota break;
5033ac1f813SEmilio G. Cota case F64_ADD:
5043ac1f813SEmilio G. Cota true_abz_f64 = slow_f64_add;
5053ac1f813SEmilio G. Cota subj_abz_f64 = qemu_f64_add;
5063ac1f813SEmilio G. Cota goto test_abz_f64;
5073ac1f813SEmilio G. Cota case F64_SUB:
5083ac1f813SEmilio G. Cota true_abz_f64 = slow_f64_sub;
5093ac1f813SEmilio G. Cota subj_abz_f64 = qemu_f64_sub;
5103ac1f813SEmilio G. Cota goto test_abz_f64;
5113ac1f813SEmilio G. Cota case F64_MUL:
5123ac1f813SEmilio G. Cota true_abz_f64 = slow_f64_mul;
5133ac1f813SEmilio G. Cota subj_abz_f64 = qemu_f64_mul;
5143ac1f813SEmilio G. Cota goto test_abz_f64;
5153ac1f813SEmilio G. Cota case F64_DIV:
5163ac1f813SEmilio G. Cota true_abz_f64 = slow_f64_div;
5173ac1f813SEmilio G. Cota subj_abz_f64 = qemu_f64_div;
5183ac1f813SEmilio G. Cota goto test_abz_f64;
5193ac1f813SEmilio G. Cota case F64_REM:
5203ac1f813SEmilio G. Cota true_abz_f64 = slow_f64_rem;
5213ac1f813SEmilio G. Cota subj_abz_f64 = qemu_f64_rem;
5223ac1f813SEmilio G. Cota test_abz_f64:
5233ac1f813SEmilio G. Cota test_abz_f64(true_abz_f64, subj_abz_f64);
5243ac1f813SEmilio G. Cota break;
5253ac1f813SEmilio G. Cota case F64_MULADD:
5263ac1f813SEmilio G. Cota test_abcz_f64(slow_f64_mulAdd, qemu_f64_mulAdd);
5273ac1f813SEmilio G. Cota break;
5283ac1f813SEmilio G. Cota case F64_SQRT:
5293ac1f813SEmilio G. Cota test_az_f64(slow_f64_sqrt, qemu_f64_sqrt);
5303ac1f813SEmilio G. Cota break;
5313ac1f813SEmilio G. Cota case F64_EQ:
5323ac1f813SEmilio G. Cota true_ab_f64_z_bool = slow_f64_eq;
5333ac1f813SEmilio G. Cota subj_ab_f64_z_bool = qemu_f64_eq;
5343ac1f813SEmilio G. Cota goto test_ab_f64_z_bool;
5353ac1f813SEmilio G. Cota case F64_LE:
5363ac1f813SEmilio G. Cota true_ab_f64_z_bool = slow_f64_le;
5373ac1f813SEmilio G. Cota subj_ab_f64_z_bool = qemu_f64_le;
5383ac1f813SEmilio G. Cota goto test_ab_f64_z_bool;
5393ac1f813SEmilio G. Cota case F64_LT:
5403ac1f813SEmilio G. Cota true_ab_f64_z_bool = slow_f64_lt;
5413ac1f813SEmilio G. Cota subj_ab_f64_z_bool = qemu_f64_lt;
5423ac1f813SEmilio G. Cota goto test_ab_f64_z_bool;
5433ac1f813SEmilio G. Cota case F64_EQ_SIGNALING:
5443ac1f813SEmilio G. Cota true_ab_f64_z_bool = slow_f64_eq_signaling;
5453ac1f813SEmilio G. Cota subj_ab_f64_z_bool = qemu_f64_eq_signaling;
5463ac1f813SEmilio G. Cota goto test_ab_f64_z_bool;
5473ac1f813SEmilio G. Cota case F64_LE_QUIET:
5483ac1f813SEmilio G. Cota true_ab_f64_z_bool = slow_f64_le_quiet;
5493ac1f813SEmilio G. Cota subj_ab_f64_z_bool = qemu_f64_le_quiet;
5503ac1f813SEmilio G. Cota goto test_ab_f64_z_bool;
5513ac1f813SEmilio G. Cota case F64_LT_QUIET:
5523ac1f813SEmilio G. Cota true_ab_f64_z_bool = slow_f64_lt_quiet;
5533ac1f813SEmilio G. Cota subj_ab_f64_z_bool = qemu_f64_lt_quiet;
5543ac1f813SEmilio G. Cota test_ab_f64_z_bool:
5553ac1f813SEmilio G. Cota test_ab_f64_z_bool(true_ab_f64_z_bool, subj_ab_f64_z_bool);
5563ac1f813SEmilio G. Cota break;
5573ac1f813SEmilio G. Cota case EXTF80_TO_UI32:
5583ac1f813SEmilio G. Cota not_implemented();
5593ac1f813SEmilio G. Cota break;
5603ac1f813SEmilio G. Cota case EXTF80_TO_UI64:
5613ac1f813SEmilio G. Cota not_implemented();
5623ac1f813SEmilio G. Cota break;
5633ac1f813SEmilio G. Cota case EXTF80_TO_I32:
5643ac1f813SEmilio G. Cota test_a_extF80_z_i32_rx(slow_extF80M_to_i32, qemu_extF80M_to_i32, rmode,
5653ac1f813SEmilio G. Cota exact);
5663ac1f813SEmilio G. Cota break;
5673ac1f813SEmilio G. Cota case EXTF80_TO_I64:
5683ac1f813SEmilio G. Cota test_a_extF80_z_i64_rx(slow_extF80M_to_i64, qemu_extF80M_to_i64, rmode,
5693ac1f813SEmilio G. Cota exact);
5703ac1f813SEmilio G. Cota break;
5713ac1f813SEmilio G. Cota case EXTF80_TO_UI32_R_MINMAG:
5723ac1f813SEmilio G. Cota not_implemented();
5733ac1f813SEmilio G. Cota break;
5743ac1f813SEmilio G. Cota case EXTF80_TO_UI64_R_MINMAG:
5753ac1f813SEmilio G. Cota not_implemented();
5763ac1f813SEmilio G. Cota break;
5773ac1f813SEmilio G. Cota case EXTF80_TO_I32_R_MINMAG:
5783ac1f813SEmilio G. Cota test_a_extF80_z_i32_x(slow_extF80M_to_i32_r_minMag,
5793ac1f813SEmilio G. Cota qemu_extF80M_to_i32_r_minMag, exact);
5803ac1f813SEmilio G. Cota break;
5813ac1f813SEmilio G. Cota case EXTF80_TO_I64_R_MINMAG:
5823ac1f813SEmilio G. Cota test_a_extF80_z_i64_x(slow_extF80M_to_i64_r_minMag,
5833ac1f813SEmilio G. Cota qemu_extF80M_to_i64_r_minMag, exact);
5843ac1f813SEmilio G. Cota break;
5853ac1f813SEmilio G. Cota case EXTF80_TO_F16:
5863ac1f813SEmilio G. Cota not_implemented();
5873ac1f813SEmilio G. Cota break;
5883ac1f813SEmilio G. Cota case EXTF80_TO_F32:
5893ac1f813SEmilio G. Cota test_a_extF80_z_f32(slow_extF80M_to_f32, qemu_extF80M_to_f32);
5903ac1f813SEmilio G. Cota break;
5913ac1f813SEmilio G. Cota case EXTF80_TO_F64:
5923ac1f813SEmilio G. Cota test_a_extF80_z_f64(slow_extF80M_to_f64, qemu_extF80M_to_f64);
5933ac1f813SEmilio G. Cota break;
5943ac1f813SEmilio G. Cota case EXTF80_TO_F128:
5953ac1f813SEmilio G. Cota test_a_extF80_z_f128(slow_extF80M_to_f128M, qemu_extF80M_to_f128M);
5963ac1f813SEmilio G. Cota break;
5973ac1f813SEmilio G. Cota case EXTF80_ROUNDTOINT:
5983ac1f813SEmilio G. Cota test_az_extF80_rx(slow_extF80M_roundToInt, qemu_extF80M_roundToInt,
5993ac1f813SEmilio G. Cota rmode, exact);
6003ac1f813SEmilio G. Cota break;
6013ac1f813SEmilio G. Cota case EXTF80_ADD:
6023ac1f813SEmilio G. Cota true_abz_extF80M = slow_extF80M_add;
6033ac1f813SEmilio G. Cota subj_abz_extF80M = qemu_extF80M_add;
6043ac1f813SEmilio G. Cota goto test_abz_extF80;
6053ac1f813SEmilio G. Cota case EXTF80_SUB:
6063ac1f813SEmilio G. Cota true_abz_extF80M = slow_extF80M_sub;
6073ac1f813SEmilio G. Cota subj_abz_extF80M = qemu_extF80M_sub;
6083ac1f813SEmilio G. Cota goto test_abz_extF80;
6093ac1f813SEmilio G. Cota case EXTF80_MUL:
6103ac1f813SEmilio G. Cota true_abz_extF80M = slow_extF80M_mul;
6113ac1f813SEmilio G. Cota subj_abz_extF80M = qemu_extF80M_mul;
6123ac1f813SEmilio G. Cota goto test_abz_extF80;
6133ac1f813SEmilio G. Cota case EXTF80_DIV:
6143ac1f813SEmilio G. Cota true_abz_extF80M = slow_extF80M_div;
6153ac1f813SEmilio G. Cota subj_abz_extF80M = qemu_extF80M_div;
6163ac1f813SEmilio G. Cota goto test_abz_extF80;
6173ac1f813SEmilio G. Cota case EXTF80_REM:
6183ac1f813SEmilio G. Cota true_abz_extF80M = slow_extF80M_rem;
6193ac1f813SEmilio G. Cota subj_abz_extF80M = qemu_extF80M_rem;
6203ac1f813SEmilio G. Cota test_abz_extF80:
6213ac1f813SEmilio G. Cota test_abz_extF80(true_abz_extF80M, subj_abz_extF80M);
6223ac1f813SEmilio G. Cota break;
6233ac1f813SEmilio G. Cota case EXTF80_SQRT:
6243ac1f813SEmilio G. Cota test_az_extF80(slow_extF80M_sqrt, qemu_extF80M_sqrt);
6253ac1f813SEmilio G. Cota break;
6263ac1f813SEmilio G. Cota case EXTF80_EQ:
6273ac1f813SEmilio G. Cota true_ab_extF80M_z_bool = slow_extF80M_eq;
6283ac1f813SEmilio G. Cota subj_ab_extF80M_z_bool = qemu_extF80M_eq;
6293ac1f813SEmilio G. Cota goto test_ab_extF80_z_bool;
6303ac1f813SEmilio G. Cota case EXTF80_LE:
6313ac1f813SEmilio G. Cota true_ab_extF80M_z_bool = slow_extF80M_le;
6323ac1f813SEmilio G. Cota subj_ab_extF80M_z_bool = qemu_extF80M_le;
6333ac1f813SEmilio G. Cota goto test_ab_extF80_z_bool;
6343ac1f813SEmilio G. Cota case EXTF80_LT:
6353ac1f813SEmilio G. Cota true_ab_extF80M_z_bool = slow_extF80M_lt;
6363ac1f813SEmilio G. Cota subj_ab_extF80M_z_bool = qemu_extF80M_lt;
6373ac1f813SEmilio G. Cota goto test_ab_extF80_z_bool;
6383ac1f813SEmilio G. Cota case EXTF80_EQ_SIGNALING:
6393ac1f813SEmilio G. Cota true_ab_extF80M_z_bool = slow_extF80M_eq_signaling;
6403ac1f813SEmilio G. Cota subj_ab_extF80M_z_bool = qemu_extF80M_eq_signaling;
6413ac1f813SEmilio G. Cota goto test_ab_extF80_z_bool;
6423ac1f813SEmilio G. Cota case EXTF80_LE_QUIET:
6433ac1f813SEmilio G. Cota true_ab_extF80M_z_bool = slow_extF80M_le_quiet;
6443ac1f813SEmilio G. Cota subj_ab_extF80M_z_bool = qemu_extF80M_le_quiet;
6453ac1f813SEmilio G. Cota goto test_ab_extF80_z_bool;
6463ac1f813SEmilio G. Cota case EXTF80_LT_QUIET:
6473ac1f813SEmilio G. Cota true_ab_extF80M_z_bool = slow_extF80M_lt_quiet;
6483ac1f813SEmilio G. Cota subj_ab_extF80M_z_bool = qemu_extF80M_lt_quiet;
6493ac1f813SEmilio G. Cota test_ab_extF80_z_bool:
6503ac1f813SEmilio G. Cota test_ab_extF80_z_bool(true_ab_extF80M_z_bool, subj_ab_extF80M_z_bool);
6513ac1f813SEmilio G. Cota break;
6523ac1f813SEmilio G. Cota case F128_TO_UI32:
65380d491feSAlex Bennée test_a_f128_z_ui32_rx(slow_f128M_to_ui32, qemu_f128M_to_ui32, rmode,
65480d491feSAlex Bennée exact);
6553ac1f813SEmilio G. Cota break;
6563ac1f813SEmilio G. Cota case F128_TO_UI64:
6573ac1f813SEmilio G. Cota test_a_f128_z_ui64_rx(slow_f128M_to_ui64, qemu_f128M_to_ui64, rmode,
6583ac1f813SEmilio G. Cota exact);
6593ac1f813SEmilio G. Cota break;
6603ac1f813SEmilio G. Cota case F128_TO_I32:
6613ac1f813SEmilio G. Cota test_a_f128_z_i32_rx(slow_f128M_to_i32, qemu_f128M_to_i32, rmode,
6623ac1f813SEmilio G. Cota exact);
6633ac1f813SEmilio G. Cota break;
6643ac1f813SEmilio G. Cota case F128_TO_I64:
6653ac1f813SEmilio G. Cota test_a_f128_z_i64_rx(slow_f128M_to_i64, qemu_f128M_to_i64, rmode,
6663ac1f813SEmilio G. Cota exact);
6673ac1f813SEmilio G. Cota break;
6683ac1f813SEmilio G. Cota case F128_TO_UI32_R_MINMAG:
6693ac1f813SEmilio G. Cota test_a_f128_z_ui32_x(slow_f128M_to_ui32_r_minMag,
6703ac1f813SEmilio G. Cota qemu_f128M_to_ui32_r_minMag, exact);
6713ac1f813SEmilio G. Cota break;
6723ac1f813SEmilio G. Cota case F128_TO_UI64_R_MINMAG:
6733ac1f813SEmilio G. Cota test_a_f128_z_ui64_x(slow_f128M_to_ui64_r_minMag,
6743ac1f813SEmilio G. Cota qemu_f128M_to_ui64_r_minMag, exact);
6753ac1f813SEmilio G. Cota break;
6763ac1f813SEmilio G. Cota case F128_TO_I32_R_MINMAG:
6773ac1f813SEmilio G. Cota test_a_f128_z_i32_x(slow_f128M_to_i32_r_minMag,
6783ac1f813SEmilio G. Cota qemu_f128M_to_i32_r_minMag, exact);
6793ac1f813SEmilio G. Cota break;
6803ac1f813SEmilio G. Cota case F128_TO_I64_R_MINMAG:
6813ac1f813SEmilio G. Cota test_a_f128_z_i64_x(slow_f128M_to_i64_r_minMag,
6823ac1f813SEmilio G. Cota qemu_f128M_to_i64_r_minMag, exact);
6833ac1f813SEmilio G. Cota break;
6843ac1f813SEmilio G. Cota case F128_TO_F16:
6853ac1f813SEmilio G. Cota not_implemented();
6863ac1f813SEmilio G. Cota break;
6873ac1f813SEmilio G. Cota case F128_TO_F32:
6883ac1f813SEmilio G. Cota test_a_f128_z_f32(slow_f128M_to_f32, qemu_f128M_to_f32);
6893ac1f813SEmilio G. Cota break;
6903ac1f813SEmilio G. Cota case F128_TO_F64:
6913ac1f813SEmilio G. Cota test_a_f128_z_f64(slow_f128M_to_f64, qemu_f128M_to_f64);
6923ac1f813SEmilio G. Cota break;
6933ac1f813SEmilio G. Cota case F128_TO_EXTF80:
6943ac1f813SEmilio G. Cota test_a_f128_z_extF80(slow_f128M_to_extF80M, qemu_f128M_to_extF80M);
6953ac1f813SEmilio G. Cota break;
6963ac1f813SEmilio G. Cota case F128_ROUNDTOINT:
6973ac1f813SEmilio G. Cota test_az_f128_rx(slow_f128M_roundToInt, qemu_f128M_roundToInt, rmode,
6983ac1f813SEmilio G. Cota exact);
6993ac1f813SEmilio G. Cota break;
7003ac1f813SEmilio G. Cota case F128_ADD:
7013ac1f813SEmilio G. Cota true_abz_f128M = slow_f128M_add;
7023ac1f813SEmilio G. Cota subj_abz_f128M = qemu_f128M_add;
7033ac1f813SEmilio G. Cota goto test_abz_f128;
7043ac1f813SEmilio G. Cota case F128_SUB:
7053ac1f813SEmilio G. Cota true_abz_f128M = slow_f128M_sub;
7063ac1f813SEmilio G. Cota subj_abz_f128M = qemu_f128M_sub;
7073ac1f813SEmilio G. Cota goto test_abz_f128;
7083ac1f813SEmilio G. Cota case F128_MUL:
7093ac1f813SEmilio G. Cota true_abz_f128M = slow_f128M_mul;
7103ac1f813SEmilio G. Cota subj_abz_f128M = qemu_f128M_mul;
7113ac1f813SEmilio G. Cota goto test_abz_f128;
7123ac1f813SEmilio G. Cota case F128_DIV:
7133ac1f813SEmilio G. Cota true_abz_f128M = slow_f128M_div;
7143ac1f813SEmilio G. Cota subj_abz_f128M = qemu_f128M_div;
7153ac1f813SEmilio G. Cota goto test_abz_f128;
7163ac1f813SEmilio G. Cota case F128_REM:
7173ac1f813SEmilio G. Cota true_abz_f128M = slow_f128M_rem;
7183ac1f813SEmilio G. Cota subj_abz_f128M = qemu_f128M_rem;
7193ac1f813SEmilio G. Cota test_abz_f128:
7203ac1f813SEmilio G. Cota test_abz_f128(true_abz_f128M, subj_abz_f128M);
7213ac1f813SEmilio G. Cota break;
7223ac1f813SEmilio G. Cota case F128_MULADD:
723dedd123cSRichard Henderson test_abcz_f128(slow_f128M_mulAdd, qemu_f128M_mulAdd);
7243ac1f813SEmilio G. Cota break;
7253ac1f813SEmilio G. Cota case F128_SQRT:
7263ac1f813SEmilio G. Cota test_az_f128(slow_f128M_sqrt, qemu_f128M_sqrt);
7273ac1f813SEmilio G. Cota break;
7283ac1f813SEmilio G. Cota case F128_EQ:
7293ac1f813SEmilio G. Cota true_ab_f128M_z_bool = slow_f128M_eq;
7303ac1f813SEmilio G. Cota subj_ab_f128M_z_bool = qemu_f128M_eq;
7313ac1f813SEmilio G. Cota goto test_ab_f128_z_bool;
7323ac1f813SEmilio G. Cota case F128_LE:
7333ac1f813SEmilio G. Cota true_ab_f128M_z_bool = slow_f128M_le;
7343ac1f813SEmilio G. Cota subj_ab_f128M_z_bool = qemu_f128M_le;
7353ac1f813SEmilio G. Cota goto test_ab_f128_z_bool;
7363ac1f813SEmilio G. Cota case F128_LT:
7373ac1f813SEmilio G. Cota true_ab_f128M_z_bool = slow_f128M_lt;
7383ac1f813SEmilio G. Cota subj_ab_f128M_z_bool = qemu_f128M_lt;
7393ac1f813SEmilio G. Cota goto test_ab_f128_z_bool;
7403ac1f813SEmilio G. Cota case F128_EQ_SIGNALING:
7413ac1f813SEmilio G. Cota true_ab_f128M_z_bool = slow_f128M_eq_signaling;
7423ac1f813SEmilio G. Cota subj_ab_f128M_z_bool = qemu_f128M_eq_signaling;
7433ac1f813SEmilio G. Cota goto test_ab_f128_z_bool;
7443ac1f813SEmilio G. Cota case F128_LE_QUIET:
7453ac1f813SEmilio G. Cota true_ab_f128M_z_bool = slow_f128M_le_quiet;
7463ac1f813SEmilio G. Cota subj_ab_f128M_z_bool = qemu_f128M_le_quiet;
7473ac1f813SEmilio G. Cota goto test_ab_f128_z_bool;
7483ac1f813SEmilio G. Cota case F128_LT_QUIET:
7493ac1f813SEmilio G. Cota true_ab_f128M_z_bool = slow_f128M_lt_quiet;
7503ac1f813SEmilio G. Cota subj_ab_f128M_z_bool = qemu_f128M_lt_quiet;
7513ac1f813SEmilio G. Cota test_ab_f128_z_bool:
7523ac1f813SEmilio G. Cota test_ab_f128_z_bool(true_ab_f128M_z_bool, subj_ab_f128M_z_bool);
7533ac1f813SEmilio G. Cota break;
7543ac1f813SEmilio G. Cota }
7553ac1f813SEmilio G. Cota if ((verCases_errorStop && verCases_anyErrors)) {
7563ac1f813SEmilio G. Cota verCases_exitWithStatus();
7573ac1f813SEmilio G. Cota }
7583ac1f813SEmilio G. Cota }
7593ac1f813SEmilio G. Cota
test_name_to_op(const char * arg)7603ac1f813SEmilio G. Cota static unsigned int test_name_to_op(const char *arg)
7613ac1f813SEmilio G. Cota {
7623ac1f813SEmilio G. Cota unsigned int i;
7633ac1f813SEmilio G. Cota
7643ac1f813SEmilio G. Cota /* counting begins at 1 */
7653ac1f813SEmilio G. Cota for (i = 1; i < NUM_FUNCTIONS; i++) {
7663ac1f813SEmilio G. Cota const char *name = functionInfos[i].namePtr;
7673ac1f813SEmilio G. Cota
7683ac1f813SEmilio G. Cota if (name && !strcmp(name, arg)) {
7693ac1f813SEmilio G. Cota return i;
7703ac1f813SEmilio G. Cota }
7713ac1f813SEmilio G. Cota }
7723ac1f813SEmilio G. Cota return 0;
7733ac1f813SEmilio G. Cota }
7743ac1f813SEmilio G. Cota
round_name_to_mode(const char * name)7753ac1f813SEmilio G. Cota static unsigned int round_name_to_mode(const char *name)
7763ac1f813SEmilio G. Cota {
7773ac1f813SEmilio G. Cota int i;
7783ac1f813SEmilio G. Cota
7793ac1f813SEmilio G. Cota /* counting begins at 1 */
7803ac1f813SEmilio G. Cota for (i = 1; i < NUM_ROUNDINGMODES; i++) {
7813ac1f813SEmilio G. Cota if (!strcmp(round_mode_names[i], name)) {
7823ac1f813SEmilio G. Cota return i;
7833ac1f813SEmilio G. Cota }
7843ac1f813SEmilio G. Cota }
7853ac1f813SEmilio G. Cota return 0;
7863ac1f813SEmilio G. Cota }
7873ac1f813SEmilio G. Cota
set_init_flags(const char * flags)7883ac1f813SEmilio G. Cota static int set_init_flags(const char *flags)
7893ac1f813SEmilio G. Cota {
7903ac1f813SEmilio G. Cota const char *p;
7913ac1f813SEmilio G. Cota
7923ac1f813SEmilio G. Cota for (p = flags; *p != '\0'; p++) {
7933ac1f813SEmilio G. Cota switch (*p) {
7943ac1f813SEmilio G. Cota case 'v':
7953ac1f813SEmilio G. Cota slow_init_flags |= softfloat_flag_invalid;
7963ac1f813SEmilio G. Cota qemu_init_flags |= float_flag_invalid;
7973ac1f813SEmilio G. Cota break;
7983ac1f813SEmilio G. Cota case 'i':
7993ac1f813SEmilio G. Cota slow_init_flags |= softfloat_flag_infinite;
8003ac1f813SEmilio G. Cota qemu_init_flags |= float_flag_divbyzero;
8013ac1f813SEmilio G. Cota break;
8023ac1f813SEmilio G. Cota case 'o':
8033ac1f813SEmilio G. Cota slow_init_flags |= softfloat_flag_overflow;
8043ac1f813SEmilio G. Cota qemu_init_flags |= float_flag_overflow;
8053ac1f813SEmilio G. Cota break;
8063ac1f813SEmilio G. Cota case 'u':
8073ac1f813SEmilio G. Cota slow_init_flags |= softfloat_flag_underflow;
8083ac1f813SEmilio G. Cota qemu_init_flags |= float_flag_underflow;
8093ac1f813SEmilio G. Cota break;
8103ac1f813SEmilio G. Cota case 'x':
8113ac1f813SEmilio G. Cota slow_init_flags |= softfloat_flag_inexact;
8123ac1f813SEmilio G. Cota qemu_init_flags |= float_flag_inexact;
8133ac1f813SEmilio G. Cota break;
8143ac1f813SEmilio G. Cota default:
8153ac1f813SEmilio G. Cota return 1;
8163ac1f813SEmilio G. Cota }
8173ac1f813SEmilio G. Cota }
8183ac1f813SEmilio G. Cota return 0;
8193ac1f813SEmilio G. Cota }
8203ac1f813SEmilio G. Cota
slow_clear_flags(void)821710fbcd2SEmilio G. Cota static uint_fast8_t slow_clear_flags(void)
8223ac1f813SEmilio G. Cota {
8233ac1f813SEmilio G. Cota uint8_t prev = slowfloat_exceptionFlags;
8243ac1f813SEmilio G. Cota
8253ac1f813SEmilio G. Cota slowfloat_exceptionFlags = slow_init_flags;
8263ac1f813SEmilio G. Cota return prev;
8273ac1f813SEmilio G. Cota }
8283ac1f813SEmilio G. Cota
qemu_clear_flags(void)829710fbcd2SEmilio G. Cota static uint_fast8_t qemu_clear_flags(void)
8303ac1f813SEmilio G. Cota {
8313ac1f813SEmilio G. Cota uint8_t prev = qemu_flags_to_sf(qsf.float_exception_flags);
8323ac1f813SEmilio G. Cota
8333ac1f813SEmilio G. Cota qsf.float_exception_flags = qemu_init_flags;
8343ac1f813SEmilio G. Cota return prev;
8353ac1f813SEmilio G. Cota }
8363ac1f813SEmilio G. Cota
parse_args(int argc,char * argv[])8373ac1f813SEmilio G. Cota static void parse_args(int argc, char *argv[])
8383ac1f813SEmilio G. Cota {
8393ac1f813SEmilio G. Cota unsigned int i;
8403ac1f813SEmilio G. Cota int c;
8413ac1f813SEmilio G. Cota
8423ac1f813SEmilio G. Cota for (;;) {
8436348a546SAlex Bennée c = getopt(argc, argv, "he:f:l:r:sq");
8443ac1f813SEmilio G. Cota if (c < 0) {
8453ac1f813SEmilio G. Cota break;
8463ac1f813SEmilio G. Cota }
8473ac1f813SEmilio G. Cota switch (c) {
8483ac1f813SEmilio G. Cota case 'h':
8493ac1f813SEmilio G. Cota usage_complete(argc, argv);
8503ac1f813SEmilio G. Cota exit(EXIT_SUCCESS);
8513ac1f813SEmilio G. Cota case 'e':
8523ac1f813SEmilio G. Cota if (qemu_strtoui(optarg, NULL, 0, &n_max_errors)) {
8533ac1f813SEmilio G. Cota fprintf(stderr, "fatal: invalid max error count\n");
8543ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
8553ac1f813SEmilio G. Cota }
8563ac1f813SEmilio G. Cota break;
8573ac1f813SEmilio G. Cota case 'f':
8583ac1f813SEmilio G. Cota if (set_init_flags(optarg)) {
8593ac1f813SEmilio G. Cota fprintf(stderr, "fatal: flags must be a subset of 'vioux'\n");
8603ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
8613ac1f813SEmilio G. Cota }
8623ac1f813SEmilio G. Cota break;
8633ac1f813SEmilio G. Cota case 'l':
8643ac1f813SEmilio G. Cota if (qemu_strtoi(optarg, NULL, 0, &test_level)) {
8653ac1f813SEmilio G. Cota fprintf(stderr, "fatal: invalid test level\n");
8663ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
8673ac1f813SEmilio G. Cota }
8683ac1f813SEmilio G. Cota break;
8693ac1f813SEmilio G. Cota case 'r':
8703ac1f813SEmilio G. Cota if (!strcmp(optarg, "all")) {
8713ac1f813SEmilio G. Cota test_round_mode = 0;
8723ac1f813SEmilio G. Cota } else {
8733ac1f813SEmilio G. Cota test_round_mode = round_name_to_mode(optarg);
8743ac1f813SEmilio G. Cota if (test_round_mode == 0) {
8753ac1f813SEmilio G. Cota fprintf(stderr, "fatal: invalid rounding mode\n");
8763ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
8773ac1f813SEmilio G. Cota }
8783ac1f813SEmilio G. Cota }
8793ac1f813SEmilio G. Cota break;
8806348a546SAlex Bennée /*
8816348a546SAlex Bennée * The following flags are declared in testfloat/source/verCases_common.c
8826348a546SAlex Bennée */
8833ac1f813SEmilio G. Cota case 's':
8843ac1f813SEmilio G. Cota verCases_errorStop = true;
8853ac1f813SEmilio G. Cota break;
8866348a546SAlex Bennée case 'q':
8876348a546SAlex Bennée verCases_verbosity = 0;
8886348a546SAlex Bennée break;
8893ac1f813SEmilio G. Cota case '?':
8903ac1f813SEmilio G. Cota /* invalid option or missing argument; getopt prints error info */
8913ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
8923ac1f813SEmilio G. Cota }
8933ac1f813SEmilio G. Cota }
8943ac1f813SEmilio G. Cota
8953ac1f813SEmilio G. Cota /* set rounding modes */
8963ac1f813SEmilio G. Cota if (test_round_mode == 0) {
8973ac1f813SEmilio G. Cota /* test all rounding modes; note that counting begins at 1 */
8983ac1f813SEmilio G. Cota n_round_modes = NUM_ROUNDINGMODES - 1;
8993ac1f813SEmilio G. Cota round_modes = g_malloc_n(n_round_modes, sizeof(*round_modes));
9003ac1f813SEmilio G. Cota for (i = 0; i < n_round_modes; i++) {
9013ac1f813SEmilio G. Cota round_modes[i] = i + 1;
9023ac1f813SEmilio G. Cota }
9033ac1f813SEmilio G. Cota } else {
9043ac1f813SEmilio G. Cota n_round_modes = 1;
9053ac1f813SEmilio G. Cota round_modes = g_malloc(sizeof(*round_modes));
9063ac1f813SEmilio G. Cota round_modes[0] = test_round_mode;
9073ac1f813SEmilio G. Cota }
9083ac1f813SEmilio G. Cota
9093ac1f813SEmilio G. Cota /* set test ops */
9103ac1f813SEmilio G. Cota if (optind == argc) {
9113ac1f813SEmilio G. Cota /* test all ops; note that counting begins at 1 */
9123ac1f813SEmilio G. Cota n_test_ops = NUM_FUNCTIONS - 1;
9133ac1f813SEmilio G. Cota test_ops = g_malloc_n(n_test_ops, sizeof(*test_ops));
9143ac1f813SEmilio G. Cota for (i = 0; i < n_test_ops; i++) {
9153ac1f813SEmilio G. Cota test_ops[i] = i + 1;
9163ac1f813SEmilio G. Cota }
9173ac1f813SEmilio G. Cota } else {
9183ac1f813SEmilio G. Cota n_test_ops = argc - optind;
9193ac1f813SEmilio G. Cota test_ops = g_malloc_n(n_test_ops, sizeof(*test_ops));
9203ac1f813SEmilio G. Cota for (i = 0; i < n_test_ops; i++) {
9213ac1f813SEmilio G. Cota const char *name = argv[i + optind];
9223ac1f813SEmilio G. Cota unsigned int op = test_name_to_op(name);
9233ac1f813SEmilio G. Cota
9243ac1f813SEmilio G. Cota if (op == 0) {
9253ac1f813SEmilio G. Cota fprintf(stderr, "fatal: invalid op '%s'\n", name);
9263ac1f813SEmilio G. Cota exit(EXIT_FAILURE);
9273ac1f813SEmilio G. Cota }
9283ac1f813SEmilio G. Cota test_ops[i] = op;
9293ac1f813SEmilio G. Cota }
9303ac1f813SEmilio G. Cota }
9313ac1f813SEmilio G. Cota }
9323ac1f813SEmilio G. Cota
9338905770bSMarc-André Lureau static G_NORETURN
run_test(void)9348905770bSMarc-André Lureau void run_test(void)
9353ac1f813SEmilio G. Cota {
9363ac1f813SEmilio G. Cota unsigned int i;
9373ac1f813SEmilio G. Cota
938*d22c9949SPeter Maydell set_float_2nan_prop_rule(float_2nan_prop_s_ab, &qsf);
939*d22c9949SPeter Maydell
9403ac1f813SEmilio G. Cota genCases_setLevel(test_level);
9413ac1f813SEmilio G. Cota verCases_maxErrorCount = n_max_errors;
9423ac1f813SEmilio G. Cota
9433ac1f813SEmilio G. Cota testLoops_trueFlagsFunction = slow_clear_flags;
9443ac1f813SEmilio G. Cota testLoops_subjFlagsFunction = qemu_clear_flags;
9453ac1f813SEmilio G. Cota
9463ac1f813SEmilio G. Cota for (i = 0; i < n_test_ops; i++) {
9473ac1f813SEmilio G. Cota unsigned int op = test_ops[i];
9483ac1f813SEmilio G. Cota int j;
9493ac1f813SEmilio G. Cota
9503ac1f813SEmilio G. Cota if (functionInfos[op].namePtr == NULL) {
9513ac1f813SEmilio G. Cota continue;
9523ac1f813SEmilio G. Cota }
9533ac1f813SEmilio G. Cota verCases_functionNamePtr = functionInfos[op].namePtr;
9543ac1f813SEmilio G. Cota
9553ac1f813SEmilio G. Cota for (j = 0; j < n_round_modes; j++) {
9563ac1f813SEmilio G. Cota int attrs = functionInfos[op].attribs;
9573ac1f813SEmilio G. Cota int round = round_modes[j];
9583ac1f813SEmilio G. Cota int rmode = roundingModes[round];
9593ac1f813SEmilio G. Cota int k;
9603ac1f813SEmilio G. Cota
9613ac1f813SEmilio G. Cota verCases_roundingCode = 0;
9623ac1f813SEmilio G. Cota slowfloat_roundingMode = rmode;
9633ac1f813SEmilio G. Cota qsf.float_rounding_mode = sf_rounding_to_qemu(rmode);
9643ac1f813SEmilio G. Cota
9653ac1f813SEmilio G. Cota if (attrs & (FUNC_ARG_ROUNDINGMODE | FUNC_EFF_ROUNDINGMODE)) {
9663ac1f813SEmilio G. Cota /* print rounding mode if the op is affected by it */
9673ac1f813SEmilio G. Cota verCases_roundingCode = round;
9683ac1f813SEmilio G. Cota } else if (j > 0) {
9693ac1f813SEmilio G. Cota /* if the op is not sensitive to rounding, move on */
9703ac1f813SEmilio G. Cota break;
9713ac1f813SEmilio G. Cota }
9723ac1f813SEmilio G. Cota
9733ac1f813SEmilio G. Cota /* QEMU doesn't have !exact */
9743ac1f813SEmilio G. Cota verCases_exact = true;
9753ac1f813SEmilio G. Cota verCases_usesExact = !!(attrs & FUNC_ARG_EXACT);
9763ac1f813SEmilio G. Cota
9773ac1f813SEmilio G. Cota for (k = 0; k < 3; k++) {
9787ccae4ceSRichard Henderson FloatX80RoundPrec qsf_prec80 = floatx80_precision_x;
9797ccae4ceSRichard Henderson int prec80 = 80;
9803ac1f813SEmilio G. Cota int l;
9813ac1f813SEmilio G. Cota
9823ac1f813SEmilio G. Cota if (k == 1) {
9833ac1f813SEmilio G. Cota prec80 = 64;
9848da5f1dbSRichard Henderson qsf_prec80 = floatx80_precision_d;
9853ac1f813SEmilio G. Cota } else if (k == 2) {
9867ccae4ceSRichard Henderson prec80 = 32;
9877ccae4ceSRichard Henderson qsf_prec80 = floatx80_precision_s;
9883ac1f813SEmilio G. Cota }
9893ac1f813SEmilio G. Cota
9903ac1f813SEmilio G. Cota verCases_roundingPrecision = 0;
9913ac1f813SEmilio G. Cota slow_extF80_roundingPrecision = prec80;
9928da5f1dbSRichard Henderson qsf.floatx80_rounding_precision = qsf_prec80;
9933ac1f813SEmilio G. Cota
9943ac1f813SEmilio G. Cota if (attrs & FUNC_EFF_ROUNDINGPRECISION) {
9953ac1f813SEmilio G. Cota verCases_roundingPrecision = prec80;
9963ac1f813SEmilio G. Cota } else if (k > 0) {
9973ac1f813SEmilio G. Cota /* if the op is not sensitive to prec80, move on */
9983ac1f813SEmilio G. Cota break;
9993ac1f813SEmilio G. Cota }
10003ac1f813SEmilio G. Cota
10013ac1f813SEmilio G. Cota /* note: the count begins at 1 */
10023ac1f813SEmilio G. Cota for (l = 1; l < NUM_TININESSMODES; l++) {
10033ac1f813SEmilio G. Cota int tmode = tininessModes[l];
10043ac1f813SEmilio G. Cota
10053ac1f813SEmilio G. Cota verCases_tininessCode = 0;
10063ac1f813SEmilio G. Cota slowfloat_detectTininess = tmode;
1007a828b373SRichard Henderson qsf.tininess_before_rounding = sf_tininess_to_qemu(tmode);
10083ac1f813SEmilio G. Cota
10093ac1f813SEmilio G. Cota if (attrs & FUNC_EFF_TININESSMODE ||
10103ac1f813SEmilio G. Cota ((attrs & FUNC_EFF_TININESSMODE_REDUCEDPREC) &&
10113ac1f813SEmilio G. Cota prec80 && prec80 < 80)) {
10123ac1f813SEmilio G. Cota verCases_tininessCode = l;
10133ac1f813SEmilio G. Cota } else if (l > 1) {
10143ac1f813SEmilio G. Cota /* if the op is not sensitive to tininess, move on */
10153ac1f813SEmilio G. Cota break;
10163ac1f813SEmilio G. Cota }
10173ac1f813SEmilio G. Cota
10183ac1f813SEmilio G. Cota do_testfloat(op, rmode, true);
10193ac1f813SEmilio G. Cota }
10203ac1f813SEmilio G. Cota }
10213ac1f813SEmilio G. Cota }
10223ac1f813SEmilio G. Cota }
10233ac1f813SEmilio G. Cota verCases_exitWithStatus();
10243ac1f813SEmilio G. Cota /* old compilers might miss that we exited */
10253ac1f813SEmilio G. Cota g_assert_not_reached();
10263ac1f813SEmilio G. Cota }
10273ac1f813SEmilio G. Cota
main(int argc,char * argv[])10283ac1f813SEmilio G. Cota int main(int argc, char *argv[])
10293ac1f813SEmilio G. Cota {
10303ac1f813SEmilio G. Cota parse_args(argc, argv);
10313ac1f813SEmilio G. Cota fail_programName = argv[0];
10323ac1f813SEmilio G. Cota run_test(); /* does not return */
10333ac1f813SEmilio G. Cota }
1034