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 1929579f781SAleksandar Markovic static inline int ieee_to_mips_xcpt(int ieee_xcpt) 1937b77f048SAleksandar Markovic { 1949579f781SAleksandar Markovic int mips_xcpt = 0; 1959579f781SAleksandar Markovic 1969579f781SAleksandar Markovic if (ieee_xcpt & float_flag_invalid) { 1979579f781SAleksandar Markovic mips_xcpt |= FP_INVALID; 1987b77f048SAleksandar Markovic } 1999579f781SAleksandar Markovic if (ieee_xcpt & float_flag_overflow) { 2009579f781SAleksandar Markovic mips_xcpt |= FP_OVERFLOW; 2017b77f048SAleksandar Markovic } 2029579f781SAleksandar Markovic if (ieee_xcpt & float_flag_underflow) { 2039579f781SAleksandar Markovic mips_xcpt |= FP_UNDERFLOW; 2047b77f048SAleksandar Markovic } 2059579f781SAleksandar Markovic if (ieee_xcpt & float_flag_divbyzero) { 2069579f781SAleksandar Markovic mips_xcpt |= FP_DIV0; 2077b77f048SAleksandar Markovic } 2089579f781SAleksandar Markovic if (ieee_xcpt & float_flag_inexact) { 2099579f781SAleksandar Markovic mips_xcpt |= FP_INEXACT; 2107b77f048SAleksandar Markovic } 2119579f781SAleksandar Markovic 2129579f781SAleksandar Markovic return mips_xcpt; 2137b77f048SAleksandar Markovic } 2147b77f048SAleksandar Markovic 2157b77f048SAleksandar Markovic static inline void update_fcr31(CPUMIPSState *env, uintptr_t pc) 2167b77f048SAleksandar Markovic { 2179579f781SAleksandar Markovic int ieee_exception_flags = get_float_exception_flags( 2189579f781SAleksandar Markovic &env->active_fpu.fp_status); 2199579f781SAleksandar Markovic int mips_exception_flags = 0; 2207b77f048SAleksandar Markovic 2219579f781SAleksandar Markovic if (ieee_exception_flags) { 2229579f781SAleksandar Markovic mips_exception_flags = ieee_to_mips_xcpt(ieee_exception_flags); 2239579f781SAleksandar Markovic } 2247b77f048SAleksandar Markovic 2259579f781SAleksandar Markovic SET_FP_CAUSE(env->active_fpu.fcr31, mips_exception_flags); 2269579f781SAleksandar Markovic 2279579f781SAleksandar Markovic if (mips_exception_flags) { 2287b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status); 2297b77f048SAleksandar Markovic 2309579f781SAleksandar Markovic if (GET_FP_ENABLE(env->active_fpu.fcr31) & mips_exception_flags) { 2317b77f048SAleksandar Markovic do_raise_exception(env, EXCP_FPE, pc); 2327b77f048SAleksandar Markovic } else { 2339579f781SAleksandar Markovic UPDATE_FP_FLAGS(env->active_fpu.fcr31, mips_exception_flags); 2347b77f048SAleksandar Markovic } 2357b77f048SAleksandar Markovic } 2367b77f048SAleksandar Markovic } 2377b77f048SAleksandar Markovic 2387b77f048SAleksandar Markovic /* 2397b77f048SAleksandar Markovic * Float support. 2407b77f048SAleksandar Markovic * Single precition routines have a "s" suffix, double precision a 2417b77f048SAleksandar Markovic * "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps", 2427b77f048SAleksandar Markovic * paired single lower "pl", paired single upper "pu". 2437b77f048SAleksandar Markovic */ 2447b77f048SAleksandar Markovic 2457b77f048SAleksandar Markovic /* unary operations, modifying fp status */ 2467b77f048SAleksandar Markovic uint64_t helper_float_sqrt_d(CPUMIPSState *env, uint64_t fdt0) 2477b77f048SAleksandar Markovic { 2487b77f048SAleksandar Markovic fdt0 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 2497b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2507b77f048SAleksandar Markovic return fdt0; 2517b77f048SAleksandar Markovic } 2527b77f048SAleksandar Markovic 2537b77f048SAleksandar Markovic uint32_t helper_float_sqrt_s(CPUMIPSState *env, uint32_t fst0) 2547b77f048SAleksandar Markovic { 2557b77f048SAleksandar Markovic fst0 = float32_sqrt(fst0, &env->active_fpu.fp_status); 2567b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2577b77f048SAleksandar Markovic return fst0; 2587b77f048SAleksandar Markovic } 2597b77f048SAleksandar Markovic 2607b77f048SAleksandar Markovic uint64_t helper_float_cvtd_s(CPUMIPSState *env, uint32_t fst0) 2617b77f048SAleksandar Markovic { 2627b77f048SAleksandar Markovic uint64_t fdt2; 2637b77f048SAleksandar Markovic 2647b77f048SAleksandar Markovic fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); 2657b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2667b77f048SAleksandar Markovic return fdt2; 2677b77f048SAleksandar Markovic } 2687b77f048SAleksandar Markovic 2697b77f048SAleksandar Markovic uint64_t helper_float_cvtd_w(CPUMIPSState *env, uint32_t wt0) 2707b77f048SAleksandar Markovic { 2717b77f048SAleksandar Markovic uint64_t fdt2; 2727b77f048SAleksandar Markovic 2737b77f048SAleksandar Markovic fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); 2747b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2757b77f048SAleksandar Markovic return fdt2; 2767b77f048SAleksandar Markovic } 2777b77f048SAleksandar Markovic 2787b77f048SAleksandar Markovic uint64_t helper_float_cvtd_l(CPUMIPSState *env, uint64_t dt0) 2797b77f048SAleksandar Markovic { 2807b77f048SAleksandar Markovic uint64_t fdt2; 2817b77f048SAleksandar Markovic 2827b77f048SAleksandar Markovic fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); 2837b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2847b77f048SAleksandar Markovic return fdt2; 2857b77f048SAleksandar Markovic } 2867b77f048SAleksandar Markovic 2877b77f048SAleksandar Markovic uint64_t helper_float_cvt_l_d(CPUMIPSState *env, uint64_t fdt0) 2887b77f048SAleksandar Markovic { 2897b77f048SAleksandar Markovic uint64_t dt2; 2907b77f048SAleksandar Markovic 2917b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 2927b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 2937b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 2947b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 2957b77f048SAleksandar Markovic } 2967b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 2977b77f048SAleksandar Markovic return dt2; 2987b77f048SAleksandar Markovic } 2997b77f048SAleksandar Markovic 3007b77f048SAleksandar Markovic uint64_t helper_float_cvt_l_s(CPUMIPSState *env, uint32_t fst0) 3017b77f048SAleksandar Markovic { 3027b77f048SAleksandar Markovic uint64_t dt2; 3037b77f048SAleksandar Markovic 3047b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 3057b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 3067b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 3077b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 3087b77f048SAleksandar Markovic } 3097b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3107b77f048SAleksandar Markovic return dt2; 3117b77f048SAleksandar Markovic } 3127b77f048SAleksandar Markovic 3137b77f048SAleksandar Markovic uint64_t helper_float_cvtps_pw(CPUMIPSState *env, uint64_t dt0) 3147b77f048SAleksandar Markovic { 3157b77f048SAleksandar Markovic uint32_t fst2; 3167b77f048SAleksandar Markovic uint32_t fsth2; 3177b77f048SAleksandar Markovic 3187b77f048SAleksandar Markovic fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 3197b77f048SAleksandar Markovic fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status); 3207b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3217b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2; 3227b77f048SAleksandar Markovic } 3237b77f048SAleksandar Markovic 3247b77f048SAleksandar Markovic uint64_t helper_float_cvtpw_ps(CPUMIPSState *env, uint64_t fdt0) 3257b77f048SAleksandar Markovic { 3267b77f048SAleksandar Markovic uint32_t wt2; 3277b77f048SAleksandar Markovic uint32_t wth2; 3287b77f048SAleksandar Markovic int excp, excph; 3297b77f048SAleksandar Markovic 3307b77f048SAleksandar Markovic wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 3317b77f048SAleksandar Markovic excp = get_float_exception_flags(&env->active_fpu.fp_status); 3327b77f048SAleksandar Markovic if (excp & (float_flag_overflow | float_flag_invalid)) { 3337b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 3347b77f048SAleksandar Markovic } 3357b77f048SAleksandar Markovic 3367b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status); 3377b77f048SAleksandar Markovic wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status); 3387b77f048SAleksandar Markovic excph = get_float_exception_flags(&env->active_fpu.fp_status); 3397b77f048SAleksandar Markovic if (excph & (float_flag_overflow | float_flag_invalid)) { 3407b77f048SAleksandar Markovic wth2 = FP_TO_INT32_OVERFLOW; 3417b77f048SAleksandar Markovic } 3427b77f048SAleksandar Markovic 3437b77f048SAleksandar Markovic set_float_exception_flags(excp | excph, &env->active_fpu.fp_status); 3447b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3457b77f048SAleksandar Markovic 3467b77f048SAleksandar Markovic return ((uint64_t)wth2 << 32) | wt2; 3477b77f048SAleksandar Markovic } 3487b77f048SAleksandar Markovic 3497b77f048SAleksandar Markovic uint32_t helper_float_cvts_d(CPUMIPSState *env, uint64_t fdt0) 3507b77f048SAleksandar Markovic { 3517b77f048SAleksandar Markovic uint32_t fst2; 3527b77f048SAleksandar Markovic 3537b77f048SAleksandar Markovic fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); 3547b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3557b77f048SAleksandar Markovic return fst2; 3567b77f048SAleksandar Markovic } 3577b77f048SAleksandar Markovic 3587b77f048SAleksandar Markovic uint32_t helper_float_cvts_w(CPUMIPSState *env, uint32_t wt0) 3597b77f048SAleksandar Markovic { 3607b77f048SAleksandar Markovic uint32_t fst2; 3617b77f048SAleksandar Markovic 3627b77f048SAleksandar Markovic fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); 3637b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3647b77f048SAleksandar Markovic return fst2; 3657b77f048SAleksandar Markovic } 3667b77f048SAleksandar Markovic 3677b77f048SAleksandar Markovic uint32_t helper_float_cvts_l(CPUMIPSState *env, uint64_t dt0) 3687b77f048SAleksandar Markovic { 3697b77f048SAleksandar Markovic uint32_t fst2; 3707b77f048SAleksandar Markovic 3717b77f048SAleksandar Markovic fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); 3727b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3737b77f048SAleksandar Markovic return fst2; 3747b77f048SAleksandar Markovic } 3757b77f048SAleksandar Markovic 3767b77f048SAleksandar Markovic uint32_t helper_float_cvts_pl(CPUMIPSState *env, uint32_t wt0) 3777b77f048SAleksandar Markovic { 3787b77f048SAleksandar Markovic uint32_t wt2; 3797b77f048SAleksandar Markovic 3807b77f048SAleksandar Markovic wt2 = wt0; 3817b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3827b77f048SAleksandar Markovic return wt2; 3837b77f048SAleksandar Markovic } 3847b77f048SAleksandar Markovic 3857b77f048SAleksandar Markovic uint32_t helper_float_cvts_pu(CPUMIPSState *env, uint32_t wth0) 3867b77f048SAleksandar Markovic { 3877b77f048SAleksandar Markovic uint32_t wt2; 3887b77f048SAleksandar Markovic 3897b77f048SAleksandar Markovic wt2 = wth0; 3907b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 3917b77f048SAleksandar Markovic return wt2; 3927b77f048SAleksandar Markovic } 3937b77f048SAleksandar Markovic 3947b77f048SAleksandar Markovic uint32_t helper_float_cvt_w_s(CPUMIPSState *env, uint32_t fst0) 3957b77f048SAleksandar Markovic { 3967b77f048SAleksandar Markovic uint32_t wt2; 3977b77f048SAleksandar Markovic 3987b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 3997b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4007b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4017b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4027b77f048SAleksandar Markovic } 4037b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4047b77f048SAleksandar Markovic return wt2; 4057b77f048SAleksandar Markovic } 4067b77f048SAleksandar Markovic 4077b77f048SAleksandar Markovic uint32_t helper_float_cvt_w_d(CPUMIPSState *env, uint64_t fdt0) 4087b77f048SAleksandar Markovic { 4097b77f048SAleksandar Markovic uint32_t wt2; 4107b77f048SAleksandar Markovic 4117b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 4127b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4137b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4147b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4157b77f048SAleksandar Markovic } 4167b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4177b77f048SAleksandar Markovic return wt2; 4187b77f048SAleksandar Markovic } 4197b77f048SAleksandar Markovic 4207b77f048SAleksandar Markovic uint64_t helper_float_round_l_d(CPUMIPSState *env, uint64_t fdt0) 4217b77f048SAleksandar Markovic { 4227b77f048SAleksandar Markovic uint64_t dt2; 4237b77f048SAleksandar Markovic 4247b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4257b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4267b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 4277b77f048SAleksandar Markovic restore_rounding_mode(env); 4287b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4297b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4307b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 4317b77f048SAleksandar Markovic } 4327b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4337b77f048SAleksandar Markovic return dt2; 4347b77f048SAleksandar Markovic } 4357b77f048SAleksandar Markovic 4367b77f048SAleksandar Markovic uint64_t helper_float_round_l_s(CPUMIPSState *env, uint32_t fst0) 4377b77f048SAleksandar Markovic { 4387b77f048SAleksandar Markovic uint64_t dt2; 4397b77f048SAleksandar Markovic 4407b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4417b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4427b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 4437b77f048SAleksandar Markovic restore_rounding_mode(env); 4447b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4457b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4467b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 4477b77f048SAleksandar Markovic } 4487b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4497b77f048SAleksandar Markovic return dt2; 4507b77f048SAleksandar Markovic } 4517b77f048SAleksandar Markovic 4527b77f048SAleksandar Markovic uint32_t helper_float_round_w_d(CPUMIPSState *env, uint64_t fdt0) 4537b77f048SAleksandar Markovic { 4547b77f048SAleksandar Markovic uint32_t wt2; 4557b77f048SAleksandar Markovic 4567b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4577b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4587b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 4597b77f048SAleksandar Markovic restore_rounding_mode(env); 4607b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4617b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4627b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4637b77f048SAleksandar Markovic } 4647b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4657b77f048SAleksandar Markovic return wt2; 4667b77f048SAleksandar Markovic } 4677b77f048SAleksandar Markovic 4687b77f048SAleksandar Markovic uint32_t helper_float_round_w_s(CPUMIPSState *env, uint32_t fst0) 4697b77f048SAleksandar Markovic { 4707b77f048SAleksandar Markovic uint32_t wt2; 4717b77f048SAleksandar Markovic 4727b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 4737b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4747b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 4757b77f048SAleksandar Markovic restore_rounding_mode(env); 4767b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4777b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4787b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 4797b77f048SAleksandar Markovic } 4807b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4817b77f048SAleksandar Markovic return wt2; 4827b77f048SAleksandar Markovic } 4837b77f048SAleksandar Markovic 4847b77f048SAleksandar Markovic uint64_t helper_float_trunc_l_d(CPUMIPSState *env, uint64_t fdt0) 4857b77f048SAleksandar Markovic { 4867b77f048SAleksandar Markovic uint64_t dt2; 4877b77f048SAleksandar Markovic 4887b77f048SAleksandar Markovic dt2 = float64_to_int64_round_to_zero(fdt0, 4897b77f048SAleksandar Markovic &env->active_fpu.fp_status); 4907b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 4917b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 4927b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 4937b77f048SAleksandar Markovic } 4947b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 4957b77f048SAleksandar Markovic return dt2; 4967b77f048SAleksandar Markovic } 4977b77f048SAleksandar Markovic 4987b77f048SAleksandar Markovic uint64_t helper_float_trunc_l_s(CPUMIPSState *env, uint32_t fst0) 4997b77f048SAleksandar Markovic { 5007b77f048SAleksandar Markovic uint64_t dt2; 5017b77f048SAleksandar Markovic 5027b77f048SAleksandar Markovic dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); 5037b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5047b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5057b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 5067b77f048SAleksandar Markovic } 5077b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5087b77f048SAleksandar Markovic return dt2; 5097b77f048SAleksandar Markovic } 5107b77f048SAleksandar Markovic 5117b77f048SAleksandar Markovic uint32_t helper_float_trunc_w_d(CPUMIPSState *env, uint64_t fdt0) 5127b77f048SAleksandar Markovic { 5137b77f048SAleksandar Markovic uint32_t wt2; 5147b77f048SAleksandar Markovic 5157b77f048SAleksandar Markovic wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); 5167b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5177b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5187b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5197b77f048SAleksandar Markovic } 5207b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5217b77f048SAleksandar Markovic return wt2; 5227b77f048SAleksandar Markovic } 5237b77f048SAleksandar Markovic 5247b77f048SAleksandar Markovic uint32_t helper_float_trunc_w_s(CPUMIPSState *env, uint32_t fst0) 5257b77f048SAleksandar Markovic { 5267b77f048SAleksandar Markovic uint32_t wt2; 5277b77f048SAleksandar Markovic 5287b77f048SAleksandar Markovic wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); 5297b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5307b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5317b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5327b77f048SAleksandar Markovic } 5337b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5347b77f048SAleksandar Markovic return wt2; 5357b77f048SAleksandar Markovic } 5367b77f048SAleksandar Markovic 5377b77f048SAleksandar Markovic uint64_t helper_float_ceil_l_d(CPUMIPSState *env, uint64_t fdt0) 5387b77f048SAleksandar Markovic { 5397b77f048SAleksandar Markovic uint64_t dt2; 5407b77f048SAleksandar Markovic 5417b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5427b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 5437b77f048SAleksandar Markovic restore_rounding_mode(env); 5447b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5457b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5467b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 5477b77f048SAleksandar Markovic } 5487b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5497b77f048SAleksandar Markovic return dt2; 5507b77f048SAleksandar Markovic } 5517b77f048SAleksandar Markovic 5527b77f048SAleksandar Markovic uint64_t helper_float_ceil_l_s(CPUMIPSState *env, uint32_t fst0) 5537b77f048SAleksandar Markovic { 5547b77f048SAleksandar Markovic uint64_t dt2; 5557b77f048SAleksandar Markovic 5567b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5577b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 5587b77f048SAleksandar Markovic restore_rounding_mode(env); 5597b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5607b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5617b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 5627b77f048SAleksandar Markovic } 5637b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5647b77f048SAleksandar Markovic return dt2; 5657b77f048SAleksandar Markovic } 5667b77f048SAleksandar Markovic 5677b77f048SAleksandar Markovic uint32_t helper_float_ceil_w_d(CPUMIPSState *env, uint64_t fdt0) 5687b77f048SAleksandar Markovic { 5697b77f048SAleksandar Markovic uint32_t wt2; 5707b77f048SAleksandar Markovic 5717b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5727b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 5737b77f048SAleksandar Markovic restore_rounding_mode(env); 5747b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5757b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5767b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5777b77f048SAleksandar Markovic } 5787b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5797b77f048SAleksandar Markovic return wt2; 5807b77f048SAleksandar Markovic } 5817b77f048SAleksandar Markovic 5827b77f048SAleksandar Markovic uint32_t helper_float_ceil_w_s(CPUMIPSState *env, uint32_t fst0) 5837b77f048SAleksandar Markovic { 5847b77f048SAleksandar Markovic uint32_t wt2; 5857b77f048SAleksandar Markovic 5867b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 5877b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 5887b77f048SAleksandar Markovic restore_rounding_mode(env); 5897b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 5907b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 5917b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 5927b77f048SAleksandar Markovic } 5937b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 5947b77f048SAleksandar Markovic return wt2; 5957b77f048SAleksandar Markovic } 5967b77f048SAleksandar Markovic 5977b77f048SAleksandar Markovic uint64_t helper_float_floor_l_d(CPUMIPSState *env, uint64_t fdt0) 5987b77f048SAleksandar Markovic { 5997b77f048SAleksandar Markovic uint64_t dt2; 6007b77f048SAleksandar Markovic 6017b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6027b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 6037b77f048SAleksandar Markovic restore_rounding_mode(env); 6047b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6057b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6067b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 6077b77f048SAleksandar Markovic } 6087b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6097b77f048SAleksandar Markovic return dt2; 6107b77f048SAleksandar Markovic } 6117b77f048SAleksandar Markovic 6127b77f048SAleksandar Markovic uint64_t helper_float_floor_l_s(CPUMIPSState *env, uint32_t fst0) 6137b77f048SAleksandar Markovic { 6147b77f048SAleksandar Markovic uint64_t dt2; 6157b77f048SAleksandar Markovic 6167b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6177b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 6187b77f048SAleksandar Markovic restore_rounding_mode(env); 6197b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6207b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6217b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW; 6227b77f048SAleksandar Markovic } 6237b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6247b77f048SAleksandar Markovic return dt2; 6257b77f048SAleksandar Markovic } 6267b77f048SAleksandar Markovic 6277b77f048SAleksandar Markovic uint32_t helper_float_floor_w_d(CPUMIPSState *env, uint64_t fdt0) 6287b77f048SAleksandar Markovic { 6297b77f048SAleksandar Markovic uint32_t wt2; 6307b77f048SAleksandar Markovic 6317b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6327b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 6337b77f048SAleksandar Markovic restore_rounding_mode(env); 6347b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6357b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6367b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 6377b77f048SAleksandar Markovic } 6387b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6397b77f048SAleksandar Markovic return wt2; 6407b77f048SAleksandar Markovic } 6417b77f048SAleksandar Markovic 6427b77f048SAleksandar Markovic uint32_t helper_float_floor_w_s(CPUMIPSState *env, uint32_t fst0) 6437b77f048SAleksandar Markovic { 6447b77f048SAleksandar Markovic uint32_t wt2; 6457b77f048SAleksandar Markovic 6467b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 6477b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 6487b77f048SAleksandar Markovic restore_rounding_mode(env); 6497b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6507b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) { 6517b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW; 6527b77f048SAleksandar Markovic } 6537b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6547b77f048SAleksandar Markovic return wt2; 6557b77f048SAleksandar Markovic } 6567b77f048SAleksandar Markovic 6577b77f048SAleksandar Markovic uint64_t helper_float_cvt_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 6587b77f048SAleksandar Markovic { 6597b77f048SAleksandar Markovic uint64_t dt2; 6607b77f048SAleksandar Markovic 6617b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 6627b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6637b77f048SAleksandar Markovic & float_flag_invalid) { 6647b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 6657b77f048SAleksandar Markovic dt2 = 0; 6667b77f048SAleksandar Markovic } 6677b77f048SAleksandar Markovic } 6687b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6697b77f048SAleksandar Markovic return dt2; 6707b77f048SAleksandar Markovic } 6717b77f048SAleksandar Markovic 6727b77f048SAleksandar Markovic uint64_t helper_float_cvt_2008_l_s(CPUMIPSState *env, uint32_t fst0) 6737b77f048SAleksandar Markovic { 6747b77f048SAleksandar Markovic uint64_t dt2; 6757b77f048SAleksandar Markovic 6767b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 6777b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6787b77f048SAleksandar Markovic & float_flag_invalid) { 6797b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 6807b77f048SAleksandar Markovic dt2 = 0; 6817b77f048SAleksandar Markovic } 6827b77f048SAleksandar Markovic } 6837b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6847b77f048SAleksandar Markovic return dt2; 6857b77f048SAleksandar Markovic } 6867b77f048SAleksandar Markovic 6877b77f048SAleksandar Markovic uint32_t helper_float_cvt_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 6887b77f048SAleksandar Markovic { 6897b77f048SAleksandar Markovic uint32_t wt2; 6907b77f048SAleksandar Markovic 6917b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 6927b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 6937b77f048SAleksandar Markovic & float_flag_invalid) { 6947b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 6957b77f048SAleksandar Markovic wt2 = 0; 6967b77f048SAleksandar Markovic } 6977b77f048SAleksandar Markovic } 6987b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 6997b77f048SAleksandar Markovic return wt2; 7007b77f048SAleksandar Markovic } 7017b77f048SAleksandar Markovic 7027b77f048SAleksandar Markovic uint32_t helper_float_cvt_2008_w_s(CPUMIPSState *env, uint32_t fst0) 7037b77f048SAleksandar Markovic { 7047b77f048SAleksandar Markovic uint32_t wt2; 7057b77f048SAleksandar Markovic 7067b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 7077b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7087b77f048SAleksandar Markovic & float_flag_invalid) { 7097b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 7107b77f048SAleksandar Markovic wt2 = 0; 7117b77f048SAleksandar Markovic } 7127b77f048SAleksandar Markovic } 7137b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7147b77f048SAleksandar Markovic return wt2; 7157b77f048SAleksandar Markovic } 7167b77f048SAleksandar Markovic 7177b77f048SAleksandar Markovic uint64_t helper_float_round_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 7187b77f048SAleksandar Markovic { 7197b77f048SAleksandar Markovic uint64_t dt2; 7207b77f048SAleksandar Markovic 7217b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7227b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7237b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 7247b77f048SAleksandar Markovic restore_rounding_mode(env); 7257b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7267b77f048SAleksandar Markovic & float_flag_invalid) { 7277b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 7287b77f048SAleksandar Markovic dt2 = 0; 7297b77f048SAleksandar Markovic } 7307b77f048SAleksandar Markovic } 7317b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7327b77f048SAleksandar Markovic return dt2; 7337b77f048SAleksandar Markovic } 7347b77f048SAleksandar Markovic 7357b77f048SAleksandar Markovic uint64_t helper_float_round_2008_l_s(CPUMIPSState *env, uint32_t fst0) 7367b77f048SAleksandar Markovic { 7377b77f048SAleksandar Markovic uint64_t dt2; 7387b77f048SAleksandar Markovic 7397b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7407b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7417b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 7427b77f048SAleksandar Markovic restore_rounding_mode(env); 7437b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7447b77f048SAleksandar Markovic & float_flag_invalid) { 7457b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 7467b77f048SAleksandar Markovic dt2 = 0; 7477b77f048SAleksandar Markovic } 7487b77f048SAleksandar Markovic } 7497b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7507b77f048SAleksandar Markovic return dt2; 7517b77f048SAleksandar Markovic } 7527b77f048SAleksandar Markovic 7537b77f048SAleksandar Markovic uint32_t helper_float_round_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 7547b77f048SAleksandar Markovic { 7557b77f048SAleksandar Markovic uint32_t wt2; 7567b77f048SAleksandar Markovic 7577b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7587b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7597b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 7607b77f048SAleksandar Markovic restore_rounding_mode(env); 7617b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7627b77f048SAleksandar Markovic & float_flag_invalid) { 7637b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 7647b77f048SAleksandar Markovic wt2 = 0; 7657b77f048SAleksandar Markovic } 7667b77f048SAleksandar Markovic } 7677b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7687b77f048SAleksandar Markovic return wt2; 7697b77f048SAleksandar Markovic } 7707b77f048SAleksandar Markovic 7717b77f048SAleksandar Markovic uint32_t helper_float_round_2008_w_s(CPUMIPSState *env, uint32_t fst0) 7727b77f048SAleksandar Markovic { 7737b77f048SAleksandar Markovic uint32_t wt2; 7747b77f048SAleksandar Markovic 7757b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even, 7767b77f048SAleksandar Markovic &env->active_fpu.fp_status); 7777b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 7787b77f048SAleksandar Markovic restore_rounding_mode(env); 7797b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7807b77f048SAleksandar Markovic & float_flag_invalid) { 7817b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 7827b77f048SAleksandar Markovic wt2 = 0; 7837b77f048SAleksandar Markovic } 7847b77f048SAleksandar Markovic } 7857b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 7867b77f048SAleksandar Markovic return wt2; 7877b77f048SAleksandar Markovic } 7887b77f048SAleksandar Markovic 7897b77f048SAleksandar Markovic uint64_t helper_float_trunc_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 7907b77f048SAleksandar Markovic { 7917b77f048SAleksandar Markovic uint64_t dt2; 7927b77f048SAleksandar Markovic 7937b77f048SAleksandar Markovic dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); 7947b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 7957b77f048SAleksandar Markovic & float_flag_invalid) { 7967b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 7977b77f048SAleksandar Markovic dt2 = 0; 7987b77f048SAleksandar Markovic } 7997b77f048SAleksandar Markovic } 8007b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8017b77f048SAleksandar Markovic return dt2; 8027b77f048SAleksandar Markovic } 8037b77f048SAleksandar Markovic 8047b77f048SAleksandar Markovic uint64_t helper_float_trunc_2008_l_s(CPUMIPSState *env, uint32_t fst0) 8057b77f048SAleksandar Markovic { 8067b77f048SAleksandar Markovic uint64_t dt2; 8077b77f048SAleksandar Markovic 8087b77f048SAleksandar Markovic dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); 8097b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8107b77f048SAleksandar Markovic & float_flag_invalid) { 8117b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 8127b77f048SAleksandar Markovic dt2 = 0; 8137b77f048SAleksandar Markovic } 8147b77f048SAleksandar Markovic } 8157b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8167b77f048SAleksandar Markovic return dt2; 8177b77f048SAleksandar Markovic } 8187b77f048SAleksandar Markovic 8197b77f048SAleksandar Markovic uint32_t helper_float_trunc_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 8207b77f048SAleksandar Markovic { 8217b77f048SAleksandar Markovic uint32_t wt2; 8227b77f048SAleksandar Markovic 8237b77f048SAleksandar Markovic wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); 8247b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8257b77f048SAleksandar Markovic & float_flag_invalid) { 8267b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 8277b77f048SAleksandar Markovic wt2 = 0; 8287b77f048SAleksandar Markovic } 8297b77f048SAleksandar Markovic } 8307b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8317b77f048SAleksandar Markovic return wt2; 8327b77f048SAleksandar Markovic } 8337b77f048SAleksandar Markovic 8347b77f048SAleksandar Markovic uint32_t helper_float_trunc_2008_w_s(CPUMIPSState *env, uint32_t fst0) 8357b77f048SAleksandar Markovic { 8367b77f048SAleksandar Markovic uint32_t wt2; 8377b77f048SAleksandar Markovic 8387b77f048SAleksandar Markovic wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); 8397b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8407b77f048SAleksandar Markovic & float_flag_invalid) { 8417b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 8427b77f048SAleksandar Markovic wt2 = 0; 8437b77f048SAleksandar Markovic } 8447b77f048SAleksandar Markovic } 8457b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8467b77f048SAleksandar Markovic return wt2; 8477b77f048SAleksandar Markovic } 8487b77f048SAleksandar Markovic 8497b77f048SAleksandar Markovic uint64_t helper_float_ceil_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 8507b77f048SAleksandar Markovic { 8517b77f048SAleksandar Markovic uint64_t dt2; 8527b77f048SAleksandar Markovic 8537b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 8547b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 8557b77f048SAleksandar Markovic restore_rounding_mode(env); 8567b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8577b77f048SAleksandar Markovic & float_flag_invalid) { 8587b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 8597b77f048SAleksandar Markovic dt2 = 0; 8607b77f048SAleksandar Markovic } 8617b77f048SAleksandar Markovic } 8627b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8637b77f048SAleksandar Markovic return dt2; 8647b77f048SAleksandar Markovic } 8657b77f048SAleksandar Markovic 8667b77f048SAleksandar Markovic uint64_t helper_float_ceil_2008_l_s(CPUMIPSState *env, uint32_t fst0) 8677b77f048SAleksandar Markovic { 8687b77f048SAleksandar Markovic uint64_t dt2; 8697b77f048SAleksandar Markovic 8707b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 8717b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 8727b77f048SAleksandar Markovic restore_rounding_mode(env); 8737b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8747b77f048SAleksandar Markovic & float_flag_invalid) { 8757b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 8767b77f048SAleksandar Markovic dt2 = 0; 8777b77f048SAleksandar Markovic } 8787b77f048SAleksandar Markovic } 8797b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8807b77f048SAleksandar Markovic return dt2; 8817b77f048SAleksandar Markovic } 8827b77f048SAleksandar Markovic 8837b77f048SAleksandar Markovic uint32_t helper_float_ceil_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 8847b77f048SAleksandar Markovic { 8857b77f048SAleksandar Markovic uint32_t wt2; 8867b77f048SAleksandar Markovic 8877b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 8887b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 8897b77f048SAleksandar Markovic restore_rounding_mode(env); 8907b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 8917b77f048SAleksandar Markovic & float_flag_invalid) { 8927b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 8937b77f048SAleksandar Markovic wt2 = 0; 8947b77f048SAleksandar Markovic } 8957b77f048SAleksandar Markovic } 8967b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 8977b77f048SAleksandar Markovic return wt2; 8987b77f048SAleksandar Markovic } 8997b77f048SAleksandar Markovic 9007b77f048SAleksandar Markovic uint32_t helper_float_ceil_2008_w_s(CPUMIPSState *env, uint32_t fst0) 9017b77f048SAleksandar Markovic { 9027b77f048SAleksandar Markovic uint32_t wt2; 9037b77f048SAleksandar Markovic 9047b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 9057b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 9067b77f048SAleksandar Markovic restore_rounding_mode(env); 9077b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9087b77f048SAleksandar Markovic & float_flag_invalid) { 9097b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 9107b77f048SAleksandar Markovic wt2 = 0; 9117b77f048SAleksandar Markovic } 9127b77f048SAleksandar Markovic } 9137b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9147b77f048SAleksandar Markovic return wt2; 9157b77f048SAleksandar Markovic } 9167b77f048SAleksandar Markovic 9177b77f048SAleksandar Markovic uint64_t helper_float_floor_2008_l_d(CPUMIPSState *env, uint64_t fdt0) 9187b77f048SAleksandar Markovic { 9197b77f048SAleksandar Markovic uint64_t dt2; 9207b77f048SAleksandar Markovic 9217b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9227b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 9237b77f048SAleksandar Markovic restore_rounding_mode(env); 9247b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9257b77f048SAleksandar Markovic & float_flag_invalid) { 9267b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 9277b77f048SAleksandar Markovic dt2 = 0; 9287b77f048SAleksandar Markovic } 9297b77f048SAleksandar Markovic } 9307b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9317b77f048SAleksandar Markovic return dt2; 9327b77f048SAleksandar Markovic } 9337b77f048SAleksandar Markovic 9347b77f048SAleksandar Markovic uint64_t helper_float_floor_2008_l_s(CPUMIPSState *env, uint32_t fst0) 9357b77f048SAleksandar Markovic { 9367b77f048SAleksandar Markovic uint64_t dt2; 9377b77f048SAleksandar Markovic 9387b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9397b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 9407b77f048SAleksandar Markovic restore_rounding_mode(env); 9417b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9427b77f048SAleksandar Markovic & float_flag_invalid) { 9437b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 9447b77f048SAleksandar Markovic dt2 = 0; 9457b77f048SAleksandar Markovic } 9467b77f048SAleksandar Markovic } 9477b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9487b77f048SAleksandar Markovic return dt2; 9497b77f048SAleksandar Markovic } 9507b77f048SAleksandar Markovic 9517b77f048SAleksandar Markovic uint32_t helper_float_floor_2008_w_d(CPUMIPSState *env, uint64_t fdt0) 9527b77f048SAleksandar Markovic { 9537b77f048SAleksandar Markovic uint32_t wt2; 9547b77f048SAleksandar Markovic 9557b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9567b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 9577b77f048SAleksandar Markovic restore_rounding_mode(env); 9587b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9597b77f048SAleksandar Markovic & float_flag_invalid) { 9607b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) { 9617b77f048SAleksandar Markovic wt2 = 0; 9627b77f048SAleksandar Markovic } 9637b77f048SAleksandar Markovic } 9647b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9657b77f048SAleksandar Markovic return wt2; 9667b77f048SAleksandar Markovic } 9677b77f048SAleksandar Markovic 9687b77f048SAleksandar Markovic uint32_t helper_float_floor_2008_w_s(CPUMIPSState *env, uint32_t fst0) 9697b77f048SAleksandar Markovic { 9707b77f048SAleksandar Markovic uint32_t wt2; 9717b77f048SAleksandar Markovic 9727b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 9737b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 9747b77f048SAleksandar Markovic restore_rounding_mode(env); 9757b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status) 9767b77f048SAleksandar Markovic & float_flag_invalid) { 9777b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) { 9787b77f048SAleksandar Markovic wt2 = 0; 9797b77f048SAleksandar Markovic } 9807b77f048SAleksandar Markovic } 9817b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 9827b77f048SAleksandar Markovic return wt2; 9837b77f048SAleksandar Markovic } 9847b77f048SAleksandar Markovic 9857b77f048SAleksandar Markovic /* unary operations, not modifying fp status */ 9868a6c9e0fSAleksandar Markovic 9878a6c9e0fSAleksandar Markovic uint64_t helper_float_abs_d(uint64_t fdt0) 9888a6c9e0fSAleksandar Markovic { 9898a6c9e0fSAleksandar Markovic return float64_abs(fdt0); 9907b77f048SAleksandar Markovic } 9918a6c9e0fSAleksandar Markovic 9928a6c9e0fSAleksandar Markovic uint32_t helper_float_abs_s(uint32_t fst0) 9938a6c9e0fSAleksandar Markovic { 9948a6c9e0fSAleksandar Markovic return float32_abs(fst0); 9958a6c9e0fSAleksandar Markovic } 9968a6c9e0fSAleksandar Markovic 9978a6c9e0fSAleksandar Markovic uint64_t helper_float_abs_ps(uint64_t fdt0) 9988a6c9e0fSAleksandar Markovic { 9998a6c9e0fSAleksandar Markovic uint32_t wt0; 10008a6c9e0fSAleksandar Markovic uint32_t wth0; 10018a6c9e0fSAleksandar Markovic 10028a6c9e0fSAleksandar Markovic wt0 = float32_abs(fdt0 & 0XFFFFFFFF); 10038a6c9e0fSAleksandar Markovic wth0 = float32_abs(fdt0 >> 32); 10048a6c9e0fSAleksandar Markovic return ((uint64_t)wth0 << 32) | wt0; 10058a6c9e0fSAleksandar Markovic } 10068a6c9e0fSAleksandar Markovic 10078a6c9e0fSAleksandar Markovic uint64_t helper_float_chs_d(uint64_t fdt0) 10088a6c9e0fSAleksandar Markovic { 10098a6c9e0fSAleksandar Markovic return float64_chs(fdt0); 10108a6c9e0fSAleksandar Markovic } 10118a6c9e0fSAleksandar Markovic 10128a6c9e0fSAleksandar Markovic uint32_t helper_float_chs_s(uint32_t fst0) 10138a6c9e0fSAleksandar Markovic { 10148a6c9e0fSAleksandar Markovic return float32_chs(fst0); 10158a6c9e0fSAleksandar Markovic } 10168a6c9e0fSAleksandar Markovic 10178a6c9e0fSAleksandar Markovic uint64_t helper_float_chs_ps(uint64_t fdt0) 10188a6c9e0fSAleksandar Markovic { 10198a6c9e0fSAleksandar Markovic uint32_t wt0; 10208a6c9e0fSAleksandar Markovic uint32_t wth0; 10218a6c9e0fSAleksandar Markovic 10228a6c9e0fSAleksandar Markovic wt0 = float32_chs(fdt0 & 0XFFFFFFFF); 10238a6c9e0fSAleksandar Markovic wth0 = float32_chs(fdt0 >> 32); 10248a6c9e0fSAleksandar Markovic return ((uint64_t)wth0 << 32) | wt0; 10258a6c9e0fSAleksandar Markovic } 10267b77f048SAleksandar Markovic 10277b77f048SAleksandar Markovic /* MIPS specific unary operations */ 10287b77f048SAleksandar Markovic uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0) 10297b77f048SAleksandar Markovic { 10307b77f048SAleksandar Markovic uint64_t fdt2; 10317b77f048SAleksandar Markovic 10327b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); 10337b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10347b77f048SAleksandar Markovic return fdt2; 10357b77f048SAleksandar Markovic } 10367b77f048SAleksandar Markovic 10377b77f048SAleksandar Markovic uint32_t helper_float_recip_s(CPUMIPSState *env, uint32_t fst0) 10387b77f048SAleksandar Markovic { 10397b77f048SAleksandar Markovic uint32_t fst2; 10407b77f048SAleksandar Markovic 10417b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); 10427b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10437b77f048SAleksandar Markovic return fst2; 10447b77f048SAleksandar Markovic } 10457b77f048SAleksandar Markovic 10467b77f048SAleksandar Markovic uint64_t helper_float_rsqrt_d(CPUMIPSState *env, uint64_t fdt0) 10477b77f048SAleksandar Markovic { 10487b77f048SAleksandar Markovic uint64_t fdt2; 10497b77f048SAleksandar Markovic 10507b77f048SAleksandar Markovic fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 10517b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); 10527b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10537b77f048SAleksandar Markovic return fdt2; 10547b77f048SAleksandar Markovic } 10557b77f048SAleksandar Markovic 10567b77f048SAleksandar Markovic uint32_t helper_float_rsqrt_s(CPUMIPSState *env, uint32_t fst0) 10577b77f048SAleksandar Markovic { 10587b77f048SAleksandar Markovic uint32_t fst2; 10597b77f048SAleksandar Markovic 10607b77f048SAleksandar Markovic fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); 10617b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); 10627b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10637b77f048SAleksandar Markovic return fst2; 10647b77f048SAleksandar Markovic } 10657b77f048SAleksandar Markovic 10667b77f048SAleksandar Markovic uint64_t helper_float_recip1_d(CPUMIPSState *env, uint64_t fdt0) 10677b77f048SAleksandar Markovic { 10687b77f048SAleksandar Markovic uint64_t fdt2; 10697b77f048SAleksandar Markovic 10707b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); 10717b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10727b77f048SAleksandar Markovic return fdt2; 10737b77f048SAleksandar Markovic } 10747b77f048SAleksandar Markovic 10757b77f048SAleksandar Markovic uint32_t helper_float_recip1_s(CPUMIPSState *env, uint32_t fst0) 10767b77f048SAleksandar Markovic { 10777b77f048SAleksandar Markovic uint32_t fst2; 10787b77f048SAleksandar Markovic 10797b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); 10807b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 10817b77f048SAleksandar Markovic return fst2; 10827b77f048SAleksandar Markovic } 10837b77f048SAleksandar Markovic 10847b77f048SAleksandar Markovic uint64_t helper_float_recip1_ps(CPUMIPSState *env, uint64_t fdt0) 10857b77f048SAleksandar Markovic { 1086485cd2e4SAleksandar Markovic uint32_t fstl2; 10877b77f048SAleksandar Markovic uint32_t fsth2; 10887b77f048SAleksandar Markovic 1089485cd2e4SAleksandar Markovic fstl2 = float32_div(float32_one, fdt0 & 0XFFFFFFFF, 10907b77f048SAleksandar Markovic &env->active_fpu.fp_status); 10917b77f048SAleksandar Markovic fsth2 = float32_div(float32_one, fdt0 >> 32, &env->active_fpu.fp_status); 10927b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 1093485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2; 10947b77f048SAleksandar Markovic } 10957b77f048SAleksandar Markovic 10967b77f048SAleksandar Markovic uint64_t helper_float_rsqrt1_d(CPUMIPSState *env, uint64_t fdt0) 10977b77f048SAleksandar Markovic { 10987b77f048SAleksandar Markovic uint64_t fdt2; 10997b77f048SAleksandar Markovic 11007b77f048SAleksandar Markovic fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 11017b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); 11027b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 11037b77f048SAleksandar Markovic return fdt2; 11047b77f048SAleksandar Markovic } 11057b77f048SAleksandar Markovic 11067b77f048SAleksandar Markovic uint32_t helper_float_rsqrt1_s(CPUMIPSState *env, uint32_t fst0) 11077b77f048SAleksandar Markovic { 11087b77f048SAleksandar Markovic uint32_t fst2; 11097b77f048SAleksandar Markovic 11107b77f048SAleksandar Markovic fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); 11117b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); 11127b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 11137b77f048SAleksandar Markovic return fst2; 11147b77f048SAleksandar Markovic } 11157b77f048SAleksandar Markovic 11167b77f048SAleksandar Markovic uint64_t helper_float_rsqrt1_ps(CPUMIPSState *env, uint64_t fdt0) 11177b77f048SAleksandar Markovic { 1118485cd2e4SAleksandar Markovic uint32_t fstl2; 11197b77f048SAleksandar Markovic uint32_t fsth2; 11207b77f048SAleksandar Markovic 1121485cd2e4SAleksandar Markovic fstl2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 11227b77f048SAleksandar Markovic fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status); 1123485cd2e4SAleksandar Markovic fstl2 = float32_div(float32_one, fstl2, &env->active_fpu.fp_status); 11247b77f048SAleksandar Markovic fsth2 = float32_div(float32_one, fsth2, &env->active_fpu.fp_status); 11257b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 1126485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2; 11277b77f048SAleksandar Markovic } 11287b77f048SAleksandar Markovic 1129728e4246SAleksandar Markovic uint64_t helper_float_rint_d(CPUMIPSState *env, uint64_t fs) 1130728e4246SAleksandar Markovic { 1131728e4246SAleksandar Markovic uint64_t fdret; 1132728e4246SAleksandar Markovic 1133728e4246SAleksandar Markovic fdret = float64_round_to_int(fs, &env->active_fpu.fp_status); 1134728e4246SAleksandar Markovic update_fcr31(env, GETPC()); 1135728e4246SAleksandar Markovic return fdret; 1136728e4246SAleksandar Markovic } 1137728e4246SAleksandar Markovic 1138728e4246SAleksandar Markovic uint32_t helper_float_rint_s(CPUMIPSState *env, uint32_t fs) 1139728e4246SAleksandar Markovic { 1140728e4246SAleksandar Markovic uint32_t fdret; 1141728e4246SAleksandar Markovic 1142728e4246SAleksandar Markovic fdret = float32_round_to_int(fs, &env->active_fpu.fp_status); 1143728e4246SAleksandar Markovic update_fcr31(env, GETPC()); 1144728e4246SAleksandar Markovic return fdret; 1145728e4246SAleksandar Markovic } 1146728e4246SAleksandar Markovic 11477b77f048SAleksandar Markovic #define FLOAT_CLASS_SIGNALING_NAN 0x001 11487b77f048SAleksandar Markovic #define FLOAT_CLASS_QUIET_NAN 0x002 11497b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_INFINITY 0x004 11507b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_NORMAL 0x008 11517b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010 11527b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_ZERO 0x020 11537b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_INFINITY 0x040 11547b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_NORMAL 0x080 11557b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100 11567b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_ZERO 0x200 11577b77f048SAleksandar Markovic 11580bd99ac7SAleksandar Markovic uint64_t float_class_d(uint64_t arg, float_status *status) 11590bd99ac7SAleksandar Markovic { 11600bd99ac7SAleksandar Markovic if (float64_is_signaling_nan(arg, status)) { 11610bd99ac7SAleksandar Markovic return FLOAT_CLASS_SIGNALING_NAN; 11620bd99ac7SAleksandar Markovic } else if (float64_is_quiet_nan(arg, status)) { 11630bd99ac7SAleksandar Markovic return FLOAT_CLASS_QUIET_NAN; 11640bd99ac7SAleksandar Markovic } else if (float64_is_neg(arg)) { 11650bd99ac7SAleksandar Markovic if (float64_is_infinity(arg)) { 11660bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_INFINITY; 11670bd99ac7SAleksandar Markovic } else if (float64_is_zero(arg)) { 11680bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_ZERO; 11690bd99ac7SAleksandar Markovic } else if (float64_is_zero_or_denormal(arg)) { 11700bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_SUBNORMAL; 11710bd99ac7SAleksandar Markovic } else { 11720bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_NORMAL; 11730bd99ac7SAleksandar Markovic } 11740bd99ac7SAleksandar Markovic } else { 11750bd99ac7SAleksandar Markovic if (float64_is_infinity(arg)) { 11760bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_INFINITY; 11770bd99ac7SAleksandar Markovic } else if (float64_is_zero(arg)) { 11780bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_ZERO; 11790bd99ac7SAleksandar Markovic } else if (float64_is_zero_or_denormal(arg)) { 11800bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_SUBNORMAL; 11810bd99ac7SAleksandar Markovic } else { 11820bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_NORMAL; 11830bd99ac7SAleksandar Markovic } 11840bd99ac7SAleksandar Markovic } 11850bd99ac7SAleksandar Markovic } 11860bd99ac7SAleksandar Markovic 11870bd99ac7SAleksandar Markovic uint64_t helper_float_class_d(CPUMIPSState *env, uint64_t arg) 11880bd99ac7SAleksandar Markovic { 11890bd99ac7SAleksandar Markovic return float_class_d(arg, &env->active_fpu.fp_status); 11900bd99ac7SAleksandar Markovic } 11910bd99ac7SAleksandar Markovic 11920bd99ac7SAleksandar Markovic uint32_t float_class_s(uint32_t arg, float_status *status) 11930bd99ac7SAleksandar Markovic { 11940bd99ac7SAleksandar Markovic if (float32_is_signaling_nan(arg, status)) { 11950bd99ac7SAleksandar Markovic return FLOAT_CLASS_SIGNALING_NAN; 11960bd99ac7SAleksandar Markovic } else if (float32_is_quiet_nan(arg, status)) { 11970bd99ac7SAleksandar Markovic return FLOAT_CLASS_QUIET_NAN; 11980bd99ac7SAleksandar Markovic } else if (float32_is_neg(arg)) { 11990bd99ac7SAleksandar Markovic if (float32_is_infinity(arg)) { 12000bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_INFINITY; 12010bd99ac7SAleksandar Markovic } else if (float32_is_zero(arg)) { 12020bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_ZERO; 12030bd99ac7SAleksandar Markovic } else if (float32_is_zero_or_denormal(arg)) { 12040bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_SUBNORMAL; 12050bd99ac7SAleksandar Markovic } else { 12060bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_NORMAL; 12070bd99ac7SAleksandar Markovic } 12080bd99ac7SAleksandar Markovic } else { 12090bd99ac7SAleksandar Markovic if (float32_is_infinity(arg)) { 12100bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_INFINITY; 12110bd99ac7SAleksandar Markovic } else if (float32_is_zero(arg)) { 12120bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_ZERO; 12130bd99ac7SAleksandar Markovic } else if (float32_is_zero_or_denormal(arg)) { 12140bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_SUBNORMAL; 12150bd99ac7SAleksandar Markovic } else { 12160bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_NORMAL; 12170bd99ac7SAleksandar Markovic } 12180bd99ac7SAleksandar Markovic } 12190bd99ac7SAleksandar Markovic } 12200bd99ac7SAleksandar Markovic 12210bd99ac7SAleksandar Markovic uint32_t helper_float_class_s(CPUMIPSState *env, uint32_t arg) 12220bd99ac7SAleksandar Markovic { 12230bd99ac7SAleksandar Markovic return float_class_s(arg, &env->active_fpu.fp_status); 12240bd99ac7SAleksandar Markovic } 12250bd99ac7SAleksandar Markovic 12267b77f048SAleksandar Markovic /* binary operations */ 12277b77f048SAleksandar Markovic 12281ace099fSAleksandar Markovic uint64_t helper_float_add_d(CPUMIPSState *env, 12291ace099fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 12301ace099fSAleksandar Markovic { 12311ace099fSAleksandar Markovic uint64_t dt2; 12321ace099fSAleksandar Markovic 12331ace099fSAleksandar Markovic dt2 = float64_add(fdt0, fdt1, &env->active_fpu.fp_status); 12341ace099fSAleksandar Markovic update_fcr31(env, GETPC()); 12351ace099fSAleksandar Markovic return dt2; 12361ace099fSAleksandar Markovic } 12371ace099fSAleksandar Markovic 12381ace099fSAleksandar Markovic uint32_t helper_float_add_s(CPUMIPSState *env, 12391ace099fSAleksandar Markovic uint32_t fst0, uint32_t fst1) 12401ace099fSAleksandar Markovic { 12411ace099fSAleksandar Markovic uint32_t wt2; 12421ace099fSAleksandar Markovic 1243dda97e38SAlex Richardson wt2 = float32_add(fst0, fst1, &env->active_fpu.fp_status); 12441ace099fSAleksandar Markovic update_fcr31(env, GETPC()); 12451ace099fSAleksandar Markovic return wt2; 12461ace099fSAleksandar Markovic } 12471ace099fSAleksandar Markovic 12481ace099fSAleksandar Markovic uint64_t helper_float_add_ps(CPUMIPSState *env, 12491ace099fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 12501ace099fSAleksandar Markovic { 12511ace099fSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 12521ace099fSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 12531ace099fSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 12541ace099fSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 12551ace099fSAleksandar Markovic uint32_t wtl2; 12561ace099fSAleksandar Markovic uint32_t wth2; 12571ace099fSAleksandar Markovic 12581ace099fSAleksandar Markovic wtl2 = float32_add(fstl0, fstl1, &env->active_fpu.fp_status); 12591ace099fSAleksandar Markovic wth2 = float32_add(fsth0, fsth1, &env->active_fpu.fp_status); 12601ace099fSAleksandar Markovic update_fcr31(env, GETPC()); 12611ace099fSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 12621ace099fSAleksandar Markovic } 12631ace099fSAleksandar Markovic 126492ebdd7fSAleksandar Markovic uint64_t helper_float_sub_d(CPUMIPSState *env, 126592ebdd7fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 126692ebdd7fSAleksandar Markovic { 126792ebdd7fSAleksandar Markovic uint64_t dt2; 126892ebdd7fSAleksandar Markovic 126992ebdd7fSAleksandar Markovic dt2 = float64_sub(fdt0, fdt1, &env->active_fpu.fp_status); 127092ebdd7fSAleksandar Markovic update_fcr31(env, GETPC()); 127192ebdd7fSAleksandar Markovic return dt2; 127292ebdd7fSAleksandar Markovic } 127392ebdd7fSAleksandar Markovic 127492ebdd7fSAleksandar Markovic uint32_t helper_float_sub_s(CPUMIPSState *env, 127592ebdd7fSAleksandar Markovic uint32_t fst0, uint32_t fst1) 127692ebdd7fSAleksandar Markovic { 127792ebdd7fSAleksandar Markovic uint32_t wt2; 127892ebdd7fSAleksandar Markovic 127992ebdd7fSAleksandar Markovic wt2 = float32_sub(fst0, fst1, &env->active_fpu.fp_status); 128092ebdd7fSAleksandar Markovic update_fcr31(env, GETPC()); 128192ebdd7fSAleksandar Markovic return wt2; 128292ebdd7fSAleksandar Markovic } 128392ebdd7fSAleksandar Markovic 128492ebdd7fSAleksandar Markovic uint64_t helper_float_sub_ps(CPUMIPSState *env, 128592ebdd7fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 128692ebdd7fSAleksandar Markovic { 128792ebdd7fSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 128892ebdd7fSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 128992ebdd7fSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 129092ebdd7fSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 129192ebdd7fSAleksandar Markovic uint32_t wtl2; 129292ebdd7fSAleksandar Markovic uint32_t wth2; 129392ebdd7fSAleksandar Markovic 129492ebdd7fSAleksandar Markovic wtl2 = float32_sub(fstl0, fstl1, &env->active_fpu.fp_status); 129592ebdd7fSAleksandar Markovic wth2 = float32_sub(fsth0, fsth1, &env->active_fpu.fp_status); 129692ebdd7fSAleksandar Markovic update_fcr31(env, GETPC()); 129792ebdd7fSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 129892ebdd7fSAleksandar Markovic } 129992ebdd7fSAleksandar Markovic 130011811198SAleksandar Markovic uint64_t helper_float_mul_d(CPUMIPSState *env, 130111811198SAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 130211811198SAleksandar Markovic { 130311811198SAleksandar Markovic uint64_t dt2; 130411811198SAleksandar Markovic 130511811198SAleksandar Markovic dt2 = float64_mul(fdt0, fdt1, &env->active_fpu.fp_status); 130611811198SAleksandar Markovic update_fcr31(env, GETPC()); 130711811198SAleksandar Markovic return dt2; 130811811198SAleksandar Markovic } 130911811198SAleksandar Markovic 131011811198SAleksandar Markovic uint32_t helper_float_mul_s(CPUMIPSState *env, 131111811198SAleksandar Markovic uint32_t fst0, uint32_t fst1) 131211811198SAleksandar Markovic { 131311811198SAleksandar Markovic uint32_t wt2; 131411811198SAleksandar Markovic 131511811198SAleksandar Markovic wt2 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 131611811198SAleksandar Markovic update_fcr31(env, GETPC()); 131711811198SAleksandar Markovic return wt2; 131811811198SAleksandar Markovic } 131911811198SAleksandar Markovic 132011811198SAleksandar Markovic uint64_t helper_float_mul_ps(CPUMIPSState *env, 132111811198SAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 132211811198SAleksandar Markovic { 132311811198SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 132411811198SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 132511811198SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 132611811198SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 132711811198SAleksandar Markovic uint32_t wtl2; 132811811198SAleksandar Markovic uint32_t wth2; 132911811198SAleksandar Markovic 133011811198SAleksandar Markovic wtl2 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 133111811198SAleksandar Markovic wth2 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 133211811198SAleksandar Markovic update_fcr31(env, GETPC()); 133311811198SAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 133411811198SAleksandar Markovic } 133511811198SAleksandar Markovic 1336bcca8c4bSAleksandar Markovic uint64_t helper_float_div_d(CPUMIPSState *env, 1337bcca8c4bSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 1338bcca8c4bSAleksandar Markovic { 1339bcca8c4bSAleksandar Markovic uint64_t dt2; 1340bcca8c4bSAleksandar Markovic 1341bcca8c4bSAleksandar Markovic dt2 = float64_div(fdt0, fdt1, &env->active_fpu.fp_status); 1342bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC()); 1343bcca8c4bSAleksandar Markovic return dt2; 1344bcca8c4bSAleksandar Markovic } 1345bcca8c4bSAleksandar Markovic 1346bcca8c4bSAleksandar Markovic uint32_t helper_float_div_s(CPUMIPSState *env, 1347bcca8c4bSAleksandar Markovic uint32_t fst0, uint32_t fst1) 1348bcca8c4bSAleksandar Markovic { 1349bcca8c4bSAleksandar Markovic uint32_t wt2; 1350bcca8c4bSAleksandar Markovic 1351bcca8c4bSAleksandar Markovic wt2 = float32_div(fst0, fst1, &env->active_fpu.fp_status); 1352bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC()); 1353bcca8c4bSAleksandar Markovic return wt2; 1354bcca8c4bSAleksandar Markovic } 1355bcca8c4bSAleksandar Markovic 1356bcca8c4bSAleksandar Markovic uint64_t helper_float_div_ps(CPUMIPSState *env, 1357bcca8c4bSAleksandar Markovic uint64_t fdt0, uint64_t fdt1) 1358bcca8c4bSAleksandar Markovic { 1359bcca8c4bSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 1360bcca8c4bSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1361bcca8c4bSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 1362bcca8c4bSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 1363bcca8c4bSAleksandar Markovic uint32_t wtl2; 1364bcca8c4bSAleksandar Markovic uint32_t wth2; 1365bcca8c4bSAleksandar Markovic 1366bcca8c4bSAleksandar Markovic wtl2 = float32_div(fstl0, fstl1, &env->active_fpu.fp_status); 1367bcca8c4bSAleksandar Markovic wth2 = float32_div(fsth0, fsth1, &env->active_fpu.fp_status); 1368bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC()); 1369bcca8c4bSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2; 1370bcca8c4bSAleksandar Markovic } 1371bcca8c4bSAleksandar Markovic 13721ace099fSAleksandar Markovic 13737b77f048SAleksandar Markovic /* MIPS specific binary operations */ 13747b77f048SAleksandar Markovic uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 13757b77f048SAleksandar Markovic { 13767b77f048SAleksandar Markovic fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); 13777b77f048SAleksandar Markovic fdt2 = float64_chs(float64_sub(fdt2, float64_one, 13787b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13797b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13807b77f048SAleksandar Markovic return fdt2; 13817b77f048SAleksandar Markovic } 13827b77f048SAleksandar Markovic 13837b77f048SAleksandar Markovic uint32_t helper_float_recip2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) 13847b77f048SAleksandar Markovic { 13857b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 13867b77f048SAleksandar Markovic fst2 = float32_chs(float32_sub(fst2, float32_one, 13877b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 13887b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 13897b77f048SAleksandar Markovic return fst2; 13907b77f048SAleksandar Markovic } 13917b77f048SAleksandar Markovic 13927b77f048SAleksandar Markovic uint64_t helper_float_recip2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 13937b77f048SAleksandar Markovic { 1394485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 13957b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1396485cd2e4SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 13977b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 13987b77f048SAleksandar Markovic 1399485cd2e4SAleksandar Markovic fstl2 = float32_mul(fstl0, fstl2, &env->active_fpu.fp_status); 14007b77f048SAleksandar Markovic fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); 1401485cd2e4SAleksandar Markovic fstl2 = float32_chs(float32_sub(fstl2, float32_one, 14027b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 14037b77f048SAleksandar Markovic fsth2 = float32_chs(float32_sub(fsth2, float32_one, 14047b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 14057b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 1406485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2; 14077b77f048SAleksandar Markovic } 14087b77f048SAleksandar Markovic 14097b77f048SAleksandar Markovic uint64_t helper_float_rsqrt2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 14107b77f048SAleksandar Markovic { 14117b77f048SAleksandar Markovic fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); 14127b77f048SAleksandar Markovic fdt2 = float64_sub(fdt2, float64_one, &env->active_fpu.fp_status); 14137b77f048SAleksandar Markovic fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, 14147b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 14157b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 14167b77f048SAleksandar Markovic return fdt2; 14177b77f048SAleksandar Markovic } 14187b77f048SAleksandar Markovic 14197b77f048SAleksandar Markovic uint32_t helper_float_rsqrt2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) 14207b77f048SAleksandar Markovic { 14217b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 14227b77f048SAleksandar Markovic fst2 = float32_sub(fst2, float32_one, &env->active_fpu.fp_status); 14237b77f048SAleksandar Markovic fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, 14247b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 14257b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 14267b77f048SAleksandar Markovic return fst2; 14277b77f048SAleksandar Markovic } 14287b77f048SAleksandar Markovic 14297b77f048SAleksandar Markovic uint64_t helper_float_rsqrt2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) 14307b77f048SAleksandar Markovic { 1431485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 14327b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1433485cd2e4SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 14347b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 14357b77f048SAleksandar Markovic 1436485cd2e4SAleksandar Markovic fstl2 = float32_mul(fstl0, fstl2, &env->active_fpu.fp_status); 14377b77f048SAleksandar Markovic fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); 1438485cd2e4SAleksandar Markovic fstl2 = float32_sub(fstl2, float32_one, &env->active_fpu.fp_status); 14397b77f048SAleksandar Markovic fsth2 = float32_sub(fsth2, float32_one, &env->active_fpu.fp_status); 1440485cd2e4SAleksandar Markovic fstl2 = float32_chs(float32_div(fstl2, FLOAT_TWO32, 14417b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 14427b77f048SAleksandar Markovic fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, 14437b77f048SAleksandar Markovic &env->active_fpu.fp_status)); 14447b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 1445485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2; 14467b77f048SAleksandar Markovic } 14477b77f048SAleksandar Markovic 14487b77f048SAleksandar Markovic uint64_t helper_float_addr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) 14497b77f048SAleksandar Markovic { 1450485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 14517b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1452485cd2e4SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 14537b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 1454485cd2e4SAleksandar Markovic uint32_t fstl2; 14557b77f048SAleksandar Markovic uint32_t fsth2; 14567b77f048SAleksandar Markovic 1457485cd2e4SAleksandar Markovic fstl2 = float32_add(fstl0, fsth0, &env->active_fpu.fp_status); 1458485cd2e4SAleksandar Markovic fsth2 = float32_add(fstl1, fsth1, &env->active_fpu.fp_status); 14597b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 1460485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2; 14617b77f048SAleksandar Markovic } 14627b77f048SAleksandar Markovic 14637b77f048SAleksandar Markovic uint64_t helper_float_mulr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) 14647b77f048SAleksandar Markovic { 1465485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 14667b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1467485cd2e4SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 14687b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 1469485cd2e4SAleksandar Markovic uint32_t fstl2; 14707b77f048SAleksandar Markovic uint32_t fsth2; 14717b77f048SAleksandar Markovic 1472485cd2e4SAleksandar Markovic fstl2 = float32_mul(fstl0, fsth0, &env->active_fpu.fp_status); 1473485cd2e4SAleksandar Markovic fsth2 = float32_mul(fstl1, fsth1, &env->active_fpu.fp_status); 14747b77f048SAleksandar Markovic update_fcr31(env, GETPC()); 1475485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2; 14767b77f048SAleksandar Markovic } 14777b77f048SAleksandar Markovic 1478*32eb97b5SAleksandar Markovic 1479*32eb97b5SAleksandar Markovic uint32_t helper_float_max_s(CPUMIPSState *env, uint32_t fs, uint32_t ft) 1480*32eb97b5SAleksandar Markovic { 1481*32eb97b5SAleksandar Markovic uint32_t fdret; 1482*32eb97b5SAleksandar Markovic 1483*32eb97b5SAleksandar Markovic fdret = float32_maxnum(fs, ft, &env->active_fpu.fp_status); 1484*32eb97b5SAleksandar Markovic 1485*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1486*32eb97b5SAleksandar Markovic return fdret; 14877b77f048SAleksandar Markovic } 14887b77f048SAleksandar Markovic 1489*32eb97b5SAleksandar Markovic uint64_t helper_float_max_d(CPUMIPSState *env, uint64_t fs, uint64_t ft) 1490*32eb97b5SAleksandar Markovic { 1491*32eb97b5SAleksandar Markovic uint64_t fdret; 14927b77f048SAleksandar Markovic 1493*32eb97b5SAleksandar Markovic fdret = float64_maxnum(fs, ft, &env->active_fpu.fp_status); 1494*32eb97b5SAleksandar Markovic 1495*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1496*32eb97b5SAleksandar Markovic return fdret; 1497*32eb97b5SAleksandar Markovic } 1498*32eb97b5SAleksandar Markovic 1499*32eb97b5SAleksandar Markovic uint32_t helper_float_maxa_s(CPUMIPSState *env, uint32_t fs, uint32_t ft) 1500*32eb97b5SAleksandar Markovic { 1501*32eb97b5SAleksandar Markovic uint32_t fdret; 1502*32eb97b5SAleksandar Markovic 1503*32eb97b5SAleksandar Markovic fdret = float32_maxnummag(fs, ft, &env->active_fpu.fp_status); 1504*32eb97b5SAleksandar Markovic 1505*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1506*32eb97b5SAleksandar Markovic return fdret; 1507*32eb97b5SAleksandar Markovic } 1508*32eb97b5SAleksandar Markovic 1509*32eb97b5SAleksandar Markovic uint64_t helper_float_maxa_d(CPUMIPSState *env, uint64_t fs, uint64_t ft) 1510*32eb97b5SAleksandar Markovic { 1511*32eb97b5SAleksandar Markovic uint64_t fdret; 1512*32eb97b5SAleksandar Markovic 1513*32eb97b5SAleksandar Markovic fdret = float64_maxnummag(fs, ft, &env->active_fpu.fp_status); 1514*32eb97b5SAleksandar Markovic 1515*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1516*32eb97b5SAleksandar Markovic return fdret; 1517*32eb97b5SAleksandar Markovic } 1518*32eb97b5SAleksandar Markovic 1519*32eb97b5SAleksandar Markovic uint32_t helper_float_min_s(CPUMIPSState *env, uint32_t fs, uint32_t ft) 1520*32eb97b5SAleksandar Markovic { 1521*32eb97b5SAleksandar Markovic uint32_t fdret; 1522*32eb97b5SAleksandar Markovic 1523*32eb97b5SAleksandar Markovic fdret = float32_minnum(fs, ft, &env->active_fpu.fp_status); 1524*32eb97b5SAleksandar Markovic 1525*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1526*32eb97b5SAleksandar Markovic return fdret; 1527*32eb97b5SAleksandar Markovic } 1528*32eb97b5SAleksandar Markovic 1529*32eb97b5SAleksandar Markovic uint64_t helper_float_min_d(CPUMIPSState *env, uint64_t fs, uint64_t ft) 1530*32eb97b5SAleksandar Markovic { 1531*32eb97b5SAleksandar Markovic uint64_t fdret; 1532*32eb97b5SAleksandar Markovic 1533*32eb97b5SAleksandar Markovic fdret = float64_minnum(fs, ft, &env->active_fpu.fp_status); 1534*32eb97b5SAleksandar Markovic 1535*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1536*32eb97b5SAleksandar Markovic return fdret; 1537*32eb97b5SAleksandar Markovic } 1538*32eb97b5SAleksandar Markovic 1539*32eb97b5SAleksandar Markovic uint32_t helper_float_mina_s(CPUMIPSState *env, uint32_t fs, uint32_t ft) 1540*32eb97b5SAleksandar Markovic { 1541*32eb97b5SAleksandar Markovic uint32_t fdret; 1542*32eb97b5SAleksandar Markovic 1543*32eb97b5SAleksandar Markovic fdret = float32_minnummag(fs, ft, &env->active_fpu.fp_status); 1544*32eb97b5SAleksandar Markovic 1545*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1546*32eb97b5SAleksandar Markovic return fdret; 1547*32eb97b5SAleksandar Markovic } 1548*32eb97b5SAleksandar Markovic 1549*32eb97b5SAleksandar Markovic uint64_t helper_float_mina_d(CPUMIPSState *env, uint64_t fs, uint64_t ft) 1550*32eb97b5SAleksandar Markovic { 1551*32eb97b5SAleksandar Markovic uint64_t fdret; 1552*32eb97b5SAleksandar Markovic 1553*32eb97b5SAleksandar Markovic fdret = float64_minnummag(fs, ft, &env->active_fpu.fp_status); 1554*32eb97b5SAleksandar Markovic 1555*32eb97b5SAleksandar Markovic update_fcr31(env, GETPC()); 1556*32eb97b5SAleksandar Markovic return fdret; 1557*32eb97b5SAleksandar Markovic } 1558*32eb97b5SAleksandar Markovic 15597b77f048SAleksandar Markovic 15607b77f048SAleksandar Markovic /* ternary operations */ 15617b77f048SAleksandar Markovic 156216734cc1SAleksandar Markovic uint64_t helper_float_madd_d(CPUMIPSState *env, uint64_t fst0, 156316734cc1SAleksandar Markovic uint64_t fst1, uint64_t fst2) 156416734cc1SAleksandar Markovic { 156516734cc1SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status); 156616734cc1SAleksandar Markovic fst0 = float64_add(fst0, fst2, &env->active_fpu.fp_status); 156716734cc1SAleksandar Markovic 156816734cc1SAleksandar Markovic update_fcr31(env, GETPC()); 156916734cc1SAleksandar Markovic return fst0; 157016734cc1SAleksandar Markovic } 157116734cc1SAleksandar Markovic 157216734cc1SAleksandar Markovic uint32_t helper_float_madd_s(CPUMIPSState *env, uint32_t fst0, 157316734cc1SAleksandar Markovic uint32_t fst1, uint32_t fst2) 157416734cc1SAleksandar Markovic { 157516734cc1SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 157616734cc1SAleksandar Markovic fst0 = float32_add(fst0, fst2, &env->active_fpu.fp_status); 157716734cc1SAleksandar Markovic 157816734cc1SAleksandar Markovic update_fcr31(env, GETPC()); 157916734cc1SAleksandar Markovic return fst0; 158016734cc1SAleksandar Markovic } 158116734cc1SAleksandar Markovic 158216734cc1SAleksandar Markovic uint64_t helper_float_madd_ps(CPUMIPSState *env, uint64_t fdt0, 158316734cc1SAleksandar Markovic uint64_t fdt1, uint64_t fdt2) 158416734cc1SAleksandar Markovic { 158516734cc1SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 158616734cc1SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 158716734cc1SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 158816734cc1SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 158916734cc1SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 159016734cc1SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 159116734cc1SAleksandar Markovic 159216734cc1SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 159316734cc1SAleksandar Markovic fstl0 = float32_add(fstl0, fstl2, &env->active_fpu.fp_status); 159416734cc1SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 159516734cc1SAleksandar Markovic fsth0 = float32_add(fsth0, fsth2, &env->active_fpu.fp_status); 159616734cc1SAleksandar Markovic 159716734cc1SAleksandar Markovic update_fcr31(env, GETPC()); 159816734cc1SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0; 159916734cc1SAleksandar Markovic } 160016734cc1SAleksandar Markovic 1601faec7524SAleksandar Markovic uint64_t helper_float_msub_d(CPUMIPSState *env, uint64_t fst0, 1602faec7524SAleksandar Markovic uint64_t fst1, uint64_t fst2) 1603faec7524SAleksandar Markovic { 1604faec7524SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status); 1605faec7524SAleksandar Markovic fst0 = float64_sub(fst0, fst2, &env->active_fpu.fp_status); 1606faec7524SAleksandar Markovic 1607faec7524SAleksandar Markovic update_fcr31(env, GETPC()); 1608faec7524SAleksandar Markovic return fst0; 1609faec7524SAleksandar Markovic } 1610faec7524SAleksandar Markovic 1611faec7524SAleksandar Markovic uint32_t helper_float_msub_s(CPUMIPSState *env, uint32_t fst0, 1612faec7524SAleksandar Markovic uint32_t fst1, uint32_t fst2) 1613faec7524SAleksandar Markovic { 1614faec7524SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 1615faec7524SAleksandar Markovic fst0 = float32_sub(fst0, fst2, &env->active_fpu.fp_status); 1616faec7524SAleksandar Markovic 1617faec7524SAleksandar Markovic update_fcr31(env, GETPC()); 1618faec7524SAleksandar Markovic return fst0; 1619faec7524SAleksandar Markovic } 1620faec7524SAleksandar Markovic 1621faec7524SAleksandar Markovic uint64_t helper_float_msub_ps(CPUMIPSState *env, uint64_t fdt0, 1622faec7524SAleksandar Markovic uint64_t fdt1, uint64_t fdt2) 1623faec7524SAleksandar Markovic { 1624faec7524SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 1625faec7524SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 1626faec7524SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 1627faec7524SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 1628faec7524SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 1629faec7524SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 1630faec7524SAleksandar Markovic 1631faec7524SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 1632faec7524SAleksandar Markovic fstl0 = float32_sub(fstl0, fstl2, &env->active_fpu.fp_status); 1633faec7524SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 1634faec7524SAleksandar Markovic fsth0 = float32_sub(fsth0, fsth2, &env->active_fpu.fp_status); 1635faec7524SAleksandar Markovic 1636faec7524SAleksandar Markovic update_fcr31(env, GETPC()); 1637faec7524SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0; 1638faec7524SAleksandar Markovic } 1639faec7524SAleksandar Markovic 16400278586dSAleksandar Markovic uint64_t helper_float_nmadd_d(CPUMIPSState *env, uint64_t fst0, 16410278586dSAleksandar Markovic uint64_t fst1, uint64_t fst2) 16420278586dSAleksandar Markovic { 16430278586dSAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status); 16440278586dSAleksandar Markovic fst0 = float64_add(fst0, fst2, &env->active_fpu.fp_status); 16450278586dSAleksandar Markovic fst0 = float64_chs(fst0); 16460278586dSAleksandar Markovic 16470278586dSAleksandar Markovic update_fcr31(env, GETPC()); 16480278586dSAleksandar Markovic return fst0; 16490278586dSAleksandar Markovic } 16500278586dSAleksandar Markovic 16510278586dSAleksandar Markovic uint32_t helper_float_nmadd_s(CPUMIPSState *env, uint32_t fst0, 16520278586dSAleksandar Markovic uint32_t fst1, uint32_t fst2) 16530278586dSAleksandar Markovic { 16540278586dSAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 16550278586dSAleksandar Markovic fst0 = float32_add(fst0, fst2, &env->active_fpu.fp_status); 16560278586dSAleksandar Markovic fst0 = float32_chs(fst0); 16570278586dSAleksandar Markovic 16580278586dSAleksandar Markovic update_fcr31(env, GETPC()); 16590278586dSAleksandar Markovic return fst0; 16600278586dSAleksandar Markovic } 16610278586dSAleksandar Markovic 16620278586dSAleksandar Markovic uint64_t helper_float_nmadd_ps(CPUMIPSState *env, uint64_t fdt0, 16630278586dSAleksandar Markovic uint64_t fdt1, uint64_t fdt2) 16640278586dSAleksandar Markovic { 16650278586dSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 16660278586dSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 16670278586dSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 16680278586dSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 16690278586dSAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 16700278586dSAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 16710278586dSAleksandar Markovic 16720278586dSAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 16730278586dSAleksandar Markovic fstl0 = float32_add(fstl0, fstl2, &env->active_fpu.fp_status); 16740278586dSAleksandar Markovic fstl0 = float32_chs(fstl0); 16750278586dSAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 16760278586dSAleksandar Markovic fsth0 = float32_add(fsth0, fsth2, &env->active_fpu.fp_status); 16770278586dSAleksandar Markovic fsth0 = float32_chs(fsth0); 16780278586dSAleksandar Markovic 16790278586dSAleksandar Markovic update_fcr31(env, GETPC()); 16800278586dSAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0; 16810278586dSAleksandar Markovic } 16820278586dSAleksandar Markovic 16835c591e22SAleksandar Markovic uint64_t helper_float_nmsub_d(CPUMIPSState *env, uint64_t fst0, 16845c591e22SAleksandar Markovic uint64_t fst1, uint64_t fst2) 16855c591e22SAleksandar Markovic { 16865c591e22SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status); 16875c591e22SAleksandar Markovic fst0 = float64_sub(fst0, fst2, &env->active_fpu.fp_status); 16885c591e22SAleksandar Markovic fst0 = float64_chs(fst0); 16895c591e22SAleksandar Markovic 16905c591e22SAleksandar Markovic update_fcr31(env, GETPC()); 16915c591e22SAleksandar Markovic return fst0; 16925c591e22SAleksandar Markovic } 16935c591e22SAleksandar Markovic 16945c591e22SAleksandar Markovic uint32_t helper_float_nmsub_s(CPUMIPSState *env, uint32_t fst0, 16955c591e22SAleksandar Markovic uint32_t fst1, uint32_t fst2) 16965c591e22SAleksandar Markovic { 16975c591e22SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status); 16985c591e22SAleksandar Markovic fst0 = float32_sub(fst0, fst2, &env->active_fpu.fp_status); 16995c591e22SAleksandar Markovic fst0 = float32_chs(fst0); 17005c591e22SAleksandar Markovic 17015c591e22SAleksandar Markovic update_fcr31(env, GETPC()); 17025c591e22SAleksandar Markovic return fst0; 17035c591e22SAleksandar Markovic } 17045c591e22SAleksandar Markovic 17055c591e22SAleksandar Markovic uint64_t helper_float_nmsub_ps(CPUMIPSState *env, uint64_t fdt0, 17065c591e22SAleksandar Markovic uint64_t fdt1, uint64_t fdt2) 17075c591e22SAleksandar Markovic { 17085c591e22SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF; 17095c591e22SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32; 17105c591e22SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF; 17115c591e22SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32; 17125c591e22SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF; 17135c591e22SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32; 17145c591e22SAleksandar Markovic 17155c591e22SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status); 17165c591e22SAleksandar Markovic fstl0 = float32_sub(fstl0, fstl2, &env->active_fpu.fp_status); 17175c591e22SAleksandar Markovic fstl0 = float32_chs(fstl0); 17185c591e22SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status); 17195c591e22SAleksandar Markovic fsth0 = float32_sub(fsth0, fsth2, &env->active_fpu.fp_status); 17205c591e22SAleksandar Markovic fsth0 = float32_chs(fsth0); 17215c591e22SAleksandar Markovic 17225c591e22SAleksandar Markovic update_fcr31(env, GETPC()); 17235c591e22SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0; 17245c591e22SAleksandar Markovic } 17255c591e22SAleksandar Markovic 172616734cc1SAleksandar Markovic 1727be0cb994SAleksandar Markovic uint32_t helper_float_maddf_s(CPUMIPSState *env, uint32_t fs, 1728be0cb994SAleksandar Markovic uint32_t ft, uint32_t fd) 1729be0cb994SAleksandar Markovic { 1730be0cb994SAleksandar Markovic uint32_t fdret; 1731be0cb994SAleksandar Markovic 1732be0cb994SAleksandar Markovic fdret = float32_muladd(fs, ft, fd, 0, 1733be0cb994SAleksandar Markovic &env->active_fpu.fp_status); 1734be0cb994SAleksandar Markovic 1735be0cb994SAleksandar Markovic update_fcr31(env, GETPC()); 1736be0cb994SAleksandar Markovic return fdret; 17377b77f048SAleksandar Markovic } 17387b77f048SAleksandar Markovic 1739be0cb994SAleksandar Markovic uint64_t helper_float_maddf_d(CPUMIPSState *env, uint64_t fs, 1740be0cb994SAleksandar Markovic uint64_t ft, uint64_t fd) 1741be0cb994SAleksandar Markovic { 1742be0cb994SAleksandar Markovic uint64_t fdret; 1743be0cb994SAleksandar Markovic 1744be0cb994SAleksandar Markovic fdret = float64_muladd(fs, ft, fd, 0, 1745be0cb994SAleksandar Markovic &env->active_fpu.fp_status); 1746be0cb994SAleksandar Markovic 1747be0cb994SAleksandar Markovic update_fcr31(env, GETPC()); 1748be0cb994SAleksandar Markovic return fdret; 1749be0cb994SAleksandar Markovic } 1750be0cb994SAleksandar Markovic 1751be0cb994SAleksandar Markovic uint32_t helper_float_msubf_s(CPUMIPSState *env, uint32_t fs, 1752be0cb994SAleksandar Markovic uint32_t ft, uint32_t fd) 1753be0cb994SAleksandar Markovic { 1754be0cb994SAleksandar Markovic uint32_t fdret; 1755be0cb994SAleksandar Markovic 1756be0cb994SAleksandar Markovic fdret = float32_muladd(fs, ft, fd, float_muladd_negate_product, 1757be0cb994SAleksandar Markovic &env->active_fpu.fp_status); 1758be0cb994SAleksandar Markovic 1759be0cb994SAleksandar Markovic update_fcr31(env, GETPC()); 1760be0cb994SAleksandar Markovic return fdret; 1761be0cb994SAleksandar Markovic } 1762be0cb994SAleksandar Markovic 1763be0cb994SAleksandar Markovic uint64_t helper_float_msubf_d(CPUMIPSState *env, uint64_t fs, 1764be0cb994SAleksandar Markovic uint64_t ft, uint64_t fd) 1765be0cb994SAleksandar Markovic { 1766be0cb994SAleksandar Markovic uint64_t fdret; 1767be0cb994SAleksandar Markovic 1768be0cb994SAleksandar Markovic fdret = float64_muladd(fs, ft, fd, float_muladd_negate_product, 1769be0cb994SAleksandar Markovic &env->active_fpu.fp_status); 1770be0cb994SAleksandar Markovic 1771be0cb994SAleksandar Markovic update_fcr31(env, GETPC()); 1772be0cb994SAleksandar Markovic return fdret; 1773be0cb994SAleksandar Markovic } 1774be0cb994SAleksandar Markovic 17757b77f048SAleksandar Markovic 17767b77f048SAleksandar Markovic /* compare operations */ 17777b77f048SAleksandar Markovic #define FOP_COND_D(op, cond) \ 17787b77f048SAleksandar Markovic void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 17797b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 17807b77f048SAleksandar Markovic { \ 17817b77f048SAleksandar Markovic int c; \ 17827b77f048SAleksandar Markovic c = cond; \ 17837b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 17847b77f048SAleksandar Markovic if (c) \ 17857b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 17867b77f048SAleksandar Markovic else \ 17877b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 17887b77f048SAleksandar Markovic } \ 17897b77f048SAleksandar Markovic void helper_cmpabs_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 17907b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 17917b77f048SAleksandar Markovic { \ 17927b77f048SAleksandar Markovic int c; \ 17937b77f048SAleksandar Markovic fdt0 = float64_abs(fdt0); \ 17947b77f048SAleksandar Markovic fdt1 = float64_abs(fdt1); \ 17957b77f048SAleksandar Markovic c = cond; \ 17967b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 17977b77f048SAleksandar Markovic if (c) \ 17987b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 17997b77f048SAleksandar Markovic else \ 18007b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 18017b77f048SAleksandar Markovic } 18027b77f048SAleksandar Markovic 18037b77f048SAleksandar Markovic /* 18047b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 18057b77f048SAleksandar Markovic * but float64_unordered_quiet() is still called. 18067b77f048SAleksandar Markovic */ 18077b77f048SAleksandar Markovic FOP_COND_D(f, (float64_unordered_quiet(fdt1, fdt0, 18087b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 18097b77f048SAleksandar Markovic FOP_COND_D(un, float64_unordered_quiet(fdt1, fdt0, 18107b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18117b77f048SAleksandar Markovic FOP_COND_D(eq, float64_eq_quiet(fdt0, fdt1, 18127b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18137b77f048SAleksandar Markovic FOP_COND_D(ueq, float64_unordered_quiet(fdt1, fdt0, 18147b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18157b77f048SAleksandar Markovic || float64_eq_quiet(fdt0, fdt1, 18167b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18177b77f048SAleksandar Markovic FOP_COND_D(olt, float64_lt_quiet(fdt0, fdt1, 18187b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18197b77f048SAleksandar Markovic FOP_COND_D(ult, float64_unordered_quiet(fdt1, fdt0, 18207b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18217b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 18227b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18237b77f048SAleksandar Markovic FOP_COND_D(ole, float64_le_quiet(fdt0, fdt1, 18247b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18257b77f048SAleksandar Markovic FOP_COND_D(ule, float64_unordered_quiet(fdt1, fdt0, 18267b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18277b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1, 18287b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18297b77f048SAleksandar Markovic /* 18307b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 18317b77f048SAleksandar Markovic * but float64_unordered() is still called. 18327b77f048SAleksandar Markovic */ 18337b77f048SAleksandar Markovic FOP_COND_D(sf, (float64_unordered(fdt1, fdt0, 18347b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 18357b77f048SAleksandar Markovic FOP_COND_D(ngle, float64_unordered(fdt1, fdt0, 18367b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18377b77f048SAleksandar Markovic FOP_COND_D(seq, float64_eq(fdt0, fdt1, 18387b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18397b77f048SAleksandar Markovic FOP_COND_D(ngl, float64_unordered(fdt1, fdt0, 18407b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18417b77f048SAleksandar Markovic || float64_eq(fdt0, fdt1, 18427b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18437b77f048SAleksandar Markovic FOP_COND_D(lt, float64_lt(fdt0, fdt1, 18447b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18457b77f048SAleksandar Markovic FOP_COND_D(nge, float64_unordered(fdt1, fdt0, 18467b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18477b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 18487b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18497b77f048SAleksandar Markovic FOP_COND_D(le, float64_le(fdt0, fdt1, 18507b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18517b77f048SAleksandar Markovic FOP_COND_D(ngt, float64_unordered(fdt1, fdt0, 18527b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18537b77f048SAleksandar Markovic || float64_le(fdt0, fdt1, 18547b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18557b77f048SAleksandar Markovic 18567b77f048SAleksandar Markovic #define FOP_COND_S(op, cond) \ 18577b77f048SAleksandar Markovic void helper_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ 18587b77f048SAleksandar Markovic uint32_t fst1, int cc) \ 18597b77f048SAleksandar Markovic { \ 18607b77f048SAleksandar Markovic int c; \ 18617b77f048SAleksandar Markovic c = cond; \ 18627b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 18637b77f048SAleksandar Markovic if (c) \ 18647b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 18657b77f048SAleksandar Markovic else \ 18667b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 18677b77f048SAleksandar Markovic } \ 18687b77f048SAleksandar Markovic void helper_cmpabs_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ 18697b77f048SAleksandar Markovic uint32_t fst1, int cc) \ 18707b77f048SAleksandar Markovic { \ 18717b77f048SAleksandar Markovic int c; \ 18727b77f048SAleksandar Markovic fst0 = float32_abs(fst0); \ 18737b77f048SAleksandar Markovic fst1 = float32_abs(fst1); \ 18747b77f048SAleksandar Markovic c = cond; \ 18757b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 18767b77f048SAleksandar Markovic if (c) \ 18777b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 18787b77f048SAleksandar Markovic else \ 18797b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 18807b77f048SAleksandar Markovic } 18817b77f048SAleksandar Markovic 18827b77f048SAleksandar Markovic /* 18837b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 18847b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called. 18857b77f048SAleksandar Markovic */ 18867b77f048SAleksandar Markovic FOP_COND_S(f, (float32_unordered_quiet(fst1, fst0, 18877b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 18887b77f048SAleksandar Markovic FOP_COND_S(un, float32_unordered_quiet(fst1, fst0, 18897b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18907b77f048SAleksandar Markovic FOP_COND_S(eq, float32_eq_quiet(fst0, fst1, 18917b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18927b77f048SAleksandar Markovic FOP_COND_S(ueq, float32_unordered_quiet(fst1, fst0, 18937b77f048SAleksandar Markovic &env->active_fpu.fp_status) 18947b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1, 18957b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18967b77f048SAleksandar Markovic FOP_COND_S(olt, float32_lt_quiet(fst0, fst1, 18977b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 18987b77f048SAleksandar Markovic FOP_COND_S(ult, float32_unordered_quiet(fst1, fst0, 18997b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19007b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 19017b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19027b77f048SAleksandar Markovic FOP_COND_S(ole, float32_le_quiet(fst0, fst1, 19037b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19047b77f048SAleksandar Markovic FOP_COND_S(ule, float32_unordered_quiet(fst1, fst0, 19057b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19067b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 19077b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19087b77f048SAleksandar Markovic /* 19097b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 19107b77f048SAleksandar Markovic * but float32_unordered() is still called. 19117b77f048SAleksandar Markovic */ 19127b77f048SAleksandar Markovic FOP_COND_S(sf, (float32_unordered(fst1, fst0, 19137b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 19147b77f048SAleksandar Markovic FOP_COND_S(ngle, float32_unordered(fst1, fst0, 19157b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19167b77f048SAleksandar Markovic FOP_COND_S(seq, float32_eq(fst0, fst1, 19177b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19187b77f048SAleksandar Markovic FOP_COND_S(ngl, float32_unordered(fst1, fst0, 19197b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19207b77f048SAleksandar Markovic || float32_eq(fst0, fst1, 19217b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19227b77f048SAleksandar Markovic FOP_COND_S(lt, float32_lt(fst0, fst1, 19237b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19247b77f048SAleksandar Markovic FOP_COND_S(nge, float32_unordered(fst1, fst0, 19257b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19267b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 19277b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19287b77f048SAleksandar Markovic FOP_COND_S(le, float32_le(fst0, fst1, 19297b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19307b77f048SAleksandar Markovic FOP_COND_S(ngt, float32_unordered(fst1, fst0, 19317b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19327b77f048SAleksandar Markovic || float32_le(fst0, fst1, 19337b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19347b77f048SAleksandar Markovic 19357b77f048SAleksandar Markovic #define FOP_COND_PS(op, condl, condh) \ 19367b77f048SAleksandar Markovic void helper_cmp_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 19377b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 19387b77f048SAleksandar Markovic { \ 19397b77f048SAleksandar Markovic uint32_t fst0, fsth0, fst1, fsth1; \ 19407b77f048SAleksandar Markovic int ch, cl; \ 19417b77f048SAleksandar Markovic fst0 = fdt0 & 0XFFFFFFFF; \ 19427b77f048SAleksandar Markovic fsth0 = fdt0 >> 32; \ 19437b77f048SAleksandar Markovic fst1 = fdt1 & 0XFFFFFFFF; \ 19447b77f048SAleksandar Markovic fsth1 = fdt1 >> 32; \ 19457b77f048SAleksandar Markovic cl = condl; \ 19467b77f048SAleksandar Markovic ch = condh; \ 19477b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 19487b77f048SAleksandar Markovic if (cl) \ 19497b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 19507b77f048SAleksandar Markovic else \ 19517b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 19527b77f048SAleksandar Markovic if (ch) \ 19537b77f048SAleksandar Markovic SET_FP_COND(cc + 1, env->active_fpu); \ 19547b77f048SAleksandar Markovic else \ 19557b77f048SAleksandar Markovic CLEAR_FP_COND(cc + 1, env->active_fpu); \ 19567b77f048SAleksandar Markovic } \ 19577b77f048SAleksandar Markovic void helper_cmpabs_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 19587b77f048SAleksandar Markovic uint64_t fdt1, int cc) \ 19597b77f048SAleksandar Markovic { \ 19607b77f048SAleksandar Markovic uint32_t fst0, fsth0, fst1, fsth1; \ 19617b77f048SAleksandar Markovic int ch, cl; \ 19627b77f048SAleksandar Markovic fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \ 19637b77f048SAleksandar Markovic fsth0 = float32_abs(fdt0 >> 32); \ 19647b77f048SAleksandar Markovic fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \ 19657b77f048SAleksandar Markovic fsth1 = float32_abs(fdt1 >> 32); \ 19667b77f048SAleksandar Markovic cl = condl; \ 19677b77f048SAleksandar Markovic ch = condh; \ 19687b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 19697b77f048SAleksandar Markovic if (cl) \ 19707b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \ 19717b77f048SAleksandar Markovic else \ 19727b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \ 19737b77f048SAleksandar Markovic if (ch) \ 19747b77f048SAleksandar Markovic SET_FP_COND(cc + 1, env->active_fpu); \ 19757b77f048SAleksandar Markovic else \ 19767b77f048SAleksandar Markovic CLEAR_FP_COND(cc + 1, env->active_fpu); \ 19777b77f048SAleksandar Markovic } 19787b77f048SAleksandar Markovic 19797b77f048SAleksandar Markovic /* 19807b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 19817b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called. 19827b77f048SAleksandar Markovic */ 19837b77f048SAleksandar Markovic FOP_COND_PS(f, (float32_unordered_quiet(fst1, fst0, 19847b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0), 19857b77f048SAleksandar Markovic (float32_unordered_quiet(fsth1, fsth0, 19867b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 19877b77f048SAleksandar Markovic FOP_COND_PS(un, float32_unordered_quiet(fst1, fst0, 19887b77f048SAleksandar Markovic &env->active_fpu.fp_status), 19897b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 19907b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19917b77f048SAleksandar Markovic FOP_COND_PS(eq, float32_eq_quiet(fst0, fst1, 19927b77f048SAleksandar Markovic &env->active_fpu.fp_status), 19937b77f048SAleksandar Markovic float32_eq_quiet(fsth0, fsth1, 19947b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 19957b77f048SAleksandar Markovic FOP_COND_PS(ueq, float32_unordered_quiet(fst1, fst0, 19967b77f048SAleksandar Markovic &env->active_fpu.fp_status) 19977b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1, 19987b77f048SAleksandar Markovic &env->active_fpu.fp_status), 19997b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 20007b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20017b77f048SAleksandar Markovic || float32_eq_quiet(fsth0, fsth1, 20027b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20037b77f048SAleksandar Markovic FOP_COND_PS(olt, float32_lt_quiet(fst0, fst1, 20047b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20057b77f048SAleksandar Markovic float32_lt_quiet(fsth0, fsth1, 20067b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20077b77f048SAleksandar Markovic FOP_COND_PS(ult, float32_unordered_quiet(fst1, fst0, 20087b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20097b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 20107b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20117b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 20127b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20137b77f048SAleksandar Markovic || float32_lt_quiet(fsth0, fsth1, 20147b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20157b77f048SAleksandar Markovic FOP_COND_PS(ole, float32_le_quiet(fst0, fst1, 20167b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20177b77f048SAleksandar Markovic float32_le_quiet(fsth0, fsth1, 20187b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20197b77f048SAleksandar Markovic FOP_COND_PS(ule, float32_unordered_quiet(fst1, fst0, 20207b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20217b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 20227b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20237b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0, 20247b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20257b77f048SAleksandar Markovic || float32_le_quiet(fsth0, fsth1, 20267b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20277b77f048SAleksandar Markovic /* 20287b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 20297b77f048SAleksandar Markovic * but float32_unordered() is still called. 20307b77f048SAleksandar Markovic */ 20317b77f048SAleksandar Markovic FOP_COND_PS(sf, (float32_unordered(fst1, fst0, 20327b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0), 20337b77f048SAleksandar Markovic (float32_unordered(fsth1, fsth0, 20347b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 20357b77f048SAleksandar Markovic FOP_COND_PS(ngle, float32_unordered(fst1, fst0, 20367b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20377b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 20387b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20397b77f048SAleksandar Markovic FOP_COND_PS(seq, float32_eq(fst0, fst1, 20407b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20417b77f048SAleksandar Markovic float32_eq(fsth0, fsth1, 20427b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20437b77f048SAleksandar Markovic FOP_COND_PS(ngl, float32_unordered(fst1, fst0, 20447b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20457b77f048SAleksandar Markovic || float32_eq(fst0, fst1, 20467b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20477b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 20487b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20497b77f048SAleksandar Markovic || float32_eq(fsth0, fsth1, 20507b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20517b77f048SAleksandar Markovic FOP_COND_PS(lt, float32_lt(fst0, fst1, 20527b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20537b77f048SAleksandar Markovic float32_lt(fsth0, fsth1, 20547b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20557b77f048SAleksandar Markovic FOP_COND_PS(nge, float32_unordered(fst1, fst0, 20567b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20577b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 20587b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20597b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 20607b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20617b77f048SAleksandar Markovic || float32_lt(fsth0, fsth1, 20627b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20637b77f048SAleksandar Markovic FOP_COND_PS(le, float32_le(fst0, fst1, 20647b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20657b77f048SAleksandar Markovic float32_le(fsth0, fsth1, 20667b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20677b77f048SAleksandar Markovic FOP_COND_PS(ngt, float32_unordered(fst1, fst0, 20687b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20697b77f048SAleksandar Markovic || float32_le(fst0, fst1, 20707b77f048SAleksandar Markovic &env->active_fpu.fp_status), 20717b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0, 20727b77f048SAleksandar Markovic &env->active_fpu.fp_status) 20737b77f048SAleksandar Markovic || float32_le(fsth0, fsth1, 20747b77f048SAleksandar Markovic &env->active_fpu.fp_status)) 20757b77f048SAleksandar Markovic 20767b77f048SAleksandar Markovic /* R6 compare operations */ 20777b77f048SAleksandar Markovic #define FOP_CONDN_D(op, cond) \ 20787b77f048SAleksandar Markovic uint64_t helper_r6_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ 20797b77f048SAleksandar Markovic uint64_t fdt1) \ 20807b77f048SAleksandar Markovic { \ 20817b77f048SAleksandar Markovic uint64_t c; \ 20827b77f048SAleksandar Markovic c = cond; \ 20837b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 20847b77f048SAleksandar Markovic if (c) { \ 20857b77f048SAleksandar Markovic return -1; \ 20867b77f048SAleksandar Markovic } else { \ 20877b77f048SAleksandar Markovic return 0; \ 20887b77f048SAleksandar Markovic } \ 20897b77f048SAleksandar Markovic } 20907b77f048SAleksandar Markovic 20917b77f048SAleksandar Markovic /* 20927b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 20937b77f048SAleksandar Markovic * but float64_unordered_quiet() is still called. 20947b77f048SAleksandar Markovic */ 20957b77f048SAleksandar Markovic FOP_CONDN_D(af, (float64_unordered_quiet(fdt1, fdt0, 20967b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 20977b77f048SAleksandar Markovic FOP_CONDN_D(un, (float64_unordered_quiet(fdt1, fdt0, 20987b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 20997b77f048SAleksandar Markovic FOP_CONDN_D(eq, (float64_eq_quiet(fdt0, fdt1, 21007b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21017b77f048SAleksandar Markovic FOP_CONDN_D(ueq, (float64_unordered_quiet(fdt1, fdt0, 21027b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21037b77f048SAleksandar Markovic || float64_eq_quiet(fdt0, fdt1, 21047b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21057b77f048SAleksandar Markovic FOP_CONDN_D(lt, (float64_lt_quiet(fdt0, fdt1, 21067b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21077b77f048SAleksandar Markovic FOP_CONDN_D(ult, (float64_unordered_quiet(fdt1, fdt0, 21087b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21097b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 21107b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21117b77f048SAleksandar Markovic FOP_CONDN_D(le, (float64_le_quiet(fdt0, fdt1, 21127b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21137b77f048SAleksandar Markovic FOP_CONDN_D(ule, (float64_unordered_quiet(fdt1, fdt0, 21147b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21157b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1, 21167b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21177b77f048SAleksandar Markovic /* 21187b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 21197b77f048SAleksandar Markovic * but float64_unordered() is still called.\ 21207b77f048SAleksandar Markovic */ 21217b77f048SAleksandar Markovic FOP_CONDN_D(saf, (float64_unordered(fdt1, fdt0, 21227b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 21237b77f048SAleksandar Markovic FOP_CONDN_D(sun, (float64_unordered(fdt1, fdt0, 21247b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21257b77f048SAleksandar Markovic FOP_CONDN_D(seq, (float64_eq(fdt0, fdt1, 21267b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21277b77f048SAleksandar Markovic FOP_CONDN_D(sueq, (float64_unordered(fdt1, fdt0, 21287b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21297b77f048SAleksandar Markovic || float64_eq(fdt0, fdt1, 21307b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21317b77f048SAleksandar Markovic FOP_CONDN_D(slt, (float64_lt(fdt0, fdt1, 21327b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21337b77f048SAleksandar Markovic FOP_CONDN_D(sult, (float64_unordered(fdt1, fdt0, 21347b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21357b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 21367b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21377b77f048SAleksandar Markovic FOP_CONDN_D(sle, (float64_le(fdt0, fdt1, 21387b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21397b77f048SAleksandar Markovic FOP_CONDN_D(sule, (float64_unordered(fdt1, fdt0, 21407b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21417b77f048SAleksandar Markovic || float64_le(fdt0, fdt1, 21427b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21437b77f048SAleksandar Markovic FOP_CONDN_D(or, (float64_le_quiet(fdt1, fdt0, 21447b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21457b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1, 21467b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21477b77f048SAleksandar Markovic FOP_CONDN_D(une, (float64_unordered_quiet(fdt1, fdt0, 21487b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21497b77f048SAleksandar Markovic || float64_lt_quiet(fdt1, fdt0, 21507b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21517b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 21527b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21537b77f048SAleksandar Markovic FOP_CONDN_D(ne, (float64_lt_quiet(fdt1, fdt0, 21547b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21557b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1, 21567b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21577b77f048SAleksandar Markovic FOP_CONDN_D(sor, (float64_le(fdt1, fdt0, 21587b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21597b77f048SAleksandar Markovic || float64_le(fdt0, fdt1, 21607b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21617b77f048SAleksandar Markovic FOP_CONDN_D(sune, (float64_unordered(fdt1, fdt0, 21627b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21637b77f048SAleksandar Markovic || float64_lt(fdt1, fdt0, 21647b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21657b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 21667b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21677b77f048SAleksandar Markovic FOP_CONDN_D(sne, (float64_lt(fdt1, fdt0, 21687b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21697b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1, 21707b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21717b77f048SAleksandar Markovic 21727b77f048SAleksandar Markovic #define FOP_CONDN_S(op, cond) \ 21737b77f048SAleksandar Markovic uint32_t helper_r6_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ 21747b77f048SAleksandar Markovic uint32_t fst1) \ 21757b77f048SAleksandar Markovic { \ 21767b77f048SAleksandar Markovic uint64_t c; \ 21777b77f048SAleksandar Markovic c = cond; \ 21787b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \ 21797b77f048SAleksandar Markovic if (c) { \ 21807b77f048SAleksandar Markovic return -1; \ 21817b77f048SAleksandar Markovic } else { \ 21827b77f048SAleksandar Markovic return 0; \ 21837b77f048SAleksandar Markovic } \ 21847b77f048SAleksandar Markovic } 21857b77f048SAleksandar Markovic 21867b77f048SAleksandar Markovic /* 21877b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 21887b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called. 21897b77f048SAleksandar Markovic */ 21907b77f048SAleksandar Markovic FOP_CONDN_S(af, (float32_unordered_quiet(fst1, fst0, 21917b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 21927b77f048SAleksandar Markovic FOP_CONDN_S(un, (float32_unordered_quiet(fst1, fst0, 21937b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21947b77f048SAleksandar Markovic FOP_CONDN_S(eq, (float32_eq_quiet(fst0, fst1, 21957b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 21967b77f048SAleksandar Markovic FOP_CONDN_S(ueq, (float32_unordered_quiet(fst1, fst0, 21977b77f048SAleksandar Markovic &env->active_fpu.fp_status) 21987b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1, 21997b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22007b77f048SAleksandar Markovic FOP_CONDN_S(lt, (float32_lt_quiet(fst0, fst1, 22017b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22027b77f048SAleksandar Markovic FOP_CONDN_S(ult, (float32_unordered_quiet(fst1, fst0, 22037b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22047b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 22057b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22067b77f048SAleksandar Markovic FOP_CONDN_S(le, (float32_le_quiet(fst0, fst1, 22077b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22087b77f048SAleksandar Markovic FOP_CONDN_S(ule, (float32_unordered_quiet(fst1, fst0, 22097b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22107b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 22117b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22127b77f048SAleksandar Markovic /* 22137b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false, 22147b77f048SAleksandar Markovic * but float32_unordered() is still called. 22157b77f048SAleksandar Markovic */ 22167b77f048SAleksandar Markovic FOP_CONDN_S(saf, (float32_unordered(fst1, fst0, 22177b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0)) 22187b77f048SAleksandar Markovic FOP_CONDN_S(sun, (float32_unordered(fst1, fst0, 22197b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22207b77f048SAleksandar Markovic FOP_CONDN_S(seq, (float32_eq(fst0, fst1, 22217b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22227b77f048SAleksandar Markovic FOP_CONDN_S(sueq, (float32_unordered(fst1, fst0, 22237b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22247b77f048SAleksandar Markovic || float32_eq(fst0, fst1, 22257b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22267b77f048SAleksandar Markovic FOP_CONDN_S(slt, (float32_lt(fst0, fst1, 22277b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22287b77f048SAleksandar Markovic FOP_CONDN_S(sult, (float32_unordered(fst1, fst0, 22297b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22307b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 22317b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22327b77f048SAleksandar Markovic FOP_CONDN_S(sle, (float32_le(fst0, fst1, 22337b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22347b77f048SAleksandar Markovic FOP_CONDN_S(sule, (float32_unordered(fst1, fst0, 22357b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22367b77f048SAleksandar Markovic || float32_le(fst0, fst1, 22377b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22387b77f048SAleksandar Markovic FOP_CONDN_S(or, (float32_le_quiet(fst1, fst0, 22397b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22407b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1, 22417b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22427b77f048SAleksandar Markovic FOP_CONDN_S(une, (float32_unordered_quiet(fst1, fst0, 22437b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22447b77f048SAleksandar Markovic || float32_lt_quiet(fst1, fst0, 22457b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22467b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 22477b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22487b77f048SAleksandar Markovic FOP_CONDN_S(ne, (float32_lt_quiet(fst1, fst0, 22497b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22507b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1, 22517b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22527b77f048SAleksandar Markovic FOP_CONDN_S(sor, (float32_le(fst1, fst0, 22537b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22547b77f048SAleksandar Markovic || float32_le(fst0, fst1, 22557b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22567b77f048SAleksandar Markovic FOP_CONDN_S(sune, (float32_unordered(fst1, fst0, 22577b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22587b77f048SAleksandar Markovic || float32_lt(fst1, fst0, 22597b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22607b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 22617b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 22627b77f048SAleksandar Markovic FOP_CONDN_S(sne, (float32_lt(fst1, fst0, 22637b77f048SAleksandar Markovic &env->active_fpu.fp_status) 22647b77f048SAleksandar Markovic || float32_lt(fst0, fst1, 22657b77f048SAleksandar Markovic &env->active_fpu.fp_status))) 2266