17b77f048SAleksandar Markovic /* 27b77f048SAleksandar Markovic * Helpers for emulation of FPU-related MIPS instructions. 37b77f048SAleksandar Markovic * 47b77f048SAleksandar Markovic * Copyright (C) 2004-2005 Jocelyn Mayer 57b77f048SAleksandar Markovic * Copyright (C) 2020 Wave Computing, Inc. 67b77f048SAleksandar Markovic * Copyright (C) 2020 Aleksandar Markovic <amarkovic@wavecomp.com> 77b77f048SAleksandar Markovic * 87b77f048SAleksandar Markovic * This library is free software; you can redistribute it and/or 97b77f048SAleksandar Markovic * modify it under the terms of the GNU Lesser General Public 107b77f048SAleksandar Markovic * License as published by the Free Software Foundation; either 117b77f048SAleksandar Markovic * version 2 of the License, or (at your option) any later version. 127b77f048SAleksandar Markovic * 137b77f048SAleksandar Markovic * This library is distributed in the hope that it will be useful, 147b77f048SAleksandar Markovic * but WITHOUT ANY WARRANTY; without even the implied warranty of 157b77f048SAleksandar Markovic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 167b77f048SAleksandar Markovic * Lesser General Public License for more details. 177b77f048SAleksandar Markovic * 187b77f048SAleksandar Markovic * You should have received a copy of the GNU Lesser General Public 197b77f048SAleksandar Markovic * License along with this library; if not, see <http://www.gnu.org/licenses/>. 207b77f048SAleksandar Markovic * 217b77f048SAleksandar Markovic */ 227b77f048SAleksandar Markovic 237b77f048SAleksandar Markovic #include "qemu/osdep.h" 247b77f048SAleksandar Markovic #include "qemu/main-loop.h" 257b77f048SAleksandar Markovic #include "cpu.h" 267b77f048SAleksandar Markovic #include "internal.h" 277b77f048SAleksandar Markovic #include "qemu/host-utils.h" 287b77f048SAleksandar Markovic #include "exec/helper-proto.h" 297b77f048SAleksandar Markovic #include "exec/exec-all.h" 307b77f048SAleksandar Markovic #include "exec/cpu_ldst.h" 317b77f048SAleksandar Markovic #include "exec/memop.h" 327b77f048SAleksandar Markovic #include "sysemu/kvm.h" 337b77f048SAleksandar Markovic #include "fpu/softfloat.h" 347b77f048SAleksandar Markovic 357b77f048SAleksandar Markovic 367b77f048SAleksandar Markovic /* Complex FPU operations which may need stack space. */ 377b77f048SAleksandar Markovic 387b77f048SAleksandar Markovic #define FLOAT_TWO32 make_float32(1 << 30) 397b77f048SAleksandar Markovic #define FLOAT_TWO64 make_float64(1ULL << 62) 407b77f048SAleksandar Markovic 417b77f048SAleksandar Markovic #define FP_TO_INT32_OVERFLOW 0x7fffffff 427b77f048SAleksandar Markovic #define FP_TO_INT64_OVERFLOW 0x7fffffffffffffffULL 437b77f048SAleksandar Markovic 447b77f048SAleksandar Markovic /* convert MIPS rounding mode in FCR31 to IEEE library */ 457b77f048SAleksandar Markovic unsigned int ieee_rm[] = { 467b77f048SAleksandar Markovic float_round_nearest_even, 477b77f048SAleksandar Markovic float_round_to_zero, 487b77f048SAleksandar Markovic float_round_up, 497b77f048SAleksandar Markovic float_round_down 507b77f048SAleksandar Markovic }; 517b77f048SAleksandar Markovic 527b77f048SAleksandar Markovic target_ulong helper_cfc1(CPUMIPSState *env, uint32_t reg) 537b77f048SAleksandar Markovic { 547b77f048SAleksandar Markovic target_ulong arg1 = 0; 557b77f048SAleksandar Markovic 567b77f048SAleksandar Markovic switch (reg) { 577b77f048SAleksandar Markovic case 0: 587b77f048SAleksandar Markovic arg1 = (int32_t)env->active_fpu.fcr0; 597b77f048SAleksandar Markovic break; 607b77f048SAleksandar Markovic case 1: 617b77f048SAleksandar Markovic /* UFR Support - Read Status FR */ 627b77f048SAleksandar Markovic if (env->active_fpu.fcr0 & (1 << FCR0_UFRP)) { 637b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFR)) { 647b77f048SAleksandar Markovic arg1 = (int32_t) 657b77f048SAleksandar Markovic ((env->CP0_Status & (1 << CP0St_FR)) >> CP0St_FR); 667b77f048SAleksandar Markovic } else { 677b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC()); 687b77f048SAleksandar Markovic } 697b77f048SAleksandar Markovic } 707b77f048SAleksandar Markovic break; 717b77f048SAleksandar Markovic case 5: 727b77f048SAleksandar Markovic /* FRE Support - read Config5.FRE bit */ 737b77f048SAleksandar Markovic if (env->active_fpu.fcr0 & (1 << FCR0_FREP)) { 747b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFE)) { 757b77f048SAleksandar Markovic arg1 = (env->CP0_Config5 >> CP0C5_FRE) & 1; 767b77f048SAleksandar Markovic } else { 777b77f048SAleksandar Markovic helper_raise_exception(env, EXCP_RI); 787b77f048SAleksandar Markovic } 797b77f048SAleksandar Markovic } 807b77f048SAleksandar Markovic break; 817b77f048SAleksandar Markovic case 25: 827b77f048SAleksandar Markovic arg1 = ((env->active_fpu.fcr31 >> 24) & 0xfe) | 837b77f048SAleksandar Markovic ((env->active_fpu.fcr31 >> 23) & 0x1); 847b77f048SAleksandar Markovic break; 857b77f048SAleksandar Markovic case 26: 867b77f048SAleksandar Markovic arg1 = env->active_fpu.fcr31 & 0x0003f07c; 877b77f048SAleksandar Markovic break; 887b77f048SAleksandar Markovic case 28: 897b77f048SAleksandar Markovic arg1 = (env->active_fpu.fcr31 & 0x00000f83) | 907b77f048SAleksandar Markovic ((env->active_fpu.fcr31 >> 22) & 0x4); 917b77f048SAleksandar Markovic break; 927b77f048SAleksandar Markovic default: 937b77f048SAleksandar Markovic arg1 = (int32_t)env->active_fpu.fcr31; 947b77f048SAleksandar Markovic break; 957b77f048SAleksandar Markovic } 967b77f048SAleksandar Markovic 977b77f048SAleksandar Markovic return arg1; 987b77f048SAleksandar Markovic } 997b77f048SAleksandar Markovic 1007b77f048SAleksandar Markovic void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t fs, uint32_t rt) 1017b77f048SAleksandar Markovic { 1027b77f048SAleksandar Markovic switch (fs) { 1037b77f048SAleksandar Markovic case 1: 1047b77f048SAleksandar Markovic /* UFR Alias - Reset Status FR */ 1057b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_UFRP)) && (rt == 0))) { 1067b77f048SAleksandar Markovic return; 1077b77f048SAleksandar Markovic } 1087b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFR)) { 1097b77f048SAleksandar Markovic env->CP0_Status &= ~(1 << CP0St_FR); 1107b77f048SAleksandar Markovic compute_hflags(env); 1117b77f048SAleksandar Markovic } else { 1127b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC()); 1137b77f048SAleksandar Markovic } 1147b77f048SAleksandar Markovic break; 1157b77f048SAleksandar Markovic case 4: 1167b77f048SAleksandar Markovic /* UNFR Alias - Set Status FR */ 1177b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_UFRP)) && (rt == 0))) { 1187b77f048SAleksandar Markovic return; 1197b77f048SAleksandar Markovic } 1207b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFR)) { 1217b77f048SAleksandar Markovic env->CP0_Status |= (1 << CP0St_FR); 1227b77f048SAleksandar Markovic compute_hflags(env); 1237b77f048SAleksandar Markovic } else { 1247b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC()); 1257b77f048SAleksandar Markovic } 1267b77f048SAleksandar Markovic break; 1277b77f048SAleksandar Markovic case 5: 1287b77f048SAleksandar Markovic /* FRE Support - clear Config5.FRE bit */ 1297b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_FREP)) && (rt == 0))) { 1307b77f048SAleksandar Markovic return; 1317b77f048SAleksandar Markovic } 1327b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFE)) { 1337b77f048SAleksandar Markovic env->CP0_Config5 &= ~(1 << CP0C5_FRE); 1347b77f048SAleksandar Markovic compute_hflags(env); 1357b77f048SAleksandar Markovic } else { 1367b77f048SAleksandar Markovic helper_raise_exception(env, EXCP_RI); 1377b77f048SAleksandar Markovic } 1387b77f048SAleksandar Markovic break; 1397b77f048SAleksandar Markovic case 6: 1407b77f048SAleksandar Markovic /* FRE Support - set Config5.FRE bit */ 1417b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_FREP)) && (rt == 0))) { 1427b77f048SAleksandar Markovic return; 1437b77f048SAleksandar Markovic } 1447b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFE)) { 1457b77f048SAleksandar Markovic env->CP0_Config5 |= (1 << CP0C5_FRE); 1467b77f048SAleksandar Markovic compute_hflags(env); 1477b77f048SAleksandar Markovic } else { 1487b77f048SAleksandar Markovic helper_raise_exception(env, EXCP_RI); 1497b77f048SAleksandar Markovic } 1507b77f048SAleksandar Markovic break; 1517b77f048SAleksandar Markovic case 25: 1527b77f048SAleksandar Markovic if ((env->insn_flags & ISA_MIPS32R6) || (arg1 & 0xffffff00)) { 1537b77f048SAleksandar Markovic return; 1547b77f048SAleksandar Markovic } 1557b77f048SAleksandar Markovic env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0x017fffff) | 1567b77f048SAleksandar Markovic ((arg1 & 0xfe) << 24) | 1577b77f048SAleksandar Markovic ((arg1 & 0x1) << 23); 1587b77f048SAleksandar Markovic break; 1597b77f048SAleksandar Markovic case 26: 1607b77f048SAleksandar Markovic if (arg1 & 0x007c0000) { 1617b77f048SAleksandar Markovic return; 1627b77f048SAleksandar Markovic } 1637b77f048SAleksandar Markovic env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfffc0f83) | 1647b77f048SAleksandar Markovic (arg1 & 0x0003f07c); 1657b77f048SAleksandar Markovic break; 1667b77f048SAleksandar Markovic case 28: 1677b77f048SAleksandar Markovic if (arg1 & 0x007c0000) { 1687b77f048SAleksandar Markovic return; 1697b77f048SAleksandar Markovic } 1707b77f048SAleksandar Markovic env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfefff07c) | 1717b77f048SAleksandar Markovic (arg1 & 0x00000f83) | 1727b77f048SAleksandar Markovic ((arg1 & 0x4) << 22); 1737b77f048SAleksandar Markovic break; 1747b77f048SAleksandar Markovic case 31: 1757b77f048SAleksandar Markovic env->active_fpu.fcr31 = (arg1 & env->active_fpu.fcr31_rw_bitmask) | 1767b77f048SAleksandar Markovic (env->active_fpu.fcr31 & ~(env->active_fpu.fcr31_rw_bitmask)); 1777b77f048SAleksandar Markovic break; 1787b77f048SAleksandar Markovic default: 1797b77f048SAleksandar Markovic if (env->insn_flags & ISA_MIPS32R6) { 1807b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC()); 1817b77f048SAleksandar Markovic } 1827b77f048SAleksandar Markovic return; 1837b77f048SAleksandar Markovic } 1847b77f048SAleksandar Markovic restore_fp_status(env); 1857b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status); 1867b77f048SAleksandar Markovic if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & 1877b77f048SAleksandar Markovic GET_FP_CAUSE(env->active_fpu.fcr31)) { 1887b77f048SAleksandar Markovic do_raise_exception(env, EXCP_FPE, GETPC()); 1897b77f048SAleksandar Markovic } 1907b77f048SAleksandar Markovic } 1917b77f048SAleksandar Markovic 1927b77f048SAleksandar Markovic int ieee_ex_to_mips(int xcpt) 1937b77f048SAleksandar Markovic { 1947b77f048SAleksandar Markovic int ret = 0; 1957b77f048SAleksandar Markovic if (xcpt) { 1967b77f048SAleksandar Markovic if (xcpt & float_flag_invalid) { 1977b77f048SAleksandar Markovic ret |= FP_INVALID; 1987b77f048SAleksandar Markovic } 1997b77f048SAleksandar Markovic if (xcpt & float_flag_overflow) { 2007b77f048SAleksandar Markovic ret |= FP_OVERFLOW; 2017b77f048SAleksandar Markovic } 2027b77f048SAleksandar Markovic if (xcpt & float_flag_underflow) { 2037b77f048SAleksandar Markovic ret |= FP_UNDERFLOW; 2047b77f048SAleksandar Markovic } 2057b77f048SAleksandar Markovic if (xcpt & float_flag_divbyzero) { 2067b77f048SAleksandar Markovic ret |= FP_DIV0; 2077b77f048SAleksandar Markovic } 2087b77f048SAleksandar Markovic if (xcpt & float_flag_inexact) { 2097b77f048SAleksandar Markovic ret |= FP_INEXACT; 2107b77f048SAleksandar Markovic } 2117b77f048SAleksandar Markovic } 2127b77f048SAleksandar Markovic return ret; 2137b77f048SAleksandar Markovic } 2147b77f048SAleksandar Markovic 2157b77f048SAleksandar Markovic static inline void update_fcr31(CPUMIPSState *env, uintptr_t pc) 2167b77f048SAleksandar Markovic { 2177b77f048SAleksandar Markovic int tmp = ieee_ex_to_mips(get_float_exception_flags( 2187b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 2197b77f048SAleksandar Markovic 2207b77f048SAleksandar Markovic SET_FP_CAUSE(env->active_fpu.fcr31, tmp); 2217b77f048SAleksandar Markovic 2227b77f048SAleksandar Markovic if (tmp) { 2237b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status); 2247b77f048SAleksandar Markovic 2257b77f048SAleksandar Markovic if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp) { 2267b77f048SAleksandar Markovic do_raise_exception(env, EXCP_FPE, pc); 2277b77f048SAleksandar Markovic } else { 2287b77f048SAleksandar Markovic UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp); 2297b77f048SAleksandar Markovic } 2307b77f048SAleksandar Markovic } 2317b77f048SAleksandar Markovic } 2327b77f048SAleksandar Markovic 2337b77f048SAleksandar Markovic /* 2347b77f048SAleksandar Markovic * Float support. 2357b77f048SAleksandar Markovic * Single precition routines have a "s" suffix, double precision a 2367b77f048SAleksandar Markovic * "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps", 2377b77f048SAleksandar Markovic * paired single lower "pl", paired single upper "pu". 2387b77f048SAleksandar Markovic */ 2397b77f048SAleksandar Markovic 2407b77f048SAleksandar Markovic /* unary operations, modifying fp status */ 2417b77f048SAleksandar Markovic uint64_t helper_float_sqrt_d(CPUMIPSState *env, uint64_t fdt0) 2427b77f048SAleksandar Markovic { 2437b77f048SAleksandar Markovic fdt0 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 2447b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2457b77f048SAleksandar Markovic return fdt0; 2467b77f048SAleksandar Markovic } 2477b77f048SAleksandar Markovic 2487b77f048SAleksandar Markovic uint32_t helper_float_sqrt_s(CPUMIPSState *env, uint32_t fst0) 2497b77f048SAleksandar Markovic { 2507b77f048SAleksandar Markovic fst0 = float32_sqrt(fst0, &env->active_fpu.fp_status); 2517b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2527b77f048SAleksandar Markovic return fst0; 2537b77f048SAleksandar Markovic } 2547b77f048SAleksandar Markovic 2557b77f048SAleksandar Markovic uint64_t helper_float_cvtd_s(CPUMIPSState *env, uint32_t fst0) 2567b77f048SAleksandar Markovic { 2577b77f048SAleksandar Markovic uint64_t fdt2; 2587b77f048SAleksandar Markovic 2597b77f048SAleksandar Markovic fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); 2607b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2617b77f048SAleksandar Markovic return fdt2; 2627b77f048SAleksandar Markovic } 2637b77f048SAleksandar Markovic 2647b77f048SAleksandar Markovic uint64_t helper_float_cvtd_w(CPUMIPSState *env, uint32_t wt0) 2657b77f048SAleksandar Markovic { 2667b77f048SAleksandar Markovic uint64_t fdt2; 2677b77f048SAleksandar Markovic 2687b77f048SAleksandar Markovic fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); 2697b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2707b77f048SAleksandar Markovic return fdt2; 2717b77f048SAleksandar Markovic } 2727b77f048SAleksandar Markovic 2737b77f048SAleksandar Markovic uint64_t helper_float_cvtd_l(CPUMIPSState *env, uint64_t dt0) 2747b77f048SAleksandar Markovic { 2757b77f048SAleksandar Markovic uint64_t fdt2; 2767b77f048SAleksandar Markovic 2777b77f048SAleksandar Markovic fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); 2787b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2797b77f048SAleksandar Markovic return fdt2; 2807b77f048SAleksandar Markovic } 2817b77f048SAleksandar Markovic 2827b77f048SAleksandar Markovic uint64_t helper_float_cvt_l_d(CPUMIPSState *env, uint64_t fdt0) 2837b77f048SAleksandar Markovic { 2847b77f048SAleksandar Markovic uint64_t dt2; 2857b77f048SAleksandar Markovic 2867b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 2877b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 2887b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 2897b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 2907b77f048SAleksandar Markovic } 2917b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2927b77f048SAleksandar Markovic return dt2; 2937b77f048SAleksandar Markovic } 2947b77f048SAleksandar Markovic 2957b77f048SAleksandar Markovic uint64_t helper_float_cvt_l_s(CPUMIPSState *env, uint32_t fst0) 2967b77f048SAleksandar Markovic { 2977b77f048SAleksandar Markovic uint64_t dt2; 2987b77f048SAleksandar Markovic 2997b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 3007b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 3017b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 3027b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 3037b77f048SAleksandar Markovic } 3047b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3057b77f048SAleksandar Markovic return dt2; 3067b77f048SAleksandar Markovic } 3077b77f048SAleksandar Markovic 3087b77f048SAleksandar Markovic uint64_t helper_float_cvtps_pw(CPUMIPSState *env, uint64_t dt0) 3097b77f048SAleksandar Markovic { 3107b77f048SAleksandar Markovic uint32_t fst2; 3117b77f048SAleksandar Markovic uint32_t fsth2; 3127b77f048SAleksandar Markovic 3137b77f048SAleksandar Markovic fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 3147b77f048SAleksandar Markovic fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status); 3157b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3167b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 3177b77f048SAleksandar Markovic } 3187b77f048SAleksandar Markovic 3197b77f048SAleksandar Markovic uint64_t helper_float_cvtpw_ps(CPUMIPSState *env, uint64_t fdt0) 3207b77f048SAleksandar Markovic { 3217b77f048SAleksandar Markovic uint32_t wt2; 3227b77f048SAleksandar Markovic uint32_t wth2; 3237b77f048SAleksandar Markovic int excp, excph; 3247b77f048SAleksandar Markovic 3257b77f048SAleksandar Markovic wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 3267b77f048SAleksandar Markovic excp = get_float_exception_flags(&env->active_fpu.fp_status); 3277b77f048SAleksandar Markovic if (excp & (float_flag_overflow | float_flag_invalid)) { 3287b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 3297b77f048SAleksandar Markovic } 3307b77f048SAleksandar Markovic 3317b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status); 3327b77f048SAleksandar Markovic wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status); 3337b77f048SAleksandar Markovic excph = get_float_exception_flags(&env->active_fpu.fp_status); 3347b77f048SAleksandar Markovic if (excph & (float_flag_overflow | float_flag_invalid)) { 3357b77f048SAleksandar Markovic wth2 = FP_TO_INT32_OVERFLOW; 3367b77f048SAleksandar Markovic } 3377b77f048SAleksandar Markovic 3387b77f048SAleksandar Markovic set_float_exception_flags(excp | excph, &env->active_fpu.fp_status); 3397b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3407b77f048SAleksandar Markovic 3417b77f048SAleksandar Markovic return ((uint64_t)wth2 << 32) | wt2; 3427b77f048SAleksandar Markovic } 3437b77f048SAleksandar Markovic 3447b77f048SAleksandar Markovic uint32_t helper_float_cvts_d(CPUMIPSState *env, uint64_t fdt0) 3457b77f048SAleksandar Markovic { 3467b77f048SAleksandar Markovic uint32_t fst2; 3477b77f048SAleksandar Markovic 3487b77f048SAleksandar Markovic fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); 3497b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3507b77f048SAleksandar Markovic return fst2; 3517b77f048SAleksandar Markovic } 3527b77f048SAleksandar Markovic 3537b77f048SAleksandar Markovic uint32_t helper_float_cvts_w(CPUMIPSState *env, uint32_t wt0) 3547b77f048SAleksandar Markovic { 3557b77f048SAleksandar Markovic uint32_t fst2; 3567b77f048SAleksandar Markovic 3577b77f048SAleksandar Markovic fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); 3587b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3597b77f048SAleksandar Markovic return fst2; 3607b77f048SAleksandar Markovic } 3617b77f048SAleksandar Markovic 3627b77f048SAleksandar Markovic uint32_t helper_float_cvts_l(CPUMIPSState *env, uint64_t dt0) 3637b77f048SAleksandar Markovic { 3647b77f048SAleksandar Markovic uint32_t fst2; 3657b77f048SAleksandar Markovic 3667b77f048SAleksandar Markovic fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); 3677b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3687b77f048SAleksandar Markovic return fst2; 3697b77f048SAleksandar Markovic } 3707b77f048SAleksandar Markovic 3717b77f048SAleksandar Markovic uint32_t helper_float_cvts_pl(CPUMIPSState *env, uint32_t wt0) 3727b77f048SAleksandar Markovic { 3737b77f048SAleksandar Markovic uint32_t wt2; 3747b77f048SAleksandar Markovic 3757b77f048SAleksandar Markovic wt2 = wt0; 3767b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3777b77f048SAleksandar Markovic return wt2; 3787b77f048SAleksandar Markovic } 3797b77f048SAleksandar Markovic 3807b77f048SAleksandar Markovic uint32_t helper_float_cvts_pu(CPUMIPSState *env, uint32_t wth0) 3817b77f048SAleksandar Markovic { 3827b77f048SAleksandar Markovic uint32_t wt2; 3837b77f048SAleksandar Markovic 3847b77f048SAleksandar Markovic wt2 = wth0; 3857b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3867b77f048SAleksandar Markovic return wt2; 3877b77f048SAleksandar Markovic } 3887b77f048SAleksandar Markovic 3897b77f048SAleksandar Markovic uint32_t helper_float_cvt_w_s(CPUMIPSState *env, uint32_t fst0) 3907b77f048SAleksandar Markovic { 3917b77f048SAleksandar Markovic uint32_t wt2; 3927b77f048SAleksandar Markovic 3937b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 3947b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 3957b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 3967b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 3977b77f048SAleksandar Markovic } 3987b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3997b77f048SAleksandar Markovic return wt2; 4007b77f048SAleksandar Markovic } 4017b77f048SAleksandar Markovic 4027b77f048SAleksandar Markovic uint32_t helper_float_cvt_w_d(CPUMIPSState *env, uint64_t fdt0) 4037b77f048SAleksandar Markovic { 4047b77f048SAleksandar Markovic uint32_t wt2; 4057b77f048SAleksandar Markovic 4067b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 4077b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4087b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4097b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4107b77f048SAleksandar Markovic } 4117b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4127b77f048SAleksandar Markovic return wt2; 4137b77f048SAleksandar Markovic } 4147b77f048SAleksandar Markovic 4157b77f048SAleksandar Markovic uint64_t helper_float_round_l_d(CPUMIPSState *env, uint64_t fdt0) 4167b77f048SAleksandar Markovic { 4177b77f048SAleksandar Markovic uint64_t dt2; 4187b77f048SAleksandar Markovic 4197b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4207b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4217b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 4227b77f048SAleksandar Markovic restore_rounding_mode(env); 4237b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4247b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4257b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 4267b77f048SAleksandar Markovic } 4277b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4287b77f048SAleksandar Markovic return dt2; 4297b77f048SAleksandar Markovic } 4307b77f048SAleksandar Markovic 4317b77f048SAleksandar Markovic uint64_t helper_float_round_l_s(CPUMIPSState *env, uint32_t fst0) 4327b77f048SAleksandar Markovic { 4337b77f048SAleksandar Markovic uint64_t dt2; 4347b77f048SAleksandar Markovic 4357b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4367b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4377b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 4387b77f048SAleksandar Markovic restore_rounding_mode(env); 4397b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4407b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4417b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 4427b77f048SAleksandar Markovic } 4437b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4447b77f048SAleksandar Markovic return dt2; 4457b77f048SAleksandar Markovic } 4467b77f048SAleksandar Markovic 4477b77f048SAleksandar Markovic uint32_t helper_float_round_w_d(CPUMIPSState *env, uint64_t fdt0) 4487b77f048SAleksandar Markovic { 4497b77f048SAleksandar Markovic uint32_t wt2; 4507b77f048SAleksandar Markovic 4517b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4527b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4537b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 4547b77f048SAleksandar Markovic restore_rounding_mode(env); 4557b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4567b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4577b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4587b77f048SAleksandar Markovic } 4597b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4607b77f048SAleksandar Markovic return wt2; 4617b77f048SAleksandar Markovic } 4627b77f048SAleksandar Markovic 4637b77f048SAleksandar Markovic uint32_t helper_float_round_w_s(CPUMIPSState *env, uint32_t fst0) 4647b77f048SAleksandar Markovic { 4657b77f048SAleksandar Markovic uint32_t wt2; 4667b77f048SAleksandar Markovic 4677b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4687b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4697b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 4707b77f048SAleksandar Markovic restore_rounding_mode(env); 4717b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4727b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4737b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4747b77f048SAleksandar Markovic } 4757b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4767b77f048SAleksandar Markovic return wt2; 4777b77f048SAleksandar Markovic } 4787b77f048SAleksandar Markovic 4797b77f048SAleksandar Markovic uint64_t helper_float_trunc_l_d(CPUMIPSState *env, uint64_t fdt0) 4807b77f048SAleksandar Markovic { 4817b77f048SAleksandar Markovic uint64_t dt2; 4827b77f048SAleksandar Markovic 4837b77f048SAleksandar Markovic dt2 = float64_to_int64_round_to_zero(fdt0, 4847b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4857b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4867b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4877b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 4887b77f048SAleksandar Markovic } 4897b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4907b77f048SAleksandar Markovic return dt2; 4917b77f048SAleksandar Markovic } 4927b77f048SAleksandar Markovic 4937b77f048SAleksandar Markovic uint64_t helper_float_trunc_l_s(CPUMIPSState *env, uint32_t fst0) 4947b77f048SAleksandar Markovic { 4957b77f048SAleksandar Markovic uint64_t dt2; 4967b77f048SAleksandar Markovic 4977b77f048SAleksandar Markovic dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); 4987b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4997b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5007b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 5017b77f048SAleksandar Markovic } 5027b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5037b77f048SAleksandar Markovic return dt2; 5047b77f048SAleksandar Markovic } 5057b77f048SAleksandar Markovic 5067b77f048SAleksandar Markovic uint32_t helper_float_trunc_w_d(CPUMIPSState *env, uint64_t fdt0) 5077b77f048SAleksandar Markovic { 5087b77f048SAleksandar Markovic uint32_t wt2; 5097b77f048SAleksandar Markovic 5107b77f048SAleksandar Markovic wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); 5117b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5127b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5137b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5147b77f048SAleksandar Markovic } 5157b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5167b77f048SAleksandar Markovic return wt2; 5177b77f048SAleksandar Markovic } 5187b77f048SAleksandar Markovic 5197b77f048SAleksandar Markovic uint32_t helper_float_trunc_w_s(CPUMIPSState *env, uint32_t fst0) 5207b77f048SAleksandar Markovic { 5217b77f048SAleksandar Markovic uint32_t wt2; 5227b77f048SAleksandar Markovic 5237b77f048SAleksandar Markovic wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); 5247b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5257b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5267b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5277b77f048SAleksandar Markovic } 5287b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5297b77f048SAleksandar Markovic return wt2; 5307b77f048SAleksandar Markovic } 5317b77f048SAleksandar Markovic 5327b77f048SAleksandar Markovic uint64_t helper_float_ceil_l_d(CPUMIPSState *env, uint64_t fdt0) 5337b77f048SAleksandar Markovic { 5347b77f048SAleksandar Markovic uint64_t dt2; 5357b77f048SAleksandar Markovic 5367b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5377b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 5387b77f048SAleksandar Markovic restore_rounding_mode(env); 5397b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5407b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5417b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 5427b77f048SAleksandar Markovic } 5437b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5447b77f048SAleksandar Markovic return dt2; 5457b77f048SAleksandar Markovic } 5467b77f048SAleksandar Markovic 5477b77f048SAleksandar Markovic uint64_t helper_float_ceil_l_s(CPUMIPSState *env, uint32_t fst0) 5487b77f048SAleksandar Markovic { 5497b77f048SAleksandar Markovic uint64_t dt2; 5507b77f048SAleksandar Markovic 5517b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5527b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 5537b77f048SAleksandar Markovic restore_rounding_mode(env); 5547b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5557b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5567b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 5577b77f048SAleksandar Markovic } 5587b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5597b77f048SAleksandar Markovic return dt2; 5607b77f048SAleksandar Markovic } 5617b77f048SAleksandar Markovic 5627b77f048SAleksandar Markovic uint32_t helper_float_ceil_w_d(CPUMIPSState *env, uint64_t fdt0) 5637b77f048SAleksandar Markovic { 5647b77f048SAleksandar Markovic uint32_t wt2; 5657b77f048SAleksandar Markovic 5667b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5677b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 5687b77f048SAleksandar Markovic restore_rounding_mode(env); 5697b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5707b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5717b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5727b77f048SAleksandar Markovic } 5737b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5747b77f048SAleksandar Markovic return wt2; 5757b77f048SAleksandar Markovic } 5767b77f048SAleksandar Markovic 5777b77f048SAleksandar Markovic uint32_t helper_float_ceil_w_s(CPUMIPSState *env, uint32_t fst0) 5787b77f048SAleksandar Markovic { 5797b77f048SAleksandar Markovic uint32_t wt2; 5807b77f048SAleksandar Markovic 5817b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5827b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 5837b77f048SAleksandar Markovic restore_rounding_mode(env); 5847b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5857b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5867b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5877b77f048SAleksandar Markovic } 5887b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5897b77f048SAleksandar Markovic return wt2; 5907b77f048SAleksandar Markovic } 5917b77f048SAleksandar Markovic 5927b77f048SAleksandar Markovic uint64_t helper_float_floor_l_d(CPUMIPSState *env, uint64_t fdt0) 5937b77f048SAleksandar Markovic { 5947b77f048SAleksandar Markovic uint64_t dt2; 5957b77f048SAleksandar Markovic 5967b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 5977b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 5987b77f048SAleksandar Markovic restore_rounding_mode(env); 5997b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6007b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6017b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 6027b77f048SAleksandar Markovic } 6037b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6047b77f048SAleksandar Markovic return dt2; 6057b77f048SAleksandar Markovic } 6067b77f048SAleksandar Markovic 6077b77f048SAleksandar Markovic uint64_t helper_float_floor_l_s(CPUMIPSState *env, uint32_t fst0) 6087b77f048SAleksandar Markovic { 6097b77f048SAleksandar Markovic uint64_t dt2; 6107b77f048SAleksandar Markovic 6117b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6127b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 6137b77f048SAleksandar Markovic restore_rounding_mode(env); 6147b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6157b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6167b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 6177b77f048SAleksandar Markovic } 6187b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6197b77f048SAleksandar Markovic return dt2; 6207b77f048SAleksandar Markovic } 6217b77f048SAleksandar Markovic 6227b77f048SAleksandar Markovic uint32_t helper_float_floor_w_d(CPUMIPSState *env, uint64_t fdt0) 6237b77f048SAleksandar Markovic { 6247b77f048SAleksandar Markovic uint32_t wt2; 6257b77f048SAleksandar Markovic 6267b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6277b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 6287b77f048SAleksandar Markovic restore_rounding_mode(env); 6297b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6307b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6317b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 6327b77f048SAleksandar Markovic } 6337b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6347b77f048SAleksandar Markovic return wt2; 6357b77f048SAleksandar Markovic } 6367b77f048SAleksandar Markovic 6377b77f048SAleksandar Markovic uint32_t helper_float_floor_w_s(CPUMIPSState *env, uint32_t fst0) 6387b77f048SAleksandar Markovic { 6397b77f048SAleksandar Markovic uint32_t wt2; 6407b77f048SAleksandar Markovic 6417b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6427b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 6437b77f048SAleksandar Markovic restore_rounding_mode(env); 6447b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6457b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6467b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 6477b77f048SAleksandar Markovic } 6487b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6497b77f048SAleksandar Markovic return wt2; 6507b77f048SAleksandar Markovic } 6517b77f048SAleksandar Markovic 6527b77f048SAleksandar Markovic uint64_t helper_float_cvt_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 6537b77f048SAleksandar Markovic { 6547b77f048SAleksandar Markovic uint64_t dt2; 6557b77f048SAleksandar Markovic 6567b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 6577b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6587b77f048SAleksandar Markovic & float_flag_invalid) { 6597b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 6607b77f048SAleksandar Markovic dt2 = 0; 6617b77f048SAleksandar Markovic } 6627b77f048SAleksandar Markovic } 6637b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6647b77f048SAleksandar Markovic return dt2; 6657b77f048SAleksandar Markovic } 6667b77f048SAleksandar Markovic 6677b77f048SAleksandar Markovic uint64_t helper_float_cvt_2008_l_s(CPUMIPSState *env, uint32_t fst0) 6687b77f048SAleksandar Markovic { 6697b77f048SAleksandar Markovic uint64_t dt2; 6707b77f048SAleksandar Markovic 6717b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 6727b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6737b77f048SAleksandar Markovic & float_flag_invalid) { 6747b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 6757b77f048SAleksandar Markovic dt2 = 0; 6767b77f048SAleksandar Markovic } 6777b77f048SAleksandar Markovic } 6787b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6797b77f048SAleksandar Markovic return dt2; 6807b77f048SAleksandar Markovic } 6817b77f048SAleksandar Markovic 6827b77f048SAleksandar Markovic uint32_t helper_float_cvt_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 6837b77f048SAleksandar Markovic { 6847b77f048SAleksandar Markovic uint32_t wt2; 6857b77f048SAleksandar Markovic 6867b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 6877b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6887b77f048SAleksandar Markovic & float_flag_invalid) { 6897b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 6907b77f048SAleksandar Markovic wt2 = 0; 6917b77f048SAleksandar Markovic } 6927b77f048SAleksandar Markovic } 6937b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6947b77f048SAleksandar Markovic return wt2; 6957b77f048SAleksandar Markovic } 6967b77f048SAleksandar Markovic 6977b77f048SAleksandar Markovic uint32_t helper_float_cvt_2008_w_s(CPUMIPSState *env, uint32_t fst0) 6987b77f048SAleksandar Markovic { 6997b77f048SAleksandar Markovic uint32_t wt2; 7007b77f048SAleksandar Markovic 7017b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 7027b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7037b77f048SAleksandar Markovic & float_flag_invalid) { 7047b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 7057b77f048SAleksandar Markovic wt2 = 0; 7067b77f048SAleksandar Markovic } 7077b77f048SAleksandar Markovic } 7087b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7097b77f048SAleksandar Markovic return wt2; 7107b77f048SAleksandar Markovic } 7117b77f048SAleksandar Markovic 7127b77f048SAleksandar Markovic uint64_t helper_float_round_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 7137b77f048SAleksandar Markovic { 7147b77f048SAleksandar Markovic uint64_t dt2; 7157b77f048SAleksandar Markovic 7167b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7177b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7187b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 7197b77f048SAleksandar Markovic restore_rounding_mode(env); 7207b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7217b77f048SAleksandar Markovic & float_flag_invalid) { 7227b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 7237b77f048SAleksandar Markovic dt2 = 0; 7247b77f048SAleksandar Markovic } 7257b77f048SAleksandar Markovic } 7267b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7277b77f048SAleksandar Markovic return dt2; 7287b77f048SAleksandar Markovic } 7297b77f048SAleksandar Markovic 7307b77f048SAleksandar Markovic uint64_t helper_float_round_2008_l_s(CPUMIPSState *env, uint32_t fst0) 7317b77f048SAleksandar Markovic { 7327b77f048SAleksandar Markovic uint64_t dt2; 7337b77f048SAleksandar Markovic 7347b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7357b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7367b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 7377b77f048SAleksandar Markovic restore_rounding_mode(env); 7387b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7397b77f048SAleksandar Markovic & float_flag_invalid) { 7407b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 7417b77f048SAleksandar Markovic dt2 = 0; 7427b77f048SAleksandar Markovic } 7437b77f048SAleksandar Markovic } 7447b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7457b77f048SAleksandar Markovic return dt2; 7467b77f048SAleksandar Markovic } 7477b77f048SAleksandar Markovic 7487b77f048SAleksandar Markovic uint32_t helper_float_round_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 7497b77f048SAleksandar Markovic { 7507b77f048SAleksandar Markovic uint32_t wt2; 7517b77f048SAleksandar Markovic 7527b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7537b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7547b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 7557b77f048SAleksandar Markovic restore_rounding_mode(env); 7567b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7577b77f048SAleksandar Markovic & float_flag_invalid) { 7587b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 7597b77f048SAleksandar Markovic wt2 = 0; 7607b77f048SAleksandar Markovic } 7617b77f048SAleksandar Markovic } 7627b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7637b77f048SAleksandar Markovic return wt2; 7647b77f048SAleksandar Markovic } 7657b77f048SAleksandar Markovic 7667b77f048SAleksandar Markovic uint32_t helper_float_round_2008_w_s(CPUMIPSState *env, uint32_t fst0) 7677b77f048SAleksandar Markovic { 7687b77f048SAleksandar Markovic uint32_t wt2; 7697b77f048SAleksandar Markovic 7707b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7717b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7727b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 7737b77f048SAleksandar Markovic restore_rounding_mode(env); 7747b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7757b77f048SAleksandar Markovic & float_flag_invalid) { 7767b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 7777b77f048SAleksandar Markovic wt2 = 0; 7787b77f048SAleksandar Markovic } 7797b77f048SAleksandar Markovic } 7807b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7817b77f048SAleksandar Markovic return wt2; 7827b77f048SAleksandar Markovic } 7837b77f048SAleksandar Markovic 7847b77f048SAleksandar Markovic uint64_t helper_float_trunc_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 7857b77f048SAleksandar Markovic { 7867b77f048SAleksandar Markovic uint64_t dt2; 7877b77f048SAleksandar Markovic 7887b77f048SAleksandar Markovic dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); 7897b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7907b77f048SAleksandar Markovic & float_flag_invalid) { 7917b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 7927b77f048SAleksandar Markovic dt2 = 0; 7937b77f048SAleksandar Markovic } 7947b77f048SAleksandar Markovic } 7957b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7967b77f048SAleksandar Markovic return dt2; 7977b77f048SAleksandar Markovic } 7987b77f048SAleksandar Markovic 7997b77f048SAleksandar Markovic uint64_t helper_float_trunc_2008_l_s(CPUMIPSState *env, uint32_t fst0) 8007b77f048SAleksandar Markovic { 8017b77f048SAleksandar Markovic uint64_t dt2; 8027b77f048SAleksandar Markovic 8037b77f048SAleksandar Markovic dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); 8047b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8057b77f048SAleksandar Markovic & float_flag_invalid) { 8067b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 8077b77f048SAleksandar Markovic dt2 = 0; 8087b77f048SAleksandar Markovic } 8097b77f048SAleksandar Markovic } 8107b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8117b77f048SAleksandar Markovic return dt2; 8127b77f048SAleksandar Markovic } 8137b77f048SAleksandar Markovic 8147b77f048SAleksandar Markovic uint32_t helper_float_trunc_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 8157b77f048SAleksandar Markovic { 8167b77f048SAleksandar Markovic uint32_t wt2; 8177b77f048SAleksandar Markovic 8187b77f048SAleksandar Markovic wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); 8197b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8207b77f048SAleksandar Markovic & float_flag_invalid) { 8217b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 8227b77f048SAleksandar Markovic wt2 = 0; 8237b77f048SAleksandar Markovic } 8247b77f048SAleksandar Markovic } 8257b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8267b77f048SAleksandar Markovic return wt2; 8277b77f048SAleksandar Markovic } 8287b77f048SAleksandar Markovic 8297b77f048SAleksandar Markovic uint32_t helper_float_trunc_2008_w_s(CPUMIPSState *env, uint32_t fst0) 8307b77f048SAleksandar Markovic { 8317b77f048SAleksandar Markovic uint32_t wt2; 8327b77f048SAleksandar Markovic 8337b77f048SAleksandar Markovic wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); 8347b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8357b77f048SAleksandar Markovic & float_flag_invalid) { 8367b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 8377b77f048SAleksandar Markovic wt2 = 0; 8387b77f048SAleksandar Markovic } 8397b77f048SAleksandar Markovic } 8407b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8417b77f048SAleksandar Markovic return wt2; 8427b77f048SAleksandar Markovic } 8437b77f048SAleksandar Markovic 8447b77f048SAleksandar Markovic uint64_t helper_float_ceil_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 8457b77f048SAleksandar Markovic { 8467b77f048SAleksandar Markovic uint64_t dt2; 8477b77f048SAleksandar Markovic 8487b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 8497b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 8507b77f048SAleksandar Markovic restore_rounding_mode(env); 8517b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8527b77f048SAleksandar Markovic & float_flag_invalid) { 8537b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 8547b77f048SAleksandar Markovic dt2 = 0; 8557b77f048SAleksandar Markovic } 8567b77f048SAleksandar Markovic } 8577b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8587b77f048SAleksandar Markovic return dt2; 8597b77f048SAleksandar Markovic } 8607b77f048SAleksandar Markovic 8617b77f048SAleksandar Markovic uint64_t helper_float_ceil_2008_l_s(CPUMIPSState *env, uint32_t fst0) 8627b77f048SAleksandar Markovic { 8637b77f048SAleksandar Markovic uint64_t dt2; 8647b77f048SAleksandar Markovic 8657b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 8667b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 8677b77f048SAleksandar Markovic restore_rounding_mode(env); 8687b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8697b77f048SAleksandar Markovic & float_flag_invalid) { 8707b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 8717b77f048SAleksandar Markovic dt2 = 0; 8727b77f048SAleksandar Markovic } 8737b77f048SAleksandar Markovic } 8747b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8757b77f048SAleksandar Markovic return dt2; 8767b77f048SAleksandar Markovic } 8777b77f048SAleksandar Markovic 8787b77f048SAleksandar Markovic uint32_t helper_float_ceil_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 8797b77f048SAleksandar Markovic { 8807b77f048SAleksandar Markovic uint32_t wt2; 8817b77f048SAleksandar Markovic 8827b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 8837b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 8847b77f048SAleksandar Markovic restore_rounding_mode(env); 8857b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8867b77f048SAleksandar Markovic & float_flag_invalid) { 8877b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 8887b77f048SAleksandar Markovic wt2 = 0; 8897b77f048SAleksandar Markovic } 8907b77f048SAleksandar Markovic } 8917b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8927b77f048SAleksandar Markovic return wt2; 8937b77f048SAleksandar Markovic } 8947b77f048SAleksandar Markovic 8957b77f048SAleksandar Markovic uint32_t helper_float_ceil_2008_w_s(CPUMIPSState *env, uint32_t fst0) 8967b77f048SAleksandar Markovic { 8977b77f048SAleksandar Markovic uint32_t wt2; 8987b77f048SAleksandar Markovic 8997b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 9007b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 9017b77f048SAleksandar Markovic restore_rounding_mode(env); 9027b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9037b77f048SAleksandar Markovic & float_flag_invalid) { 9047b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 9057b77f048SAleksandar Markovic wt2 = 0; 9067b77f048SAleksandar Markovic } 9077b77f048SAleksandar Markovic } 9087b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9097b77f048SAleksandar Markovic return wt2; 9107b77f048SAleksandar Markovic } 9117b77f048SAleksandar Markovic 9127b77f048SAleksandar Markovic uint64_t helper_float_floor_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 9137b77f048SAleksandar Markovic { 9147b77f048SAleksandar Markovic uint64_t dt2; 9157b77f048SAleksandar Markovic 9167b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9177b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 9187b77f048SAleksandar Markovic restore_rounding_mode(env); 9197b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9207b77f048SAleksandar Markovic & float_flag_invalid) { 9217b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 9227b77f048SAleksandar Markovic dt2 = 0; 9237b77f048SAleksandar Markovic } 9247b77f048SAleksandar Markovic } 9257b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9267b77f048SAleksandar Markovic return dt2; 9277b77f048SAleksandar Markovic } 9287b77f048SAleksandar Markovic 9297b77f048SAleksandar Markovic uint64_t helper_float_floor_2008_l_s(CPUMIPSState *env, uint32_t fst0) 9307b77f048SAleksandar Markovic { 9317b77f048SAleksandar Markovic uint64_t dt2; 9327b77f048SAleksandar Markovic 9337b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9347b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 9357b77f048SAleksandar Markovic restore_rounding_mode(env); 9367b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9377b77f048SAleksandar Markovic & float_flag_invalid) { 9387b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 9397b77f048SAleksandar Markovic dt2 = 0; 9407b77f048SAleksandar Markovic } 9417b77f048SAleksandar Markovic } 9427b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9437b77f048SAleksandar Markovic return dt2; 9447b77f048SAleksandar Markovic } 9457b77f048SAleksandar Markovic 9467b77f048SAleksandar Markovic uint32_t helper_float_floor_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 9477b77f048SAleksandar Markovic { 9487b77f048SAleksandar Markovic uint32_t wt2; 9497b77f048SAleksandar Markovic 9507b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9517b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 9527b77f048SAleksandar Markovic restore_rounding_mode(env); 9537b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9547b77f048SAleksandar Markovic & float_flag_invalid) { 9557b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 9567b77f048SAleksandar Markovic wt2 = 0; 9577b77f048SAleksandar Markovic } 9587b77f048SAleksandar Markovic } 9597b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9607b77f048SAleksandar Markovic return wt2; 9617b77f048SAleksandar Markovic } 9627b77f048SAleksandar Markovic 9637b77f048SAleksandar Markovic uint32_t helper_float_floor_2008_w_s(CPUMIPSState *env, uint32_t fst0) 9647b77f048SAleksandar Markovic { 9657b77f048SAleksandar Markovic uint32_t wt2; 9667b77f048SAleksandar Markovic 9677b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9687b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 9697b77f048SAleksandar Markovic restore_rounding_mode(env); 9707b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9717b77f048SAleksandar Markovic & float_flag_invalid) { 9727b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 9737b77f048SAleksandar Markovic wt2 = 0; 9747b77f048SAleksandar Markovic } 9757b77f048SAleksandar Markovic } 9767b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9777b77f048SAleksandar Markovic return wt2; 9787b77f048SAleksandar Markovic } 9797b77f048SAleksandar Markovic 9807b77f048SAleksandar Markovic /* unary operations, not modifying fp status */ 9817b77f048SAleksandar Markovic #define FLOAT_UNOP(name) \ 9827b77f048SAleksandar Markovic uint64_t helper_float_ ## name ## _d(uint64_t fdt0) \ 9837b77f048SAleksandar Markovic { \ 9847b77f048SAleksandar Markovic return float64_ ## name(fdt0); \ 9857b77f048SAleksandar Markovic } \ 9867b77f048SAleksandar Markovic uint32_t helper_float_ ## name ## _s(uint32_t fst0) \ 9877b77f048SAleksandar Markovic { \ 9887b77f048SAleksandar Markovic return float32_ ## name(fst0); \ 9897b77f048SAleksandar Markovic } \ 9907b77f048SAleksandar Markovic uint64_t helper_float_ ## name ## _ps(uint64_t fdt0) \ 9917b77f048SAleksandar Markovic { \ 9927b77f048SAleksandar Markovic uint32_t wt0; \ 9937b77f048SAleksandar Markovic uint32_t wth0; \ 9947b77f048SAleksandar Markovic \ 9957b77f048SAleksandar Markovic wt0 = float32_ ## name(fdt0 & 0XFFFFFFFF); \ 9967b77f048SAleksandar Markovic wth0 = float32_ ## name(fdt0 >> 32); \ 9977b77f048SAleksandar Markovic return ((uint64_t)wth0 << 32) | wt0; \ 9987b77f048SAleksandar Markovic } 9997b77f048SAleksandar Markovic FLOAT_UNOP(abs) 10007b77f048SAleksandar Markovic FLOAT_UNOP(chs) 10017b77f048SAleksandar Markovic #undef FLOAT_UNOP 10027b77f048SAleksandar Markovic 10037b77f048SAleksandar Markovic /* MIPS specific unary operations */ 10047b77f048SAleksandar Markovic uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0) 10057b77f048SAleksandar Markovic { 10067b77f048SAleksandar Markovic uint64_t fdt2; 10077b77f048SAleksandar Markovic 10087b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); 10097b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10107b77f048SAleksandar Markovic return fdt2; 10117b77f048SAleksandar Markovic } 10127b77f048SAleksandar Markovic 10137b77f048SAleksandar Markovic uint32_t helper_float_recip_s(CPUMIPSState *env, uint32_t fst0) 10147b77f048SAleksandar Markovic { 10157b77f048SAleksandar Markovic uint32_t fst2; 10167b77f048SAleksandar Markovic 10177b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); 10187b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10197b77f048SAleksandar Markovic return fst2; 10207b77f048SAleksandar Markovic } 10217b77f048SAleksandar Markovic 10227b77f048SAleksandar Markovic uint64_t helper_float_rsqrt_d(CPUMIPSState *env, uint64_t fdt0) 10237b77f048SAleksandar Markovic { 10247b77f048SAleksandar Markovic uint64_t fdt2; 10257b77f048SAleksandar Markovic 10267b77f048SAleksandar Markovic fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 10277b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); 10287b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10297b77f048SAleksandar Markovic return fdt2; 10307b77f048SAleksandar Markovic } 10317b77f048SAleksandar Markovic 10327b77f048SAleksandar Markovic uint32_t helper_float_rsqrt_s(CPUMIPSState *env, uint32_t fst0) 10337b77f048SAleksandar Markovic { 10347b77f048SAleksandar Markovic uint32_t fst2; 10357b77f048SAleksandar Markovic 10367b77f048SAleksandar Markovic fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); 10377b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); 10387b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10397b77f048SAleksandar Markovic return fst2; 10407b77f048SAleksandar Markovic } 10417b77f048SAleksandar Markovic 10427b77f048SAleksandar Markovic uint64_t helper_float_recip1_d(CPUMIPSState *env, uint64_t fdt0) 10437b77f048SAleksandar Markovic { 10447b77f048SAleksandar Markovic uint64_t fdt2; 10457b77f048SAleksandar Markovic 10467b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); 10477b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10487b77f048SAleksandar Markovic return fdt2; 10497b77f048SAleksandar Markovic } 10507b77f048SAleksandar Markovic 10517b77f048SAleksandar Markovic uint32_t helper_float_recip1_s(CPUMIPSState *env, uint32_t fst0) 10527b77f048SAleksandar Markovic { 10537b77f048SAleksandar Markovic uint32_t fst2; 10547b77f048SAleksandar Markovic 10557b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); 10567b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10577b77f048SAleksandar Markovic return fst2; 10587b77f048SAleksandar Markovic } 10597b77f048SAleksandar Markovic 10607b77f048SAleksandar Markovic uint64_t helper_float_recip1_ps(CPUMIPSState *env, uint64_t fdt0) 10617b77f048SAleksandar Markovic { 10627b77f048SAleksandar Markovic uint32_t fst2; 10637b77f048SAleksandar Markovic uint32_t fsth2; 10647b77f048SAleksandar Markovic 10657b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fdt0 & 0XFFFFFFFF, 10667b77f048SAleksandar Markovic &env->active_fpu.fp_status); 10677b77f048SAleksandar Markovic fsth2 = float32_div(float32_one, fdt0 >> 32, &env->active_fpu.fp_status); 10687b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10697b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 10707b77f048SAleksandar Markovic } 10717b77f048SAleksandar Markovic 10727b77f048SAleksandar Markovic uint64_t helper_float_rsqrt1_d(CPUMIPSState *env, uint64_t fdt0) 10737b77f048SAleksandar Markovic { 10747b77f048SAleksandar Markovic uint64_t fdt2; 10757b77f048SAleksandar Markovic 10767b77f048SAleksandar Markovic fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 10777b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); 10787b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10797b77f048SAleksandar Markovic return fdt2; 10807b77f048SAleksandar Markovic } 10817b77f048SAleksandar Markovic 10827b77f048SAleksandar Markovic uint32_t helper_float_rsqrt1_s(CPUMIPSState *env, uint32_t fst0) 10837b77f048SAleksandar Markovic { 10847b77f048SAleksandar Markovic uint32_t fst2; 10857b77f048SAleksandar Markovic 10867b77f048SAleksandar Markovic fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); 10877b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); 10887b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10897b77f048SAleksandar Markovic return fst2; 10907b77f048SAleksandar Markovic } 10917b77f048SAleksandar Markovic 10927b77f048SAleksandar Markovic uint64_t helper_float_rsqrt1_ps(CPUMIPSState *env, uint64_t fdt0) 10937b77f048SAleksandar Markovic { 10947b77f048SAleksandar Markovic uint32_t fst2; 10957b77f048SAleksandar Markovic uint32_t fsth2; 10967b77f048SAleksandar Markovic 10977b77f048SAleksandar Markovic fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 10987b77f048SAleksandar Markovic fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status); 10997b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); 11007b77f048SAleksandar Markovic fsth2 = float32_div(float32_one, fsth2, &env->active_fpu.fp_status); 11017b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 11027b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 11037b77f048SAleksandar Markovic } 11047b77f048SAleksandar Markovic 11057b77f048SAleksandar Markovic #define FLOAT_RINT(name, bits) \ 11067b77f048SAleksandar Markovic uint ## bits ## _t helper_float_ ## name(CPUMIPSState *env, \ 11077b77f048SAleksandar Markovic uint ## bits ## _t fs) \ 11087b77f048SAleksandar Markovic { \ 11097b77f048SAleksandar Markovic uint ## bits ## _t fdret; \ 11107b77f048SAleksandar Markovic \ 11117b77f048SAleksandar Markovic fdret = float ## bits ## _round_to_int(fs, &env->active_fpu.fp_status); \ 11127b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 11137b77f048SAleksandar Markovic return fdret; \ 11147b77f048SAleksandar Markovic } 11157b77f048SAleksandar Markovic 11167b77f048SAleksandar Markovic FLOAT_RINT(rint_s, 32) 11177b77f048SAleksandar Markovic FLOAT_RINT(rint_d, 64) 11187b77f048SAleksandar Markovic #undef FLOAT_RINT 11197b77f048SAleksandar Markovic 11207b77f048SAleksandar Markovic #define FLOAT_CLASS_SIGNALING_NAN 0x001 11217b77f048SAleksandar Markovic #define FLOAT_CLASS_QUIET_NAN 0x002 11227b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_INFINITY 0x004 11237b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_NORMAL 0x008 11247b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010 11257b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_ZERO 0x020 11267b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_INFINITY 0x040 11277b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_NORMAL 0x080 11287b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100 11297b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_ZERO 0x200 11307b77f048SAleksandar Markovic 11317b77f048SAleksandar Markovic #define FLOAT_CLASS(name, bits) \ 11327b77f048SAleksandar Markovic uint ## bits ## _t float_ ## name(uint ## bits ## _t arg, \ 11337b77f048SAleksandar Markovic float_status *status) \ 11347b77f048SAleksandar Markovic { \ 11357b77f048SAleksandar Markovic if (float ## bits ## _is_signaling_nan(arg, status)) { \ 11367b77f048SAleksandar Markovic return FLOAT_CLASS_SIGNALING_NAN; \ 11377b77f048SAleksandar Markovic } else if (float ## bits ## _is_quiet_nan(arg, status)) { \ 11387b77f048SAleksandar Markovic return FLOAT_CLASS_QUIET_NAN; \ 11397b77f048SAleksandar Markovic } else if (float ## bits ## _is_neg(arg)) { \ 11407b77f048SAleksandar Markovic if (float ## bits ## _is_infinity(arg)) { \ 11417b77f048SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_INFINITY; \ 11427b77f048SAleksandar Markovic } else if (float ## bits ## _is_zero(arg)) { \ 11437b77f048SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_ZERO; \ 11447b77f048SAleksandar Markovic } else if (float ## bits ## _is_zero_or_denormal(arg)) { \ 11457b77f048SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_SUBNORMAL; \ 11467b77f048SAleksandar Markovic } else { \ 11477b77f048SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_NORMAL; \ 11487b77f048SAleksandar Markovic } \ 11497b77f048SAleksandar Markovic } else { \ 11507b77f048SAleksandar Markovic if (float ## bits ## _is_infinity(arg)) { \ 11517b77f048SAleksandar Markovic return FLOAT_CLASS_POSITIVE_INFINITY; \ 11527b77f048SAleksandar Markovic } else if (float ## bits ## _is_zero(arg)) { \ 11537b77f048SAleksandar Markovic return FLOAT_CLASS_POSITIVE_ZERO; \ 11547b77f048SAleksandar Markovic } else if (float ## bits ## _is_zero_or_denormal(arg)) { \ 11557b77f048SAleksandar Markovic return FLOAT_CLASS_POSITIVE_SUBNORMAL; \ 11567b77f048SAleksandar Markovic } else { \ 11577b77f048SAleksandar Markovic return FLOAT_CLASS_POSITIVE_NORMAL; \ 11587b77f048SAleksandar Markovic } \ 11597b77f048SAleksandar Markovic } \ 11607b77f048SAleksandar Markovic } \ 11617b77f048SAleksandar Markovic \ 11627b77f048SAleksandar Markovic uint ## bits ## _t helper_float_ ## name(CPUMIPSState *env, \ 11637b77f048SAleksandar Markovic uint ## bits ## _t arg) \ 11647b77f048SAleksandar Markovic { \ 11657b77f048SAleksandar Markovic return float_ ## name(arg, &env->active_fpu.fp_status); \ 11667b77f048SAleksandar Markovic } 11677b77f048SAleksandar Markovic 11687b77f048SAleksandar Markovic FLOAT_CLASS(class_s, 32) 11697b77f048SAleksandar Markovic FLOAT_CLASS(class_d, 64) 11707b77f048SAleksandar Markovic #undef FLOAT_CLASS 11717b77f048SAleksandar Markovic 11727b77f048SAleksandar Markovic /* binary operations */ 11737b77f048SAleksandar Markovic 11741ace099fSAleksandar Markovic uint64_t helper_float_add_d(CPUMIPSState *env, 11751ace099fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 11761ace099fSAleksandar Markovic { 11771ace099fSAleksandar Markovic uint64_t dt2; 11781ace099fSAleksandar Markovic 11791ace099fSAleksandar Markovic dt2 = float64_add(fdt0, fdt1, &env->active_fpu.fp_status); 11801ace099fSAleksandar Markovic update_fcr31(env, GETPC()); 11811ace099fSAleksandar Markovic return dt2; 11821ace099fSAleksandar Markovic } 11831ace099fSAleksandar Markovic 11841ace099fSAleksandar Markovic uint32_t helper_float_add_s(CPUMIPSState *env, 11851ace099fSAleksandar Markovic uint32_t fst0, uint32_t fst1) 11861ace099fSAleksandar Markovic { 11871ace099fSAleksandar Markovic uint32_t wt2; 11881ace099fSAleksandar Markovic 11891ace099fSAleksandar Markovic wt2 = float32_sub(fst0, fst1, &env->active_fpu.fp_status); 11901ace099fSAleksandar Markovic update_fcr31(env, GETPC()); 11911ace099fSAleksandar Markovic return wt2; 11921ace099fSAleksandar Markovic } 11931ace099fSAleksandar Markovic 11941ace099fSAleksandar Markovic uint64_t helper_float_add_ps(CPUMIPSState *env, 11951ace099fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 11961ace099fSAleksandar Markovic { 11971ace099fSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 11981ace099fSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 11991ace099fSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 12001ace099fSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 12011ace099fSAleksandar Markovic uint32_t wtl2; 12021ace099fSAleksandar Markovic uint32_t wth2; 12031ace099fSAleksandar Markovic 12041ace099fSAleksandar Markovic wtl2 = float32_add(fstl0, fstl1, &env->active_fpu.fp_status); 12051ace099fSAleksandar Markovic wth2 = float32_add(fsth0, fsth1, &env->active_fpu.fp_status); 12061ace099fSAleksandar Markovic update_fcr31(env, GETPC()); 12071ace099fSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 12081ace099fSAleksandar Markovic } 12091ace099fSAleksandar Markovic 121092ebdd7fSAleksandar Markovic uint64_t helper_float_sub_d(CPUMIPSState *env, 121192ebdd7fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 121292ebdd7fSAleksandar Markovic { 121392ebdd7fSAleksandar Markovic uint64_t dt2; 121492ebdd7fSAleksandar Markovic 121592ebdd7fSAleksandar Markovic dt2 = float64_sub(fdt0, fdt1, &env->active_fpu.fp_status); 121692ebdd7fSAleksandar Markovic update_fcr31(env, GETPC()); 121792ebdd7fSAleksandar Markovic return dt2; 121892ebdd7fSAleksandar Markovic } 121992ebdd7fSAleksandar Markovic 122092ebdd7fSAleksandar Markovic uint32_t helper_float_sub_s(CPUMIPSState *env, 122192ebdd7fSAleksandar Markovic uint32_t fst0, uint32_t fst1) 122292ebdd7fSAleksandar Markovic { 122392ebdd7fSAleksandar Markovic uint32_t wt2; 122492ebdd7fSAleksandar Markovic 122592ebdd7fSAleksandar Markovic wt2 = float32_sub(fst0, fst1, &env->active_fpu.fp_status); 122692ebdd7fSAleksandar Markovic update_fcr31(env, GETPC()); 122792ebdd7fSAleksandar Markovic return wt2; 122892ebdd7fSAleksandar Markovic } 122992ebdd7fSAleksandar Markovic 123092ebdd7fSAleksandar Markovic uint64_t helper_float_sub_ps(CPUMIPSState *env, 123192ebdd7fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 123292ebdd7fSAleksandar Markovic { 123392ebdd7fSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 123492ebdd7fSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 123592ebdd7fSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 123692ebdd7fSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 123792ebdd7fSAleksandar Markovic uint32_t wtl2; 123892ebdd7fSAleksandar Markovic uint32_t wth2; 123992ebdd7fSAleksandar Markovic 124092ebdd7fSAleksandar Markovic wtl2 = float32_sub(fstl0, fstl1, &env->active_fpu.fp_status); 124192ebdd7fSAleksandar Markovic wth2 = float32_sub(fsth0, fsth1, &env->active_fpu.fp_status); 124292ebdd7fSAleksandar Markovic update_fcr31(env, GETPC()); 124392ebdd7fSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 124492ebdd7fSAleksandar Markovic } 124592ebdd7fSAleksandar Markovic 124611811198SAleksandar Markovic uint64_t helper_float_mul_d(CPUMIPSState *env, 124711811198SAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 124811811198SAleksandar Markovic { 124911811198SAleksandar Markovic uint64_t dt2; 125011811198SAleksandar Markovic 125111811198SAleksandar Markovic dt2 = float64_mul(fdt0, fdt1, &env->active_fpu.fp_status); 125211811198SAleksandar Markovic update_fcr31(env, GETPC()); 125311811198SAleksandar Markovic return dt2; 125411811198SAleksandar Markovic } 125511811198SAleksandar Markovic 125611811198SAleksandar Markovic uint32_t helper_float_mul_s(CPUMIPSState *env, 125711811198SAleksandar Markovic uint32_t fst0, uint32_t fst1) 125811811198SAleksandar Markovic { 125911811198SAleksandar Markovic uint32_t wt2; 126011811198SAleksandar Markovic 126111811198SAleksandar Markovic wt2 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 126211811198SAleksandar Markovic update_fcr31(env, GETPC()); 126311811198SAleksandar Markovic return wt2; 126411811198SAleksandar Markovic } 126511811198SAleksandar Markovic 126611811198SAleksandar Markovic uint64_t helper_float_mul_ps(CPUMIPSState *env, 126711811198SAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 126811811198SAleksandar Markovic { 126911811198SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 127011811198SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 127111811198SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 127211811198SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 127311811198SAleksandar Markovic uint32_t wtl2; 127411811198SAleksandar Markovic uint32_t wth2; 127511811198SAleksandar Markovic 127611811198SAleksandar Markovic wtl2 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 127711811198SAleksandar Markovic wth2 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 127811811198SAleksandar Markovic update_fcr31(env, GETPC()); 127911811198SAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 128011811198SAleksandar Markovic } 128111811198SAleksandar Markovic 1282bcca8c4bSAleksandar Markovic uint64_t helper_float_div_d(CPUMIPSState *env, 1283bcca8c4bSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 1284bcca8c4bSAleksandar Markovic { 1285bcca8c4bSAleksandar Markovic uint64_t dt2; 1286bcca8c4bSAleksandar Markovic 1287bcca8c4bSAleksandar Markovic dt2 = float64_div(fdt0, fdt1, &env->active_fpu.fp_status); 1288bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC()); 1289bcca8c4bSAleksandar Markovic return dt2; 1290bcca8c4bSAleksandar Markovic } 1291bcca8c4bSAleksandar Markovic 1292bcca8c4bSAleksandar Markovic uint32_t helper_float_div_s(CPUMIPSState *env, 1293bcca8c4bSAleksandar Markovic uint32_t fst0, uint32_t fst1) 1294bcca8c4bSAleksandar Markovic { 1295bcca8c4bSAleksandar Markovic uint32_t wt2; 1296bcca8c4bSAleksandar Markovic 1297bcca8c4bSAleksandar Markovic wt2 = float32_div(fst0, fst1, &env->active_fpu.fp_status); 1298bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC()); 1299bcca8c4bSAleksandar Markovic return wt2; 1300bcca8c4bSAleksandar Markovic } 1301bcca8c4bSAleksandar Markovic 1302bcca8c4bSAleksandar Markovic uint64_t helper_float_div_ps(CPUMIPSState *env, 1303bcca8c4bSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 1304bcca8c4bSAleksandar Markovic { 1305bcca8c4bSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 1306bcca8c4bSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1307bcca8c4bSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 1308bcca8c4bSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 1309bcca8c4bSAleksandar Markovic uint32_t wtl2; 1310bcca8c4bSAleksandar Markovic uint32_t wth2; 1311bcca8c4bSAleksandar Markovic 1312bcca8c4bSAleksandar Markovic wtl2 = float32_div(fstl0, fstl1, &env->active_fpu.fp_status); 1313bcca8c4bSAleksandar Markovic wth2 = float32_div(fsth0, fsth1, &env->active_fpu.fp_status); 1314bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC()); 1315bcca8c4bSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 1316bcca8c4bSAleksandar Markovic } 1317bcca8c4bSAleksandar Markovic 13181ace099fSAleksandar Markovic 13197b77f048SAleksandar Markovic /* MIPS specific binary operations */ 13207b77f048SAleksandar Markovic uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 13217b77f048SAleksandar Markovic { 13227b77f048SAleksandar Markovic fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); 13237b77f048SAleksandar Markovic fdt2 = float64_chs(float64_sub(fdt2, float64_one, 13247b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13257b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13267b77f048SAleksandar Markovic return fdt2; 13277b77f048SAleksandar Markovic } 13287b77f048SAleksandar Markovic 13297b77f048SAleksandar Markovic uint32_t helper_float_recip2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) 13307b77f048SAleksandar Markovic { 13317b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 13327b77f048SAleksandar Markovic fst2 = float32_chs(float32_sub(fst2, float32_one, 13337b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13347b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13357b77f048SAleksandar Markovic return fst2; 13367b77f048SAleksandar Markovic } 13377b77f048SAleksandar Markovic 13387b77f048SAleksandar Markovic uint64_t helper_float_recip2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 13397b77f048SAleksandar Markovic { 13407b77f048SAleksandar Markovic uint32_t fst0 = fdt0 & 0XFFFFFFFF; 13417b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 13427b77f048SAleksandar Markovic uint32_t fst2 = fdt2 & 0XFFFFFFFF; 13437b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 13447b77f048SAleksandar Markovic 13457b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 13467b77f048SAleksandar Markovic fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); 13477b77f048SAleksandar Markovic fst2 = float32_chs(float32_sub(fst2, float32_one, 13487b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13497b77f048SAleksandar Markovic fsth2 = float32_chs(float32_sub(fsth2, float32_one, 13507b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13517b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13527b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 13537b77f048SAleksandar Markovic } 13547b77f048SAleksandar Markovic 13557b77f048SAleksandar Markovic uint64_t helper_float_rsqrt2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 13567b77f048SAleksandar Markovic { 13577b77f048SAleksandar Markovic fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); 13587b77f048SAleksandar Markovic fdt2 = float64_sub(fdt2, float64_one, &env->active_fpu.fp_status); 13597b77f048SAleksandar Markovic fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, 13607b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13617b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13627b77f048SAleksandar Markovic return fdt2; 13637b77f048SAleksandar Markovic } 13647b77f048SAleksandar Markovic 13657b77f048SAleksandar Markovic uint32_t helper_float_rsqrt2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) 13667b77f048SAleksandar Markovic { 13677b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 13687b77f048SAleksandar Markovic fst2 = float32_sub(fst2, float32_one, &env->active_fpu.fp_status); 13697b77f048SAleksandar Markovic fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, 13707b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13717b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13727b77f048SAleksandar Markovic return fst2; 13737b77f048SAleksandar Markovic } 13747b77f048SAleksandar Markovic 13757b77f048SAleksandar Markovic uint64_t helper_float_rsqrt2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 13767b77f048SAleksandar Markovic { 13777b77f048SAleksandar Markovic uint32_t fst0 = fdt0 & 0XFFFFFFFF; 13787b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 13797b77f048SAleksandar Markovic uint32_t fst2 = fdt2 & 0XFFFFFFFF; 13807b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 13817b77f048SAleksandar Markovic 13827b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 13837b77f048SAleksandar Markovic fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); 13847b77f048SAleksandar Markovic fst2 = float32_sub(fst2, float32_one, &env->active_fpu.fp_status); 13857b77f048SAleksandar Markovic fsth2 = float32_sub(fsth2, float32_one, &env->active_fpu.fp_status); 13867b77f048SAleksandar Markovic fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, 13877b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13887b77f048SAleksandar Markovic fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, 13897b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13907b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13917b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 13927b77f048SAleksandar Markovic } 13937b77f048SAleksandar Markovic 13947b77f048SAleksandar Markovic uint64_t helper_float_addr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) 13957b77f048SAleksandar Markovic { 13967b77f048SAleksandar Markovic uint32_t fst0 = fdt0 & 0XFFFFFFFF; 13977b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 13987b77f048SAleksandar Markovic uint32_t fst1 = fdt1 & 0XFFFFFFFF; 13997b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 14007b77f048SAleksandar Markovic uint32_t fst2; 14017b77f048SAleksandar Markovic uint32_t fsth2; 14027b77f048SAleksandar Markovic 14037b77f048SAleksandar Markovic fst2 = float32_add(fst0, fsth0, &env->active_fpu.fp_status); 14047b77f048SAleksandar Markovic fsth2 = float32_add(fst1, fsth1, &env->active_fpu.fp_status); 14057b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 14067b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 14077b77f048SAleksandar Markovic } 14087b77f048SAleksandar Markovic 14097b77f048SAleksandar Markovic uint64_t helper_float_mulr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) 14107b77f048SAleksandar Markovic { 14117b77f048SAleksandar Markovic uint32_t fst0 = fdt0 & 0XFFFFFFFF; 14127b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 14137b77f048SAleksandar Markovic uint32_t fst1 = fdt1 & 0XFFFFFFFF; 14147b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 14157b77f048SAleksandar Markovic uint32_t fst2; 14167b77f048SAleksandar Markovic uint32_t fsth2; 14177b77f048SAleksandar Markovic 14187b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fsth0, &env->active_fpu.fp_status); 14197b77f048SAleksandar Markovic fsth2 = float32_mul(fst1, fsth1, &env->active_fpu.fp_status); 14207b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 14217b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 14227b77f048SAleksandar Markovic } 14237b77f048SAleksandar Markovic 14247b77f048SAleksandar Markovic #define FLOAT_MINMAX(name, bits, minmaxfunc) \ 14257b77f048SAleksandar Markovic uint ## bits ## _t helper_float_ ## name(CPUMIPSState *env, \ 14267b77f048SAleksandar Markovic uint ## bits ## _t fs, \ 14277b77f048SAleksandar Markovic uint ## bits ## _t ft) \ 14287b77f048SAleksandar Markovic { \ 14297b77f048SAleksandar Markovic uint ## bits ## _t fdret; \ 14307b77f048SAleksandar Markovic \ 14317b77f048SAleksandar Markovic fdret = float ## bits ## _ ## minmaxfunc(fs, ft, \ 14327b77f048SAleksandar Markovic &env->active_fpu.fp_status); \ 14337b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 14347b77f048SAleksandar Markovic return fdret; \ 14357b77f048SAleksandar Markovic } 14367b77f048SAleksandar Markovic 14377b77f048SAleksandar Markovic FLOAT_MINMAX(max_s, 32, maxnum) 14387b77f048SAleksandar Markovic FLOAT_MINMAX(max_d, 64, maxnum) 14397b77f048SAleksandar Markovic FLOAT_MINMAX(maxa_s, 32, maxnummag) 14407b77f048SAleksandar Markovic FLOAT_MINMAX(maxa_d, 64, maxnummag) 14417b77f048SAleksandar Markovic 14427b77f048SAleksandar Markovic FLOAT_MINMAX(min_s, 32, minnum) 14437b77f048SAleksandar Markovic FLOAT_MINMAX(min_d, 64, minnum) 14447b77f048SAleksandar Markovic FLOAT_MINMAX(mina_s, 32, minnummag) 14457b77f048SAleksandar Markovic FLOAT_MINMAX(mina_d, 64, minnummag) 14467b77f048SAleksandar Markovic #undef FLOAT_MINMAX 14477b77f048SAleksandar Markovic 14487b77f048SAleksandar Markovic /* ternary operations */ 14497b77f048SAleksandar Markovic #define UNFUSED_FMA(prefix, a, b, c, flags) \ 14507b77f048SAleksandar Markovic { \ 14517b77f048SAleksandar Markovic a = prefix##_mul(a, b, &env->active_fpu.fp_status); \ 14527b77f048SAleksandar Markovic if ((flags) & float_muladd_negate_c) { \ 14537b77f048SAleksandar Markovic a = prefix##_sub(a, c, &env->active_fpu.fp_status); \ 14547b77f048SAleksandar Markovic } else { \ 14557b77f048SAleksandar Markovic a = prefix##_add(a, c, &env->active_fpu.fp_status); \ 14567b77f048SAleksandar Markovic } \ 14577b77f048SAleksandar Markovic if ((flags) & float_muladd_negate_result) { \ 14587b77f048SAleksandar Markovic a = prefix##_chs(a); \ 14597b77f048SAleksandar Markovic } \ 14607b77f048SAleksandar Markovic } 14617b77f048SAleksandar Markovic 14627b77f048SAleksandar Markovic /* FMA based operations */ 14637b77f048SAleksandar Markovic #define FLOAT_FMA(name, type) \ 14647b77f048SAleksandar Markovic uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \ 14657b77f048SAleksandar Markovic uint64_t fdt0, uint64_t fdt1, \ 14667b77f048SAleksandar Markovic uint64_t fdt2) \ 14677b77f048SAleksandar Markovic { \ 14687b77f048SAleksandar Markovic UNFUSED_FMA(float64, fdt0, fdt1, fdt2, type); \ 14697b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 14707b77f048SAleksandar Markovic return fdt0; \ 14717b77f048SAleksandar Markovic } \ 14727b77f048SAleksandar Markovic \ 14737b77f048SAleksandar Markovic uint32_t helper_float_ ## name ## _s(CPUMIPSState *env, \ 14747b77f048SAleksandar Markovic uint32_t fst0, uint32_t fst1, \ 14757b77f048SAleksandar Markovic uint32_t fst2) \ 14767b77f048SAleksandar Markovic { \ 14777b77f048SAleksandar Markovic UNFUSED_FMA(float32, fst0, fst1, fst2, type); \ 14787b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 14797b77f048SAleksandar Markovic return fst0; \ 14807b77f048SAleksandar Markovic } \ 14817b77f048SAleksandar Markovic \ 14827b77f048SAleksandar Markovic uint64_t helper_float_ ## name ## _ps(CPUMIPSState *env, \ 14837b77f048SAleksandar Markovic uint64_t fdt0, uint64_t fdt1, \ 14847b77f048SAleksandar Markovic uint64_t fdt2) \ 14857b77f048SAleksandar Markovic { \ 14867b77f048SAleksandar Markovic uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ 14877b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; \ 14887b77f048SAleksandar Markovic uint32_t fst1 = fdt1 & 0XFFFFFFFF; \ 14897b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; \ 14907b77f048SAleksandar Markovic uint32_t fst2 = fdt2 & 0XFFFFFFFF; \ 14917b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; \ 14927b77f048SAleksandar Markovic \ 14937b77f048SAleksandar Markovic UNFUSED_FMA(float32, fst0, fst1, fst2, type); \ 14947b77f048SAleksandar Markovic UNFUSED_FMA(float32, fsth0, fsth1, fsth2, type); \ 14957b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 14967b77f048SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fst0; \ 14977b77f048SAleksandar Markovic } 14987b77f048SAleksandar Markovic FLOAT_FMA(nmadd, float_muladd_negate_result) 14997b77f048SAleksandar Markovic FLOAT_FMA(nmsub, float_muladd_negate_result | float_muladd_negate_c) 15007b77f048SAleksandar Markovic #undef FLOAT_FMA 15017b77f048SAleksandar Markovic 150216734cc1SAleksandar Markovic uint64_t helper_float_madd_d(CPUMIPSState *env, uint64_t fst0, 150316734cc1SAleksandar Markovic uint64_t fst1, uint64_t fst2) 150416734cc1SAleksandar Markovic { 150516734cc1SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status); 150616734cc1SAleksandar Markovic fst0 = float64_add(fst0, fst2, &env->active_fpu.fp_status); 150716734cc1SAleksandar Markovic 150816734cc1SAleksandar Markovic update_fcr31(env, GETPC()); 150916734cc1SAleksandar Markovic return fst0; 151016734cc1SAleksandar Markovic } 151116734cc1SAleksandar Markovic 151216734cc1SAleksandar Markovic uint32_t helper_float_madd_s(CPUMIPSState *env, uint32_t fst0, 151316734cc1SAleksandar Markovic uint32_t fst1, uint32_t fst2) 151416734cc1SAleksandar Markovic { 151516734cc1SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 151616734cc1SAleksandar Markovic fst0 = float32_add(fst0, fst2, &env->active_fpu.fp_status); 151716734cc1SAleksandar Markovic 151816734cc1SAleksandar Markovic update_fcr31(env, GETPC()); 151916734cc1SAleksandar Markovic return fst0; 152016734cc1SAleksandar Markovic } 152116734cc1SAleksandar Markovic 152216734cc1SAleksandar Markovic uint64_t helper_float_madd_ps(CPUMIPSState *env, uint64_t fdt0, 152316734cc1SAleksandar Markovic uint64_t fdt1, uint64_t fdt2) 152416734cc1SAleksandar Markovic { 152516734cc1SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 152616734cc1SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 152716734cc1SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 152816734cc1SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 152916734cc1SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 153016734cc1SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 153116734cc1SAleksandar Markovic 153216734cc1SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 153316734cc1SAleksandar Markovic fstl0 = float32_add(fstl0, fstl2, &env->active_fpu.fp_status); 153416734cc1SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 153516734cc1SAleksandar Markovic fsth0 = float32_add(fsth0, fsth2, &env->active_fpu.fp_status); 153616734cc1SAleksandar Markovic 153716734cc1SAleksandar Markovic update_fcr31(env, GETPC()); 153816734cc1SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0; 153916734cc1SAleksandar Markovic } 154016734cc1SAleksandar Markovic 1541*faec7524SAleksandar Markovic uint64_t helper_float_msub_d(CPUMIPSState *env, uint64_t fst0, 1542*faec7524SAleksandar Markovic uint64_t fst1, uint64_t fst2) 1543*faec7524SAleksandar Markovic { 1544*faec7524SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status); 1545*faec7524SAleksandar Markovic fst0 = float64_sub(fst0, fst2, &env->active_fpu.fp_status); 1546*faec7524SAleksandar Markovic 1547*faec7524SAleksandar Markovic update_fcr31(env, GETPC()); 1548*faec7524SAleksandar Markovic return fst0; 1549*faec7524SAleksandar Markovic } 1550*faec7524SAleksandar Markovic 1551*faec7524SAleksandar Markovic uint32_t helper_float_msub_s(CPUMIPSState *env, uint32_t fst0, 1552*faec7524SAleksandar Markovic uint32_t fst1, uint32_t fst2) 1553*faec7524SAleksandar Markovic { 1554*faec7524SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 1555*faec7524SAleksandar Markovic fst0 = float32_sub(fst0, fst2, &env->active_fpu.fp_status); 1556*faec7524SAleksandar Markovic 1557*faec7524SAleksandar Markovic update_fcr31(env, GETPC()); 1558*faec7524SAleksandar Markovic return fst0; 1559*faec7524SAleksandar Markovic } 1560*faec7524SAleksandar Markovic 1561*faec7524SAleksandar Markovic uint64_t helper_float_msub_ps(CPUMIPSState *env, uint64_t fdt0, 1562*faec7524SAleksandar Markovic uint64_t fdt1, uint64_t fdt2) 1563*faec7524SAleksandar Markovic { 1564*faec7524SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 1565*faec7524SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1566*faec7524SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 1567*faec7524SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 1568*faec7524SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 1569*faec7524SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 1570*faec7524SAleksandar Markovic 1571*faec7524SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 1572*faec7524SAleksandar Markovic fstl0 = float32_sub(fstl0, fstl2, &env->active_fpu.fp_status); 1573*faec7524SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 1574*faec7524SAleksandar Markovic fsth0 = float32_sub(fsth0, fsth2, &env->active_fpu.fp_status); 1575*faec7524SAleksandar Markovic 1576*faec7524SAleksandar Markovic update_fcr31(env, GETPC()); 1577*faec7524SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0; 1578*faec7524SAleksandar Markovic } 1579*faec7524SAleksandar Markovic 158016734cc1SAleksandar Markovic 15817b77f048SAleksandar Markovic #define FLOAT_FMADDSUB(name, bits, muladd_arg) \ 15827b77f048SAleksandar Markovic uint ## bits ## _t helper_float_ ## name(CPUMIPSState *env, \ 15837b77f048SAleksandar Markovic uint ## bits ## _t fs, \ 15847b77f048SAleksandar Markovic uint ## bits ## _t ft, \ 15857b77f048SAleksandar Markovic uint ## bits ## _t fd) \ 15867b77f048SAleksandar Markovic { \ 15877b77f048SAleksandar Markovic uint ## bits ## _t fdret; \ 15887b77f048SAleksandar Markovic \ 15897b77f048SAleksandar Markovic fdret = float ## bits ## _muladd(fs, ft, fd, muladd_arg, \ 15907b77f048SAleksandar Markovic &env->active_fpu.fp_status); \ 15917b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 15927b77f048SAleksandar Markovic return fdret; \ 15937b77f048SAleksandar Markovic } 15947b77f048SAleksandar Markovic 15957b77f048SAleksandar Markovic FLOAT_FMADDSUB(maddf_s, 32, 0) 15967b77f048SAleksandar Markovic FLOAT_FMADDSUB(maddf_d, 64, 0) 15977b77f048SAleksandar Markovic FLOAT_FMADDSUB(msubf_s, 32, float_muladd_negate_product) 15987b77f048SAleksandar Markovic FLOAT_FMADDSUB(msubf_d, 64, float_muladd_negate_product) 15997b77f048SAleksandar Markovic #undef FLOAT_FMADDSUB 16007b77f048SAleksandar Markovic 16017b77f048SAleksandar Markovic /* compare operations */ 16027b77f048SAleksandar Markovic #define FOP_COND_D(op, cond) \ 16037b77f048SAleksandar Markovic void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 16047b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 16057b77f048SAleksandar Markovic { \ 16067b77f048SAleksandar Markovic int c; \ 16077b77f048SAleksandar Markovic c = cond; \ 16087b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 16097b77f048SAleksandar Markovic if (c) \ 16107b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 16117b77f048SAleksandar Markovic else \ 16127b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 16137b77f048SAleksandar Markovic } \ 16147b77f048SAleksandar Markovic void helper_cmpabs_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 16157b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 16167b77f048SAleksandar Markovic { \ 16177b77f048SAleksandar Markovic int c; \ 16187b77f048SAleksandar Markovic fdt0 = float64_abs(fdt0); \ 16197b77f048SAleksandar Markovic fdt1 = float64_abs(fdt1); \ 16207b77f048SAleksandar Markovic c = cond; \ 16217b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 16227b77f048SAleksandar Markovic if (c) \ 16237b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 16247b77f048SAleksandar Markovic else \ 16257b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 16267b77f048SAleksandar Markovic } 16277b77f048SAleksandar Markovic 16287b77f048SAleksandar Markovic /* 16297b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 16307b77f048SAleksandar Markovic * but float64_unordered_quiet() is still called. 16317b77f048SAleksandar Markovic */ 16327b77f048SAleksandar Markovic FOP_COND_D(f, (float64_unordered_quiet(fdt1, fdt0, 16337b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 16347b77f048SAleksandar Markovic FOP_COND_D(un, float64_unordered_quiet(fdt1, fdt0, 16357b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16367b77f048SAleksandar Markovic FOP_COND_D(eq, float64_eq_quiet(fdt0, fdt1, 16377b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16387b77f048SAleksandar Markovic FOP_COND_D(ueq, float64_unordered_quiet(fdt1, fdt0, 16397b77f048SAleksandar Markovic &env->active_fpu.fp_status) 16407b77f048SAleksandar Markovic || float64_eq_quiet(fdt0, fdt1, 16417b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16427b77f048SAleksandar Markovic FOP_COND_D(olt, float64_lt_quiet(fdt0, fdt1, 16437b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16447b77f048SAleksandar Markovic FOP_COND_D(ult, float64_unordered_quiet(fdt1, fdt0, 16457b77f048SAleksandar Markovic &env->active_fpu.fp_status) 16467b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 16477b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16487b77f048SAleksandar Markovic FOP_COND_D(ole, float64_le_quiet(fdt0, fdt1, 16497b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16507b77f048SAleksandar Markovic FOP_COND_D(ule, float64_unordered_quiet(fdt1, fdt0, 16517b77f048SAleksandar Markovic &env->active_fpu.fp_status) 16527b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1, 16537b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16547b77f048SAleksandar Markovic /* 16557b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 16567b77f048SAleksandar Markovic * but float64_unordered() is still called. 16577b77f048SAleksandar Markovic */ 16587b77f048SAleksandar Markovic FOP_COND_D(sf, (float64_unordered(fdt1, fdt0, 16597b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 16607b77f048SAleksandar Markovic FOP_COND_D(ngle, float64_unordered(fdt1, fdt0, 16617b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16627b77f048SAleksandar Markovic FOP_COND_D(seq, float64_eq(fdt0, fdt1, 16637b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16647b77f048SAleksandar Markovic FOP_COND_D(ngl, float64_unordered(fdt1, fdt0, 16657b77f048SAleksandar Markovic &env->active_fpu.fp_status) 16667b77f048SAleksandar Markovic || float64_eq(fdt0, fdt1, 16677b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16687b77f048SAleksandar Markovic FOP_COND_D(lt, float64_lt(fdt0, fdt1, 16697b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16707b77f048SAleksandar Markovic FOP_COND_D(nge, float64_unordered(fdt1, fdt0, 16717b77f048SAleksandar Markovic &env->active_fpu.fp_status) 16727b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 16737b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16747b77f048SAleksandar Markovic FOP_COND_D(le, float64_le(fdt0, fdt1, 16757b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16767b77f048SAleksandar Markovic FOP_COND_D(ngt, float64_unordered(fdt1, fdt0, 16777b77f048SAleksandar Markovic &env->active_fpu.fp_status) 16787b77f048SAleksandar Markovic || float64_le(fdt0, fdt1, 16797b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 16807b77f048SAleksandar Markovic 16817b77f048SAleksandar Markovic #define FOP_COND_S(op, cond) \ 16827b77f048SAleksandar Markovic void helper_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ 16837b77f048SAleksandar Markovic uint32_t fst1, int cc) \ 16847b77f048SAleksandar Markovic { \ 16857b77f048SAleksandar Markovic int c; \ 16867b77f048SAleksandar Markovic c = cond; \ 16877b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 16887b77f048SAleksandar Markovic if (c) \ 16897b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 16907b77f048SAleksandar Markovic else \ 16917b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 16927b77f048SAleksandar Markovic } \ 16937b77f048SAleksandar Markovic void helper_cmpabs_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ 16947b77f048SAleksandar Markovic uint32_t fst1, int cc) \ 16957b77f048SAleksandar Markovic { \ 16967b77f048SAleksandar Markovic int c; \ 16977b77f048SAleksandar Markovic fst0 = float32_abs(fst0); \ 16987b77f048SAleksandar Markovic fst1 = float32_abs(fst1); \ 16997b77f048SAleksandar Markovic c = cond; \ 17007b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 17017b77f048SAleksandar Markovic if (c) \ 17027b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 17037b77f048SAleksandar Markovic else \ 17047b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 17057b77f048SAleksandar Markovic } 17067b77f048SAleksandar Markovic 17077b77f048SAleksandar Markovic /* 17087b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 17097b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called. 17107b77f048SAleksandar Markovic */ 17117b77f048SAleksandar Markovic FOP_COND_S(f, (float32_unordered_quiet(fst1, fst0, 17127b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 17137b77f048SAleksandar Markovic FOP_COND_S(un, float32_unordered_quiet(fst1, fst0, 17147b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17157b77f048SAleksandar Markovic FOP_COND_S(eq, float32_eq_quiet(fst0, fst1, 17167b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17177b77f048SAleksandar Markovic FOP_COND_S(ueq, float32_unordered_quiet(fst1, fst0, 17187b77f048SAleksandar Markovic &env->active_fpu.fp_status) 17197b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1, 17207b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17217b77f048SAleksandar Markovic FOP_COND_S(olt, float32_lt_quiet(fst0, fst1, 17227b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17237b77f048SAleksandar Markovic FOP_COND_S(ult, float32_unordered_quiet(fst1, fst0, 17247b77f048SAleksandar Markovic &env->active_fpu.fp_status) 17257b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 17267b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17277b77f048SAleksandar Markovic FOP_COND_S(ole, float32_le_quiet(fst0, fst1, 17287b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17297b77f048SAleksandar Markovic FOP_COND_S(ule, float32_unordered_quiet(fst1, fst0, 17307b77f048SAleksandar Markovic &env->active_fpu.fp_status) 17317b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 17327b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17337b77f048SAleksandar Markovic /* 17347b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 17357b77f048SAleksandar Markovic * but float32_unordered() is still called. 17367b77f048SAleksandar Markovic */ 17377b77f048SAleksandar Markovic FOP_COND_S(sf, (float32_unordered(fst1, fst0, 17387b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 17397b77f048SAleksandar Markovic FOP_COND_S(ngle, float32_unordered(fst1, fst0, 17407b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17417b77f048SAleksandar Markovic FOP_COND_S(seq, float32_eq(fst0, fst1, 17427b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17437b77f048SAleksandar Markovic FOP_COND_S(ngl, float32_unordered(fst1, fst0, 17447b77f048SAleksandar Markovic &env->active_fpu.fp_status) 17457b77f048SAleksandar Markovic || float32_eq(fst0, fst1, 17467b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17477b77f048SAleksandar Markovic FOP_COND_S(lt, float32_lt(fst0, fst1, 17487b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17497b77f048SAleksandar Markovic FOP_COND_S(nge, float32_unordered(fst1, fst0, 17507b77f048SAleksandar Markovic &env->active_fpu.fp_status) 17517b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 17527b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17537b77f048SAleksandar Markovic FOP_COND_S(le, float32_le(fst0, fst1, 17547b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17557b77f048SAleksandar Markovic FOP_COND_S(ngt, float32_unordered(fst1, fst0, 17567b77f048SAleksandar Markovic &env->active_fpu.fp_status) 17577b77f048SAleksandar Markovic || float32_le(fst0, fst1, 17587b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 17597b77f048SAleksandar Markovic 17607b77f048SAleksandar Markovic #define FOP_COND_PS(op, condl, condh) \ 17617b77f048SAleksandar Markovic void helper_cmp_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 17627b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 17637b77f048SAleksandar Markovic { \ 17647b77f048SAleksandar Markovic uint32_t fst0, fsth0, fst1, fsth1; \ 17657b77f048SAleksandar Markovic int ch, cl; \ 17667b77f048SAleksandar Markovic fst0 = fdt0 & 0XFFFFFFFF; \ 17677b77f048SAleksandar Markovic fsth0 = fdt0 >> 32; \ 17687b77f048SAleksandar Markovic fst1 = fdt1 & 0XFFFFFFFF; \ 17697b77f048SAleksandar Markovic fsth1 = fdt1 >> 32; \ 17707b77f048SAleksandar Markovic cl = condl; \ 17717b77f048SAleksandar Markovic ch = condh; \ 17727b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 17737b77f048SAleksandar Markovic if (cl) \ 17747b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 17757b77f048SAleksandar Markovic else \ 17767b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 17777b77f048SAleksandar Markovic if (ch) \ 17787b77f048SAleksandar Markovic SET_FP_COND(cc + 1, env->active_fpu); \ 17797b77f048SAleksandar Markovic else \ 17807b77f048SAleksandar Markovic CLEAR_FP_COND(cc + 1, env->active_fpu); \ 17817b77f048SAleksandar Markovic } \ 17827b77f048SAleksandar Markovic void helper_cmpabs_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 17837b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 17847b77f048SAleksandar Markovic { \ 17857b77f048SAleksandar Markovic uint32_t fst0, fsth0, fst1, fsth1; \ 17867b77f048SAleksandar Markovic int ch, cl; \ 17877b77f048SAleksandar Markovic fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \ 17887b77f048SAleksandar Markovic fsth0 = float32_abs(fdt0 >> 32); \ 17897b77f048SAleksandar Markovic fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \ 17907b77f048SAleksandar Markovic fsth1 = float32_abs(fdt1 >> 32); \ 17917b77f048SAleksandar Markovic cl = condl; \ 17927b77f048SAleksandar Markovic ch = condh; \ 17937b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 17947b77f048SAleksandar Markovic if (cl) \ 17957b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 17967b77f048SAleksandar Markovic else \ 17977b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 17987b77f048SAleksandar Markovic if (ch) \ 17997b77f048SAleksandar Markovic SET_FP_COND(cc + 1, env->active_fpu); \ 18007b77f048SAleksandar Markovic else \ 18017b77f048SAleksandar Markovic CLEAR_FP_COND(cc + 1, env->active_fpu); \ 18027b77f048SAleksandar Markovic } 18037b77f048SAleksandar Markovic 18047b77f048SAleksandar Markovic /* 18057b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 18067b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called. 18077b77f048SAleksandar Markovic */ 18087b77f048SAleksandar Markovic FOP_COND_PS(f, (float32_unordered_quiet(fst1, fst0, 18097b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0), 18107b77f048SAleksandar Markovic (float32_unordered_quiet(fsth1, fsth0, 18117b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 18127b77f048SAleksandar Markovic FOP_COND_PS(un, float32_unordered_quiet(fst1, fst0, 18137b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18147b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 18157b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18167b77f048SAleksandar Markovic FOP_COND_PS(eq, float32_eq_quiet(fst0, fst1, 18177b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18187b77f048SAleksandar Markovic float32_eq_quiet(fsth0, fsth1, 18197b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18207b77f048SAleksandar Markovic FOP_COND_PS(ueq, float32_unordered_quiet(fst1, fst0, 18217b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18227b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1, 18237b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18247b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 18257b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18267b77f048SAleksandar Markovic || float32_eq_quiet(fsth0, fsth1, 18277b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18287b77f048SAleksandar Markovic FOP_COND_PS(olt, float32_lt_quiet(fst0, fst1, 18297b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18307b77f048SAleksandar Markovic float32_lt_quiet(fsth0, fsth1, 18317b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18327b77f048SAleksandar Markovic FOP_COND_PS(ult, float32_unordered_quiet(fst1, fst0, 18337b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18347b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 18357b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18367b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 18377b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18387b77f048SAleksandar Markovic || float32_lt_quiet(fsth0, fsth1, 18397b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18407b77f048SAleksandar Markovic FOP_COND_PS(ole, float32_le_quiet(fst0, fst1, 18417b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18427b77f048SAleksandar Markovic float32_le_quiet(fsth0, fsth1, 18437b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18447b77f048SAleksandar Markovic FOP_COND_PS(ule, float32_unordered_quiet(fst1, fst0, 18457b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18467b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 18477b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18487b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 18497b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18507b77f048SAleksandar Markovic || float32_le_quiet(fsth0, fsth1, 18517b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18527b77f048SAleksandar Markovic /* 18537b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 18547b77f048SAleksandar Markovic * but float32_unordered() is still called. 18557b77f048SAleksandar Markovic */ 18567b77f048SAleksandar Markovic FOP_COND_PS(sf, (float32_unordered(fst1, fst0, 18577b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0), 18587b77f048SAleksandar Markovic (float32_unordered(fsth1, fsth0, 18597b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 18607b77f048SAleksandar Markovic FOP_COND_PS(ngle, float32_unordered(fst1, fst0, 18617b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18627b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 18637b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18647b77f048SAleksandar Markovic FOP_COND_PS(seq, float32_eq(fst0, fst1, 18657b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18667b77f048SAleksandar Markovic float32_eq(fsth0, fsth1, 18677b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18687b77f048SAleksandar Markovic FOP_COND_PS(ngl, float32_unordered(fst1, fst0, 18697b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18707b77f048SAleksandar Markovic || float32_eq(fst0, fst1, 18717b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18727b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 18737b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18747b77f048SAleksandar Markovic || float32_eq(fsth0, fsth1, 18757b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18767b77f048SAleksandar Markovic FOP_COND_PS(lt, float32_lt(fst0, fst1, 18777b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18787b77f048SAleksandar Markovic float32_lt(fsth0, fsth1, 18797b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18807b77f048SAleksandar Markovic FOP_COND_PS(nge, float32_unordered(fst1, fst0, 18817b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18827b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 18837b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18847b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 18857b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18867b77f048SAleksandar Markovic || float32_lt(fsth0, fsth1, 18877b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18887b77f048SAleksandar Markovic FOP_COND_PS(le, float32_le(fst0, fst1, 18897b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18907b77f048SAleksandar Markovic float32_le(fsth0, fsth1, 18917b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18927b77f048SAleksandar Markovic FOP_COND_PS(ngt, float32_unordered(fst1, fst0, 18937b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18947b77f048SAleksandar Markovic || float32_le(fst0, fst1, 18957b77f048SAleksandar Markovic &env->active_fpu.fp_status), 18967b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 18977b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18987b77f048SAleksandar Markovic || float32_le(fsth0, fsth1, 18997b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19007b77f048SAleksandar Markovic 19017b77f048SAleksandar Markovic /* R6 compare operations */ 19027b77f048SAleksandar Markovic #define FOP_CONDN_D(op, cond) \ 19037b77f048SAleksandar Markovic uint64_t helper_r6_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 19047b77f048SAleksandar Markovic uint64_t fdt1) \ 19057b77f048SAleksandar Markovic { \ 19067b77f048SAleksandar Markovic uint64_t c; \ 19077b77f048SAleksandar Markovic c = cond; \ 19087b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 19097b77f048SAleksandar Markovic if (c) { \ 19107b77f048SAleksandar Markovic return -1; \ 19117b77f048SAleksandar Markovic } else { \ 19127b77f048SAleksandar Markovic return 0; \ 19137b77f048SAleksandar Markovic } \ 19147b77f048SAleksandar Markovic } 19157b77f048SAleksandar Markovic 19167b77f048SAleksandar Markovic /* 19177b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 19187b77f048SAleksandar Markovic * but float64_unordered_quiet() is still called. 19197b77f048SAleksandar Markovic */ 19207b77f048SAleksandar Markovic FOP_CONDN_D(af, (float64_unordered_quiet(fdt1, fdt0, 19217b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 19227b77f048SAleksandar Markovic FOP_CONDN_D(un, (float64_unordered_quiet(fdt1, fdt0, 19237b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19247b77f048SAleksandar Markovic FOP_CONDN_D(eq, (float64_eq_quiet(fdt0, fdt1, 19257b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19267b77f048SAleksandar Markovic FOP_CONDN_D(ueq, (float64_unordered_quiet(fdt1, fdt0, 19277b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19287b77f048SAleksandar Markovic || float64_eq_quiet(fdt0, fdt1, 19297b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19307b77f048SAleksandar Markovic FOP_CONDN_D(lt, (float64_lt_quiet(fdt0, fdt1, 19317b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19327b77f048SAleksandar Markovic FOP_CONDN_D(ult, (float64_unordered_quiet(fdt1, fdt0, 19337b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19347b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 19357b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19367b77f048SAleksandar Markovic FOP_CONDN_D(le, (float64_le_quiet(fdt0, fdt1, 19377b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19387b77f048SAleksandar Markovic FOP_CONDN_D(ule, (float64_unordered_quiet(fdt1, fdt0, 19397b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19407b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1, 19417b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19427b77f048SAleksandar Markovic /* 19437b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 19447b77f048SAleksandar Markovic * but float64_unordered() is still called.\ 19457b77f048SAleksandar Markovic */ 19467b77f048SAleksandar Markovic FOP_CONDN_D(saf, (float64_unordered(fdt1, fdt0, 19477b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 19487b77f048SAleksandar Markovic FOP_CONDN_D(sun, (float64_unordered(fdt1, fdt0, 19497b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19507b77f048SAleksandar Markovic FOP_CONDN_D(seq, (float64_eq(fdt0, fdt1, 19517b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19527b77f048SAleksandar Markovic FOP_CONDN_D(sueq, (float64_unordered(fdt1, fdt0, 19537b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19547b77f048SAleksandar Markovic || float64_eq(fdt0, fdt1, 19557b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19567b77f048SAleksandar Markovic FOP_CONDN_D(slt, (float64_lt(fdt0, fdt1, 19577b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19587b77f048SAleksandar Markovic FOP_CONDN_D(sult, (float64_unordered(fdt1, fdt0, 19597b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19607b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 19617b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19627b77f048SAleksandar Markovic FOP_CONDN_D(sle, (float64_le(fdt0, fdt1, 19637b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19647b77f048SAleksandar Markovic FOP_CONDN_D(sule, (float64_unordered(fdt1, fdt0, 19657b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19667b77f048SAleksandar Markovic || float64_le(fdt0, fdt1, 19677b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19687b77f048SAleksandar Markovic FOP_CONDN_D(or, (float64_le_quiet(fdt1, fdt0, 19697b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19707b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1, 19717b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19727b77f048SAleksandar Markovic FOP_CONDN_D(une, (float64_unordered_quiet(fdt1, fdt0, 19737b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19747b77f048SAleksandar Markovic || float64_lt_quiet(fdt1, fdt0, 19757b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19767b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 19777b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19787b77f048SAleksandar Markovic FOP_CONDN_D(ne, (float64_lt_quiet(fdt1, fdt0, 19797b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19807b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 19817b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19827b77f048SAleksandar Markovic FOP_CONDN_D(sor, (float64_le(fdt1, fdt0, 19837b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19847b77f048SAleksandar Markovic || float64_le(fdt0, fdt1, 19857b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19867b77f048SAleksandar Markovic FOP_CONDN_D(sune, (float64_unordered(fdt1, fdt0, 19877b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19887b77f048SAleksandar Markovic || float64_lt(fdt1, fdt0, 19897b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19907b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 19917b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19927b77f048SAleksandar Markovic FOP_CONDN_D(sne, (float64_lt(fdt1, fdt0, 19937b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19947b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 19957b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 19967b77f048SAleksandar Markovic 19977b77f048SAleksandar Markovic #define FOP_CONDN_S(op, cond) \ 19987b77f048SAleksandar Markovic uint32_t helper_r6_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ 19997b77f048SAleksandar Markovic uint32_t fst1) \ 20007b77f048SAleksandar Markovic { \ 20017b77f048SAleksandar Markovic uint64_t c; \ 20027b77f048SAleksandar Markovic c = cond; \ 20037b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 20047b77f048SAleksandar Markovic if (c) { \ 20057b77f048SAleksandar Markovic return -1; \ 20067b77f048SAleksandar Markovic } else { \ 20077b77f048SAleksandar Markovic return 0; \ 20087b77f048SAleksandar Markovic } \ 20097b77f048SAleksandar Markovic } 20107b77f048SAleksandar Markovic 20117b77f048SAleksandar Markovic /* 20127b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 20137b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called. 20147b77f048SAleksandar Markovic */ 20157b77f048SAleksandar Markovic FOP_CONDN_S(af, (float32_unordered_quiet(fst1, fst0, 20167b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 20177b77f048SAleksandar Markovic FOP_CONDN_S(un, (float32_unordered_quiet(fst1, fst0, 20187b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20197b77f048SAleksandar Markovic FOP_CONDN_S(eq, (float32_eq_quiet(fst0, fst1, 20207b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20217b77f048SAleksandar Markovic FOP_CONDN_S(ueq, (float32_unordered_quiet(fst1, fst0, 20227b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20237b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1, 20247b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20257b77f048SAleksandar Markovic FOP_CONDN_S(lt, (float32_lt_quiet(fst0, fst1, 20267b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20277b77f048SAleksandar Markovic FOP_CONDN_S(ult, (float32_unordered_quiet(fst1, fst0, 20287b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20297b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 20307b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20317b77f048SAleksandar Markovic FOP_CONDN_S(le, (float32_le_quiet(fst0, fst1, 20327b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20337b77f048SAleksandar Markovic FOP_CONDN_S(ule, (float32_unordered_quiet(fst1, fst0, 20347b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20357b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 20367b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20377b77f048SAleksandar Markovic /* 20387b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 20397b77f048SAleksandar Markovic * but float32_unordered() is still called. 20407b77f048SAleksandar Markovic */ 20417b77f048SAleksandar Markovic FOP_CONDN_S(saf, (float32_unordered(fst1, fst0, 20427b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 20437b77f048SAleksandar Markovic FOP_CONDN_S(sun, (float32_unordered(fst1, fst0, 20447b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20457b77f048SAleksandar Markovic FOP_CONDN_S(seq, (float32_eq(fst0, fst1, 20467b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20477b77f048SAleksandar Markovic FOP_CONDN_S(sueq, (float32_unordered(fst1, fst0, 20487b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20497b77f048SAleksandar Markovic || float32_eq(fst0, fst1, 20507b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20517b77f048SAleksandar Markovic FOP_CONDN_S(slt, (float32_lt(fst0, fst1, 20527b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20537b77f048SAleksandar Markovic FOP_CONDN_S(sult, (float32_unordered(fst1, fst0, 20547b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20557b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 20567b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20577b77f048SAleksandar Markovic FOP_CONDN_S(sle, (float32_le(fst0, fst1, 20587b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20597b77f048SAleksandar Markovic FOP_CONDN_S(sule, (float32_unordered(fst1, fst0, 20607b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20617b77f048SAleksandar Markovic || float32_le(fst0, fst1, 20627b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20637b77f048SAleksandar Markovic FOP_CONDN_S(or, (float32_le_quiet(fst1, fst0, 20647b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20657b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 20667b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20677b77f048SAleksandar Markovic FOP_CONDN_S(une, (float32_unordered_quiet(fst1, fst0, 20687b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20697b77f048SAleksandar Markovic || float32_lt_quiet(fst1, fst0, 20707b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20717b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 20727b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20737b77f048SAleksandar Markovic FOP_CONDN_S(ne, (float32_lt_quiet(fst1, fst0, 20747b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20757b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 20767b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20777b77f048SAleksandar Markovic FOP_CONDN_S(sor, (float32_le(fst1, fst0, 20787b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20797b77f048SAleksandar Markovic || float32_le(fst0, fst1, 20807b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20817b77f048SAleksandar Markovic FOP_CONDN_S(sune, (float32_unordered(fst1, fst0, 20827b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20837b77f048SAleksandar Markovic || float32_lt(fst1, fst0, 20847b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20857b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 20867b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20877b77f048SAleksandar Markovic FOP_CONDN_S(sne, (float32_lt(fst1, fst0, 20887b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20897b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 20907b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 2091