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