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
1189975214SChetan Pant * version 2.1 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 "cpu.h"
257b77f048SAleksandar Markovic #include "internal.h"
267b77f048SAleksandar Markovic #include "exec/helper-proto.h"
277b77f048SAleksandar Markovic #include "fpu/softfloat.h"
28*81ddae7cSPhilippe Mathieu-Daudé #include "fpu_helper.h"
297b77f048SAleksandar Markovic
307b77f048SAleksandar Markovic
317b77f048SAleksandar Markovic /* Complex FPU operations which may need stack space. */
327b77f048SAleksandar Markovic
337b77f048SAleksandar Markovic #define FLOAT_TWO32 make_float32(1 << 30)
347b77f048SAleksandar Markovic #define FLOAT_TWO64 make_float64(1ULL << 62)
357b77f048SAleksandar Markovic
367b77f048SAleksandar Markovic #define FP_TO_INT32_OVERFLOW 0x7fffffff
377b77f048SAleksandar Markovic #define FP_TO_INT64_OVERFLOW 0x7fffffffffffffffULL
387b77f048SAleksandar Markovic
helper_cfc1(CPUMIPSState * env,uint32_t reg)397b77f048SAleksandar Markovic target_ulong helper_cfc1(CPUMIPSState *env, uint32_t reg)
407b77f048SAleksandar Markovic {
417b77f048SAleksandar Markovic target_ulong arg1 = 0;
427b77f048SAleksandar Markovic
437b77f048SAleksandar Markovic switch (reg) {
447b77f048SAleksandar Markovic case 0:
457b77f048SAleksandar Markovic arg1 = (int32_t)env->active_fpu.fcr0;
467b77f048SAleksandar Markovic break;
477b77f048SAleksandar Markovic case 1:
487b77f048SAleksandar Markovic /* UFR Support - Read Status FR */
497b77f048SAleksandar Markovic if (env->active_fpu.fcr0 & (1 << FCR0_UFRP)) {
507b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFR)) {
517b77f048SAleksandar Markovic arg1 = (int32_t)
527b77f048SAleksandar Markovic ((env->CP0_Status & (1 << CP0St_FR)) >> CP0St_FR);
537b77f048SAleksandar Markovic } else {
547b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC());
557b77f048SAleksandar Markovic }
567b77f048SAleksandar Markovic }
577b77f048SAleksandar Markovic break;
587b77f048SAleksandar Markovic case 5:
597b77f048SAleksandar Markovic /* FRE Support - read Config5.FRE bit */
607b77f048SAleksandar Markovic if (env->active_fpu.fcr0 & (1 << FCR0_FREP)) {
617b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFE)) {
627b77f048SAleksandar Markovic arg1 = (env->CP0_Config5 >> CP0C5_FRE) & 1;
637b77f048SAleksandar Markovic } else {
647b77f048SAleksandar Markovic helper_raise_exception(env, EXCP_RI);
657b77f048SAleksandar Markovic }
667b77f048SAleksandar Markovic }
677b77f048SAleksandar Markovic break;
687b77f048SAleksandar Markovic case 25:
697b77f048SAleksandar Markovic arg1 = ((env->active_fpu.fcr31 >> 24) & 0xfe) |
707b77f048SAleksandar Markovic ((env->active_fpu.fcr31 >> 23) & 0x1);
717b77f048SAleksandar Markovic break;
727b77f048SAleksandar Markovic case 26:
737b77f048SAleksandar Markovic arg1 = env->active_fpu.fcr31 & 0x0003f07c;
747b77f048SAleksandar Markovic break;
757b77f048SAleksandar Markovic case 28:
767b77f048SAleksandar Markovic arg1 = (env->active_fpu.fcr31 & 0x00000f83) |
777b77f048SAleksandar Markovic ((env->active_fpu.fcr31 >> 22) & 0x4);
787b77f048SAleksandar Markovic break;
797b77f048SAleksandar Markovic default:
807b77f048SAleksandar Markovic arg1 = (int32_t)env->active_fpu.fcr31;
817b77f048SAleksandar Markovic break;
827b77f048SAleksandar Markovic }
837b77f048SAleksandar Markovic
847b77f048SAleksandar Markovic return arg1;
857b77f048SAleksandar Markovic }
867b77f048SAleksandar Markovic
helper_ctc1(CPUMIPSState * env,target_ulong arg1,uint32_t fs,uint32_t rt)877b77f048SAleksandar Markovic void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t fs, uint32_t rt)
887b77f048SAleksandar Markovic {
897b77f048SAleksandar Markovic switch (fs) {
907b77f048SAleksandar Markovic case 1:
917b77f048SAleksandar Markovic /* UFR Alias - Reset Status FR */
927b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_UFRP)) && (rt == 0))) {
937b77f048SAleksandar Markovic return;
947b77f048SAleksandar Markovic }
957b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFR)) {
967b77f048SAleksandar Markovic env->CP0_Status &= ~(1 << CP0St_FR);
977b77f048SAleksandar Markovic compute_hflags(env);
987b77f048SAleksandar Markovic } else {
997b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC());
1007b77f048SAleksandar Markovic }
1017b77f048SAleksandar Markovic break;
1027b77f048SAleksandar Markovic case 4:
1037b77f048SAleksandar Markovic /* UNFR Alias - Set Status FR */
1047b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_UFRP)) && (rt == 0))) {
1057b77f048SAleksandar Markovic return;
1067b77f048SAleksandar Markovic }
1077b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFR)) {
1087b77f048SAleksandar Markovic env->CP0_Status |= (1 << CP0St_FR);
1097b77f048SAleksandar Markovic compute_hflags(env);
1107b77f048SAleksandar Markovic } else {
1117b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC());
1127b77f048SAleksandar Markovic }
1137b77f048SAleksandar Markovic break;
1147b77f048SAleksandar Markovic case 5:
1157b77f048SAleksandar Markovic /* FRE Support - clear Config5.FRE bit */
1167b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_FREP)) && (rt == 0))) {
1177b77f048SAleksandar Markovic return;
1187b77f048SAleksandar Markovic }
1197b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFE)) {
1207b77f048SAleksandar Markovic env->CP0_Config5 &= ~(1 << CP0C5_FRE);
1217b77f048SAleksandar Markovic compute_hflags(env);
1227b77f048SAleksandar Markovic } else {
1237b77f048SAleksandar Markovic helper_raise_exception(env, EXCP_RI);
1247b77f048SAleksandar Markovic }
1257b77f048SAleksandar Markovic break;
1267b77f048SAleksandar Markovic case 6:
1277b77f048SAleksandar Markovic /* FRE Support - set Config5.FRE bit */
1287b77f048SAleksandar Markovic if (!((env->active_fpu.fcr0 & (1 << FCR0_FREP)) && (rt == 0))) {
1297b77f048SAleksandar Markovic return;
1307b77f048SAleksandar Markovic }
1317b77f048SAleksandar Markovic if (env->CP0_Config5 & (1 << CP0C5_UFE)) {
1327b77f048SAleksandar Markovic env->CP0_Config5 |= (1 << CP0C5_FRE);
1337b77f048SAleksandar Markovic compute_hflags(env);
1347b77f048SAleksandar Markovic } else {
1357b77f048SAleksandar Markovic helper_raise_exception(env, EXCP_RI);
1367b77f048SAleksandar Markovic }
1377b77f048SAleksandar Markovic break;
1387b77f048SAleksandar Markovic case 25:
1392e211e0aSPhilippe Mathieu-Daudé if ((env->insn_flags & ISA_MIPS_R6) || (arg1 & 0xffffff00)) {
1407b77f048SAleksandar Markovic return;
1417b77f048SAleksandar Markovic }
1427b77f048SAleksandar Markovic env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0x017fffff) |
1437b77f048SAleksandar Markovic ((arg1 & 0xfe) << 24) |
1447b77f048SAleksandar Markovic ((arg1 & 0x1) << 23);
1457b77f048SAleksandar Markovic break;
1467b77f048SAleksandar Markovic case 26:
1477b77f048SAleksandar Markovic if (arg1 & 0x007c0000) {
1487b77f048SAleksandar Markovic return;
1497b77f048SAleksandar Markovic }
1507b77f048SAleksandar Markovic env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfffc0f83) |
1517b77f048SAleksandar Markovic (arg1 & 0x0003f07c);
1527b77f048SAleksandar Markovic break;
1537b77f048SAleksandar Markovic case 28:
1547b77f048SAleksandar Markovic if (arg1 & 0x007c0000) {
1557b77f048SAleksandar Markovic return;
1567b77f048SAleksandar Markovic }
1577b77f048SAleksandar Markovic env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfefff07c) |
1587b77f048SAleksandar Markovic (arg1 & 0x00000f83) |
1597b77f048SAleksandar Markovic ((arg1 & 0x4) << 22);
1607b77f048SAleksandar Markovic break;
1617b77f048SAleksandar Markovic case 31:
1627b77f048SAleksandar Markovic env->active_fpu.fcr31 = (arg1 & env->active_fpu.fcr31_rw_bitmask) |
1637b77f048SAleksandar Markovic (env->active_fpu.fcr31 & ~(env->active_fpu.fcr31_rw_bitmask));
1647b77f048SAleksandar Markovic break;
1657b77f048SAleksandar Markovic default:
1662e211e0aSPhilippe Mathieu-Daudé if (env->insn_flags & ISA_MIPS_R6) {
1677b77f048SAleksandar Markovic do_raise_exception(env, EXCP_RI, GETPC());
1687b77f048SAleksandar Markovic }
1697b77f048SAleksandar Markovic return;
1707b77f048SAleksandar Markovic }
1717b77f048SAleksandar Markovic restore_fp_status(env);
1727b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status);
1737b77f048SAleksandar Markovic if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) &
1747b77f048SAleksandar Markovic GET_FP_CAUSE(env->active_fpu.fcr31)) {
1757b77f048SAleksandar Markovic do_raise_exception(env, EXCP_FPE, GETPC());
1767b77f048SAleksandar Markovic }
1777b77f048SAleksandar Markovic }
1787b77f048SAleksandar Markovic
ieee_to_mips_xcpt(int ieee_xcpt)1799579f781SAleksandar Markovic static inline int ieee_to_mips_xcpt(int ieee_xcpt)
1807b77f048SAleksandar Markovic {
1819579f781SAleksandar Markovic int mips_xcpt = 0;
1829579f781SAleksandar Markovic
1839579f781SAleksandar Markovic if (ieee_xcpt & float_flag_invalid) {
1849579f781SAleksandar Markovic mips_xcpt |= FP_INVALID;
1857b77f048SAleksandar Markovic }
1869579f781SAleksandar Markovic if (ieee_xcpt & float_flag_overflow) {
1879579f781SAleksandar Markovic mips_xcpt |= FP_OVERFLOW;
1887b77f048SAleksandar Markovic }
1899579f781SAleksandar Markovic if (ieee_xcpt & float_flag_underflow) {
1909579f781SAleksandar Markovic mips_xcpt |= FP_UNDERFLOW;
1917b77f048SAleksandar Markovic }
1929579f781SAleksandar Markovic if (ieee_xcpt & float_flag_divbyzero) {
1939579f781SAleksandar Markovic mips_xcpt |= FP_DIV0;
1947b77f048SAleksandar Markovic }
1959579f781SAleksandar Markovic if (ieee_xcpt & float_flag_inexact) {
1969579f781SAleksandar Markovic mips_xcpt |= FP_INEXACT;
1977b77f048SAleksandar Markovic }
1989579f781SAleksandar Markovic
1999579f781SAleksandar Markovic return mips_xcpt;
2007b77f048SAleksandar Markovic }
2017b77f048SAleksandar Markovic
update_fcr31(CPUMIPSState * env,uintptr_t pc)2027b77f048SAleksandar Markovic static inline void update_fcr31(CPUMIPSState *env, uintptr_t pc)
2037b77f048SAleksandar Markovic {
2049579f781SAleksandar Markovic int ieee_exception_flags = get_float_exception_flags(
2059579f781SAleksandar Markovic &env->active_fpu.fp_status);
2069579f781SAleksandar Markovic int mips_exception_flags = 0;
2077b77f048SAleksandar Markovic
2089579f781SAleksandar Markovic if (ieee_exception_flags) {
2099579f781SAleksandar Markovic mips_exception_flags = ieee_to_mips_xcpt(ieee_exception_flags);
2109579f781SAleksandar Markovic }
2117b77f048SAleksandar Markovic
2129579f781SAleksandar Markovic SET_FP_CAUSE(env->active_fpu.fcr31, mips_exception_flags);
2139579f781SAleksandar Markovic
2149579f781SAleksandar Markovic if (mips_exception_flags) {
2157b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status);
2167b77f048SAleksandar Markovic
2179579f781SAleksandar Markovic if (GET_FP_ENABLE(env->active_fpu.fcr31) & mips_exception_flags) {
2187b77f048SAleksandar Markovic do_raise_exception(env, EXCP_FPE, pc);
2197b77f048SAleksandar Markovic } else {
2209579f781SAleksandar Markovic UPDATE_FP_FLAGS(env->active_fpu.fcr31, mips_exception_flags);
2217b77f048SAleksandar Markovic }
2227b77f048SAleksandar Markovic }
2237b77f048SAleksandar Markovic }
2247b77f048SAleksandar Markovic
2257b77f048SAleksandar Markovic /*
2267b77f048SAleksandar Markovic * Float support.
2277b77f048SAleksandar Markovic * Single precition routines have a "s" suffix, double precision a
2287b77f048SAleksandar Markovic * "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps",
2297b77f048SAleksandar Markovic * paired single lower "pl", paired single upper "pu".
2307b77f048SAleksandar Markovic */
2317b77f048SAleksandar Markovic
2327b77f048SAleksandar Markovic /* unary operations, modifying fp status */
helper_float_sqrt_d(CPUMIPSState * env,uint64_t fdt0)2337b77f048SAleksandar Markovic uint64_t helper_float_sqrt_d(CPUMIPSState *env, uint64_t fdt0)
2347b77f048SAleksandar Markovic {
2357b77f048SAleksandar Markovic fdt0 = float64_sqrt(fdt0, &env->active_fpu.fp_status);
2367b77f048SAleksandar Markovic update_fcr31(env, GETPC());
2377b77f048SAleksandar Markovic return fdt0;
2387b77f048SAleksandar Markovic }
2397b77f048SAleksandar Markovic
helper_float_sqrt_s(CPUMIPSState * env,uint32_t fst0)2407b77f048SAleksandar Markovic uint32_t helper_float_sqrt_s(CPUMIPSState *env, uint32_t fst0)
2417b77f048SAleksandar Markovic {
2427b77f048SAleksandar Markovic fst0 = float32_sqrt(fst0, &env->active_fpu.fp_status);
2437b77f048SAleksandar Markovic update_fcr31(env, GETPC());
2447b77f048SAleksandar Markovic return fst0;
2457b77f048SAleksandar Markovic }
2467b77f048SAleksandar Markovic
helper_float_cvtd_s(CPUMIPSState * env,uint32_t fst0)2477b77f048SAleksandar Markovic uint64_t helper_float_cvtd_s(CPUMIPSState *env, uint32_t fst0)
2487b77f048SAleksandar Markovic {
2497b77f048SAleksandar Markovic uint64_t fdt2;
2507b77f048SAleksandar Markovic
2517b77f048SAleksandar Markovic fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status);
2527b77f048SAleksandar Markovic update_fcr31(env, GETPC());
2537b77f048SAleksandar Markovic return fdt2;
2547b77f048SAleksandar Markovic }
2557b77f048SAleksandar Markovic
helper_float_cvtd_w(CPUMIPSState * env,uint32_t wt0)2567b77f048SAleksandar Markovic uint64_t helper_float_cvtd_w(CPUMIPSState *env, uint32_t wt0)
2577b77f048SAleksandar Markovic {
2587b77f048SAleksandar Markovic uint64_t fdt2;
2597b77f048SAleksandar Markovic
2607b77f048SAleksandar Markovic fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status);
2617b77f048SAleksandar Markovic update_fcr31(env, GETPC());
2627b77f048SAleksandar Markovic return fdt2;
2637b77f048SAleksandar Markovic }
2647b77f048SAleksandar Markovic
helper_float_cvtd_l(CPUMIPSState * env,uint64_t dt0)2657b77f048SAleksandar Markovic uint64_t helper_float_cvtd_l(CPUMIPSState *env, uint64_t dt0)
2667b77f048SAleksandar Markovic {
2677b77f048SAleksandar Markovic uint64_t fdt2;
2687b77f048SAleksandar Markovic
2697b77f048SAleksandar Markovic fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status);
2707b77f048SAleksandar Markovic update_fcr31(env, GETPC());
2717b77f048SAleksandar Markovic return fdt2;
2727b77f048SAleksandar Markovic }
2737b77f048SAleksandar Markovic
helper_float_cvt_l_d(CPUMIPSState * env,uint64_t fdt0)2747b77f048SAleksandar Markovic uint64_t helper_float_cvt_l_d(CPUMIPSState *env, uint64_t fdt0)
2757b77f048SAleksandar Markovic {
2767b77f048SAleksandar Markovic uint64_t dt2;
2777b77f048SAleksandar Markovic
2787b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
2797b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
2807b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
2817b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
2827b77f048SAleksandar Markovic }
2837b77f048SAleksandar Markovic update_fcr31(env, GETPC());
2847b77f048SAleksandar Markovic return dt2;
2857b77f048SAleksandar Markovic }
2867b77f048SAleksandar Markovic
helper_float_cvt_l_s(CPUMIPSState * env,uint32_t fst0)2877b77f048SAleksandar Markovic uint64_t helper_float_cvt_l_s(CPUMIPSState *env, uint32_t fst0)
2887b77f048SAleksandar Markovic {
2897b77f048SAleksandar Markovic uint64_t dt2;
2907b77f048SAleksandar Markovic
2917b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &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
helper_float_cvtps_pw(CPUMIPSState * env,uint64_t dt0)3007b77f048SAleksandar Markovic uint64_t helper_float_cvtps_pw(CPUMIPSState *env, uint64_t dt0)
3017b77f048SAleksandar Markovic {
3027b77f048SAleksandar Markovic uint32_t fst2;
3037b77f048SAleksandar Markovic uint32_t fsth2;
3047b77f048SAleksandar Markovic
3057b77f048SAleksandar Markovic fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
3067b77f048SAleksandar Markovic fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status);
3077b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3087b77f048SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fst2;
3097b77f048SAleksandar Markovic }
3107b77f048SAleksandar Markovic
helper_float_cvtpw_ps(CPUMIPSState * env,uint64_t fdt0)3117b77f048SAleksandar Markovic uint64_t helper_float_cvtpw_ps(CPUMIPSState *env, uint64_t fdt0)
3127b77f048SAleksandar Markovic {
3137b77f048SAleksandar Markovic uint32_t wt2;
3147b77f048SAleksandar Markovic uint32_t wth2;
3157b77f048SAleksandar Markovic int excp, excph;
3167b77f048SAleksandar Markovic
3177b77f048SAleksandar Markovic wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
3187b77f048SAleksandar Markovic excp = get_float_exception_flags(&env->active_fpu.fp_status);
3197b77f048SAleksandar Markovic if (excp & (float_flag_overflow | float_flag_invalid)) {
3207b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
3217b77f048SAleksandar Markovic }
3227b77f048SAleksandar Markovic
3237b77f048SAleksandar Markovic set_float_exception_flags(0, &env->active_fpu.fp_status);
3247b77f048SAleksandar Markovic wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status);
3257b77f048SAleksandar Markovic excph = get_float_exception_flags(&env->active_fpu.fp_status);
3267b77f048SAleksandar Markovic if (excph & (float_flag_overflow | float_flag_invalid)) {
3277b77f048SAleksandar Markovic wth2 = FP_TO_INT32_OVERFLOW;
3287b77f048SAleksandar Markovic }
3297b77f048SAleksandar Markovic
3307b77f048SAleksandar Markovic set_float_exception_flags(excp | excph, &env->active_fpu.fp_status);
3317b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3327b77f048SAleksandar Markovic
3337b77f048SAleksandar Markovic return ((uint64_t)wth2 << 32) | wt2;
3347b77f048SAleksandar Markovic }
3357b77f048SAleksandar Markovic
helper_float_cvts_d(CPUMIPSState * env,uint64_t fdt0)3367b77f048SAleksandar Markovic uint32_t helper_float_cvts_d(CPUMIPSState *env, uint64_t fdt0)
3377b77f048SAleksandar Markovic {
3387b77f048SAleksandar Markovic uint32_t fst2;
3397b77f048SAleksandar Markovic
3407b77f048SAleksandar Markovic fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status);
3417b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3427b77f048SAleksandar Markovic return fst2;
3437b77f048SAleksandar Markovic }
3447b77f048SAleksandar Markovic
helper_float_cvts_w(CPUMIPSState * env,uint32_t wt0)3457b77f048SAleksandar Markovic uint32_t helper_float_cvts_w(CPUMIPSState *env, uint32_t wt0)
3467b77f048SAleksandar Markovic {
3477b77f048SAleksandar Markovic uint32_t fst2;
3487b77f048SAleksandar Markovic
3497b77f048SAleksandar Markovic fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status);
3507b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3517b77f048SAleksandar Markovic return fst2;
3527b77f048SAleksandar Markovic }
3537b77f048SAleksandar Markovic
helper_float_cvts_l(CPUMIPSState * env,uint64_t dt0)3547b77f048SAleksandar Markovic uint32_t helper_float_cvts_l(CPUMIPSState *env, uint64_t dt0)
3557b77f048SAleksandar Markovic {
3567b77f048SAleksandar Markovic uint32_t fst2;
3577b77f048SAleksandar Markovic
3587b77f048SAleksandar Markovic fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status);
3597b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3607b77f048SAleksandar Markovic return fst2;
3617b77f048SAleksandar Markovic }
3627b77f048SAleksandar Markovic
helper_float_cvts_pl(CPUMIPSState * env,uint32_t wt0)3637b77f048SAleksandar Markovic uint32_t helper_float_cvts_pl(CPUMIPSState *env, uint32_t wt0)
3647b77f048SAleksandar Markovic {
3657b77f048SAleksandar Markovic uint32_t wt2;
3667b77f048SAleksandar Markovic
3677b77f048SAleksandar Markovic wt2 = wt0;
3687b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3697b77f048SAleksandar Markovic return wt2;
3707b77f048SAleksandar Markovic }
3717b77f048SAleksandar Markovic
helper_float_cvts_pu(CPUMIPSState * env,uint32_t wth0)3727b77f048SAleksandar Markovic uint32_t helper_float_cvts_pu(CPUMIPSState *env, uint32_t wth0)
3737b77f048SAleksandar Markovic {
3747b77f048SAleksandar Markovic uint32_t wt2;
3757b77f048SAleksandar Markovic
3767b77f048SAleksandar Markovic wt2 = wth0;
3777b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3787b77f048SAleksandar Markovic return wt2;
3797b77f048SAleksandar Markovic }
3807b77f048SAleksandar Markovic
helper_float_cvt_w_s(CPUMIPSState * env,uint32_t fst0)3817b77f048SAleksandar Markovic uint32_t helper_float_cvt_w_s(CPUMIPSState *env, uint32_t fst0)
3827b77f048SAleksandar Markovic {
3837b77f048SAleksandar Markovic uint32_t wt2;
3847b77f048SAleksandar Markovic
3857b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
3867b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
3877b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
3887b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
3897b77f048SAleksandar Markovic }
3907b77f048SAleksandar Markovic update_fcr31(env, GETPC());
3917b77f048SAleksandar Markovic return wt2;
3927b77f048SAleksandar Markovic }
3937b77f048SAleksandar Markovic
helper_float_cvt_w_d(CPUMIPSState * env,uint64_t fdt0)3947b77f048SAleksandar Markovic uint32_t helper_float_cvt_w_d(CPUMIPSState *env, uint64_t fdt0)
3957b77f048SAleksandar Markovic {
3967b77f048SAleksandar Markovic uint32_t wt2;
3977b77f048SAleksandar Markovic
3987b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &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
helper_float_round_l_d(CPUMIPSState * env,uint64_t fdt0)4077b77f048SAleksandar Markovic uint64_t helper_float_round_l_d(CPUMIPSState *env, uint64_t fdt0)
4087b77f048SAleksandar Markovic {
4097b77f048SAleksandar Markovic uint64_t dt2;
4107b77f048SAleksandar Markovic
4117b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
4127b77f048SAleksandar Markovic &env->active_fpu.fp_status);
4137b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
4147b77f048SAleksandar Markovic restore_rounding_mode(env);
4157b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
4167b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
4177b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
4187b77f048SAleksandar Markovic }
4197b77f048SAleksandar Markovic update_fcr31(env, GETPC());
4207b77f048SAleksandar Markovic return dt2;
4217b77f048SAleksandar Markovic }
4227b77f048SAleksandar Markovic
helper_float_round_l_s(CPUMIPSState * env,uint32_t fst0)4237b77f048SAleksandar Markovic uint64_t helper_float_round_l_s(CPUMIPSState *env, uint32_t fst0)
4247b77f048SAleksandar Markovic {
4257b77f048SAleksandar Markovic uint64_t dt2;
4267b77f048SAleksandar Markovic
4277b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
4287b77f048SAleksandar Markovic &env->active_fpu.fp_status);
4297b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
4307b77f048SAleksandar Markovic restore_rounding_mode(env);
4317b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
4327b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
4337b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
4347b77f048SAleksandar Markovic }
4357b77f048SAleksandar Markovic update_fcr31(env, GETPC());
4367b77f048SAleksandar Markovic return dt2;
4377b77f048SAleksandar Markovic }
4387b77f048SAleksandar Markovic
helper_float_round_w_d(CPUMIPSState * env,uint64_t fdt0)4397b77f048SAleksandar Markovic uint32_t helper_float_round_w_d(CPUMIPSState *env, uint64_t fdt0)
4407b77f048SAleksandar Markovic {
4417b77f048SAleksandar Markovic uint32_t wt2;
4427b77f048SAleksandar Markovic
4437b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
4447b77f048SAleksandar Markovic &env->active_fpu.fp_status);
4457b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
4467b77f048SAleksandar Markovic restore_rounding_mode(env);
4477b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
4487b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
4497b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
4507b77f048SAleksandar Markovic }
4517b77f048SAleksandar Markovic update_fcr31(env, GETPC());
4527b77f048SAleksandar Markovic return wt2;
4537b77f048SAleksandar Markovic }
4547b77f048SAleksandar Markovic
helper_float_round_w_s(CPUMIPSState * env,uint32_t fst0)4557b77f048SAleksandar Markovic uint32_t helper_float_round_w_s(CPUMIPSState *env, uint32_t fst0)
4567b77f048SAleksandar Markovic {
4577b77f048SAleksandar Markovic uint32_t wt2;
4587b77f048SAleksandar Markovic
4597b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
4607b77f048SAleksandar Markovic &env->active_fpu.fp_status);
4617b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
4627b77f048SAleksandar Markovic restore_rounding_mode(env);
4637b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
4647b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
4657b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
4667b77f048SAleksandar Markovic }
4677b77f048SAleksandar Markovic update_fcr31(env, GETPC());
4687b77f048SAleksandar Markovic return wt2;
4697b77f048SAleksandar Markovic }
4707b77f048SAleksandar Markovic
helper_float_trunc_l_d(CPUMIPSState * env,uint64_t fdt0)4717b77f048SAleksandar Markovic uint64_t helper_float_trunc_l_d(CPUMIPSState *env, uint64_t fdt0)
4727b77f048SAleksandar Markovic {
4737b77f048SAleksandar Markovic uint64_t dt2;
4747b77f048SAleksandar Markovic
4757b77f048SAleksandar Markovic dt2 = float64_to_int64_round_to_zero(fdt0,
4767b77f048SAleksandar Markovic &env->active_fpu.fp_status);
4777b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
4787b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
4797b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
4807b77f048SAleksandar Markovic }
4817b77f048SAleksandar Markovic update_fcr31(env, GETPC());
4827b77f048SAleksandar Markovic return dt2;
4837b77f048SAleksandar Markovic }
4847b77f048SAleksandar Markovic
helper_float_trunc_l_s(CPUMIPSState * env,uint32_t fst0)4857b77f048SAleksandar Markovic uint64_t helper_float_trunc_l_s(CPUMIPSState *env, uint32_t fst0)
4867b77f048SAleksandar Markovic {
4877b77f048SAleksandar Markovic uint64_t dt2;
4887b77f048SAleksandar Markovic
4897b77f048SAleksandar Markovic dt2 = float32_to_int64_round_to_zero(fst0, &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
helper_float_trunc_w_d(CPUMIPSState * env,uint64_t fdt0)4987b77f048SAleksandar Markovic uint32_t helper_float_trunc_w_d(CPUMIPSState *env, uint64_t fdt0)
4997b77f048SAleksandar Markovic {
5007b77f048SAleksandar Markovic uint32_t wt2;
5017b77f048SAleksandar Markovic
5027b77f048SAleksandar Markovic wt2 = float64_to_int32_round_to_zero(fdt0, &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 wt2 = FP_TO_INT32_OVERFLOW;
5067b77f048SAleksandar Markovic }
5077b77f048SAleksandar Markovic update_fcr31(env, GETPC());
5087b77f048SAleksandar Markovic return wt2;
5097b77f048SAleksandar Markovic }
5107b77f048SAleksandar Markovic
helper_float_trunc_w_s(CPUMIPSState * env,uint32_t fst0)5117b77f048SAleksandar Markovic uint32_t helper_float_trunc_w_s(CPUMIPSState *env, uint32_t fst0)
5127b77f048SAleksandar Markovic {
5137b77f048SAleksandar Markovic uint32_t wt2;
5147b77f048SAleksandar Markovic
5157b77f048SAleksandar Markovic wt2 = float32_to_int32_round_to_zero(fst0, &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
helper_float_ceil_l_d(CPUMIPSState * env,uint64_t fdt0)5247b77f048SAleksandar Markovic uint64_t helper_float_ceil_l_d(CPUMIPSState *env, uint64_t fdt0)
5257b77f048SAleksandar Markovic {
5267b77f048SAleksandar Markovic uint64_t dt2;
5277b77f048SAleksandar Markovic
5287b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
5297b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
5307b77f048SAleksandar Markovic restore_rounding_mode(env);
5317b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
5327b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
5337b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
5347b77f048SAleksandar Markovic }
5357b77f048SAleksandar Markovic update_fcr31(env, GETPC());
5367b77f048SAleksandar Markovic return dt2;
5377b77f048SAleksandar Markovic }
5387b77f048SAleksandar Markovic
helper_float_ceil_l_s(CPUMIPSState * env,uint32_t fst0)5397b77f048SAleksandar Markovic uint64_t helper_float_ceil_l_s(CPUMIPSState *env, uint32_t fst0)
5407b77f048SAleksandar Markovic {
5417b77f048SAleksandar Markovic uint64_t dt2;
5427b77f048SAleksandar Markovic
5437b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
5447b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
5457b77f048SAleksandar Markovic restore_rounding_mode(env);
5467b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
5477b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
5487b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
5497b77f048SAleksandar Markovic }
5507b77f048SAleksandar Markovic update_fcr31(env, GETPC());
5517b77f048SAleksandar Markovic return dt2;
5527b77f048SAleksandar Markovic }
5537b77f048SAleksandar Markovic
helper_float_ceil_w_d(CPUMIPSState * env,uint64_t fdt0)5547b77f048SAleksandar Markovic uint32_t helper_float_ceil_w_d(CPUMIPSState *env, uint64_t fdt0)
5557b77f048SAleksandar Markovic {
5567b77f048SAleksandar Markovic uint32_t wt2;
5577b77f048SAleksandar Markovic
5587b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
5597b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
5607b77f048SAleksandar Markovic restore_rounding_mode(env);
5617b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
5627b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
5637b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
5647b77f048SAleksandar Markovic }
5657b77f048SAleksandar Markovic update_fcr31(env, GETPC());
5667b77f048SAleksandar Markovic return wt2;
5677b77f048SAleksandar Markovic }
5687b77f048SAleksandar Markovic
helper_float_ceil_w_s(CPUMIPSState * env,uint32_t fst0)5697b77f048SAleksandar Markovic uint32_t helper_float_ceil_w_s(CPUMIPSState *env, uint32_t fst0)
5707b77f048SAleksandar Markovic {
5717b77f048SAleksandar Markovic uint32_t wt2;
5727b77f048SAleksandar Markovic
5737b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
5747b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
5757b77f048SAleksandar Markovic restore_rounding_mode(env);
5767b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
5777b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
5787b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
5797b77f048SAleksandar Markovic }
5807b77f048SAleksandar Markovic update_fcr31(env, GETPC());
5817b77f048SAleksandar Markovic return wt2;
5827b77f048SAleksandar Markovic }
5837b77f048SAleksandar Markovic
helper_float_floor_l_d(CPUMIPSState * env,uint64_t fdt0)5847b77f048SAleksandar Markovic uint64_t helper_float_floor_l_d(CPUMIPSState *env, uint64_t fdt0)
5857b77f048SAleksandar Markovic {
5867b77f048SAleksandar Markovic uint64_t dt2;
5877b77f048SAleksandar Markovic
5887b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
5897b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
5907b77f048SAleksandar Markovic restore_rounding_mode(env);
5917b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
5927b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
5937b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
5947b77f048SAleksandar Markovic }
5957b77f048SAleksandar Markovic update_fcr31(env, GETPC());
5967b77f048SAleksandar Markovic return dt2;
5977b77f048SAleksandar Markovic }
5987b77f048SAleksandar Markovic
helper_float_floor_l_s(CPUMIPSState * env,uint32_t fst0)5997b77f048SAleksandar Markovic uint64_t helper_float_floor_l_s(CPUMIPSState *env, uint32_t fst0)
6007b77f048SAleksandar Markovic {
6017b77f048SAleksandar Markovic uint64_t dt2;
6027b77f048SAleksandar Markovic
6037b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
6047b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
6057b77f048SAleksandar Markovic restore_rounding_mode(env);
6067b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6077b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
6087b77f048SAleksandar Markovic dt2 = FP_TO_INT64_OVERFLOW;
6097b77f048SAleksandar Markovic }
6107b77f048SAleksandar Markovic update_fcr31(env, GETPC());
6117b77f048SAleksandar Markovic return dt2;
6127b77f048SAleksandar Markovic }
6137b77f048SAleksandar Markovic
helper_float_floor_w_d(CPUMIPSState * env,uint64_t fdt0)6147b77f048SAleksandar Markovic uint32_t helper_float_floor_w_d(CPUMIPSState *env, uint64_t fdt0)
6157b77f048SAleksandar Markovic {
6167b77f048SAleksandar Markovic uint32_t wt2;
6177b77f048SAleksandar Markovic
6187b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
6197b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
6207b77f048SAleksandar Markovic restore_rounding_mode(env);
6217b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6227b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
6237b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
6247b77f048SAleksandar Markovic }
6257b77f048SAleksandar Markovic update_fcr31(env, GETPC());
6267b77f048SAleksandar Markovic return wt2;
6277b77f048SAleksandar Markovic }
6287b77f048SAleksandar Markovic
helper_float_floor_w_s(CPUMIPSState * env,uint32_t fst0)6297b77f048SAleksandar Markovic uint32_t helper_float_floor_w_s(CPUMIPSState *env, uint32_t fst0)
6307b77f048SAleksandar Markovic {
6317b77f048SAleksandar Markovic uint32_t wt2;
6327b77f048SAleksandar Markovic
6337b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
6347b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
6357b77f048SAleksandar Markovic restore_rounding_mode(env);
6367b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6377b77f048SAleksandar Markovic & (float_flag_invalid | float_flag_overflow)) {
6387b77f048SAleksandar Markovic wt2 = FP_TO_INT32_OVERFLOW;
6397b77f048SAleksandar Markovic }
6407b77f048SAleksandar Markovic update_fcr31(env, GETPC());
6417b77f048SAleksandar Markovic return wt2;
6427b77f048SAleksandar Markovic }
6437b77f048SAleksandar Markovic
helper_float_cvt_2008_l_d(CPUMIPSState * env,uint64_t fdt0)6447b77f048SAleksandar Markovic uint64_t helper_float_cvt_2008_l_d(CPUMIPSState *env, uint64_t fdt0)
6457b77f048SAleksandar Markovic {
6467b77f048SAleksandar Markovic uint64_t dt2;
6477b77f048SAleksandar Markovic
6487b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
6497b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6507b77f048SAleksandar Markovic & float_flag_invalid) {
6517b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
6527b77f048SAleksandar Markovic dt2 = 0;
6537b77f048SAleksandar Markovic }
6547b77f048SAleksandar Markovic }
6557b77f048SAleksandar Markovic update_fcr31(env, GETPC());
6567b77f048SAleksandar Markovic return dt2;
6577b77f048SAleksandar Markovic }
6587b77f048SAleksandar Markovic
helper_float_cvt_2008_l_s(CPUMIPSState * env,uint32_t fst0)6597b77f048SAleksandar Markovic uint64_t helper_float_cvt_2008_l_s(CPUMIPSState *env, uint32_t fst0)
6607b77f048SAleksandar Markovic {
6617b77f048SAleksandar Markovic uint64_t dt2;
6627b77f048SAleksandar Markovic
6637b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
6647b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6657b77f048SAleksandar Markovic & float_flag_invalid) {
6667b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
6677b77f048SAleksandar Markovic dt2 = 0;
6687b77f048SAleksandar Markovic }
6697b77f048SAleksandar Markovic }
6707b77f048SAleksandar Markovic update_fcr31(env, GETPC());
6717b77f048SAleksandar Markovic return dt2;
6727b77f048SAleksandar Markovic }
6737b77f048SAleksandar Markovic
helper_float_cvt_2008_w_d(CPUMIPSState * env,uint64_t fdt0)6747b77f048SAleksandar Markovic uint32_t helper_float_cvt_2008_w_d(CPUMIPSState *env, uint64_t fdt0)
6757b77f048SAleksandar Markovic {
6767b77f048SAleksandar Markovic uint32_t wt2;
6777b77f048SAleksandar Markovic
6787b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
6797b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6807b77f048SAleksandar Markovic & float_flag_invalid) {
6817b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
6827b77f048SAleksandar Markovic wt2 = 0;
6837b77f048SAleksandar Markovic }
6847b77f048SAleksandar Markovic }
6857b77f048SAleksandar Markovic update_fcr31(env, GETPC());
6867b77f048SAleksandar Markovic return wt2;
6877b77f048SAleksandar Markovic }
6887b77f048SAleksandar Markovic
helper_float_cvt_2008_w_s(CPUMIPSState * env,uint32_t fst0)6897b77f048SAleksandar Markovic uint32_t helper_float_cvt_2008_w_s(CPUMIPSState *env, uint32_t fst0)
6907b77f048SAleksandar Markovic {
6917b77f048SAleksandar Markovic uint32_t wt2;
6927b77f048SAleksandar Markovic
6937b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
6947b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
6957b77f048SAleksandar Markovic & float_flag_invalid) {
6967b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
6977b77f048SAleksandar Markovic wt2 = 0;
6987b77f048SAleksandar Markovic }
6997b77f048SAleksandar Markovic }
7007b77f048SAleksandar Markovic update_fcr31(env, GETPC());
7017b77f048SAleksandar Markovic return wt2;
7027b77f048SAleksandar Markovic }
7037b77f048SAleksandar Markovic
helper_float_round_2008_l_d(CPUMIPSState * env,uint64_t fdt0)7047b77f048SAleksandar Markovic uint64_t helper_float_round_2008_l_d(CPUMIPSState *env, uint64_t fdt0)
7057b77f048SAleksandar Markovic {
7067b77f048SAleksandar Markovic uint64_t dt2;
7077b77f048SAleksandar Markovic
7087b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
7097b77f048SAleksandar Markovic &env->active_fpu.fp_status);
7107b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
7117b77f048SAleksandar Markovic restore_rounding_mode(env);
7127b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
7137b77f048SAleksandar Markovic & float_flag_invalid) {
7147b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
7157b77f048SAleksandar Markovic dt2 = 0;
7167b77f048SAleksandar Markovic }
7177b77f048SAleksandar Markovic }
7187b77f048SAleksandar Markovic update_fcr31(env, GETPC());
7197b77f048SAleksandar Markovic return dt2;
7207b77f048SAleksandar Markovic }
7217b77f048SAleksandar Markovic
helper_float_round_2008_l_s(CPUMIPSState * env,uint32_t fst0)7227b77f048SAleksandar Markovic uint64_t helper_float_round_2008_l_s(CPUMIPSState *env, uint32_t fst0)
7237b77f048SAleksandar Markovic {
7247b77f048SAleksandar Markovic uint64_t dt2;
7257b77f048SAleksandar Markovic
7267b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
7277b77f048SAleksandar Markovic &env->active_fpu.fp_status);
7287b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
7297b77f048SAleksandar Markovic restore_rounding_mode(env);
7307b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
7317b77f048SAleksandar Markovic & float_flag_invalid) {
7327b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
7337b77f048SAleksandar Markovic dt2 = 0;
7347b77f048SAleksandar Markovic }
7357b77f048SAleksandar Markovic }
7367b77f048SAleksandar Markovic update_fcr31(env, GETPC());
7377b77f048SAleksandar Markovic return dt2;
7387b77f048SAleksandar Markovic }
7397b77f048SAleksandar Markovic
helper_float_round_2008_w_d(CPUMIPSState * env,uint64_t fdt0)7407b77f048SAleksandar Markovic uint32_t helper_float_round_2008_w_d(CPUMIPSState *env, uint64_t fdt0)
7417b77f048SAleksandar Markovic {
7427b77f048SAleksandar Markovic uint32_t wt2;
7437b77f048SAleksandar Markovic
7447b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
7457b77f048SAleksandar Markovic &env->active_fpu.fp_status);
7467b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
7477b77f048SAleksandar Markovic restore_rounding_mode(env);
7487b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
7497b77f048SAleksandar Markovic & float_flag_invalid) {
7507b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
7517b77f048SAleksandar Markovic wt2 = 0;
7527b77f048SAleksandar Markovic }
7537b77f048SAleksandar Markovic }
7547b77f048SAleksandar Markovic update_fcr31(env, GETPC());
7557b77f048SAleksandar Markovic return wt2;
7567b77f048SAleksandar Markovic }
7577b77f048SAleksandar Markovic
helper_float_round_2008_w_s(CPUMIPSState * env,uint32_t fst0)7587b77f048SAleksandar Markovic uint32_t helper_float_round_2008_w_s(CPUMIPSState *env, uint32_t fst0)
7597b77f048SAleksandar Markovic {
7607b77f048SAleksandar Markovic uint32_t wt2;
7617b77f048SAleksandar Markovic
7627b77f048SAleksandar Markovic set_float_rounding_mode(float_round_nearest_even,
7637b77f048SAleksandar Markovic &env->active_fpu.fp_status);
7647b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
7657b77f048SAleksandar Markovic restore_rounding_mode(env);
7667b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
7677b77f048SAleksandar Markovic & float_flag_invalid) {
7687b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
7697b77f048SAleksandar Markovic wt2 = 0;
7707b77f048SAleksandar Markovic }
7717b77f048SAleksandar Markovic }
7727b77f048SAleksandar Markovic update_fcr31(env, GETPC());
7737b77f048SAleksandar Markovic return wt2;
7747b77f048SAleksandar Markovic }
7757b77f048SAleksandar Markovic
helper_float_trunc_2008_l_d(CPUMIPSState * env,uint64_t fdt0)7767b77f048SAleksandar Markovic uint64_t helper_float_trunc_2008_l_d(CPUMIPSState *env, uint64_t fdt0)
7777b77f048SAleksandar Markovic {
7787b77f048SAleksandar Markovic uint64_t dt2;
7797b77f048SAleksandar Markovic
7807b77f048SAleksandar Markovic dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status);
7817b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
7827b77f048SAleksandar Markovic & float_flag_invalid) {
7837b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
7847b77f048SAleksandar Markovic dt2 = 0;
7857b77f048SAleksandar Markovic }
7867b77f048SAleksandar Markovic }
7877b77f048SAleksandar Markovic update_fcr31(env, GETPC());
7887b77f048SAleksandar Markovic return dt2;
7897b77f048SAleksandar Markovic }
7907b77f048SAleksandar Markovic
helper_float_trunc_2008_l_s(CPUMIPSState * env,uint32_t fst0)7917b77f048SAleksandar Markovic uint64_t helper_float_trunc_2008_l_s(CPUMIPSState *env, uint32_t fst0)
7927b77f048SAleksandar Markovic {
7937b77f048SAleksandar Markovic uint64_t dt2;
7947b77f048SAleksandar Markovic
7957b77f048SAleksandar Markovic dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status);
7967b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
7977b77f048SAleksandar Markovic & float_flag_invalid) {
7987b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
7997b77f048SAleksandar Markovic dt2 = 0;
8007b77f048SAleksandar Markovic }
8017b77f048SAleksandar Markovic }
8027b77f048SAleksandar Markovic update_fcr31(env, GETPC());
8037b77f048SAleksandar Markovic return dt2;
8047b77f048SAleksandar Markovic }
8057b77f048SAleksandar Markovic
helper_float_trunc_2008_w_d(CPUMIPSState * env,uint64_t fdt0)8067b77f048SAleksandar Markovic uint32_t helper_float_trunc_2008_w_d(CPUMIPSState *env, uint64_t fdt0)
8077b77f048SAleksandar Markovic {
8087b77f048SAleksandar Markovic uint32_t wt2;
8097b77f048SAleksandar Markovic
8107b77f048SAleksandar Markovic wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status);
8117b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
8127b77f048SAleksandar Markovic & float_flag_invalid) {
8137b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
8147b77f048SAleksandar Markovic wt2 = 0;
8157b77f048SAleksandar Markovic }
8167b77f048SAleksandar Markovic }
8177b77f048SAleksandar Markovic update_fcr31(env, GETPC());
8187b77f048SAleksandar Markovic return wt2;
8197b77f048SAleksandar Markovic }
8207b77f048SAleksandar Markovic
helper_float_trunc_2008_w_s(CPUMIPSState * env,uint32_t fst0)8217b77f048SAleksandar Markovic uint32_t helper_float_trunc_2008_w_s(CPUMIPSState *env, uint32_t fst0)
8227b77f048SAleksandar Markovic {
8237b77f048SAleksandar Markovic uint32_t wt2;
8247b77f048SAleksandar Markovic
8257b77f048SAleksandar Markovic wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status);
8267b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
8277b77f048SAleksandar Markovic & float_flag_invalid) {
8287b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
8297b77f048SAleksandar Markovic wt2 = 0;
8307b77f048SAleksandar Markovic }
8317b77f048SAleksandar Markovic }
8327b77f048SAleksandar Markovic update_fcr31(env, GETPC());
8337b77f048SAleksandar Markovic return wt2;
8347b77f048SAleksandar Markovic }
8357b77f048SAleksandar Markovic
helper_float_ceil_2008_l_d(CPUMIPSState * env,uint64_t fdt0)8367b77f048SAleksandar Markovic uint64_t helper_float_ceil_2008_l_d(CPUMIPSState *env, uint64_t fdt0)
8377b77f048SAleksandar Markovic {
8387b77f048SAleksandar Markovic uint64_t dt2;
8397b77f048SAleksandar Markovic
8407b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
8417b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
8427b77f048SAleksandar Markovic restore_rounding_mode(env);
8437b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
8447b77f048SAleksandar Markovic & float_flag_invalid) {
8457b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
8467b77f048SAleksandar Markovic dt2 = 0;
8477b77f048SAleksandar Markovic }
8487b77f048SAleksandar Markovic }
8497b77f048SAleksandar Markovic update_fcr31(env, GETPC());
8507b77f048SAleksandar Markovic return dt2;
8517b77f048SAleksandar Markovic }
8527b77f048SAleksandar Markovic
helper_float_ceil_2008_l_s(CPUMIPSState * env,uint32_t fst0)8537b77f048SAleksandar Markovic uint64_t helper_float_ceil_2008_l_s(CPUMIPSState *env, uint32_t fst0)
8547b77f048SAleksandar Markovic {
8557b77f048SAleksandar Markovic uint64_t dt2;
8567b77f048SAleksandar Markovic
8577b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
8587b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
8597b77f048SAleksandar Markovic restore_rounding_mode(env);
8607b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
8617b77f048SAleksandar Markovic & float_flag_invalid) {
8627b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
8637b77f048SAleksandar Markovic dt2 = 0;
8647b77f048SAleksandar Markovic }
8657b77f048SAleksandar Markovic }
8667b77f048SAleksandar Markovic update_fcr31(env, GETPC());
8677b77f048SAleksandar Markovic return dt2;
8687b77f048SAleksandar Markovic }
8697b77f048SAleksandar Markovic
helper_float_ceil_2008_w_d(CPUMIPSState * env,uint64_t fdt0)8707b77f048SAleksandar Markovic uint32_t helper_float_ceil_2008_w_d(CPUMIPSState *env, uint64_t fdt0)
8717b77f048SAleksandar Markovic {
8727b77f048SAleksandar Markovic uint32_t wt2;
8737b77f048SAleksandar Markovic
8747b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
8757b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
8767b77f048SAleksandar Markovic restore_rounding_mode(env);
8777b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
8787b77f048SAleksandar Markovic & float_flag_invalid) {
8797b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
8807b77f048SAleksandar Markovic wt2 = 0;
8817b77f048SAleksandar Markovic }
8827b77f048SAleksandar Markovic }
8837b77f048SAleksandar Markovic update_fcr31(env, GETPC());
8847b77f048SAleksandar Markovic return wt2;
8857b77f048SAleksandar Markovic }
8867b77f048SAleksandar Markovic
helper_float_ceil_2008_w_s(CPUMIPSState * env,uint32_t fst0)8877b77f048SAleksandar Markovic uint32_t helper_float_ceil_2008_w_s(CPUMIPSState *env, uint32_t fst0)
8887b77f048SAleksandar Markovic {
8897b77f048SAleksandar Markovic uint32_t wt2;
8907b77f048SAleksandar Markovic
8917b77f048SAleksandar Markovic set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
8927b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
8937b77f048SAleksandar Markovic restore_rounding_mode(env);
8947b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
8957b77f048SAleksandar Markovic & float_flag_invalid) {
8967b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
8977b77f048SAleksandar Markovic wt2 = 0;
8987b77f048SAleksandar Markovic }
8997b77f048SAleksandar Markovic }
9007b77f048SAleksandar Markovic update_fcr31(env, GETPC());
9017b77f048SAleksandar Markovic return wt2;
9027b77f048SAleksandar Markovic }
9037b77f048SAleksandar Markovic
helper_float_floor_2008_l_d(CPUMIPSState * env,uint64_t fdt0)9047b77f048SAleksandar Markovic uint64_t helper_float_floor_2008_l_d(CPUMIPSState *env, uint64_t fdt0)
9057b77f048SAleksandar Markovic {
9067b77f048SAleksandar Markovic uint64_t dt2;
9077b77f048SAleksandar Markovic
9087b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
9097b77f048SAleksandar Markovic dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
9107b77f048SAleksandar Markovic restore_rounding_mode(env);
9117b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
9127b77f048SAleksandar Markovic & float_flag_invalid) {
9137b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
9147b77f048SAleksandar Markovic dt2 = 0;
9157b77f048SAleksandar Markovic }
9167b77f048SAleksandar Markovic }
9177b77f048SAleksandar Markovic update_fcr31(env, GETPC());
9187b77f048SAleksandar Markovic return dt2;
9197b77f048SAleksandar Markovic }
9207b77f048SAleksandar Markovic
helper_float_floor_2008_l_s(CPUMIPSState * env,uint32_t fst0)9217b77f048SAleksandar Markovic uint64_t helper_float_floor_2008_l_s(CPUMIPSState *env, uint32_t fst0)
9227b77f048SAleksandar Markovic {
9237b77f048SAleksandar Markovic uint64_t dt2;
9247b77f048SAleksandar Markovic
9257b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
9267b77f048SAleksandar Markovic dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
9277b77f048SAleksandar Markovic restore_rounding_mode(env);
9287b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
9297b77f048SAleksandar Markovic & float_flag_invalid) {
9307b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
9317b77f048SAleksandar Markovic dt2 = 0;
9327b77f048SAleksandar Markovic }
9337b77f048SAleksandar Markovic }
9347b77f048SAleksandar Markovic update_fcr31(env, GETPC());
9357b77f048SAleksandar Markovic return dt2;
9367b77f048SAleksandar Markovic }
9377b77f048SAleksandar Markovic
helper_float_floor_2008_w_d(CPUMIPSState * env,uint64_t fdt0)9387b77f048SAleksandar Markovic uint32_t helper_float_floor_2008_w_d(CPUMIPSState *env, uint64_t fdt0)
9397b77f048SAleksandar Markovic {
9407b77f048SAleksandar Markovic uint32_t wt2;
9417b77f048SAleksandar Markovic
9427b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
9437b77f048SAleksandar Markovic wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
9447b77f048SAleksandar Markovic restore_rounding_mode(env);
9457b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
9467b77f048SAleksandar Markovic & float_flag_invalid) {
9477b77f048SAleksandar Markovic if (float64_is_any_nan(fdt0)) {
9487b77f048SAleksandar Markovic wt2 = 0;
9497b77f048SAleksandar Markovic }
9507b77f048SAleksandar Markovic }
9517b77f048SAleksandar Markovic update_fcr31(env, GETPC());
9527b77f048SAleksandar Markovic return wt2;
9537b77f048SAleksandar Markovic }
9547b77f048SAleksandar Markovic
helper_float_floor_2008_w_s(CPUMIPSState * env,uint32_t fst0)9557b77f048SAleksandar Markovic uint32_t helper_float_floor_2008_w_s(CPUMIPSState *env, uint32_t fst0)
9567b77f048SAleksandar Markovic {
9577b77f048SAleksandar Markovic uint32_t wt2;
9587b77f048SAleksandar Markovic
9597b77f048SAleksandar Markovic set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
9607b77f048SAleksandar Markovic wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
9617b77f048SAleksandar Markovic restore_rounding_mode(env);
9627b77f048SAleksandar Markovic if (get_float_exception_flags(&env->active_fpu.fp_status)
9637b77f048SAleksandar Markovic & float_flag_invalid) {
9647b77f048SAleksandar Markovic if (float32_is_any_nan(fst0)) {
9657b77f048SAleksandar Markovic wt2 = 0;
9667b77f048SAleksandar Markovic }
9677b77f048SAleksandar Markovic }
9687b77f048SAleksandar Markovic update_fcr31(env, GETPC());
9697b77f048SAleksandar Markovic return wt2;
9707b77f048SAleksandar Markovic }
9717b77f048SAleksandar Markovic
9727b77f048SAleksandar Markovic /* unary operations, not modifying fp status */
9738a6c9e0fSAleksandar Markovic
helper_float_abs_d(uint64_t fdt0)9748a6c9e0fSAleksandar Markovic uint64_t helper_float_abs_d(uint64_t fdt0)
9758a6c9e0fSAleksandar Markovic {
9768a6c9e0fSAleksandar Markovic return float64_abs(fdt0);
9777b77f048SAleksandar Markovic }
9788a6c9e0fSAleksandar Markovic
helper_float_abs_s(uint32_t fst0)9798a6c9e0fSAleksandar Markovic uint32_t helper_float_abs_s(uint32_t fst0)
9808a6c9e0fSAleksandar Markovic {
9818a6c9e0fSAleksandar Markovic return float32_abs(fst0);
9828a6c9e0fSAleksandar Markovic }
9838a6c9e0fSAleksandar Markovic
helper_float_abs_ps(uint64_t fdt0)9848a6c9e0fSAleksandar Markovic uint64_t helper_float_abs_ps(uint64_t fdt0)
9858a6c9e0fSAleksandar Markovic {
9868a6c9e0fSAleksandar Markovic uint32_t wt0;
9878a6c9e0fSAleksandar Markovic uint32_t wth0;
9888a6c9e0fSAleksandar Markovic
9898a6c9e0fSAleksandar Markovic wt0 = float32_abs(fdt0 & 0XFFFFFFFF);
9908a6c9e0fSAleksandar Markovic wth0 = float32_abs(fdt0 >> 32);
9918a6c9e0fSAleksandar Markovic return ((uint64_t)wth0 << 32) | wt0;
9928a6c9e0fSAleksandar Markovic }
9938a6c9e0fSAleksandar Markovic
helper_float_chs_d(uint64_t fdt0)9948a6c9e0fSAleksandar Markovic uint64_t helper_float_chs_d(uint64_t fdt0)
9958a6c9e0fSAleksandar Markovic {
9968a6c9e0fSAleksandar Markovic return float64_chs(fdt0);
9978a6c9e0fSAleksandar Markovic }
9988a6c9e0fSAleksandar Markovic
helper_float_chs_s(uint32_t fst0)9998a6c9e0fSAleksandar Markovic uint32_t helper_float_chs_s(uint32_t fst0)
10008a6c9e0fSAleksandar Markovic {
10018a6c9e0fSAleksandar Markovic return float32_chs(fst0);
10028a6c9e0fSAleksandar Markovic }
10038a6c9e0fSAleksandar Markovic
helper_float_chs_ps(uint64_t fdt0)10048a6c9e0fSAleksandar Markovic uint64_t helper_float_chs_ps(uint64_t fdt0)
10058a6c9e0fSAleksandar Markovic {
10068a6c9e0fSAleksandar Markovic uint32_t wt0;
10078a6c9e0fSAleksandar Markovic uint32_t wth0;
10088a6c9e0fSAleksandar Markovic
10098a6c9e0fSAleksandar Markovic wt0 = float32_chs(fdt0 & 0XFFFFFFFF);
10108a6c9e0fSAleksandar Markovic wth0 = float32_chs(fdt0 >> 32);
10118a6c9e0fSAleksandar Markovic return ((uint64_t)wth0 << 32) | wt0;
10128a6c9e0fSAleksandar Markovic }
10137b77f048SAleksandar Markovic
10147b77f048SAleksandar Markovic /* MIPS specific unary operations */
helper_float_recip_d(CPUMIPSState * env,uint64_t fdt0)10157b77f048SAleksandar Markovic uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0)
10167b77f048SAleksandar Markovic {
10177b77f048SAleksandar Markovic uint64_t fdt2;
10187b77f048SAleksandar Markovic
10197b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status);
10207b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10217b77f048SAleksandar Markovic return fdt2;
10227b77f048SAleksandar Markovic }
10237b77f048SAleksandar Markovic
helper_float_recip_s(CPUMIPSState * env,uint32_t fst0)10247b77f048SAleksandar Markovic uint32_t helper_float_recip_s(CPUMIPSState *env, uint32_t fst0)
10257b77f048SAleksandar Markovic {
10267b77f048SAleksandar Markovic uint32_t fst2;
10277b77f048SAleksandar Markovic
10287b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status);
10297b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10307b77f048SAleksandar Markovic return fst2;
10317b77f048SAleksandar Markovic }
10327b77f048SAleksandar Markovic
helper_float_rsqrt_d(CPUMIPSState * env,uint64_t fdt0)10337b77f048SAleksandar Markovic uint64_t helper_float_rsqrt_d(CPUMIPSState *env, uint64_t fdt0)
10347b77f048SAleksandar Markovic {
10357b77f048SAleksandar Markovic uint64_t fdt2;
10367b77f048SAleksandar Markovic
10377b77f048SAleksandar Markovic fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status);
10387b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status);
10397b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10407b77f048SAleksandar Markovic return fdt2;
10417b77f048SAleksandar Markovic }
10427b77f048SAleksandar Markovic
helper_float_rsqrt_s(CPUMIPSState * env,uint32_t fst0)10437b77f048SAleksandar Markovic uint32_t helper_float_rsqrt_s(CPUMIPSState *env, uint32_t fst0)
10447b77f048SAleksandar Markovic {
10457b77f048SAleksandar Markovic uint32_t fst2;
10467b77f048SAleksandar Markovic
10477b77f048SAleksandar Markovic fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status);
10487b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status);
10497b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10507b77f048SAleksandar Markovic return fst2;
10517b77f048SAleksandar Markovic }
10527b77f048SAleksandar Markovic
helper_float_recip1_d(CPUMIPSState * env,uint64_t fdt0)10537b77f048SAleksandar Markovic uint64_t helper_float_recip1_d(CPUMIPSState *env, uint64_t fdt0)
10547b77f048SAleksandar Markovic {
10557b77f048SAleksandar Markovic uint64_t fdt2;
10567b77f048SAleksandar Markovic
10577b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status);
10587b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10597b77f048SAleksandar Markovic return fdt2;
10607b77f048SAleksandar Markovic }
10617b77f048SAleksandar Markovic
helper_float_recip1_s(CPUMIPSState * env,uint32_t fst0)10627b77f048SAleksandar Markovic uint32_t helper_float_recip1_s(CPUMIPSState *env, uint32_t fst0)
10637b77f048SAleksandar Markovic {
10647b77f048SAleksandar Markovic uint32_t fst2;
10657b77f048SAleksandar Markovic
10667b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status);
10677b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10687b77f048SAleksandar Markovic return fst2;
10697b77f048SAleksandar Markovic }
10707b77f048SAleksandar Markovic
helper_float_recip1_ps(CPUMIPSState * env,uint64_t fdt0)10717b77f048SAleksandar Markovic uint64_t helper_float_recip1_ps(CPUMIPSState *env, uint64_t fdt0)
10727b77f048SAleksandar Markovic {
1073485cd2e4SAleksandar Markovic uint32_t fstl2;
10747b77f048SAleksandar Markovic uint32_t fsth2;
10757b77f048SAleksandar Markovic
1076485cd2e4SAleksandar Markovic fstl2 = float32_div(float32_one, fdt0 & 0XFFFFFFFF,
10777b77f048SAleksandar Markovic &env->active_fpu.fp_status);
10787b77f048SAleksandar Markovic fsth2 = float32_div(float32_one, fdt0 >> 32, &env->active_fpu.fp_status);
10797b77f048SAleksandar Markovic update_fcr31(env, GETPC());
1080485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2;
10817b77f048SAleksandar Markovic }
10827b77f048SAleksandar Markovic
helper_float_rsqrt1_d(CPUMIPSState * env,uint64_t fdt0)10837b77f048SAleksandar Markovic uint64_t helper_float_rsqrt1_d(CPUMIPSState *env, uint64_t fdt0)
10847b77f048SAleksandar Markovic {
10857b77f048SAleksandar Markovic uint64_t fdt2;
10867b77f048SAleksandar Markovic
10877b77f048SAleksandar Markovic fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status);
10887b77f048SAleksandar Markovic fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status);
10897b77f048SAleksandar Markovic update_fcr31(env, GETPC());
10907b77f048SAleksandar Markovic return fdt2;
10917b77f048SAleksandar Markovic }
10927b77f048SAleksandar Markovic
helper_float_rsqrt1_s(CPUMIPSState * env,uint32_t fst0)10937b77f048SAleksandar Markovic uint32_t helper_float_rsqrt1_s(CPUMIPSState *env, uint32_t fst0)
10947b77f048SAleksandar Markovic {
10957b77f048SAleksandar Markovic uint32_t fst2;
10967b77f048SAleksandar Markovic
10977b77f048SAleksandar Markovic fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status);
10987b77f048SAleksandar Markovic fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status);
10997b77f048SAleksandar Markovic update_fcr31(env, GETPC());
11007b77f048SAleksandar Markovic return fst2;
11017b77f048SAleksandar Markovic }
11027b77f048SAleksandar Markovic
helper_float_rsqrt1_ps(CPUMIPSState * env,uint64_t fdt0)11037b77f048SAleksandar Markovic uint64_t helper_float_rsqrt1_ps(CPUMIPSState *env, uint64_t fdt0)
11047b77f048SAleksandar Markovic {
1105485cd2e4SAleksandar Markovic uint32_t fstl2;
11067b77f048SAleksandar Markovic uint32_t fsth2;
11077b77f048SAleksandar Markovic
1108485cd2e4SAleksandar Markovic fstl2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
11097b77f048SAleksandar Markovic fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status);
1110485cd2e4SAleksandar Markovic fstl2 = float32_div(float32_one, fstl2, &env->active_fpu.fp_status);
11117b77f048SAleksandar Markovic fsth2 = float32_div(float32_one, fsth2, &env->active_fpu.fp_status);
11127b77f048SAleksandar Markovic update_fcr31(env, GETPC());
1113485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2;
11147b77f048SAleksandar Markovic }
11157b77f048SAleksandar Markovic
helper_float_rint_d(CPUMIPSState * env,uint64_t fs)1116728e4246SAleksandar Markovic uint64_t helper_float_rint_d(CPUMIPSState *env, uint64_t fs)
1117728e4246SAleksandar Markovic {
1118728e4246SAleksandar Markovic uint64_t fdret;
1119728e4246SAleksandar Markovic
1120728e4246SAleksandar Markovic fdret = float64_round_to_int(fs, &env->active_fpu.fp_status);
1121728e4246SAleksandar Markovic update_fcr31(env, GETPC());
1122728e4246SAleksandar Markovic return fdret;
1123728e4246SAleksandar Markovic }
1124728e4246SAleksandar Markovic
helper_float_rint_s(CPUMIPSState * env,uint32_t fs)1125728e4246SAleksandar Markovic uint32_t helper_float_rint_s(CPUMIPSState *env, uint32_t fs)
1126728e4246SAleksandar Markovic {
1127728e4246SAleksandar Markovic uint32_t fdret;
1128728e4246SAleksandar Markovic
1129728e4246SAleksandar Markovic fdret = float32_round_to_int(fs, &env->active_fpu.fp_status);
1130728e4246SAleksandar Markovic update_fcr31(env, GETPC());
1131728e4246SAleksandar Markovic return fdret;
1132728e4246SAleksandar Markovic }
1133728e4246SAleksandar Markovic
11347b77f048SAleksandar Markovic #define FLOAT_CLASS_SIGNALING_NAN 0x001
11357b77f048SAleksandar Markovic #define FLOAT_CLASS_QUIET_NAN 0x002
11367b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_INFINITY 0x004
11377b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_NORMAL 0x008
11387b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010
11397b77f048SAleksandar Markovic #define FLOAT_CLASS_NEGATIVE_ZERO 0x020
11407b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_INFINITY 0x040
11417b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_NORMAL 0x080
11427b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100
11437b77f048SAleksandar Markovic #define FLOAT_CLASS_POSITIVE_ZERO 0x200
11447b77f048SAleksandar Markovic
float_class_d(uint64_t arg,float_status * status)11450bd99ac7SAleksandar Markovic uint64_t float_class_d(uint64_t arg, float_status *status)
11460bd99ac7SAleksandar Markovic {
11470bd99ac7SAleksandar Markovic if (float64_is_signaling_nan(arg, status)) {
11480bd99ac7SAleksandar Markovic return FLOAT_CLASS_SIGNALING_NAN;
11490bd99ac7SAleksandar Markovic } else if (float64_is_quiet_nan(arg, status)) {
11500bd99ac7SAleksandar Markovic return FLOAT_CLASS_QUIET_NAN;
11510bd99ac7SAleksandar Markovic } else if (float64_is_neg(arg)) {
11520bd99ac7SAleksandar Markovic if (float64_is_infinity(arg)) {
11530bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_INFINITY;
11540bd99ac7SAleksandar Markovic } else if (float64_is_zero(arg)) {
11550bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_ZERO;
11560bd99ac7SAleksandar Markovic } else if (float64_is_zero_or_denormal(arg)) {
11570bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_SUBNORMAL;
11580bd99ac7SAleksandar Markovic } else {
11590bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_NORMAL;
11600bd99ac7SAleksandar Markovic }
11610bd99ac7SAleksandar Markovic } else {
11620bd99ac7SAleksandar Markovic if (float64_is_infinity(arg)) {
11630bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_INFINITY;
11640bd99ac7SAleksandar Markovic } else if (float64_is_zero(arg)) {
11650bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_ZERO;
11660bd99ac7SAleksandar Markovic } else if (float64_is_zero_or_denormal(arg)) {
11670bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_SUBNORMAL;
11680bd99ac7SAleksandar Markovic } else {
11690bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_NORMAL;
11700bd99ac7SAleksandar Markovic }
11710bd99ac7SAleksandar Markovic }
11720bd99ac7SAleksandar Markovic }
11730bd99ac7SAleksandar Markovic
helper_float_class_d(CPUMIPSState * env,uint64_t arg)11740bd99ac7SAleksandar Markovic uint64_t helper_float_class_d(CPUMIPSState *env, uint64_t arg)
11750bd99ac7SAleksandar Markovic {
11760bd99ac7SAleksandar Markovic return float_class_d(arg, &env->active_fpu.fp_status);
11770bd99ac7SAleksandar Markovic }
11780bd99ac7SAleksandar Markovic
float_class_s(uint32_t arg,float_status * status)11790bd99ac7SAleksandar Markovic uint32_t float_class_s(uint32_t arg, float_status *status)
11800bd99ac7SAleksandar Markovic {
11810bd99ac7SAleksandar Markovic if (float32_is_signaling_nan(arg, status)) {
11820bd99ac7SAleksandar Markovic return FLOAT_CLASS_SIGNALING_NAN;
11830bd99ac7SAleksandar Markovic } else if (float32_is_quiet_nan(arg, status)) {
11840bd99ac7SAleksandar Markovic return FLOAT_CLASS_QUIET_NAN;
11850bd99ac7SAleksandar Markovic } else if (float32_is_neg(arg)) {
11860bd99ac7SAleksandar Markovic if (float32_is_infinity(arg)) {
11870bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_INFINITY;
11880bd99ac7SAleksandar Markovic } else if (float32_is_zero(arg)) {
11890bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_ZERO;
11900bd99ac7SAleksandar Markovic } else if (float32_is_zero_or_denormal(arg)) {
11910bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_SUBNORMAL;
11920bd99ac7SAleksandar Markovic } else {
11930bd99ac7SAleksandar Markovic return FLOAT_CLASS_NEGATIVE_NORMAL;
11940bd99ac7SAleksandar Markovic }
11950bd99ac7SAleksandar Markovic } else {
11960bd99ac7SAleksandar Markovic if (float32_is_infinity(arg)) {
11970bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_INFINITY;
11980bd99ac7SAleksandar Markovic } else if (float32_is_zero(arg)) {
11990bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_ZERO;
12000bd99ac7SAleksandar Markovic } else if (float32_is_zero_or_denormal(arg)) {
12010bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_SUBNORMAL;
12020bd99ac7SAleksandar Markovic } else {
12030bd99ac7SAleksandar Markovic return FLOAT_CLASS_POSITIVE_NORMAL;
12040bd99ac7SAleksandar Markovic }
12050bd99ac7SAleksandar Markovic }
12060bd99ac7SAleksandar Markovic }
12070bd99ac7SAleksandar Markovic
helper_float_class_s(CPUMIPSState * env,uint32_t arg)12080bd99ac7SAleksandar Markovic uint32_t helper_float_class_s(CPUMIPSState *env, uint32_t arg)
12090bd99ac7SAleksandar Markovic {
12100bd99ac7SAleksandar Markovic return float_class_s(arg, &env->active_fpu.fp_status);
12110bd99ac7SAleksandar Markovic }
12120bd99ac7SAleksandar Markovic
12137b77f048SAleksandar Markovic /* binary operations */
12147b77f048SAleksandar Markovic
helper_float_add_d(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)12151ace099fSAleksandar Markovic uint64_t helper_float_add_d(CPUMIPSState *env,
12161ace099fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
12171ace099fSAleksandar Markovic {
12181ace099fSAleksandar Markovic uint64_t dt2;
12191ace099fSAleksandar Markovic
12201ace099fSAleksandar Markovic dt2 = float64_add(fdt0, fdt1, &env->active_fpu.fp_status);
12211ace099fSAleksandar Markovic update_fcr31(env, GETPC());
12221ace099fSAleksandar Markovic return dt2;
12231ace099fSAleksandar Markovic }
12241ace099fSAleksandar Markovic
helper_float_add_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1)12251ace099fSAleksandar Markovic uint32_t helper_float_add_s(CPUMIPSState *env,
12261ace099fSAleksandar Markovic uint32_t fst0, uint32_t fst1)
12271ace099fSAleksandar Markovic {
12281ace099fSAleksandar Markovic uint32_t wt2;
12291ace099fSAleksandar Markovic
1230dda97e38SAlex Richardson wt2 = float32_add(fst0, fst1, &env->active_fpu.fp_status);
12311ace099fSAleksandar Markovic update_fcr31(env, GETPC());
12321ace099fSAleksandar Markovic return wt2;
12331ace099fSAleksandar Markovic }
12341ace099fSAleksandar Markovic
helper_float_add_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)12351ace099fSAleksandar Markovic uint64_t helper_float_add_ps(CPUMIPSState *env,
12361ace099fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
12371ace099fSAleksandar Markovic {
12381ace099fSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
12391ace099fSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
12401ace099fSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
12411ace099fSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
12421ace099fSAleksandar Markovic uint32_t wtl2;
12431ace099fSAleksandar Markovic uint32_t wth2;
12441ace099fSAleksandar Markovic
12451ace099fSAleksandar Markovic wtl2 = float32_add(fstl0, fstl1, &env->active_fpu.fp_status);
12461ace099fSAleksandar Markovic wth2 = float32_add(fsth0, fsth1, &env->active_fpu.fp_status);
12471ace099fSAleksandar Markovic update_fcr31(env, GETPC());
12481ace099fSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2;
12491ace099fSAleksandar Markovic }
12501ace099fSAleksandar Markovic
helper_float_sub_d(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)125192ebdd7fSAleksandar Markovic uint64_t helper_float_sub_d(CPUMIPSState *env,
125292ebdd7fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
125392ebdd7fSAleksandar Markovic {
125492ebdd7fSAleksandar Markovic uint64_t dt2;
125592ebdd7fSAleksandar Markovic
125692ebdd7fSAleksandar Markovic dt2 = float64_sub(fdt0, fdt1, &env->active_fpu.fp_status);
125792ebdd7fSAleksandar Markovic update_fcr31(env, GETPC());
125892ebdd7fSAleksandar Markovic return dt2;
125992ebdd7fSAleksandar Markovic }
126092ebdd7fSAleksandar Markovic
helper_float_sub_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1)126192ebdd7fSAleksandar Markovic uint32_t helper_float_sub_s(CPUMIPSState *env,
126292ebdd7fSAleksandar Markovic uint32_t fst0, uint32_t fst1)
126392ebdd7fSAleksandar Markovic {
126492ebdd7fSAleksandar Markovic uint32_t wt2;
126592ebdd7fSAleksandar Markovic
126692ebdd7fSAleksandar Markovic wt2 = float32_sub(fst0, fst1, &env->active_fpu.fp_status);
126792ebdd7fSAleksandar Markovic update_fcr31(env, GETPC());
126892ebdd7fSAleksandar Markovic return wt2;
126992ebdd7fSAleksandar Markovic }
127092ebdd7fSAleksandar Markovic
helper_float_sub_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)127192ebdd7fSAleksandar Markovic uint64_t helper_float_sub_ps(CPUMIPSState *env,
127292ebdd7fSAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
127392ebdd7fSAleksandar Markovic {
127492ebdd7fSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
127592ebdd7fSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
127692ebdd7fSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
127792ebdd7fSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
127892ebdd7fSAleksandar Markovic uint32_t wtl2;
127992ebdd7fSAleksandar Markovic uint32_t wth2;
128092ebdd7fSAleksandar Markovic
128192ebdd7fSAleksandar Markovic wtl2 = float32_sub(fstl0, fstl1, &env->active_fpu.fp_status);
128292ebdd7fSAleksandar Markovic wth2 = float32_sub(fsth0, fsth1, &env->active_fpu.fp_status);
128392ebdd7fSAleksandar Markovic update_fcr31(env, GETPC());
128492ebdd7fSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2;
128592ebdd7fSAleksandar Markovic }
128692ebdd7fSAleksandar Markovic
helper_float_mul_d(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)128711811198SAleksandar Markovic uint64_t helper_float_mul_d(CPUMIPSState *env,
128811811198SAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
128911811198SAleksandar Markovic {
129011811198SAleksandar Markovic uint64_t dt2;
129111811198SAleksandar Markovic
129211811198SAleksandar Markovic dt2 = float64_mul(fdt0, fdt1, &env->active_fpu.fp_status);
129311811198SAleksandar Markovic update_fcr31(env, GETPC());
129411811198SAleksandar Markovic return dt2;
129511811198SAleksandar Markovic }
129611811198SAleksandar Markovic
helper_float_mul_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1)129711811198SAleksandar Markovic uint32_t helper_float_mul_s(CPUMIPSState *env,
129811811198SAleksandar Markovic uint32_t fst0, uint32_t fst1)
129911811198SAleksandar Markovic {
130011811198SAleksandar Markovic uint32_t wt2;
130111811198SAleksandar Markovic
130211811198SAleksandar Markovic wt2 = float32_mul(fst0, fst1, &env->active_fpu.fp_status);
130311811198SAleksandar Markovic update_fcr31(env, GETPC());
130411811198SAleksandar Markovic return wt2;
130511811198SAleksandar Markovic }
130611811198SAleksandar Markovic
helper_float_mul_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)130711811198SAleksandar Markovic uint64_t helper_float_mul_ps(CPUMIPSState *env,
130811811198SAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
130911811198SAleksandar Markovic {
131011811198SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
131111811198SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
131211811198SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
131311811198SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
131411811198SAleksandar Markovic uint32_t wtl2;
131511811198SAleksandar Markovic uint32_t wth2;
131611811198SAleksandar Markovic
131711811198SAleksandar Markovic wtl2 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status);
131811811198SAleksandar Markovic wth2 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status);
131911811198SAleksandar Markovic update_fcr31(env, GETPC());
132011811198SAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2;
132111811198SAleksandar Markovic }
132211811198SAleksandar Markovic
helper_float_div_d(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)1323bcca8c4bSAleksandar Markovic uint64_t helper_float_div_d(CPUMIPSState *env,
1324bcca8c4bSAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
1325bcca8c4bSAleksandar Markovic {
1326bcca8c4bSAleksandar Markovic uint64_t dt2;
1327bcca8c4bSAleksandar Markovic
1328bcca8c4bSAleksandar Markovic dt2 = float64_div(fdt0, fdt1, &env->active_fpu.fp_status);
1329bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC());
1330bcca8c4bSAleksandar Markovic return dt2;
1331bcca8c4bSAleksandar Markovic }
1332bcca8c4bSAleksandar Markovic
helper_float_div_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1)1333bcca8c4bSAleksandar Markovic uint32_t helper_float_div_s(CPUMIPSState *env,
1334bcca8c4bSAleksandar Markovic uint32_t fst0, uint32_t fst1)
1335bcca8c4bSAleksandar Markovic {
1336bcca8c4bSAleksandar Markovic uint32_t wt2;
1337bcca8c4bSAleksandar Markovic
1338bcca8c4bSAleksandar Markovic wt2 = float32_div(fst0, fst1, &env->active_fpu.fp_status);
1339bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC());
1340bcca8c4bSAleksandar Markovic return wt2;
1341bcca8c4bSAleksandar Markovic }
1342bcca8c4bSAleksandar Markovic
helper_float_div_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)1343bcca8c4bSAleksandar Markovic uint64_t helper_float_div_ps(CPUMIPSState *env,
1344bcca8c4bSAleksandar Markovic uint64_t fdt0, uint64_t fdt1)
1345bcca8c4bSAleksandar Markovic {
1346bcca8c4bSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
1347bcca8c4bSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
1348bcca8c4bSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
1349bcca8c4bSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
1350bcca8c4bSAleksandar Markovic uint32_t wtl2;
1351bcca8c4bSAleksandar Markovic uint32_t wth2;
1352bcca8c4bSAleksandar Markovic
1353bcca8c4bSAleksandar Markovic wtl2 = float32_div(fstl0, fstl1, &env->active_fpu.fp_status);
1354bcca8c4bSAleksandar Markovic wth2 = float32_div(fsth0, fsth1, &env->active_fpu.fp_status);
1355bcca8c4bSAleksandar Markovic update_fcr31(env, GETPC());
1356bcca8c4bSAleksandar Markovic return ((uint64_t)wth2 << 32) | wtl2;
1357bcca8c4bSAleksandar Markovic }
1358bcca8c4bSAleksandar Markovic
13591ace099fSAleksandar Markovic
13607b77f048SAleksandar Markovic /* MIPS specific binary operations */
helper_float_recip2_d(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt2)13617b77f048SAleksandar Markovic uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2)
13627b77f048SAleksandar Markovic {
13637b77f048SAleksandar Markovic fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status);
13647b77f048SAleksandar Markovic fdt2 = float64_chs(float64_sub(fdt2, float64_one,
13657b77f048SAleksandar Markovic &env->active_fpu.fp_status));
13667b77f048SAleksandar Markovic update_fcr31(env, GETPC());
13677b77f048SAleksandar Markovic return fdt2;
13687b77f048SAleksandar Markovic }
13697b77f048SAleksandar Markovic
helper_float_recip2_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst2)13707b77f048SAleksandar Markovic uint32_t helper_float_recip2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2)
13717b77f048SAleksandar Markovic {
13727b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status);
13737b77f048SAleksandar Markovic fst2 = float32_chs(float32_sub(fst2, float32_one,
13747b77f048SAleksandar Markovic &env->active_fpu.fp_status));
13757b77f048SAleksandar Markovic update_fcr31(env, GETPC());
13767b77f048SAleksandar Markovic return fst2;
13777b77f048SAleksandar Markovic }
13787b77f048SAleksandar Markovic
helper_float_recip2_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt2)13797b77f048SAleksandar Markovic uint64_t helper_float_recip2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2)
13807b77f048SAleksandar Markovic {
1381485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
13827b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
1383485cd2e4SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF;
13847b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32;
13857b77f048SAleksandar Markovic
1386485cd2e4SAleksandar Markovic fstl2 = float32_mul(fstl0, fstl2, &env->active_fpu.fp_status);
13877b77f048SAleksandar Markovic fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status);
1388485cd2e4SAleksandar Markovic fstl2 = float32_chs(float32_sub(fstl2, float32_one,
13897b77f048SAleksandar Markovic &env->active_fpu.fp_status));
13907b77f048SAleksandar Markovic fsth2 = float32_chs(float32_sub(fsth2, float32_one,
13917b77f048SAleksandar Markovic &env->active_fpu.fp_status));
13927b77f048SAleksandar Markovic update_fcr31(env, GETPC());
1393485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2;
13947b77f048SAleksandar Markovic }
13957b77f048SAleksandar Markovic
helper_float_rsqrt2_d(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt2)13967b77f048SAleksandar Markovic uint64_t helper_float_rsqrt2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2)
13977b77f048SAleksandar Markovic {
13987b77f048SAleksandar Markovic fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status);
13997b77f048SAleksandar Markovic fdt2 = float64_sub(fdt2, float64_one, &env->active_fpu.fp_status);
14007b77f048SAleksandar Markovic fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64,
14017b77f048SAleksandar Markovic &env->active_fpu.fp_status));
14027b77f048SAleksandar Markovic update_fcr31(env, GETPC());
14037b77f048SAleksandar Markovic return fdt2;
14047b77f048SAleksandar Markovic }
14057b77f048SAleksandar Markovic
helper_float_rsqrt2_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst2)14067b77f048SAleksandar Markovic uint32_t helper_float_rsqrt2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2)
14077b77f048SAleksandar Markovic {
14087b77f048SAleksandar Markovic fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status);
14097b77f048SAleksandar Markovic fst2 = float32_sub(fst2, float32_one, &env->active_fpu.fp_status);
14107b77f048SAleksandar Markovic fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32,
14117b77f048SAleksandar Markovic &env->active_fpu.fp_status));
14127b77f048SAleksandar Markovic update_fcr31(env, GETPC());
14137b77f048SAleksandar Markovic return fst2;
14147b77f048SAleksandar Markovic }
14157b77f048SAleksandar Markovic
helper_float_rsqrt2_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt2)14167b77f048SAleksandar Markovic uint64_t helper_float_rsqrt2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2)
14177b77f048SAleksandar Markovic {
1418485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
14197b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
1420485cd2e4SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF;
14217b77f048SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32;
14227b77f048SAleksandar Markovic
1423485cd2e4SAleksandar Markovic fstl2 = float32_mul(fstl0, fstl2, &env->active_fpu.fp_status);
14247b77f048SAleksandar Markovic fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status);
1425485cd2e4SAleksandar Markovic fstl2 = float32_sub(fstl2, float32_one, &env->active_fpu.fp_status);
14267b77f048SAleksandar Markovic fsth2 = float32_sub(fsth2, float32_one, &env->active_fpu.fp_status);
1427485cd2e4SAleksandar Markovic fstl2 = float32_chs(float32_div(fstl2, FLOAT_TWO32,
14287b77f048SAleksandar Markovic &env->active_fpu.fp_status));
14297b77f048SAleksandar Markovic fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32,
14307b77f048SAleksandar Markovic &env->active_fpu.fp_status));
14317b77f048SAleksandar Markovic update_fcr31(env, GETPC());
1432485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2;
14337b77f048SAleksandar Markovic }
14347b77f048SAleksandar Markovic
helper_float_addr_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)14357b77f048SAleksandar Markovic uint64_t helper_float_addr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1)
14367b77f048SAleksandar Markovic {
1437485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
14387b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
1439485cd2e4SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
14407b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
1441485cd2e4SAleksandar Markovic uint32_t fstl2;
14427b77f048SAleksandar Markovic uint32_t fsth2;
14437b77f048SAleksandar Markovic
1444485cd2e4SAleksandar Markovic fstl2 = float32_add(fstl0, fsth0, &env->active_fpu.fp_status);
1445485cd2e4SAleksandar Markovic fsth2 = float32_add(fstl1, fsth1, &env->active_fpu.fp_status);
14467b77f048SAleksandar Markovic update_fcr31(env, GETPC());
1447485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2;
14487b77f048SAleksandar Markovic }
14497b77f048SAleksandar Markovic
helper_float_mulr_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1)14507b77f048SAleksandar Markovic uint64_t helper_float_mulr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1)
14517b77f048SAleksandar Markovic {
1452485cd2e4SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
14537b77f048SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
1454485cd2e4SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
14557b77f048SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
1456485cd2e4SAleksandar Markovic uint32_t fstl2;
14577b77f048SAleksandar Markovic uint32_t fsth2;
14587b77f048SAleksandar Markovic
1459485cd2e4SAleksandar Markovic fstl2 = float32_mul(fstl0, fsth0, &env->active_fpu.fp_status);
1460485cd2e4SAleksandar Markovic fsth2 = float32_mul(fstl1, fsth1, &env->active_fpu.fp_status);
14617b77f048SAleksandar Markovic update_fcr31(env, GETPC());
1462485cd2e4SAleksandar Markovic return ((uint64_t)fsth2 << 32) | fstl2;
14637b77f048SAleksandar Markovic }
14647b77f048SAleksandar Markovic
146532eb97b5SAleksandar Markovic
helper_float_max_s(CPUMIPSState * env,uint32_t fs,uint32_t ft)146632eb97b5SAleksandar Markovic uint32_t helper_float_max_s(CPUMIPSState *env, uint32_t fs, uint32_t ft)
146732eb97b5SAleksandar Markovic {
146832eb97b5SAleksandar Markovic uint32_t fdret;
146932eb97b5SAleksandar Markovic
147032eb97b5SAleksandar Markovic fdret = float32_maxnum(fs, ft, &env->active_fpu.fp_status);
147132eb97b5SAleksandar Markovic
147232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
147332eb97b5SAleksandar Markovic return fdret;
14747b77f048SAleksandar Markovic }
14757b77f048SAleksandar Markovic
helper_float_max_d(CPUMIPSState * env,uint64_t fs,uint64_t ft)147632eb97b5SAleksandar Markovic uint64_t helper_float_max_d(CPUMIPSState *env, uint64_t fs, uint64_t ft)
147732eb97b5SAleksandar Markovic {
147832eb97b5SAleksandar Markovic uint64_t fdret;
14797b77f048SAleksandar Markovic
148032eb97b5SAleksandar Markovic fdret = float64_maxnum(fs, ft, &env->active_fpu.fp_status);
148132eb97b5SAleksandar Markovic
148232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
148332eb97b5SAleksandar Markovic return fdret;
148432eb97b5SAleksandar Markovic }
148532eb97b5SAleksandar Markovic
helper_float_maxa_s(CPUMIPSState * env,uint32_t fs,uint32_t ft)148632eb97b5SAleksandar Markovic uint32_t helper_float_maxa_s(CPUMIPSState *env, uint32_t fs, uint32_t ft)
148732eb97b5SAleksandar Markovic {
148832eb97b5SAleksandar Markovic uint32_t fdret;
148932eb97b5SAleksandar Markovic
149032eb97b5SAleksandar Markovic fdret = float32_maxnummag(fs, ft, &env->active_fpu.fp_status);
149132eb97b5SAleksandar Markovic
149232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
149332eb97b5SAleksandar Markovic return fdret;
149432eb97b5SAleksandar Markovic }
149532eb97b5SAleksandar Markovic
helper_float_maxa_d(CPUMIPSState * env,uint64_t fs,uint64_t ft)149632eb97b5SAleksandar Markovic uint64_t helper_float_maxa_d(CPUMIPSState *env, uint64_t fs, uint64_t ft)
149732eb97b5SAleksandar Markovic {
149832eb97b5SAleksandar Markovic uint64_t fdret;
149932eb97b5SAleksandar Markovic
150032eb97b5SAleksandar Markovic fdret = float64_maxnummag(fs, ft, &env->active_fpu.fp_status);
150132eb97b5SAleksandar Markovic
150232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
150332eb97b5SAleksandar Markovic return fdret;
150432eb97b5SAleksandar Markovic }
150532eb97b5SAleksandar Markovic
helper_float_min_s(CPUMIPSState * env,uint32_t fs,uint32_t ft)150632eb97b5SAleksandar Markovic uint32_t helper_float_min_s(CPUMIPSState *env, uint32_t fs, uint32_t ft)
150732eb97b5SAleksandar Markovic {
150832eb97b5SAleksandar Markovic uint32_t fdret;
150932eb97b5SAleksandar Markovic
151032eb97b5SAleksandar Markovic fdret = float32_minnum(fs, ft, &env->active_fpu.fp_status);
151132eb97b5SAleksandar Markovic
151232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
151332eb97b5SAleksandar Markovic return fdret;
151432eb97b5SAleksandar Markovic }
151532eb97b5SAleksandar Markovic
helper_float_min_d(CPUMIPSState * env,uint64_t fs,uint64_t ft)151632eb97b5SAleksandar Markovic uint64_t helper_float_min_d(CPUMIPSState *env, uint64_t fs, uint64_t ft)
151732eb97b5SAleksandar Markovic {
151832eb97b5SAleksandar Markovic uint64_t fdret;
151932eb97b5SAleksandar Markovic
152032eb97b5SAleksandar Markovic fdret = float64_minnum(fs, ft, &env->active_fpu.fp_status);
152132eb97b5SAleksandar Markovic
152232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
152332eb97b5SAleksandar Markovic return fdret;
152432eb97b5SAleksandar Markovic }
152532eb97b5SAleksandar Markovic
helper_float_mina_s(CPUMIPSState * env,uint32_t fs,uint32_t ft)152632eb97b5SAleksandar Markovic uint32_t helper_float_mina_s(CPUMIPSState *env, uint32_t fs, uint32_t ft)
152732eb97b5SAleksandar Markovic {
152832eb97b5SAleksandar Markovic uint32_t fdret;
152932eb97b5SAleksandar Markovic
153032eb97b5SAleksandar Markovic fdret = float32_minnummag(fs, ft, &env->active_fpu.fp_status);
153132eb97b5SAleksandar Markovic
153232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
153332eb97b5SAleksandar Markovic return fdret;
153432eb97b5SAleksandar Markovic }
153532eb97b5SAleksandar Markovic
helper_float_mina_d(CPUMIPSState * env,uint64_t fs,uint64_t ft)153632eb97b5SAleksandar Markovic uint64_t helper_float_mina_d(CPUMIPSState *env, uint64_t fs, uint64_t ft)
153732eb97b5SAleksandar Markovic {
153832eb97b5SAleksandar Markovic uint64_t fdret;
153932eb97b5SAleksandar Markovic
154032eb97b5SAleksandar Markovic fdret = float64_minnummag(fs, ft, &env->active_fpu.fp_status);
154132eb97b5SAleksandar Markovic
154232eb97b5SAleksandar Markovic update_fcr31(env, GETPC());
154332eb97b5SAleksandar Markovic return fdret;
154432eb97b5SAleksandar Markovic }
154532eb97b5SAleksandar Markovic
15467b77f048SAleksandar Markovic
15477b77f048SAleksandar Markovic /* ternary operations */
15487b77f048SAleksandar Markovic
helper_float_madd_d(CPUMIPSState * env,uint64_t fst0,uint64_t fst1,uint64_t fst2)154916734cc1SAleksandar Markovic uint64_t helper_float_madd_d(CPUMIPSState *env, uint64_t fst0,
155016734cc1SAleksandar Markovic uint64_t fst1, uint64_t fst2)
155116734cc1SAleksandar Markovic {
155216734cc1SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status);
155316734cc1SAleksandar Markovic fst0 = float64_add(fst0, fst2, &env->active_fpu.fp_status);
155416734cc1SAleksandar Markovic
155516734cc1SAleksandar Markovic update_fcr31(env, GETPC());
155616734cc1SAleksandar Markovic return fst0;
155716734cc1SAleksandar Markovic }
155816734cc1SAleksandar Markovic
helper_float_madd_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1,uint32_t fst2)155916734cc1SAleksandar Markovic uint32_t helper_float_madd_s(CPUMIPSState *env, uint32_t fst0,
156016734cc1SAleksandar Markovic uint32_t fst1, uint32_t fst2)
156116734cc1SAleksandar Markovic {
156216734cc1SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status);
156316734cc1SAleksandar Markovic fst0 = float32_add(fst0, fst2, &env->active_fpu.fp_status);
156416734cc1SAleksandar Markovic
156516734cc1SAleksandar Markovic update_fcr31(env, GETPC());
156616734cc1SAleksandar Markovic return fst0;
156716734cc1SAleksandar Markovic }
156816734cc1SAleksandar Markovic
helper_float_madd_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1,uint64_t fdt2)156916734cc1SAleksandar Markovic uint64_t helper_float_madd_ps(CPUMIPSState *env, uint64_t fdt0,
157016734cc1SAleksandar Markovic uint64_t fdt1, uint64_t fdt2)
157116734cc1SAleksandar Markovic {
157216734cc1SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
157316734cc1SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
157416734cc1SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
157516734cc1SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
157616734cc1SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF;
157716734cc1SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32;
157816734cc1SAleksandar Markovic
157916734cc1SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status);
158016734cc1SAleksandar Markovic fstl0 = float32_add(fstl0, fstl2, &env->active_fpu.fp_status);
158116734cc1SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status);
158216734cc1SAleksandar Markovic fsth0 = float32_add(fsth0, fsth2, &env->active_fpu.fp_status);
158316734cc1SAleksandar Markovic
158416734cc1SAleksandar Markovic update_fcr31(env, GETPC());
158516734cc1SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0;
158616734cc1SAleksandar Markovic }
158716734cc1SAleksandar Markovic
helper_float_msub_d(CPUMIPSState * env,uint64_t fst0,uint64_t fst1,uint64_t fst2)1588faec7524SAleksandar Markovic uint64_t helper_float_msub_d(CPUMIPSState *env, uint64_t fst0,
1589faec7524SAleksandar Markovic uint64_t fst1, uint64_t fst2)
1590faec7524SAleksandar Markovic {
1591faec7524SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status);
1592faec7524SAleksandar Markovic fst0 = float64_sub(fst0, fst2, &env->active_fpu.fp_status);
1593faec7524SAleksandar Markovic
1594faec7524SAleksandar Markovic update_fcr31(env, GETPC());
1595faec7524SAleksandar Markovic return fst0;
1596faec7524SAleksandar Markovic }
1597faec7524SAleksandar Markovic
helper_float_msub_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1,uint32_t fst2)1598faec7524SAleksandar Markovic uint32_t helper_float_msub_s(CPUMIPSState *env, uint32_t fst0,
1599faec7524SAleksandar Markovic uint32_t fst1, uint32_t fst2)
1600faec7524SAleksandar Markovic {
1601faec7524SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status);
1602faec7524SAleksandar Markovic fst0 = float32_sub(fst0, fst2, &env->active_fpu.fp_status);
1603faec7524SAleksandar Markovic
1604faec7524SAleksandar Markovic update_fcr31(env, GETPC());
1605faec7524SAleksandar Markovic return fst0;
1606faec7524SAleksandar Markovic }
1607faec7524SAleksandar Markovic
helper_float_msub_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1,uint64_t fdt2)1608faec7524SAleksandar Markovic uint64_t helper_float_msub_ps(CPUMIPSState *env, uint64_t fdt0,
1609faec7524SAleksandar Markovic uint64_t fdt1, uint64_t fdt2)
1610faec7524SAleksandar Markovic {
1611faec7524SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
1612faec7524SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
1613faec7524SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
1614faec7524SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
1615faec7524SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF;
1616faec7524SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32;
1617faec7524SAleksandar Markovic
1618faec7524SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status);
1619faec7524SAleksandar Markovic fstl0 = float32_sub(fstl0, fstl2, &env->active_fpu.fp_status);
1620faec7524SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status);
1621faec7524SAleksandar Markovic fsth0 = float32_sub(fsth0, fsth2, &env->active_fpu.fp_status);
1622faec7524SAleksandar Markovic
1623faec7524SAleksandar Markovic update_fcr31(env, GETPC());
1624faec7524SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0;
1625faec7524SAleksandar Markovic }
1626faec7524SAleksandar Markovic
helper_float_nmadd_d(CPUMIPSState * env,uint64_t fst0,uint64_t fst1,uint64_t fst2)16270278586dSAleksandar Markovic uint64_t helper_float_nmadd_d(CPUMIPSState *env, uint64_t fst0,
16280278586dSAleksandar Markovic uint64_t fst1, uint64_t fst2)
16290278586dSAleksandar Markovic {
16300278586dSAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status);
16310278586dSAleksandar Markovic fst0 = float64_add(fst0, fst2, &env->active_fpu.fp_status);
16320278586dSAleksandar Markovic fst0 = float64_chs(fst0);
16330278586dSAleksandar Markovic
16340278586dSAleksandar Markovic update_fcr31(env, GETPC());
16350278586dSAleksandar Markovic return fst0;
16360278586dSAleksandar Markovic }
16370278586dSAleksandar Markovic
helper_float_nmadd_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1,uint32_t fst2)16380278586dSAleksandar Markovic uint32_t helper_float_nmadd_s(CPUMIPSState *env, uint32_t fst0,
16390278586dSAleksandar Markovic uint32_t fst1, uint32_t fst2)
16400278586dSAleksandar Markovic {
16410278586dSAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status);
16420278586dSAleksandar Markovic fst0 = float32_add(fst0, fst2, &env->active_fpu.fp_status);
16430278586dSAleksandar Markovic fst0 = float32_chs(fst0);
16440278586dSAleksandar Markovic
16450278586dSAleksandar Markovic update_fcr31(env, GETPC());
16460278586dSAleksandar Markovic return fst0;
16470278586dSAleksandar Markovic }
16480278586dSAleksandar Markovic
helper_float_nmadd_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1,uint64_t fdt2)16490278586dSAleksandar Markovic uint64_t helper_float_nmadd_ps(CPUMIPSState *env, uint64_t fdt0,
16500278586dSAleksandar Markovic uint64_t fdt1, uint64_t fdt2)
16510278586dSAleksandar Markovic {
16520278586dSAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
16530278586dSAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
16540278586dSAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
16550278586dSAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
16560278586dSAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF;
16570278586dSAleksandar Markovic uint32_t fsth2 = fdt2 >> 32;
16580278586dSAleksandar Markovic
16590278586dSAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status);
16600278586dSAleksandar Markovic fstl0 = float32_add(fstl0, fstl2, &env->active_fpu.fp_status);
16610278586dSAleksandar Markovic fstl0 = float32_chs(fstl0);
16620278586dSAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status);
16630278586dSAleksandar Markovic fsth0 = float32_add(fsth0, fsth2, &env->active_fpu.fp_status);
16640278586dSAleksandar Markovic fsth0 = float32_chs(fsth0);
16650278586dSAleksandar Markovic
16660278586dSAleksandar Markovic update_fcr31(env, GETPC());
16670278586dSAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0;
16680278586dSAleksandar Markovic }
16690278586dSAleksandar Markovic
helper_float_nmsub_d(CPUMIPSState * env,uint64_t fst0,uint64_t fst1,uint64_t fst2)16705c591e22SAleksandar Markovic uint64_t helper_float_nmsub_d(CPUMIPSState *env, uint64_t fst0,
16715c591e22SAleksandar Markovic uint64_t fst1, uint64_t fst2)
16725c591e22SAleksandar Markovic {
16735c591e22SAleksandar Markovic fst0 = float64_mul(fst0, fst1, &env->active_fpu.fp_status);
16745c591e22SAleksandar Markovic fst0 = float64_sub(fst0, fst2, &env->active_fpu.fp_status);
16755c591e22SAleksandar Markovic fst0 = float64_chs(fst0);
16765c591e22SAleksandar Markovic
16775c591e22SAleksandar Markovic update_fcr31(env, GETPC());
16785c591e22SAleksandar Markovic return fst0;
16795c591e22SAleksandar Markovic }
16805c591e22SAleksandar Markovic
helper_float_nmsub_s(CPUMIPSState * env,uint32_t fst0,uint32_t fst1,uint32_t fst2)16815c591e22SAleksandar Markovic uint32_t helper_float_nmsub_s(CPUMIPSState *env, uint32_t fst0,
16825c591e22SAleksandar Markovic uint32_t fst1, uint32_t fst2)
16835c591e22SAleksandar Markovic {
16845c591e22SAleksandar Markovic fst0 = float32_mul(fst0, fst1, &env->active_fpu.fp_status);
16855c591e22SAleksandar Markovic fst0 = float32_sub(fst0, fst2, &env->active_fpu.fp_status);
16865c591e22SAleksandar Markovic fst0 = float32_chs(fst0);
16875c591e22SAleksandar Markovic
16885c591e22SAleksandar Markovic update_fcr31(env, GETPC());
16895c591e22SAleksandar Markovic return fst0;
16905c591e22SAleksandar Markovic }
16915c591e22SAleksandar Markovic
helper_float_nmsub_ps(CPUMIPSState * env,uint64_t fdt0,uint64_t fdt1,uint64_t fdt2)16925c591e22SAleksandar Markovic uint64_t helper_float_nmsub_ps(CPUMIPSState *env, uint64_t fdt0,
16935c591e22SAleksandar Markovic uint64_t fdt1, uint64_t fdt2)
16945c591e22SAleksandar Markovic {
16955c591e22SAleksandar Markovic uint32_t fstl0 = fdt0 & 0XFFFFFFFF;
16965c591e22SAleksandar Markovic uint32_t fsth0 = fdt0 >> 32;
16975c591e22SAleksandar Markovic uint32_t fstl1 = fdt1 & 0XFFFFFFFF;
16985c591e22SAleksandar Markovic uint32_t fsth1 = fdt1 >> 32;
16995c591e22SAleksandar Markovic uint32_t fstl2 = fdt2 & 0XFFFFFFFF;
17005c591e22SAleksandar Markovic uint32_t fsth2 = fdt2 >> 32;
17015c591e22SAleksandar Markovic
17025c591e22SAleksandar Markovic fstl0 = float32_mul(fstl0, fstl1, &env->active_fpu.fp_status);
17035c591e22SAleksandar Markovic fstl0 = float32_sub(fstl0, fstl2, &env->active_fpu.fp_status);
17045c591e22SAleksandar Markovic fstl0 = float32_chs(fstl0);
17055c591e22SAleksandar Markovic fsth0 = float32_mul(fsth0, fsth1, &env->active_fpu.fp_status);
17065c591e22SAleksandar Markovic fsth0 = float32_sub(fsth0, fsth2, &env->active_fpu.fp_status);
17075c591e22SAleksandar Markovic fsth0 = float32_chs(fsth0);
17085c591e22SAleksandar Markovic
17095c591e22SAleksandar Markovic update_fcr31(env, GETPC());
17105c591e22SAleksandar Markovic return ((uint64_t)fsth0 << 32) | fstl0;
17115c591e22SAleksandar Markovic }
17125c591e22SAleksandar Markovic
171316734cc1SAleksandar Markovic
helper_float_maddf_s(CPUMIPSState * env,uint32_t fs,uint32_t ft,uint32_t fd)1714be0cb994SAleksandar Markovic uint32_t helper_float_maddf_s(CPUMIPSState *env, uint32_t fs,
1715be0cb994SAleksandar Markovic uint32_t ft, uint32_t fd)
1716be0cb994SAleksandar Markovic {
1717be0cb994SAleksandar Markovic uint32_t fdret;
1718be0cb994SAleksandar Markovic
1719be0cb994SAleksandar Markovic fdret = float32_muladd(fs, ft, fd, 0,
1720be0cb994SAleksandar Markovic &env->active_fpu.fp_status);
1721be0cb994SAleksandar Markovic
1722be0cb994SAleksandar Markovic update_fcr31(env, GETPC());
1723be0cb994SAleksandar Markovic return fdret;
17247b77f048SAleksandar Markovic }
17257b77f048SAleksandar Markovic
helper_float_maddf_d(CPUMIPSState * env,uint64_t fs,uint64_t ft,uint64_t fd)1726be0cb994SAleksandar Markovic uint64_t helper_float_maddf_d(CPUMIPSState *env, uint64_t fs,
1727be0cb994SAleksandar Markovic uint64_t ft, uint64_t fd)
1728be0cb994SAleksandar Markovic {
1729be0cb994SAleksandar Markovic uint64_t fdret;
1730be0cb994SAleksandar Markovic
1731be0cb994SAleksandar Markovic fdret = float64_muladd(fs, ft, fd, 0,
1732be0cb994SAleksandar Markovic &env->active_fpu.fp_status);
1733be0cb994SAleksandar Markovic
1734be0cb994SAleksandar Markovic update_fcr31(env, GETPC());
1735be0cb994SAleksandar Markovic return fdret;
1736be0cb994SAleksandar Markovic }
1737be0cb994SAleksandar Markovic
helper_float_msubf_s(CPUMIPSState * env,uint32_t fs,uint32_t ft,uint32_t fd)1738be0cb994SAleksandar Markovic uint32_t helper_float_msubf_s(CPUMIPSState *env, uint32_t fs,
1739be0cb994SAleksandar Markovic uint32_t ft, uint32_t fd)
1740be0cb994SAleksandar Markovic {
1741be0cb994SAleksandar Markovic uint32_t fdret;
1742be0cb994SAleksandar Markovic
1743be0cb994SAleksandar Markovic fdret = float32_muladd(fs, ft, fd, float_muladd_negate_product,
1744be0cb994SAleksandar Markovic &env->active_fpu.fp_status);
1745be0cb994SAleksandar Markovic
1746be0cb994SAleksandar Markovic update_fcr31(env, GETPC());
1747be0cb994SAleksandar Markovic return fdret;
1748be0cb994SAleksandar Markovic }
1749be0cb994SAleksandar Markovic
helper_float_msubf_d(CPUMIPSState * env,uint64_t fs,uint64_t ft,uint64_t fd)1750be0cb994SAleksandar Markovic uint64_t helper_float_msubf_d(CPUMIPSState *env, uint64_t fs,
1751be0cb994SAleksandar Markovic uint64_t ft, uint64_t fd)
1752be0cb994SAleksandar Markovic {
1753be0cb994SAleksandar Markovic uint64_t fdret;
1754be0cb994SAleksandar Markovic
1755be0cb994SAleksandar Markovic fdret = float64_muladd(fs, ft, fd, float_muladd_negate_product,
1756be0cb994SAleksandar Markovic &env->active_fpu.fp_status);
1757be0cb994SAleksandar Markovic
1758be0cb994SAleksandar Markovic update_fcr31(env, GETPC());
1759be0cb994SAleksandar Markovic return fdret;
1760be0cb994SAleksandar Markovic }
1761be0cb994SAleksandar Markovic
17627b77f048SAleksandar Markovic
17637b77f048SAleksandar Markovic /* compare operations */
17647b77f048SAleksandar Markovic #define FOP_COND_D(op, cond) \
17657b77f048SAleksandar Markovic void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \
17667b77f048SAleksandar Markovic uint64_t fdt1, int cc) \
17677b77f048SAleksandar Markovic { \
17687b77f048SAleksandar Markovic int c; \
17697b77f048SAleksandar Markovic c = cond; \
17707b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \
17717b77f048SAleksandar Markovic if (c) \
17727b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \
17737b77f048SAleksandar Markovic else \
17747b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \
17757b77f048SAleksandar Markovic } \
17767b77f048SAleksandar Markovic void helper_cmpabs_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \
17777b77f048SAleksandar Markovic uint64_t fdt1, int cc) \
17787b77f048SAleksandar Markovic { \
17797b77f048SAleksandar Markovic int c; \
17807b77f048SAleksandar Markovic fdt0 = float64_abs(fdt0); \
17817b77f048SAleksandar Markovic fdt1 = float64_abs(fdt1); \
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
17907b77f048SAleksandar Markovic /*
17917b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
17927b77f048SAleksandar Markovic * but float64_unordered_quiet() is still called.
17937b77f048SAleksandar Markovic */
17947b77f048SAleksandar Markovic FOP_COND_D(f, (float64_unordered_quiet(fdt1, fdt0,
17957b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
17967b77f048SAleksandar Markovic FOP_COND_D(un, float64_unordered_quiet(fdt1, fdt0,
17977b77f048SAleksandar Markovic &env->active_fpu.fp_status))
17987b77f048SAleksandar Markovic FOP_COND_D(eq, float64_eq_quiet(fdt0, fdt1,
17997b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18007b77f048SAleksandar Markovic FOP_COND_D(ueq, float64_unordered_quiet(fdt1, fdt0,
18017b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18027b77f048SAleksandar Markovic || float64_eq_quiet(fdt0, fdt1,
18037b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18047b77f048SAleksandar Markovic FOP_COND_D(olt, float64_lt_quiet(fdt0, fdt1,
18057b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18067b77f048SAleksandar Markovic FOP_COND_D(ult, float64_unordered_quiet(fdt1, fdt0,
18077b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18087b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1,
18097b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18107b77f048SAleksandar Markovic FOP_COND_D(ole, float64_le_quiet(fdt0, fdt1,
18117b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18127b77f048SAleksandar Markovic FOP_COND_D(ule, float64_unordered_quiet(fdt1, fdt0,
18137b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18147b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1,
18157b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18167b77f048SAleksandar Markovic /*
18177b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
18187b77f048SAleksandar Markovic * but float64_unordered() is still called.
18197b77f048SAleksandar Markovic */
18207b77f048SAleksandar Markovic FOP_COND_D(sf, (float64_unordered(fdt1, fdt0,
18217b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
18227b77f048SAleksandar Markovic FOP_COND_D(ngle, float64_unordered(fdt1, fdt0,
18237b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18247b77f048SAleksandar Markovic FOP_COND_D(seq, float64_eq(fdt0, fdt1,
18257b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18267b77f048SAleksandar Markovic FOP_COND_D(ngl, float64_unordered(fdt1, fdt0,
18277b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18287b77f048SAleksandar Markovic || float64_eq(fdt0, fdt1,
18297b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18307b77f048SAleksandar Markovic FOP_COND_D(lt, float64_lt(fdt0, fdt1,
18317b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18327b77f048SAleksandar Markovic FOP_COND_D(nge, float64_unordered(fdt1, fdt0,
18337b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18347b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1,
18357b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18367b77f048SAleksandar Markovic FOP_COND_D(le, float64_le(fdt0, fdt1,
18377b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18387b77f048SAleksandar Markovic FOP_COND_D(ngt, float64_unordered(fdt1, fdt0,
18397b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18407b77f048SAleksandar Markovic || float64_le(fdt0, fdt1,
18417b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18427b77f048SAleksandar Markovic
18437b77f048SAleksandar Markovic #define FOP_COND_S(op, cond) \
18447b77f048SAleksandar Markovic void helper_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \
18457b77f048SAleksandar Markovic uint32_t fst1, int cc) \
18467b77f048SAleksandar Markovic { \
18477b77f048SAleksandar Markovic int c; \
18487b77f048SAleksandar Markovic c = cond; \
18497b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \
18507b77f048SAleksandar Markovic if (c) \
18517b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \
18527b77f048SAleksandar Markovic else \
18537b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \
18547b77f048SAleksandar Markovic } \
18557b77f048SAleksandar Markovic void helper_cmpabs_s_ ## op(CPUMIPSState *env, uint32_t fst0, \
18567b77f048SAleksandar Markovic uint32_t fst1, int cc) \
18577b77f048SAleksandar Markovic { \
18587b77f048SAleksandar Markovic int c; \
18597b77f048SAleksandar Markovic fst0 = float32_abs(fst0); \
18607b77f048SAleksandar Markovic fst1 = float32_abs(fst1); \
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
18697b77f048SAleksandar Markovic /*
18707b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
18717b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called.
18727b77f048SAleksandar Markovic */
18737b77f048SAleksandar Markovic FOP_COND_S(f, (float32_unordered_quiet(fst1, fst0,
18747b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
18757b77f048SAleksandar Markovic FOP_COND_S(un, float32_unordered_quiet(fst1, fst0,
18767b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18777b77f048SAleksandar Markovic FOP_COND_S(eq, float32_eq_quiet(fst0, fst1,
18787b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18797b77f048SAleksandar Markovic FOP_COND_S(ueq, float32_unordered_quiet(fst1, fst0,
18807b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18817b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1,
18827b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18837b77f048SAleksandar Markovic FOP_COND_S(olt, float32_lt_quiet(fst0, fst1,
18847b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18857b77f048SAleksandar Markovic FOP_COND_S(ult, float32_unordered_quiet(fst1, fst0,
18867b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18877b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1,
18887b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18897b77f048SAleksandar Markovic FOP_COND_S(ole, float32_le_quiet(fst0, fst1,
18907b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18917b77f048SAleksandar Markovic FOP_COND_S(ule, float32_unordered_quiet(fst1, fst0,
18927b77f048SAleksandar Markovic &env->active_fpu.fp_status)
18937b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1,
18947b77f048SAleksandar Markovic &env->active_fpu.fp_status))
18957b77f048SAleksandar Markovic /*
18967b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
18977b77f048SAleksandar Markovic * but float32_unordered() is still called.
18987b77f048SAleksandar Markovic */
18997b77f048SAleksandar Markovic FOP_COND_S(sf, (float32_unordered(fst1, fst0,
19007b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
19017b77f048SAleksandar Markovic FOP_COND_S(ngle, float32_unordered(fst1, fst0,
19027b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19037b77f048SAleksandar Markovic FOP_COND_S(seq, float32_eq(fst0, fst1,
19047b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19057b77f048SAleksandar Markovic FOP_COND_S(ngl, float32_unordered(fst1, fst0,
19067b77f048SAleksandar Markovic &env->active_fpu.fp_status)
19077b77f048SAleksandar Markovic || float32_eq(fst0, fst1,
19087b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19097b77f048SAleksandar Markovic FOP_COND_S(lt, float32_lt(fst0, fst1,
19107b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19117b77f048SAleksandar Markovic FOP_COND_S(nge, float32_unordered(fst1, fst0,
19127b77f048SAleksandar Markovic &env->active_fpu.fp_status)
19137b77f048SAleksandar Markovic || float32_lt(fst0, fst1,
19147b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19157b77f048SAleksandar Markovic FOP_COND_S(le, float32_le(fst0, fst1,
19167b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19177b77f048SAleksandar Markovic FOP_COND_S(ngt, float32_unordered(fst1, fst0,
19187b77f048SAleksandar Markovic &env->active_fpu.fp_status)
19197b77f048SAleksandar Markovic || float32_le(fst0, fst1,
19207b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19217b77f048SAleksandar Markovic
19227b77f048SAleksandar Markovic #define FOP_COND_PS(op, condl, condh) \
19237b77f048SAleksandar Markovic void helper_cmp_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \
19247b77f048SAleksandar Markovic uint64_t fdt1, int cc) \
19257b77f048SAleksandar Markovic { \
19267b77f048SAleksandar Markovic uint32_t fst0, fsth0, fst1, fsth1; \
19277b77f048SAleksandar Markovic int ch, cl; \
19287b77f048SAleksandar Markovic fst0 = fdt0 & 0XFFFFFFFF; \
19297b77f048SAleksandar Markovic fsth0 = fdt0 >> 32; \
19307b77f048SAleksandar Markovic fst1 = fdt1 & 0XFFFFFFFF; \
19317b77f048SAleksandar Markovic fsth1 = fdt1 >> 32; \
19327b77f048SAleksandar Markovic cl = condl; \
19337b77f048SAleksandar Markovic ch = condh; \
19347b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \
19357b77f048SAleksandar Markovic if (cl) \
19367b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \
19377b77f048SAleksandar Markovic else \
19387b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \
19397b77f048SAleksandar Markovic if (ch) \
19407b77f048SAleksandar Markovic SET_FP_COND(cc + 1, env->active_fpu); \
19417b77f048SAleksandar Markovic else \
19427b77f048SAleksandar Markovic CLEAR_FP_COND(cc + 1, env->active_fpu); \
19437b77f048SAleksandar Markovic } \
19447b77f048SAleksandar Markovic void helper_cmpabs_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \
19457b77f048SAleksandar Markovic uint64_t fdt1, int cc) \
19467b77f048SAleksandar Markovic { \
19477b77f048SAleksandar Markovic uint32_t fst0, fsth0, fst1, fsth1; \
19487b77f048SAleksandar Markovic int ch, cl; \
19497b77f048SAleksandar Markovic fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \
19507b77f048SAleksandar Markovic fsth0 = float32_abs(fdt0 >> 32); \
19517b77f048SAleksandar Markovic fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \
19527b77f048SAleksandar Markovic fsth1 = float32_abs(fdt1 >> 32); \
19537b77f048SAleksandar Markovic cl = condl; \
19547b77f048SAleksandar Markovic ch = condh; \
19557b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \
19567b77f048SAleksandar Markovic if (cl) \
19577b77f048SAleksandar Markovic SET_FP_COND(cc, env->active_fpu); \
19587b77f048SAleksandar Markovic else \
19597b77f048SAleksandar Markovic CLEAR_FP_COND(cc, env->active_fpu); \
19607b77f048SAleksandar Markovic if (ch) \
19617b77f048SAleksandar Markovic SET_FP_COND(cc + 1, env->active_fpu); \
19627b77f048SAleksandar Markovic else \
19637b77f048SAleksandar Markovic CLEAR_FP_COND(cc + 1, env->active_fpu); \
19647b77f048SAleksandar Markovic }
19657b77f048SAleksandar Markovic
19667b77f048SAleksandar Markovic /*
19677b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
19687b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called.
19697b77f048SAleksandar Markovic */
19707b77f048SAleksandar Markovic FOP_COND_PS(f, (float32_unordered_quiet(fst1, fst0,
19717b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0),
19727b77f048SAleksandar Markovic (float32_unordered_quiet(fsth1, fsth0,
19737b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
19747b77f048SAleksandar Markovic FOP_COND_PS(un, float32_unordered_quiet(fst1, fst0,
19757b77f048SAleksandar Markovic &env->active_fpu.fp_status),
19767b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0,
19777b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19787b77f048SAleksandar Markovic FOP_COND_PS(eq, float32_eq_quiet(fst0, fst1,
19797b77f048SAleksandar Markovic &env->active_fpu.fp_status),
19807b77f048SAleksandar Markovic float32_eq_quiet(fsth0, fsth1,
19817b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19827b77f048SAleksandar Markovic FOP_COND_PS(ueq, float32_unordered_quiet(fst1, fst0,
19837b77f048SAleksandar Markovic &env->active_fpu.fp_status)
19847b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1,
19857b77f048SAleksandar Markovic &env->active_fpu.fp_status),
19867b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0,
19877b77f048SAleksandar Markovic &env->active_fpu.fp_status)
19887b77f048SAleksandar Markovic || float32_eq_quiet(fsth0, fsth1,
19897b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19907b77f048SAleksandar Markovic FOP_COND_PS(olt, float32_lt_quiet(fst0, fst1,
19917b77f048SAleksandar Markovic &env->active_fpu.fp_status),
19927b77f048SAleksandar Markovic float32_lt_quiet(fsth0, fsth1,
19937b77f048SAleksandar Markovic &env->active_fpu.fp_status))
19947b77f048SAleksandar Markovic FOP_COND_PS(ult, float32_unordered_quiet(fst1, fst0,
19957b77f048SAleksandar Markovic &env->active_fpu.fp_status)
19967b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1,
19977b77f048SAleksandar Markovic &env->active_fpu.fp_status),
19987b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0,
19997b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20007b77f048SAleksandar Markovic || float32_lt_quiet(fsth0, fsth1,
20017b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20027b77f048SAleksandar Markovic FOP_COND_PS(ole, float32_le_quiet(fst0, fst1,
20037b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20047b77f048SAleksandar Markovic float32_le_quiet(fsth0, fsth1,
20057b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20067b77f048SAleksandar Markovic FOP_COND_PS(ule, float32_unordered_quiet(fst1, fst0,
20077b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20087b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1,
20097b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20107b77f048SAleksandar Markovic float32_unordered_quiet(fsth1, fsth0,
20117b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20127b77f048SAleksandar Markovic || float32_le_quiet(fsth0, fsth1,
20137b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20147b77f048SAleksandar Markovic /*
20157b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
20167b77f048SAleksandar Markovic * but float32_unordered() is still called.
20177b77f048SAleksandar Markovic */
20187b77f048SAleksandar Markovic FOP_COND_PS(sf, (float32_unordered(fst1, fst0,
20197b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0),
20207b77f048SAleksandar Markovic (float32_unordered(fsth1, fsth0,
20217b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
20227b77f048SAleksandar Markovic FOP_COND_PS(ngle, float32_unordered(fst1, fst0,
20237b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20247b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0,
20257b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20267b77f048SAleksandar Markovic FOP_COND_PS(seq, float32_eq(fst0, fst1,
20277b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20287b77f048SAleksandar Markovic float32_eq(fsth0, fsth1,
20297b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20307b77f048SAleksandar Markovic FOP_COND_PS(ngl, float32_unordered(fst1, fst0,
20317b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20327b77f048SAleksandar Markovic || float32_eq(fst0, fst1,
20337b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20347b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0,
20357b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20367b77f048SAleksandar Markovic || float32_eq(fsth0, fsth1,
20377b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20387b77f048SAleksandar Markovic FOP_COND_PS(lt, float32_lt(fst0, fst1,
20397b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20407b77f048SAleksandar Markovic float32_lt(fsth0, fsth1,
20417b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20427b77f048SAleksandar Markovic FOP_COND_PS(nge, float32_unordered(fst1, fst0,
20437b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20447b77f048SAleksandar Markovic || float32_lt(fst0, fst1,
20457b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20467b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0,
20477b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20487b77f048SAleksandar Markovic || float32_lt(fsth0, fsth1,
20497b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20507b77f048SAleksandar Markovic FOP_COND_PS(le, float32_le(fst0, fst1,
20517b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20527b77f048SAleksandar Markovic float32_le(fsth0, fsth1,
20537b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20547b77f048SAleksandar Markovic FOP_COND_PS(ngt, float32_unordered(fst1, fst0,
20557b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20567b77f048SAleksandar Markovic || float32_le(fst0, fst1,
20577b77f048SAleksandar Markovic &env->active_fpu.fp_status),
20587b77f048SAleksandar Markovic float32_unordered(fsth1, fsth0,
20597b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20607b77f048SAleksandar Markovic || float32_le(fsth0, fsth1,
20617b77f048SAleksandar Markovic &env->active_fpu.fp_status))
20627b77f048SAleksandar Markovic
20637b77f048SAleksandar Markovic /* R6 compare operations */
20647b77f048SAleksandar Markovic #define FOP_CONDN_D(op, cond) \
20657b77f048SAleksandar Markovic uint64_t helper_r6_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \
20667b77f048SAleksandar Markovic uint64_t fdt1) \
20677b77f048SAleksandar Markovic { \
20687b77f048SAleksandar Markovic uint64_t c; \
20697b77f048SAleksandar Markovic c = cond; \
20707b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \
20717b77f048SAleksandar Markovic if (c) { \
20727b77f048SAleksandar Markovic return -1; \
20737b77f048SAleksandar Markovic } else { \
20747b77f048SAleksandar Markovic return 0; \
20757b77f048SAleksandar Markovic } \
20767b77f048SAleksandar Markovic }
20777b77f048SAleksandar Markovic
20787b77f048SAleksandar Markovic /*
20797b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
20807b77f048SAleksandar Markovic * but float64_unordered_quiet() is still called.
20817b77f048SAleksandar Markovic */
20827b77f048SAleksandar Markovic FOP_CONDN_D(af, (float64_unordered_quiet(fdt1, fdt0,
20837b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
20847b77f048SAleksandar Markovic FOP_CONDN_D(un, (float64_unordered_quiet(fdt1, fdt0,
20857b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
20867b77f048SAleksandar Markovic FOP_CONDN_D(eq, (float64_eq_quiet(fdt0, fdt1,
20877b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
20887b77f048SAleksandar Markovic FOP_CONDN_D(ueq, (float64_unordered_quiet(fdt1, fdt0,
20897b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20907b77f048SAleksandar Markovic || float64_eq_quiet(fdt0, fdt1,
20917b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
20927b77f048SAleksandar Markovic FOP_CONDN_D(lt, (float64_lt_quiet(fdt0, fdt1,
20937b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
20947b77f048SAleksandar Markovic FOP_CONDN_D(ult, (float64_unordered_quiet(fdt1, fdt0,
20957b77f048SAleksandar Markovic &env->active_fpu.fp_status)
20967b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1,
20977b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
20987b77f048SAleksandar Markovic FOP_CONDN_D(le, (float64_le_quiet(fdt0, fdt1,
20997b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21007b77f048SAleksandar Markovic FOP_CONDN_D(ule, (float64_unordered_quiet(fdt1, fdt0,
21017b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21027b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1,
21037b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21047b77f048SAleksandar Markovic /*
21057b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
21067b77f048SAleksandar Markovic * but float64_unordered() is still called.\
21077b77f048SAleksandar Markovic */
21087b77f048SAleksandar Markovic FOP_CONDN_D(saf, (float64_unordered(fdt1, fdt0,
21097b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
21107b77f048SAleksandar Markovic FOP_CONDN_D(sun, (float64_unordered(fdt1, fdt0,
21117b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21127b77f048SAleksandar Markovic FOP_CONDN_D(seq, (float64_eq(fdt0, fdt1,
21137b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21147b77f048SAleksandar Markovic FOP_CONDN_D(sueq, (float64_unordered(fdt1, fdt0,
21157b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21167b77f048SAleksandar Markovic || float64_eq(fdt0, fdt1,
21177b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21187b77f048SAleksandar Markovic FOP_CONDN_D(slt, (float64_lt(fdt0, fdt1,
21197b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21207b77f048SAleksandar Markovic FOP_CONDN_D(sult, (float64_unordered(fdt1, fdt0,
21217b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21227b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1,
21237b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21247b77f048SAleksandar Markovic FOP_CONDN_D(sle, (float64_le(fdt0, fdt1,
21257b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21267b77f048SAleksandar Markovic FOP_CONDN_D(sule, (float64_unordered(fdt1, fdt0,
21277b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21287b77f048SAleksandar Markovic || float64_le(fdt0, fdt1,
21297b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21307b77f048SAleksandar Markovic FOP_CONDN_D(or, (float64_le_quiet(fdt1, fdt0,
21317b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21327b77f048SAleksandar Markovic || float64_le_quiet(fdt0, fdt1,
21337b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21347b77f048SAleksandar Markovic FOP_CONDN_D(une, (float64_unordered_quiet(fdt1, fdt0,
21357b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21367b77f048SAleksandar Markovic || float64_lt_quiet(fdt1, fdt0,
21377b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21387b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1,
21397b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21407b77f048SAleksandar Markovic FOP_CONDN_D(ne, (float64_lt_quiet(fdt1, fdt0,
21417b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21427b77f048SAleksandar Markovic || float64_lt_quiet(fdt0, fdt1,
21437b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21447b77f048SAleksandar Markovic FOP_CONDN_D(sor, (float64_le(fdt1, fdt0,
21457b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21467b77f048SAleksandar Markovic || float64_le(fdt0, fdt1,
21477b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21487b77f048SAleksandar Markovic FOP_CONDN_D(sune, (float64_unordered(fdt1, fdt0,
21497b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21507b77f048SAleksandar Markovic || float64_lt(fdt1, fdt0,
21517b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21527b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1,
21537b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21547b77f048SAleksandar Markovic FOP_CONDN_D(sne, (float64_lt(fdt1, fdt0,
21557b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21567b77f048SAleksandar Markovic || float64_lt(fdt0, fdt1,
21577b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21587b77f048SAleksandar Markovic
21597b77f048SAleksandar Markovic #define FOP_CONDN_S(op, cond) \
21607b77f048SAleksandar Markovic uint32_t helper_r6_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \
21617b77f048SAleksandar Markovic uint32_t fst1) \
21627b77f048SAleksandar Markovic { \
21637b77f048SAleksandar Markovic uint64_t c; \
21647b77f048SAleksandar Markovic c = cond; \
21657b77f048SAleksandar Markovic update_fcr31(env, GETPC()); \
21667b77f048SAleksandar Markovic if (c) { \
21677b77f048SAleksandar Markovic return -1; \
21687b77f048SAleksandar Markovic } else { \
21697b77f048SAleksandar Markovic return 0; \
21707b77f048SAleksandar Markovic } \
21717b77f048SAleksandar Markovic }
21727b77f048SAleksandar Markovic
21737b77f048SAleksandar Markovic /*
21747b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
21757b77f048SAleksandar Markovic * but float32_unordered_quiet() is still called.
21767b77f048SAleksandar Markovic */
21777b77f048SAleksandar Markovic FOP_CONDN_S(af, (float32_unordered_quiet(fst1, fst0,
21787b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
21797b77f048SAleksandar Markovic FOP_CONDN_S(un, (float32_unordered_quiet(fst1, fst0,
21807b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21817b77f048SAleksandar Markovic FOP_CONDN_S(eq, (float32_eq_quiet(fst0, fst1,
21827b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21837b77f048SAleksandar Markovic FOP_CONDN_S(ueq, (float32_unordered_quiet(fst1, fst0,
21847b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21857b77f048SAleksandar Markovic || float32_eq_quiet(fst0, fst1,
21867b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21877b77f048SAleksandar Markovic FOP_CONDN_S(lt, (float32_lt_quiet(fst0, fst1,
21887b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21897b77f048SAleksandar Markovic FOP_CONDN_S(ult, (float32_unordered_quiet(fst1, fst0,
21907b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21917b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1,
21927b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21937b77f048SAleksandar Markovic FOP_CONDN_S(le, (float32_le_quiet(fst0, fst1,
21947b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21957b77f048SAleksandar Markovic FOP_CONDN_S(ule, (float32_unordered_quiet(fst1, fst0,
21967b77f048SAleksandar Markovic &env->active_fpu.fp_status)
21977b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1,
21987b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
21997b77f048SAleksandar Markovic /*
22007b77f048SAleksandar Markovic * NOTE: the comma operator will make "cond" to eval to false,
22017b77f048SAleksandar Markovic * but float32_unordered() is still called.
22027b77f048SAleksandar Markovic */
22037b77f048SAleksandar Markovic FOP_CONDN_S(saf, (float32_unordered(fst1, fst0,
22047b77f048SAleksandar Markovic &env->active_fpu.fp_status), 0))
22057b77f048SAleksandar Markovic FOP_CONDN_S(sun, (float32_unordered(fst1, fst0,
22067b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22077b77f048SAleksandar Markovic FOP_CONDN_S(seq, (float32_eq(fst0, fst1,
22087b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22097b77f048SAleksandar Markovic FOP_CONDN_S(sueq, (float32_unordered(fst1, fst0,
22107b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22117b77f048SAleksandar Markovic || float32_eq(fst0, fst1,
22127b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22137b77f048SAleksandar Markovic FOP_CONDN_S(slt, (float32_lt(fst0, fst1,
22147b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22157b77f048SAleksandar Markovic FOP_CONDN_S(sult, (float32_unordered(fst1, fst0,
22167b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22177b77f048SAleksandar Markovic || float32_lt(fst0, fst1,
22187b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22197b77f048SAleksandar Markovic FOP_CONDN_S(sle, (float32_le(fst0, fst1,
22207b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22217b77f048SAleksandar Markovic FOP_CONDN_S(sule, (float32_unordered(fst1, fst0,
22227b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22237b77f048SAleksandar Markovic || float32_le(fst0, fst1,
22247b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22257b77f048SAleksandar Markovic FOP_CONDN_S(or, (float32_le_quiet(fst1, fst0,
22267b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22277b77f048SAleksandar Markovic || float32_le_quiet(fst0, fst1,
22287b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22297b77f048SAleksandar Markovic FOP_CONDN_S(une, (float32_unordered_quiet(fst1, fst0,
22307b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22317b77f048SAleksandar Markovic || float32_lt_quiet(fst1, fst0,
22327b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22337b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1,
22347b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22357b77f048SAleksandar Markovic FOP_CONDN_S(ne, (float32_lt_quiet(fst1, fst0,
22367b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22377b77f048SAleksandar Markovic || float32_lt_quiet(fst0, fst1,
22387b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22397b77f048SAleksandar Markovic FOP_CONDN_S(sor, (float32_le(fst1, fst0,
22407b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22417b77f048SAleksandar Markovic || float32_le(fst0, fst1,
22427b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22437b77f048SAleksandar Markovic FOP_CONDN_S(sune, (float32_unordered(fst1, fst0,
22447b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22457b77f048SAleksandar Markovic || float32_lt(fst1, fst0,
22467b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22477b77f048SAleksandar Markovic || float32_lt(fst0, fst1,
22487b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
22497b77f048SAleksandar Markovic FOP_CONDN_S(sne, (float32_lt(fst1, fst0,
22507b77f048SAleksandar Markovic &env->active_fpu.fp_status)
22517b77f048SAleksandar Markovic || float32_lt(fst0, fst1,
22527b77f048SAleksandar Markovic &env->active_fpu.fp_status)))
2253