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 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 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 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 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 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 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 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 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 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 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 9348905770bSMarc-André Lureau void run_test(void) 9353ac1f813SEmilio G. Cota { 9363ac1f813SEmilio G. Cota unsigned int i; 9373ac1f813SEmilio G. Cota 93827aedf7dSPeter Maydell /* 93927aedf7dSPeter Maydell * These implementation-defined choices for various things IEEE 94027aedf7dSPeter Maydell * doesn't specify match those used by the Arm architecture. 94127aedf7dSPeter Maydell */ 942d22c9949SPeter Maydell set_float_2nan_prop_rule(float_2nan_prop_s_ab, &qsf); 94343e51128SPeter Maydell set_float_3nan_prop_rule(float_3nan_prop_s_cab, &qsf); 944*a264fd5aSPeter Maydell set_float_default_nan_pattern(0b01000000, &qsf); 94527aedf7dSPeter Maydell set_float_infzeronan_rule(float_infzeronan_dnan_if_qnan, &qsf); 946d22c9949SPeter Maydell 9473ac1f813SEmilio G. Cota genCases_setLevel(test_level); 9483ac1f813SEmilio G. Cota verCases_maxErrorCount = n_max_errors; 9493ac1f813SEmilio G. Cota 9503ac1f813SEmilio G. Cota testLoops_trueFlagsFunction = slow_clear_flags; 9513ac1f813SEmilio G. Cota testLoops_subjFlagsFunction = qemu_clear_flags; 9523ac1f813SEmilio G. Cota 9533ac1f813SEmilio G. Cota for (i = 0; i < n_test_ops; i++) { 9543ac1f813SEmilio G. Cota unsigned int op = test_ops[i]; 9553ac1f813SEmilio G. Cota int j; 9563ac1f813SEmilio G. Cota 9573ac1f813SEmilio G. Cota if (functionInfos[op].namePtr == NULL) { 9583ac1f813SEmilio G. Cota continue; 9593ac1f813SEmilio G. Cota } 9603ac1f813SEmilio G. Cota verCases_functionNamePtr = functionInfos[op].namePtr; 9613ac1f813SEmilio G. Cota 9623ac1f813SEmilio G. Cota for (j = 0; j < n_round_modes; j++) { 9633ac1f813SEmilio G. Cota int attrs = functionInfos[op].attribs; 9643ac1f813SEmilio G. Cota int round = round_modes[j]; 9653ac1f813SEmilio G. Cota int rmode = roundingModes[round]; 9663ac1f813SEmilio G. Cota int k; 9673ac1f813SEmilio G. Cota 9683ac1f813SEmilio G. Cota verCases_roundingCode = 0; 9693ac1f813SEmilio G. Cota slowfloat_roundingMode = rmode; 9703ac1f813SEmilio G. Cota qsf.float_rounding_mode = sf_rounding_to_qemu(rmode); 9713ac1f813SEmilio G. Cota 9723ac1f813SEmilio G. Cota if (attrs & (FUNC_ARG_ROUNDINGMODE | FUNC_EFF_ROUNDINGMODE)) { 9733ac1f813SEmilio G. Cota /* print rounding mode if the op is affected by it */ 9743ac1f813SEmilio G. Cota verCases_roundingCode = round; 9753ac1f813SEmilio G. Cota } else if (j > 0) { 9763ac1f813SEmilio G. Cota /* if the op is not sensitive to rounding, move on */ 9773ac1f813SEmilio G. Cota break; 9783ac1f813SEmilio G. Cota } 9793ac1f813SEmilio G. Cota 9803ac1f813SEmilio G. Cota /* QEMU doesn't have !exact */ 9813ac1f813SEmilio G. Cota verCases_exact = true; 9823ac1f813SEmilio G. Cota verCases_usesExact = !!(attrs & FUNC_ARG_EXACT); 9833ac1f813SEmilio G. Cota 9843ac1f813SEmilio G. Cota for (k = 0; k < 3; k++) { 9857ccae4ceSRichard Henderson FloatX80RoundPrec qsf_prec80 = floatx80_precision_x; 9867ccae4ceSRichard Henderson int prec80 = 80; 9873ac1f813SEmilio G. Cota int l; 9883ac1f813SEmilio G. Cota 9893ac1f813SEmilio G. Cota if (k == 1) { 9903ac1f813SEmilio G. Cota prec80 = 64; 9918da5f1dbSRichard Henderson qsf_prec80 = floatx80_precision_d; 9923ac1f813SEmilio G. Cota } else if (k == 2) { 9937ccae4ceSRichard Henderson prec80 = 32; 9947ccae4ceSRichard Henderson qsf_prec80 = floatx80_precision_s; 9953ac1f813SEmilio G. Cota } 9963ac1f813SEmilio G. Cota 9973ac1f813SEmilio G. Cota verCases_roundingPrecision = 0; 9983ac1f813SEmilio G. Cota slow_extF80_roundingPrecision = prec80; 9998da5f1dbSRichard Henderson qsf.floatx80_rounding_precision = qsf_prec80; 10003ac1f813SEmilio G. Cota 10013ac1f813SEmilio G. Cota if (attrs & FUNC_EFF_ROUNDINGPRECISION) { 10023ac1f813SEmilio G. Cota verCases_roundingPrecision = prec80; 10033ac1f813SEmilio G. Cota } else if (k > 0) { 10043ac1f813SEmilio G. Cota /* if the op is not sensitive to prec80, move on */ 10053ac1f813SEmilio G. Cota break; 10063ac1f813SEmilio G. Cota } 10073ac1f813SEmilio G. Cota 10083ac1f813SEmilio G. Cota /* note: the count begins at 1 */ 10093ac1f813SEmilio G. Cota for (l = 1; l < NUM_TININESSMODES; l++) { 10103ac1f813SEmilio G. Cota int tmode = tininessModes[l]; 10113ac1f813SEmilio G. Cota 10123ac1f813SEmilio G. Cota verCases_tininessCode = 0; 10133ac1f813SEmilio G. Cota slowfloat_detectTininess = tmode; 1014a828b373SRichard Henderson qsf.tininess_before_rounding = sf_tininess_to_qemu(tmode); 10153ac1f813SEmilio G. Cota 10163ac1f813SEmilio G. Cota if (attrs & FUNC_EFF_TININESSMODE || 10173ac1f813SEmilio G. Cota ((attrs & FUNC_EFF_TININESSMODE_REDUCEDPREC) && 10183ac1f813SEmilio G. Cota prec80 && prec80 < 80)) { 10193ac1f813SEmilio G. Cota verCases_tininessCode = l; 10203ac1f813SEmilio G. Cota } else if (l > 1) { 10213ac1f813SEmilio G. Cota /* if the op is not sensitive to tininess, move on */ 10223ac1f813SEmilio G. Cota break; 10233ac1f813SEmilio G. Cota } 10243ac1f813SEmilio G. Cota 10253ac1f813SEmilio G. Cota do_testfloat(op, rmode, true); 10263ac1f813SEmilio G. Cota } 10273ac1f813SEmilio G. Cota } 10283ac1f813SEmilio G. Cota } 10293ac1f813SEmilio G. Cota } 10303ac1f813SEmilio G. Cota verCases_exitWithStatus(); 10313ac1f813SEmilio G. Cota /* old compilers might miss that we exited */ 10323ac1f813SEmilio G. Cota g_assert_not_reached(); 10333ac1f813SEmilio G. Cota } 10343ac1f813SEmilio G. Cota 10353ac1f813SEmilio G. Cota int main(int argc, char *argv[]) 10363ac1f813SEmilio G. Cota { 10373ac1f813SEmilio G. Cota parse_args(argc, argv); 10383ac1f813SEmilio G. Cota fail_programName = argv[0]; 10393ac1f813SEmilio G. Cota run_test(); /* does not return */ 10403ac1f813SEmilio G. Cota } 1041