op_helper.c revision eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8
1409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/*
2409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *  MIPS emulation helpers for qemu.
3409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
4409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *  Copyright (c) 2004-2005 Jocelyn Mayer
5409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
6409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * This library is free software; you can redistribute it and/or
7409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * modify it under the terms of the GNU Lesser General Public
8409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * License as published by the Free Software Foundation; either
9409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * version 2 of the License, or (at your option) any later version.
10409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
11409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * This library is distributed in the hope that it will be useful,
12409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but WITHOUT ANY WARRANTY; without even the implied warranty of
13409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * Lesser General Public License for more details.
15409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli *
16409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * You should have received a copy of the GNU Lesser General Public
17409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli */
19409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include <stdlib.h>
20a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#include "cpu.h"
21a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#include "dyngen-exec.h"
22409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
23e90d665cd63a0bc5c3306e1ee3e98ad362546b16David 'Digit' Turner#include "qemu/host-utils.h"
24409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "helper.h"
26a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner
27a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#if !defined(CONFIG_USER_ONLY)
28a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#include "exec/softmmu_exec.h"
29a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#endif /* !defined(CONFIG_USER_ONLY) */
30a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner
31a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#ifndef CONFIG_USER_ONLY
32a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turnerstatic inline void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global);
33a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#endif
34a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner
35a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turnerstatic inline void compute_hflags(CPUMIPSState *env)
36a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner{
37a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 |
38a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner                     MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU |
39a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner                     MIPS_HFLAG_UX);
40a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
41a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        !(env->CP0_Status & (1 << CP0St_ERL)) &&
42a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        !(env->hflags & MIPS_HFLAG_DM)) {
43a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU;
44a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
45a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#if defined(TARGET_MIPS64)
46a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) ||
47a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        (env->CP0_Status & (1 << CP0St_PX)) ||
48a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        (env->CP0_Status & (1 << CP0St_UX))) {
49a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        env->hflags |= MIPS_HFLAG_64;
50a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
51a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if (env->CP0_Status & (1 << CP0St_UX)) {
52a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        env->hflags |= MIPS_HFLAG_UX;
53a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
54a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner#endif
55a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if ((env->CP0_Status & (1 << CP0St_CU0)) ||
56a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        !(env->hflags & MIPS_HFLAG_KSU)) {
57a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        env->hflags |= MIPS_HFLAG_CP0;
58a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
59a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if (env->CP0_Status & (1 << CP0St_CU1)) {
60a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        env->hflags |= MIPS_HFLAG_FPU;
61a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
62a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if (env->CP0_Status & (1 << CP0St_FR)) {
63a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        env->hflags |= MIPS_HFLAG_F64;
64a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
65a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    if (env->insn_flags & ISA_MIPS32R2) {
66a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        if (env->active_fpu.fcr0 & (1 << FCR0_F64)) {
67a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner            env->hflags |= MIPS_HFLAG_COP1X;
68a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        }
69a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    } else if (env->insn_flags & ISA_MIPS32) {
70a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        if (env->hflags & MIPS_HFLAG_64) {
71a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner            env->hflags |= MIPS_HFLAG_COP1X;
72a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        }
73a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    } else if (env->insn_flags & ISA_MIPS4) {
74a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        /* All supported MIPS IV CPUs use the XX (CU3) to enable
75a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner           and disable the MIPS IV extensions to the MIPS III ISA.
76a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner           Some other MIPS IV CPUs ignore the bit, so the check here
77a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner           would be too restrictive for them.  */
78a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        if (env->CP0_Status & (1 << CP0St_CU3)) {
79a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner            env->hflags |= MIPS_HFLAG_COP1X;
80a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner        }
81a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner    }
82a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner}
83a889d35e76c8ea18caf70c738fd585c64b857369David 'Digit' Turner
84409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/*****************************************************************************/
85409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Exceptions processing helpers */
86409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
87409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_raise_exception_err (uint32_t exception, int error_code)
88409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
89409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if 1
90409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (exception < 0x100)
91409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("%s: %d %d\n", __func__, exception, error_code);
92409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
93409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->exception_index = exception;
94409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->error_code = error_code;
9585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner    cpu_loop_exit(env);
96409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
97409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
98409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_raise_exception (uint32_t exception)
99409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    helper_raise_exception_err(exception, 0);
101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_interrupt_restart (void)
104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        !(env->CP0_Status & (1 << CP0St_ERL)) &&
107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        !(env->hflags & MIPS_HFLAG_DM) &&
108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        (env->CP0_Status & (1 << CP0St_IE)) &&
109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        (env->CP0_Status & env->CP0_Cause & CP0Ca_IP_mask)) {
110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_Cause &= ~(0x1f << CP0Ca_EC);
111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_EXT_INTERRUPT);
112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if !defined(CONFIG_USER_ONLY)
116eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turnerstatic void do_restore_state (uintptr_t pc)
117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TranslationBlock *tb;
119c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner
120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tb = tb_find_pc (pc);
121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (tb) {
1223e0677df2819b1366819fe4112dc8464425b6edaDavid 'Digit' Turner        cpu_restore_state (env, pc);
123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(CONFIG_USER_ONLY)
128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_LD(name, insn, type)                                     \
129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline type do_##name(target_ulong addr, int mem_idx)            \
130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                       \
131eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    return (type) cpu_##insn##_raw(env, addr);                                     \
132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_LD(name, insn, type)                                     \
135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline type do_##name(target_ulong addr, int mem_idx)            \
136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                       \
137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (mem_idx)                                                    \
138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    {                                                                   \
139eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    case 0: return (type) cpu_##insn##_kernel(env, addr); break;                   \
140eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    case 1: return (type) cpu_##insn##_super(env, addr); break;                    \
141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:                                                            \
142eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    case 2: return (type) cpu_##insn##_user(env, addr); break;                     \
143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }                                                                   \
144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
146409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD(lbu, ldub, uint8_t)
147409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD(lw, ldl, int32_t)
148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64
149409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD(ld, ldq, int64_t)
150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_LD
152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(CONFIG_USER_ONLY)
154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_ST(name, insn, type)                                     \
155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void do_##name(target_ulong addr, type val, int mem_idx)  \
156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                       \
157eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    cpu_##insn##_raw(env, addr, val);                                              \
158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_ST(name, insn, type)                                     \
161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void do_##name(target_ulong addr, type val, int mem_idx)  \
162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                       \
163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (mem_idx)                                                    \
164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    {                                                                   \
165eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    case 0: cpu_##insn##_kernel(env, addr, val); break;                            \
166eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    case 1: cpu_##insn##_super(env, addr, val); break;                             \
167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:                                                            \
168eca7bc24e45fb6809582795ff88f13384b5ce7dfDavid 'Digit' Turner    case 2: cpu_##insn##_user(env, addr, val); break;                              \
169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }                                                                   \
170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
172409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST(sb, stb, uint8_t)
173409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST(sw, stl, uint32_t)
174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64
175409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST(sd, stq, uint64_t)
176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_ST
178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_clo (target_ulong arg1)
180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return clo32(arg1);
182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_clz (target_ulong arg1)
185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return clz32(arg1);
187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dclo (target_ulong arg1)
191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return clo64(arg1);
193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dclz (target_ulong arg1)
196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return clz64(arg1);
198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */
200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* 64 bits arithmetic for 32 bits hosts */
202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline uint64_t get_HILO (void)
203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)(env->active_tc.HI[0]) << 32) | (uint32_t)env->active_tc.LO[0];
205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void set_HILO (uint64_t HILO)
208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.LO[0] = (int32_t)HILO;
210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.HI[0] = (int32_t)(HILO >> 32);
211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void set_HIT0_LO (target_ulong arg1, uint64_t HILO)
214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF);
216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = env->active_tc.HI[0] = (int32_t)(HILO >> 32);
217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void set_HI_LOT0 (target_ulong arg1, uint64_t HILO)
220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF);
222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.HI[0] = (int32_t)(HILO >> 32);
223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Multiplication variants of the vr54xx. */
226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_muls (target_ulong arg1, target_ulong arg2)
227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HI_LOT0(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulsu (target_ulong arg1, target_ulong arg2)
234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HI_LOT0(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2));
236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_macc (target_ulong arg1, target_ulong arg2)
241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HI_LOT0(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_macchi (target_ulong arg1, target_ulong arg2)
248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_maccu (target_ulong arg1, target_ulong arg2)
255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HI_LOT0(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2));
257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_macchiu (target_ulong arg1, target_ulong arg2)
262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2));
264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msac (target_ulong arg1, target_ulong arg2)
269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HI_LOT0(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msachi (target_ulong arg1, target_ulong arg2)
276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msacu (target_ulong arg1, target_ulong arg2)
283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HI_LOT0(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2));
285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msachiu (target_ulong arg1, target_ulong arg2)
290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2));
292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulhi (target_ulong arg1, target_ulong arg2)
297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2);
299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2)
304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2);
306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulshi (target_ulong arg1, target_ulong arg2)
311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2));
313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2)
318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_HIT0_LO(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2));
320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64
325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_dmult (target_ulong arg1, target_ulong arg2)
326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    muls64(&(env->active_tc.LO[0]), &(env->active_tc.HI[0]), arg1, arg2);
328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_dmultu (target_ulong arg1, target_ulong arg2)
331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    mulu64(&(env->active_tc.LO[0]), &(env->active_tc.HI[0]), arg1, arg2);
333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
338bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnerstatic inline hwaddr do_translate_address(target_ulong address, int rw)
339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
340bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner    hwaddr lladdr;
341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    lladdr = cpu_mips_translate_address(env, address, rw);
343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
344fa32c32d65a3082d4e06a1ba0e48eb40be27e7e0Chris Dearman    if (lladdr == (hwaddr)-1LL) {
34585c62200dbdb7ced04b34cb228098b888a8cd828David 'Digit' Turner        cpu_loop_exit(env);
346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return lladdr;
348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_LD_ATOMIC(name, insn)                                          \
352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_##name(target_ulong arg, int mem_idx)                     \
353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                             \
354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->lladdr = do_translate_address(arg, 0);                               \
355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->llval = do_##insn(arg, mem_idx);                                     \
356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->llval;                                                        \
357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
358409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD_ATOMIC(ll, lw)
359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64
360409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD_ATOMIC(lld, ld)
361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_LD_ATOMIC
363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_ST_ATOMIC(name, ld_insn, st_insn, almask)                      \
365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_##name(target_ulong arg1, target_ulong arg2, int mem_idx) \
366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                             \
367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_long tmp;                                                          \
368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                              \
369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (arg2 & almask) {                                                      \
370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_BadVAddr = arg2;                                             \
371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_AdES);                                    \
372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }                                                                         \
373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (do_translate_address(arg2, 1) == env->lladdr) {                       \
374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_##ld_insn(arg2, mem_idx);                                    \
375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (tmp == env->llval) {                                              \
376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            do_##st_insn(arg2, arg1, mem_idx);                                \
377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return 1;                                                         \
378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }                                                                     \
379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }                                                                         \
380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return 0;                                                                 \
381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
382409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST_ATOMIC(sc, lw, sw, 0x3)
383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64
384409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST_ATOMIC(scd, ld, sd, 0x7)
385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_ST_ATOMIC
387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_WORDS_BIGENDIAN
390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK(v) ((v) & 3)
391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_OFFSET(addr, offset) (addr + (offset))
392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK(v) (((v) & 3) ^ 3)
394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_OFFSET(addr, offset) (addr - (offset))
395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_lwl(target_ulong arg1, target_ulong arg2, int mem_idx)
398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong tmp;
400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tmp = do_lbu(arg2, mem_idx);
402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = (arg1 & 0x00FFFFFF) | (tmp << 24);
403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) <= 2) {
405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 1), mem_idx);
406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFF00FFFF) | (tmp << 16);
407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) <= 1) {
410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 2), mem_idx);
411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFF00FF) | (tmp << 8);
412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) == 0) {
415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 3), mem_idx);
416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFF00) | tmp;
417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (int32_t)arg1;
419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_lwr(target_ulong arg1, target_ulong arg2, int mem_idx)
422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong tmp;
424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tmp = do_lbu(arg2, mem_idx);
426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = (arg1 & 0xFFFFFF00) | tmp;
427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) >= 1) {
429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -1), mem_idx);
430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFF00FF) | (tmp << 8);
431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) >= 2) {
434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -2), mem_idx);
435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFF00FFFF) | (tmp << 16);
436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) == 3) {
439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -3), mem_idx);
440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0x00FFFFFF) | (tmp << 24);
441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (int32_t)arg1;
443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_swl(target_ulong arg1, target_ulong arg2, int mem_idx)
446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do_sb(arg2, (uint8_t)(arg1 >> 24), mem_idx);
448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) <= 2)
450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 16), mem_idx);
451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) <= 1)
453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 8), mem_idx);
454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) == 0)
456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 3), (uint8_t)arg1, mem_idx);
457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_swr(target_ulong arg1, target_ulong arg2, int mem_idx)
460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do_sb(arg2, (uint8_t)arg1, mem_idx);
462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) >= 1)
464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx);
465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) >= 2)
467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx);
468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK(arg2) == 3)
470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx);
471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* "half" load and stores.  We must do the memory access inline,
475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   or fault handling won't work.  */
476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_WORDS_BIGENDIAN
478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK64(v) ((v) & 7)
479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else
480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK64(v) (((v) & 7) ^ 7)
481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_ldl(target_ulong arg1, target_ulong arg2, int mem_idx)
484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t tmp;
486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tmp = do_lbu(arg2, mem_idx);
488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = (arg1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56);
489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 6) {
491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 1), mem_idx);
492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48);
493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 5) {
496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 2), mem_idx);
497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40);
498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 4) {
501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 3), mem_idx);
502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32);
503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 3) {
506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 4), mem_idx);
507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24);
508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 2) {
511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 5), mem_idx);
512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16);
513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 1) {
516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 6), mem_idx);
517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8);
518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) == 0) {
521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, 7), mem_idx);
522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFFFFFFFF00ULL) | tmp;
523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_ldr(target_ulong arg1, target_ulong arg2, int mem_idx)
529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t tmp;
531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tmp = do_lbu(arg2, mem_idx);
533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = (arg1 & 0xFFFFFFFFFFFFFF00ULL) | tmp;
534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 1) {
536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -1), mem_idx);
537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFFFFFF00FFULL) | (tmp  << 8);
538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 2) {
541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -2), mem_idx);
542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16);
543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 3) {
546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -3), mem_idx);
547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24);
548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 4) {
551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -4), mem_idx);
552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32);
553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 5) {
556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -5), mem_idx);
557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40);
558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 6) {
561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -6), mem_idx);
562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48);
563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) == 7) {
566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp = do_lbu(GET_OFFSET(arg2, -7), mem_idx);
567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (arg1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56);
568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_sdl(target_ulong arg1, target_ulong arg2, int mem_idx)
574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do_sb(arg2, (uint8_t)(arg1 >> 56), mem_idx);
576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 6)
578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 48), mem_idx);
579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 5)
581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 40), mem_idx);
582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 4)
584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 3), (uint8_t)(arg1 >> 32), mem_idx);
585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 3)
587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 4), (uint8_t)(arg1 >> 24), mem_idx);
588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 2)
590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 5), (uint8_t)(arg1 >> 16), mem_idx);
591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 1)
593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 6), (uint8_t)(arg1 >> 8), mem_idx);
594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) <= 0)
596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, 7), (uint8_t)arg1, mem_idx);
597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_sdr(target_ulong arg1, target_ulong arg2, int mem_idx)
600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do_sb(arg2, (uint8_t)arg1, mem_idx);
602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 1)
604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx);
605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 2)
607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx);
608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 3)
610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx);
611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 4)
613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -4), (uint8_t)(arg1 >> 32), mem_idx);
614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 5)
616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -5), (uint8_t)(arg1 >> 40), mem_idx);
617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) >= 6)
619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -6), (uint8_t)(arg1 >> 48), mem_idx);
620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_LMASK64(arg2) == 7)
622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        do_sb(GET_OFFSET(arg2, -7), (uint8_t)(arg1 >> 56), mem_idx);
623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */
625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
627c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner/* tc should point to an int with the value of the global TC index.
628c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner   This function will transform it into a local index within the
629c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner   returned CPUState.
630c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner
631c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner   FIXME: This code assumes that all VPEs have the same number of TCs,
632c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner          which depends on runtime setup. Can probably be fixed by
633c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner          walking the list of CPUStates.  */
634c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turnerstatic CPUMIPSState *mips_cpu_map_tc(int *tc)
635c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner{
636c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other;
637c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    int vpe_idx, nr_threads = env->nr_threads;
638c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    int tc_idx = *tc;
639c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner
640c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (!(env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP))) {
641c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        /* Not allowed to address other CPUs.  */
642c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        *tc = env->current_tc;
643c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return env;
644c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    }
645c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner
646c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    vpe_idx = tc_idx / nr_threads;
647c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    *tc = tc_idx % nr_threads;
648c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    other = qemu_get_cpu(vpe_idx);
649c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    return other ? other : env;
650c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner}
651c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner
652811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner/* The per VPE CP0_Status register shares some fields with the per TC
653811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner   CP0_TCStatus registers. These fields are wired to the same registers,
654811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner   so changes to either of them should be reflected on both registers.
655811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
656811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner   Also, EntryHi shares the bottom 8 bit ASID with TCStauts.
657811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
658811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner   These helper call synchronizes the regs for a given cpu.  */
659811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
660811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner/* Called for updates to CP0_Status.  */
661811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turnerstatic void sync_c0_status(CPUMIPSState *cpu, int tc)
662811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner{
663811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    int32_t tcstatus, *tcst;
664811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t v = cpu->CP0_Status;
665811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t cu, mx, asid, ksu;
666811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t mask = ((1 << CP0TCSt_TCU3)
667811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0TCSt_TCU2)
668811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0TCSt_TCU1)
669811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0TCSt_TCU0)
670811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0TCSt_TMX)
671811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (3 << CP0TCSt_TKSU)
672811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (0xff << CP0TCSt_TASID));
673811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
674811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    cu = (v >> CP0St_CU0) & 0xf;
675811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    mx = (v >> CP0St_MX) & 0x1;
676811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    ksu = (v >> CP0St_KSU) & 0x3;
677811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    asid = env->CP0_EntryHi & 0xff;
678811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
679811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tcstatus = cu << CP0TCSt_TCU0;
680811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tcstatus |= mx << CP0TCSt_TMX;
681811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tcstatus |= ksu << CP0TCSt_TKSU;
682811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tcstatus |= asid;
683811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
684811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    if (tc == cpu->current_tc) {
685811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        tcst = &cpu->active_tc.CP0_TCStatus;
686811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    } else {
687811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        tcst = &cpu->tcs[tc].CP0_TCStatus;
688811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    }
689811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
690811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    *tcst &= ~mask;
691811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    *tcst |= tcstatus;
692811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    compute_hflags(cpu);
693811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner}
694811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
695811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner/* Called for updates to CP0_TCStatus.  */
696811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turnerstatic void sync_c0_tcstatus(CPUMIPSState *cpu, int tc, target_ulong v)
697811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner{
698811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t status;
699811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t tcu, tmx, tasid, tksu;
700811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t mask = ((1 << CP0St_CU3)
701811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0St_CU2)
702811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0St_CU1)
703811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0St_CU0)
704811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (1 << CP0St_MX)
705811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner                       | (3 << CP0St_KSU));
706811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
707811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tcu = (v >> CP0TCSt_TCU0) & 0xf;
708811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tmx = (v >> CP0TCSt_TMX) & 0x1;
709811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tasid = v & 0xff;
710811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    tksu = (v >> CP0TCSt_TKSU) & 0x3;
711811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
712811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    status = tcu << CP0St_CU0;
713811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    status |= tmx << CP0St_MX;
714811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    status |= tksu << CP0St_KSU;
715811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
716811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    cpu->CP0_Status &= ~mask;
717811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    cpu->CP0_Status |= status;
718811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
719811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    /* Sync the TASID with EntryHi.  */
720811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    cpu->CP0_EntryHi &= ~0xff;
721811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    cpu->CP0_EntryHi = tasid;
722811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
723811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    compute_hflags(cpu);
724811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner}
725811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
726811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner/* Called for updates to CP0_EntryHi.  */
727811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turnerstatic void sync_c0_entryhi(CPUMIPSState *cpu, int tc)
728811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner{
729811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    int32_t *tcst;
730811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    uint32_t asid, v = cpu->CP0_EntryHi;
731811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
732811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    asid = v & 0xff;
733811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
734811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    if (tc == cpu->current_tc) {
735811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        tcst = &cpu->active_tc.CP0_TCStatus;
736811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    } else {
737811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        tcst = &cpu->tcs[tc].CP0_TCStatus;
738811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    }
739811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
740811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    *tcst &= ~0xff;
741811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    *tcst |= asid;
742811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner}
743811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* CP0 helpers */
745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_mvpcontrol (void)
746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->mvp->CP0_MVPControl;
748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_mvpconf0 (void)
751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->mvp->CP0_MVPConf0;
753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_mvpconf1 (void)
756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->mvp->CP0_MVPConf1;
758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_random (void)
761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (int32_t)cpu_mips_get_random(env);
763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcstatus (void)
766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCStatus;
768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcstatus(void)
771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
773c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
775c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
776c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.CP0_TCStatus;
777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
778c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].CP0_TCStatus;
779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcbind (void)
782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCBind;
784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcbind(void)
787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
789c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
791c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
792c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.CP0_TCBind;
793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
794c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].CP0_TCBind;
795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcrestart (void)
798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.PC;
800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcrestart(void)
803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
805c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
807c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
808c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.PC;
809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
810c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].PC;
811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tchalt (void)
814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCHalt;
816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tchalt(void)
819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
821c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
823c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
824c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.CP0_TCHalt;
825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
826c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].CP0_TCHalt;
827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tccontext (void)
830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCContext;
832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tccontext(void)
835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
837c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
839c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
840c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.CP0_TCContext;
841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
842c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].CP0_TCContext;
843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcschedule (void)
846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCSchedule;
848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcschedule(void)
851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
853c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
855c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
856c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.CP0_TCSchedule;
857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
858c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].CP0_TCSchedule;
859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcschefback (void)
862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCScheFBack;
864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcschefback(void)
867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
869c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
871c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
872c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.CP0_TCScheFBack;
873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
874c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].CP0_TCScheFBack;
875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_count (void)
878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (int32_t)cpu_mips_get_count(env);
880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_entryhi(void)
883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
885c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
887811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    return other->CP0_EntryHi;
888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_status(void)
891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
893c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
895811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    return other->CP0_Status;
896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_lladdr (void)
899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (int32_t)(env->lladdr >> env->CP0_LLAddr_shift);
901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_watchlo (uint32_t sel)
904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (int32_t)env->CP0_WatchLo[sel];
906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_watchhi (uint32_t sel)
909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->CP0_WatchHi[sel];
911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_debug (void)
914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong t0 = env->CP0_Debug;
916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->hflags & MIPS_HFLAG_DM)
917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        t0 |= 1 << CP0DB_DM;
918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return t0;
920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_debug(void)
923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int32_t tcstatus;
926c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
928c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
929c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        tcstatus = other->active_tc.CP0_Debug_tcstatus;
930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
931c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        tcstatus = other->tcs[other_tc].CP0_Debug_tcstatus;
932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* XXX: Might be wrong, check with EJTAG spec. */
934c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    return (other->CP0_Debug & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) |
935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            (tcstatus & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt)));
936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tcrestart (void)
940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.PC;
942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tchalt (void)
945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCHalt;
947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tccontext (void)
950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCContext;
952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tcschedule (void)
955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCSchedule;
957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tcschefback (void)
960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->active_tc.CP0_TCScheFBack;
962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_lladdr (void)
965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->lladdr >> env->CP0_LLAddr_shift;
967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_watchlo (uint32_t sel)
970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->CP0_WatchLo[sel];
972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */
974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_index (target_ulong arg1)
976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int num = 1;
978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    unsigned int tmp = env->tlb->nb_tlb;
979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do {
981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tmp >>= 1;
982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        num <<= 1;
983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } while (tmp);
984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Index = (env->CP0_Index & 0x80000000) | (arg1 & (num - 1));
985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_mvpcontrol (target_ulong arg1)
988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = 0;
990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP))
993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= (1 << CP0MVPCo_CPA) | (1 << CP0MVPCo_VPC) |
994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                (1 << CP0MVPCo_EVP);
995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= (1 << CP0MVPCo_STLB);
997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    newval = (env->mvp->CP0_MVPControl & ~mask) | (arg1 & mask);
998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: Enable/disable shared TLB, enable/disable VPEs.
1000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->mvp->CP0_MVPControl = newval;
1002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpecontrol (target_ulong arg1)
1005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask;
1007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
1008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    mask = (1 << CP0VPECo_YSI) | (1 << CP0VPECo_GSI) |
1010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (1 << CP0VPECo_TE) | (0xff << CP0VPECo_TargTC);
1011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    newval = (env->CP0_VPEControl & ~mask) | (arg1 & mask);
1012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Yield scheduler intercept not implemented. */
1014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Gating storage scheduler intercept not implemented. */
1015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: Enable/disable TCs.
1017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_VPEControl = newval;
1019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpeconf0 (target_ulong arg1)
1022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = 0;
1024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
1025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) {
1027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_VPEConf0 & (1 << CP0VPEC0_VPA))
1028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            mask |= (0xff << CP0VPEC0_XTC);
1029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
1030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    newval = (env->CP0_VPEConf0 & ~mask) | (arg1 & mask);
1032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: TC exclusive handling due to ERL/EXL.
1034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_VPEConf0 = newval;
1036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpeconf1 (target_ulong arg1)
1039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = 0;
1041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
1042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= (0xff << CP0VPEC1_NCX) | (0xff << CP0VPEC1_NCP2) |
1045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                (0xff << CP0VPEC1_NCP1);
1046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    newval = (env->CP0_VPEConf1 & ~mask) | (arg1 & mask);
1047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* UDI not implemented. */
1049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* CP2 not implemented. */
1050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: Handle FPU (CP1) binding.
1052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_VPEConf1 = newval;
1054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_yqmask (target_ulong arg1)
1057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Yield qualifier inputs not implemented. */
1059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_YQMask = 0x00000000;
1060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpeopt (target_ulong arg1)
1063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_VPEOpt = arg1 & 0x0000ffff;
1065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_entrylo0 (target_ulong arg1)
1068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Large physaddr (PABITS) not implemented */
1070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* 1k pages not implemented */
1071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EntryLo0 = arg1 & 0x3FFFFFFF;
1072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcstatus (target_ulong arg1)
1075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = env->CP0_TCStatus_rw_bitmask;
1077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
1078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    newval = (env->active_tc.CP0_TCStatus & ~mask) | (arg1 & mask);
1080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCStatus = newval;
1082811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    sync_c0_tcstatus(env, env->current_tc, newval);
1083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcstatus (target_ulong arg1)
1086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1088c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1090c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1091c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCStatus = arg1;
1092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1093c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCStatus = arg1;
1094811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    sync_c0_tcstatus(other, other_tc, arg1);
1095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcbind (target_ulong arg1)
1098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = (1 << CP0TCBd_TBE);
1100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
1101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= (1 << CP0TCBd_CurVPE);
1104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    newval = (env->active_tc.CP0_TCBind & ~mask) | (arg1 & mask);
1105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCBind = newval;
1106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcbind (target_ulong arg1)
1109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = (1 << CP0TCBd_TBE);
1112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t newval;
1113c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1115c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= (1 << CP0TCBd_CurVPE);
1117c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc) {
1118c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        newval = (other->active_tc.CP0_TCBind & ~mask) | (arg1 & mask);
1119c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCBind = newval;
1120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
1121c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        newval = (other->tcs[other_tc].CP0_TCBind & ~mask) | (arg1 & mask);
1122c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCBind = newval;
1123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcrestart (target_ulong arg1)
1127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.PC = arg1;
1129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS);
1130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->lladdr = 0ULL;
1131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* MIPS16 not implemented. */
1132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcrestart (target_ulong arg1)
1135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1137c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1139c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc) {
1140c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.PC = arg1;
1141c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS);
1142c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->lladdr = 0ULL;
1143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* MIPS16 not implemented. */
1144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
1145c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].PC = arg1;
1146c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCStatus &= ~(1 << CP0TCSt_TDS);
1147c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->lladdr = 0ULL;
1148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* MIPS16 not implemented. */
1149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tchalt (target_ulong arg1)
1153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCHalt = arg1 & 0x1;
1155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: Halt TC / Restart (if allocated+active) TC.
1157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tchalt (target_ulong arg1)
1160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1162c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: Halt TC / Restart (if allocated+active) TC.
1165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1166c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1167c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCHalt = arg1;
1168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1169c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCHalt = arg1;
1170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tccontext (target_ulong arg1)
1173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCContext = arg1;
1175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tccontext (target_ulong arg1)
1178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1180c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1182c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1183c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCContext = arg1;
1184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1185c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCContext = arg1;
1186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcschedule (target_ulong arg1)
1189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCSchedule = arg1;
1191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcschedule (target_ulong arg1)
1194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1196c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1198c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1199c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCSchedule = arg1;
1200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1201c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCSchedule = arg1;
1202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcschefback (target_ulong arg1)
1205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.CP0_TCScheFBack = arg1;
1207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcschefback (target_ulong arg1)
1210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1212c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1214c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1215c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_TCScheFBack = arg1;
1216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1217c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_TCScheFBack = arg1;
1218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_entrylo1 (target_ulong arg1)
1221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Large physaddr (PABITS) not implemented */
1223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* 1k pages not implemented */
1224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EntryLo1 = arg1 & 0x3FFFFFFF;
1225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_context (target_ulong arg1)
1228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Context = (env->CP0_Context & 0x007FFFFF) | (arg1 & ~0x007FFFFF);
1230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_pagemask (target_ulong arg1)
1233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* 1k pages not implemented */
1235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_PageMask = arg1 & (0x1FFFFFFF & (TARGET_PAGE_MASK << 1));
1236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_pagegrain (target_ulong arg1)
1239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* SmartMIPS not implemented */
1241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Large physaddr (PABITS) not implemented */
1242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* 1k pages not implemented */
1243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_PageGrain = 0;
1244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_wired (target_ulong arg1)
1247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Wired = arg1 % env->tlb->nb_tlb;
1249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf0 (target_ulong arg1)
1252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf0 |= arg1 & env->CP0_SRSConf0_rw_bitmask;
1254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf1 (target_ulong arg1)
1257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf1 |= arg1 & env->CP0_SRSConf1_rw_bitmask;
1259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf2 (target_ulong arg1)
1262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf2 |= arg1 & env->CP0_SRSConf2_rw_bitmask;
1264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf3 (target_ulong arg1)
1267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf3 |= arg1 & env->CP0_SRSConf3_rw_bitmask;
1269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf4 (target_ulong arg1)
1272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSConf4 |= arg1 & env->CP0_SRSConf4_rw_bitmask;
1274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_hwrena (target_ulong arg1)
1277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_HWREna = arg1 & 0x0000000F;
1279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_count (target_ulong arg1)
1282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_mips_store_count(env, arg1);
1284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_entryhi (target_ulong arg1)
1287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong old, val;
1289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* 1k pages not implemented */
1291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    val = arg1 & ((TARGET_PAGE_MASK << 1) | 0xFF);
1292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    val &= env->SEGMask;
1294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    old = env->CP0_EntryHi;
1296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EntryHi = val;
1297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->CP0_Config3 & (1 << CP0C3_MT)) {
1298811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        sync_c0_entryhi(env, env->current_tc);
1299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* If the ASID changes, flush qemu's TLB.  */
1301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((old & 0xFF) != (val & 0xFF))
1302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_mips_tlb_flush(env, 1);
1303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_entryhi(target_ulong arg1)
1306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1308c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1310811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    other->CP0_EntryHi = arg1;
1311811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    sync_c0_entryhi(other, other_tc);
1312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_compare (target_ulong arg1)
1315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_mips_store_compare(env, arg1);
1317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_status (target_ulong arg1)
1320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t val, old;
1322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = env->CP0_Status_rw_bitmask;
1323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    val = arg1 & mask;
1325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    old = env->CP0_Status;
1326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Status = (env->CP0_Status & ~mask) | val;
1327811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    if (env->CP0_Config3 & (1 << CP0C3_MT)) {
1328811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        sync_c0_status(env, env->current_tc);
1329811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    } else {
1330811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner        compute_hflags(env);
1331811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    }
1332811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner
1333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
1334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("Status %08x (%08x) => %08x (%08x) Cause %08x",
1335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                old, old & env->CP0_Cause & CP0Ca_IP_mask,
1336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                val, val & env->CP0_Cause & CP0Ca_IP_mask,
1337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->CP0_Cause);
1338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (env->hflags & MIPS_HFLAG_KSU) {
1339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_UM: qemu_log(", UM\n"); break;
1340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_SM: qemu_log(", SM\n"); break;
1341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_KM: qemu_log("\n"); break;
1342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default: cpu_abort(env, "Invalid MMU mode!\n"); break;
1343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_mips_update_irq(env);
1346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_status(target_ulong arg1)
1349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1351c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1353c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    other->CP0_Status = arg1 & ~0xf1000018;
1354811b0299ba969b708c7c15b50ebe205b87877a08David 'Digit' Turner    sync_c0_status(other, other_tc);
1355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_intctl (target_ulong arg1)
1358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* vectored interrupts not implemented, no performance counters. */
1360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_IntCtl = (env->CP0_IntCtl & ~0x000002e0) | (arg1 & 0x000002e0);
1361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsctl (target_ulong arg1)
1364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = (0xf << CP0SRSCtl_ESS) | (0xf << CP0SRSCtl_PSS);
1366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_SRSCtl = (env->CP0_SRSCtl & ~mask) | (arg1 & mask);
1367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_cause (target_ulong arg1)
1370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t mask = 0x00C00300;
1372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t old = env->CP0_Cause;
1373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->insn_flags & ISA_MIPS32R2)
1375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask |= 1 << CP0Ca_DC;
1376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Cause = (env->CP0_Cause & ~mask) | (arg1 & mask);
1378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((old ^ env->CP0_Cause) & (1 << CP0Ca_DC)) {
1380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_Cause & (1 << CP0Ca_DC))
1381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cpu_mips_stop_count(env);
1382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        else
1383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            cpu_mips_start_count(env);
1384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Handle the software interrupt as an hardware one, as they
1387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       are very similar */
1388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (arg1 & CP0Ca_IP_mask) {
1389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_mips_update_irq(env);
1390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_ebase (target_ulong arg1)
1394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* vectored interrupts not implemented */
1396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Multi-CPU not implemented */
1397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EBase = 0x80000000 | (arg1 & 0x3FFFF000);
1398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_config0 (target_ulong arg1)
1401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config0 = (env->CP0_Config0 & 0x81FFFFF8) | (arg1 & 0x00000007);
1403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_config2 (target_ulong arg1)
1406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* tertiary/secondary caches not implemented */
1408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF);
1409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_lladdr (target_ulong arg1)
1412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_long mask = env->CP0_LLAddr_rw_bitmask;
1414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = arg1 << env->CP0_LLAddr_shift;
1415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->lladdr = (env->lladdr & ~mask) | (arg1 & mask);
1416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_watchlo (target_ulong arg1, uint32_t sel)
1419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* Watch exceptions for instructions, data loads, data stores
1421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       not implemented. */
1422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_WatchLo[sel] = (arg1 & ~0x7);
1423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_watchhi (target_ulong arg1, uint32_t sel)
1426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_WatchHi[sel] = (arg1 & 0x40FF0FF8);
1428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_WatchHi[sel] &= ~(env->CP0_WatchHi[sel] & arg1 & 0x7);
1429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_xcontext (target_ulong arg1)
1432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong mask = (1ULL << (env->SEGBITS - 7)) - 1;
1434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_XContext = (env->CP0_XContext & mask) | (arg1 & ~mask);
1435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_framemask (target_ulong arg1)
1438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Framemask = arg1; /* XXX */
1440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_debug (target_ulong arg1)
1443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (arg1 & 0x13300120);
1445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (arg1 & (1 << CP0DB_DM))
1446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->hflags |= MIPS_HFLAG_DM;
1447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->hflags &= ~MIPS_HFLAG_DM;
1449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_debug(target_ulong arg1)
1452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t val = arg1 & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt));
1455c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* XXX: Might be wrong, check with EJTAG spec. */
1458c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1459c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.CP0_Debug_tcstatus = val;
1460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1461c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].CP0_Debug_tcstatus = val;
1462c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    other->CP0_Debug = (other->CP0_Debug &
1463c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner                     ((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) |
1464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     (arg1 & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt)));
1465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_performance0 (target_ulong arg1)
1468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Performance0 = arg1 & 0x000007ff;
1470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_taglo (target_ulong arg1)
1473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_TagLo = arg1 & 0xFFFFFCF6;
1475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_datalo (target_ulong arg1)
1478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_DataLo = arg1; /* XXX */
1480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_taghi (target_ulong arg1)
1483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_TagHi = arg1; /* XXX */
1485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_datahi (target_ulong arg1)
1488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_DataHi = arg1; /* XXX */
1490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS MT functions */
1493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftgpr(uint32_t sel)
1494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1496c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1498c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1499c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.gpr[sel];
1500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1501c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].gpr[sel];
1502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftlo(uint32_t sel)
1505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1507c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1509c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1510c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.LO[sel];
1511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1512c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].LO[sel];
1513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfthi(uint32_t sel)
1516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1518c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1520c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1521c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.HI[sel];
1522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1523c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].HI[sel];
1524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftacx(uint32_t sel)
1527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1529c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1531c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1532c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.ACX[sel];
1533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1534c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].ACX[sel];
1535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftdsp(void)
1538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1540c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1542c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1543c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->active_tc.DSPControl;
1544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1545c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        return other->tcs[other_tc].DSPControl;
1546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttgpr(target_ulong arg1, uint32_t sel)
1549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1551c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1553c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1554c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.gpr[sel] = arg1;
1555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1556c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].gpr[sel] = arg1;
1557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttlo(target_ulong arg1, uint32_t sel)
1560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1562c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1564c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1565c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.LO[sel] = arg1;
1566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1567c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].LO[sel] = arg1;
1568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtthi(target_ulong arg1, uint32_t sel)
1571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1573c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1575c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1576c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.HI[sel] = arg1;
1577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1578c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].HI[sel] = arg1;
1579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttacx(target_ulong arg1, uint32_t sel)
1582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1584c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1586c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1587c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.ACX[sel] = arg1;
1588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1589c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].ACX[sel] = arg1;
1590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttdsp(target_ulong arg1)
1593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1595c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    CPUMIPSState *other = mips_cpu_map_tc(&other_tc);
1596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1597c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner    if (other_tc == other->current_tc)
1598c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->active_tc.DSPControl = arg1;
1599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1600c8ba4e8ec5a6b3ff95dcd7d2c61d88363e5699baDavid 'Digit' Turner        other->tcs[other_tc].DSPControl = arg1;
1601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS MT functions */
1604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmt(target_ulong arg1)
1605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO
1607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = 0;
1608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // rt = arg1
1609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
1611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_emt(target_ulong arg1)
1614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO
1616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = 0;
1617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // rt = arg1
1618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
1620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dvpe(target_ulong arg1)
1623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO
1625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = 0;
1626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // rt = arg1
1627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
1629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_evpe(target_ulong arg1)
1632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO
1634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = 0;
1635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // rt = arg1
1636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
1638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
1640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_fork(target_ulong arg1, target_ulong arg2)
1642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // arg1 = rt, arg2 = rs
1644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    arg1 = 0;
1645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    // TODO: store to TC register
1646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_yield(target_ulong arg1)
1649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (arg1 < 0) {
1651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* No scheduling policy implemented. */
1652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (arg1 != -2) {
1653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (env->CP0_VPEControl & (1 << CP0VPECo_YSI) &&
1654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->active_tc.CP0_TCStatus & (1 << CP0TCSt_DT)) {
1655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT);
1656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->CP0_VPEControl |= 4 << CP0VPECo_EXCPT;
1657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                helper_raise_exception(EXCP_THREAD);
1658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
1659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else if (arg1 == 0) {
1661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (0 /* TODO: TC underflow */) {
1662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT);
1663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            helper_raise_exception(EXCP_THREAD);
1664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        } else {
1665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            // TODO: Deallocate TC
1666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else if (arg1 > 0) {
1668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Yield qualifier inputs not implemented. */
1669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT);
1670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_VPEControl |= 2 << CP0VPECo_EXCPT;
1671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_THREAD);
1672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return env->CP0_YQMask;
1674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY
1677e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turnerstatic void inline r4k_invalidate_tlb_shadow (CPUMIPSState *env, int idx)
1678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
167955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_tlb_t *tlb;
168055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    uint8_t ASID = env->CP0_EntryHi & 0xFF;
168155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
168255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    tlb = &env->tlb->mmu.r4k.tlb[idx];
168355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /* The qemu TLB is flushed when the ASID changes, so no need to
168455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    flush these entries again.  */
168555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    if (tlb->G == 0 && tlb->ASID != ASID) {
168655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        return;
168755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    }
1688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1690e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turnerstatic void inline r4k_invalidate_tlb (CPUMIPSState *env, int idx)
1691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
169255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_tlb_t *tlb;
169355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    target_ulong addr;
169455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    target_ulong end;
169555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    uint8_t ASID = env->CP0_EntryHi & 0xFF;
169655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    target_ulong mask;
169755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
169855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    tlb = &env->tlb->mmu.r4k.tlb[idx];
169955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /* The qemu TLB is flushed when the ASID changes, so no need to
170055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    flush these entries again.  */
170155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    if (tlb->G == 0 && tlb->ASID != ASID) {
170255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        return;
1703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
170455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
170555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /* 1k pages are not supported. */
170655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1);
170755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    if (tlb->V0) {
170855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        addr = tlb->VPN & ~mask;
170955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#if defined(TARGET_MIPS64)
171055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) {
171155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            addr |= 0x3FFFFF0000000000ULL;
171255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        }
171355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#endif
171455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        end = addr | (mask >> 1);
171555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        while (addr < end) {
171655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb_flush_page (env, addr);
171755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            addr += TARGET_PAGE_SIZE;
171855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        }
171955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    }
172055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    if (tlb->V1) {
172155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        addr = (tlb->VPN & ~mask) | ((mask >> 1) + 1);
172255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#if defined(TARGET_MIPS64)
172355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) {
172455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            addr |= 0x3FFFFF0000000000ULL;
172555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        }
172655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#endif
172755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        end = addr | mask;
172855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        while (addr - 1 < end) {
172955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb_flush_page (env, addr);
173055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            addr += TARGET_PAGE_SIZE;
173155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        }
173255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    }
173355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman}
173455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
173555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman/* TLB management */
1736e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turnervoid cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global)
173755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman{
173855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /* Flush qemu's TLB and discard all shadowed entries.  */
173955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    tlb_flush (env, flush_global);
1740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void r4k_fill_tlb (int idx)
1743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    r4k_tlb_t *tlb;
1745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* XXX: detect conflicting TLBs and raise a MCHECK exception when needed */
1747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb = &env->tlb->mmu.r4k.tlb[idx];
1748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->VPN = env->CP0_EntryHi & (TARGET_PAGE_MASK << 1);
1749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64)
1750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->VPN &= env->SEGMask;
1751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif
1752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->ASID = env->CP0_EntryHi & 0xFF;
1753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->PageMask = env->CP0_PageMask;
1754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->G = env->CP0_EntryLo0 & env->CP0_EntryLo1 & 1;
1755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->V0 = (env->CP0_EntryLo0 & 2) != 0;
1756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->D0 = (env->CP0_EntryLo0 & 4) != 0;
1757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->C0 = (env->CP0_EntryLo0 >> 3) & 0x7;
1758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->PFN[0] = (env->CP0_EntryLo0 >> 6) << 12;
1759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->V1 = (env->CP0_EntryLo1 & 2) != 0;
1760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->D1 = (env->CP0_EntryLo1 & 4) != 0;
1761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->C1 = (env->CP0_EntryLo1 >> 3) & 0x7;
1762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    tlb->PFN[1] = (env->CP0_EntryLo1 >> 6) << 12;
1763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1765e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turnervoid r4k_helper_ptw_tlbrefill(CPUMIPSState *target_env)
176655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman{
1767e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turner   CPUMIPSState *saved_env;
176855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
176955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman   /* Save current 'env' value */
177055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman   saved_env = env;
177155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman   env = target_env;
177255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
177355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman   /* Do TLB load on behalf of Page Table Walk */
177455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    int r = cpu_mips_get_random(env);
177555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_invalidate_tlb_shadow(env, r);
177655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_fill_tlb(r);
177755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
177855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman   /* Restore 'env' value */
177955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman   env = saved_env;
178055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman}
178155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman
1782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbwi (void)
1783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
178455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_tlb_t *tlb;
178555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    target_ulong tag;
178655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    target_ulong VPN;
178755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    target_ulong mask;
1788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
178955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /* If tlbwi is trying to upgrading access permissions on current entry,
179055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman     * we do not need to flush tlb hash table.
179155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman     */
179255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    tlb = &env->tlb->mmu.r4k.tlb[env->CP0_Index % env->tlb->nb_tlb];
179355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1);
179455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    tag = env->CP0_EntryHi & ~mask;
179555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    VPN = tlb->VPN & ~mask;
179655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    if (VPN == tag)
179755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    {
179855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        if (tlb->ASID == (env->CP0_EntryHi & 0xFF))
179955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        {
180055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->V0 = (env->CP0_EntryLo0 & 2) != 0;
180155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->D0 = (env->CP0_EntryLo0 & 4) != 0;
180255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->C0 = (env->CP0_EntryLo0 >> 3) & 0x7;
180355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->PFN[0] = (env->CP0_EntryLo0 >> 6) << 12;
180455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->V1 = (env->CP0_EntryLo1 & 2) != 0;
180555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->D1 = (env->CP0_EntryLo1 & 4) != 0;
180655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->C1 = (env->CP0_EntryLo1 >> 3) & 0x7;
180755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            tlb->PFN[1] = (env->CP0_EntryLo1 >> 6) << 12;
180855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman            return;
180955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        }
181055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    }
1811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
181255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /*flush all the tlb cache */
181355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    cpu_mips_tlb_flush (env, 1);
1814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
181555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_invalidate_tlb(env, env->CP0_Index % env->tlb->nb_tlb);
181655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_fill_tlb(env->CP0_Index % env->tlb->nb_tlb);
1817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbwr (void)
1820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int r = cpu_mips_get_random(env);
1822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
182355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    r4k_invalidate_tlb_shadow(env, r);
1824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    r4k_fill_tlb(r);
1825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbp (void)
1828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    r4k_tlb_t *tlb;
1830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong mask;
1831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong tag;
1832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong VPN;
1833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint8_t ASID;
1834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int i;
1835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ASID = env->CP0_EntryHi & 0xFF;
1837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    for (i = 0; i < env->tlb->nb_tlb; i++) {
1838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tlb = &env->tlb->mmu.r4k.tlb[i];
1839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* 1k pages are not supported. */
1840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1);
1841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        tag = env->CP0_EntryHi & ~mask;
1842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        VPN = tlb->VPN & ~mask;
1843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Check ASID, virtual page number & size */
184455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        if (unlikely((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag)) {
1845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* TLB match */
1846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            env->CP0_Index = i;
1847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            break;
1848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (i == env->tlb->nb_tlb) {
185155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        /* No match.  Discard any shadow entries, if any of them match. */
185255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        int index = ((env->CP0_EntryHi>>5)&0x1ff00) | ASID;
185355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman        index |= (env->CP0_EntryHi>>13)&0x20000;
1854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_Index |= 0x80000000;
1855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbr (void)
1859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    r4k_tlb_t *tlb;
1861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint8_t ASID;
1862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    ASID = env->CP0_EntryHi & 0xFF;
186455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    tlb = &env->tlb->mmu.r4k.tlb[env->CP0_Index % env->tlb->nb_tlb];
1865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* If this will change the current ASID, flush qemu's TLB.  */
1867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ASID != tlb->ASID)
1868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        cpu_mips_tlb_flush (env, 1);
1869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
187055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    /*flush all the tlb cache */
187155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman    cpu_mips_tlb_flush (env, 1);
1872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EntryHi = tlb->VPN | tlb->ASID;
1874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_PageMask = tlb->PageMask;
1875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EntryLo0 = tlb->G | (tlb->V0 << 1) | (tlb->D0 << 2) |
1876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        (tlb->C0 << 3) | (tlb->PFN[0] >> 6);
1877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_EntryLo1 = tlb->G | (tlb->V1 << 1) | (tlb->D1 << 2) |
1878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                        (tlb->C1 << 3) | (tlb->PFN[1] >> 6);
1879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbwi(void)
1882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->tlb->helper_tlbwi();
1884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbwr(void)
1887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->tlb->helper_tlbwr();
1889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbp(void)
1892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->tlb->helper_tlbp();
1894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbr(void)
1897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->tlb->helper_tlbr();
1899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Specials */
1902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_di (void)
1903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong t0 = env->CP0_Status;
1905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Status = t0 & ~(1 << CP0St_IE);
1907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_mips_update_irq(env);
1908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return t0;
1910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_ei (void)
1913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong t0 = env->CP0_Status;
1915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_Status = t0 | (1 << CP0St_IE);
1917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    cpu_mips_update_irq(env);
1918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return t0;
1920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void debug_pre_eret (void)
1923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
1925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("ERET: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx,
1926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->active_tc.PC, env->CP0_EPC);
1927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_Status & (1 << CP0St_ERL))
1928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            qemu_log(" ErrorEPC " TARGET_FMT_lx, env->CP0_ErrorEPC);
1929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->hflags & MIPS_HFLAG_DM)
1930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC);
1931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("\n");
1932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void debug_post_eret (void)
1936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
1938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        qemu_log("  =>  PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx,
1939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                env->active_tc.PC, env->CP0_EPC);
1940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->CP0_Status & (1 << CP0St_ERL))
1941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            qemu_log(" ErrorEPC " TARGET_FMT_lx, env->CP0_ErrorEPC);
1942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->hflags & MIPS_HFLAG_DM)
1943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC);
1944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        switch (env->hflags & MIPS_HFLAG_KSU) {
1945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_UM: qemu_log(", UM\n"); break;
1946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_SM: qemu_log(", SM\n"); break;
1947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        case MIPS_HFLAG_KM: qemu_log("\n"); break;
1948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        default: cpu_abort(env, "Invalid MMU mode!\n"); break;
1949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
1950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_eret (void)
1954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    debug_pre_eret();
1956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (env->CP0_Status & (1 << CP0St_ERL)) {
1957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_tc.PC = env->CP0_ErrorEPC;
1958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_Status &= ~(1 << CP0St_ERL);
1959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
1960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_tc.PC = env->CP0_EPC;
1961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->CP0_Status &= ~(1 << CP0St_EXL);
1962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
1963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    compute_hflags(env);
1964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    debug_post_eret();
1965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->lladdr = 1;
1966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_deret (void)
1969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    debug_pre_eret();
1971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->active_tc.PC = env->CP0_DEPC;
1972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->hflags &= MIPS_HFLAG_DM;
1973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    compute_hflags(env);
1974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    debug_post_eret();
1975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->lladdr = 1;
1976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
1978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_cpunum(void)
1980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((env->hflags & MIPS_HFLAG_CP0) ||
1982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        (env->CP0_HWREna & (1 << 0)))
1983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return env->CP0_EBase & 0x3ff;
1984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_RI);
1986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return 0;
1988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
1989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_synci_step(void)
1991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
1992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((env->hflags & MIPS_HFLAG_CP0) ||
1993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        (env->CP0_HWREna & (1 << 1)))
1994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return env->SYNCI_Step;
1995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
1996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_RI);
1997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
1998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return 0;
1999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_cc(void)
2002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((env->hflags & MIPS_HFLAG_CP0) ||
2004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        (env->CP0_HWREna & (1 << 2)))
2005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return env->CP0_Count;
2006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
2007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_RI);
2008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return 0;
2010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_ccres(void)
2013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((env->hflags & MIPS_HFLAG_CP0) ||
2015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        (env->CP0_HWREna & (1 << 3)))
2016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return env->CCRes;
2017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
2018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_RI);
2019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return 0;
2021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_pmon (int function)
2024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    function /= 2;
2026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (function) {
2027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 2: /* TODO: char inbyte(int waitflag); */
2028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (env->active_tc.gpr[4] == 0)
2029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            env->active_tc.gpr[2] = -1;
2030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        /* Fall through */
2031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 11: /* TODO: char inbyte (void); */
2032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_tc.gpr[2] = -1;
2033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 3:
2035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 12:
2036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        printf("%c", (char)(env->active_tc.gpr[4] & 0xFF));
2037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 17:
2039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 158:
2041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        {
2042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            unsigned char *fmt = (void *)(unsigned long)env->active_tc.gpr[4];
2043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            printf("%s", fmt);
2044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_wait (void)
2050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->halted = 1;
2052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    helper_raise_exception(EXCP_HLT);
2053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if !defined(CONFIG_USER_ONLY)
2056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2057eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turnerstatic void do_unaligned_access (target_ulong addr, int is_write,
2058eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner                                 int is_user, uintptr_t retaddr);
2059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MMUSUFFIX _mmu
2061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define ALIGNED_ONLY
2062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 0
2064852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h"
2065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 1
2067852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h"
2068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 2
2070852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h"
2071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 3
2073852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h"
2074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2075eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turnerstatic void do_unaligned_access (target_ulong addr, int is_write,
2076eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner                                 int is_user, uintptr_t retaddr)
2077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env->CP0_BadVAddr = addr;
2079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    do_restore_state (retaddr);
2080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    helper_raise_exception ((is_write == 1) ? EXCP_AdES : EXCP_AdEL);
2081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2083eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turnervoid tlb_fill (CPUMIPSState* env1, target_ulong addr, int is_write, int mmu_idx,
2084eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner               uintptr_t retaddr)
2085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    TranslationBlock *tb;
2087e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turner    CPUMIPSState *saved_env;
2088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int ret;
2089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* XXX: hack to restore env in all cases, even if not called from
2091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli       generated code */
2092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    saved_env = env;
20936d1afd3bf737fe15c9ba2a23c2f957ae8ff2e663David 'Digit' Turner    env = env1;
20940d8b235c0c6c02de86a4e7415d574175b4518ff0David 'Digit' Turner    ret = cpu_mips_handle_mmu_fault(env, addr, is_write, mmu_idx);
2095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ret) {
2096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (retaddr) {
2097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            /* now we have a real cpu fault */
2098eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner            tb = tb_find_pc(retaddr);
2099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            if (tb) {
2100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                /* the PC is inside the translated code. It means that we have
2101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                   a virtual CPU fault */
2102eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner                cpu_restore_state(env, retaddr);
2103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            }
2104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        }
2105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception_err(env->exception_index, env->error_code);
2106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    env = saved_env;
2108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
21106cf763a179bb432ef845025bb3639fcaf1251bd0David 'Digit' Turnervoid cpu_unassigned_access(CPUMIPSState* env1, hwaddr addr,
21116cf763a179bb432ef845025bb3639fcaf1251bd0David 'Digit' Turner                           int is_write, int is_exec, int unused, int size)
2112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
21136cf763a179bb432ef845025bb3639fcaf1251bd0David 'Digit' Turner    env = env1;
21146cf763a179bb432ef845025bb3639fcaf1251bd0David 'Digit' Turner
2115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (is_exec)
2116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_IBE);
2117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
2118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_DBE);
2119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2120325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli/*
2121c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner * The following functions are address translation helper functions
2122c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner * for fast memory access in QEMU.
2123325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli */
2124325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapallistatic unsigned long v2p_mmu(target_ulong addr, int is_user)
2125325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli{
2126325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    int index;
2127325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    target_ulong tlb_addr;
2128eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner    hwaddr physaddr;
2129eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner    uintptr_t retaddr;
2130325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2131325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2132325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalliredo:
2133325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    tlb_addr = env->tlb_table[is_user][index].addr_read;
2134325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    if ((addr & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
2135325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        physaddr = addr + env->tlb_table[is_user][index].addend;
2136325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    } else {
2137325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        /* the page is not in the TLB : fill it */
2138325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        retaddr = GETPC();
21396d1afd3bf737fe15c9ba2a23c2f957ae8ff2e663David 'Digit' Turner        tlb_fill(env, addr, 0, is_user, retaddr);
2140325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        goto redo;
2141325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    }
2142325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    return physaddr;
2143325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli}
2144325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2145c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner/*
2146c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner * translation from virtual address of simulated OS
2147c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner * to the address of simulation host (not the physical
2148325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli * address of simulated OS.
2149325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli */
2150342a01fc826881e6b12b7673c7d2c280295f4d9eDuane Sandunsigned long v2p(target_ulong ptr, int is_user)
2151325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli{
2152e2678e116c8cdb0f36b247a5bd9cfacc849362fcDavid 'Digit' Turner    CPUMIPSState *saved_env;
2153325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    int index;
2154325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    target_ulong addr;
2155eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner    hwaddr physaddr;
2156325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2157325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    saved_env = env;
2158325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    env = cpu_single_env;
2159325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    addr = ptr;
2160325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2161c005246ed03de874fdc432073ba8e5e8ebfed922David 'Digit' Turner    if (__builtin_expect(env->tlb_table[is_user][index].addr_read !=
2162325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli                (addr & TARGET_PAGE_MASK), 0)) {
2163325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        physaddr = v2p_mmu(addr, is_user);
2164325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    } else {
2165342a01fc826881e6b12b7673c7d2c280295f4d9eDuane Sand        physaddr = addr + env->tlb_table[is_user][index].addend;
2166325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    }
2167325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    env = saved_env;
2168325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    return physaddr;
2169325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli}
2170325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2171325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli/* copy a string from the simulated virtual space to a buffer in QEMU */
2172325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapallivoid vstrcpy(target_ulong ptr, char *buf, int max)
2173325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli{
2174325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    char *phys = 0;
2175eb3bc46a1a876f279b06d7372bf5866fbcf4e8f8David 'Digit' Turner    target_ulong page = 0;
2176325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2177325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    if (buf == NULL) return;
2178325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2179325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    while (max) {
2180325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        if ((ptr & TARGET_PAGE_MASK) != page) {
2181325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli            phys = (char *)v2p(ptr, 0);
2182325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli            page = ptr & TARGET_PAGE_MASK;
2183325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        }
2184325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        *buf = *phys;
2185325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        if (*phys == '\0')
2186325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli            return;
2187325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        ptr ++;
2188325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        buf ++;
2189325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        phys ++;
2190325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        max --;
2191325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    }
2192325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli}
2193325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli
2194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */
2195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Complex FPU operations which may need stack space. */
2197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_ONE32 make_float32(0x3f8 << 20)
2199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_ONE64 make_float64(0x3ffULL << 52)
2200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_TWO32 make_float32(1 << 30)
2201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_TWO64 make_float64(1ULL << 62)
2202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_QNAN32 0x7fbfffff
2203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_QNAN64 0x7ff7ffffffffffffULL
2204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_SNAN32 0x7fffffff
2205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_SNAN64 0x7fffffffffffffffULL
2206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* convert MIPS rounding mode in FCR31 to IEEE library */
2208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic unsigned int ieee_rm[] = {
2209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    float_round_nearest_even,
2210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    float_round_to_zero,
2211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    float_round_up,
2212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    float_round_down
2213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli};
2214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define RESTORE_ROUNDING_MODE \
2216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status)
2217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define RESTORE_FLUSH_MODE \
2219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_flush_to_zero((env->active_fpu.fcr31 & (1 << 24)) != 0, &env->active_fpu.fp_status);
2220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_cfc1 (uint32_t reg)
2222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    target_ulong arg1;
2224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch (reg) {
2226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 0:
2227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (int32_t)env->active_fpu.fcr0;
2228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 25:
2230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = ((env->active_fpu.fcr31 >> 24) & 0xfe) | ((env->active_fpu.fcr31 >> 23) & 0x1);
2231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 26:
2233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = env->active_fpu.fcr31 & 0x0003f07c;
2234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 28:
2236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (env->active_fpu.fcr31 & 0x00000f83) | ((env->active_fpu.fcr31 >> 22) & 0x4);
2237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        arg1 = (int32_t)env->active_fpu.fcr31;
2240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return arg1;
2244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_ctc1 (target_ulong arg1, uint32_t reg)
2247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    switch(reg) {
2249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 25:
2250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (arg1 & 0xffffff00)
2251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
2252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0x017fffff) | ((arg1 & 0xfe) << 24) |
2253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     ((arg1 & 0x1) << 23);
2254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 26:
2256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (arg1 & 0x007c0000)
2257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
2258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfffc0f83) | (arg1 & 0x0003f07c);
2259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 28:
2261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (arg1 & 0x007c0000)
2262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
2263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfefff07c) | (arg1 & 0x00000f83) |
2264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                     ((arg1 & 0x4) << 22);
2265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    case 31:
2267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        if (arg1 & 0x007c0000)
2268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli            return;
2269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        env->active_fpu.fcr31 = arg1;
2270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        break;
2271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    default:
2272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return;
2273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* set rounding mode */
2275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    /* set flush-to-zero mode */
2277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_FLUSH_MODE;
2278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & GET_FP_CAUSE(env->active_fpu.fcr31))
2280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_FPE);
2281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline char ieee_ex_to_mips(char xcpt)
2284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (xcpt & float_flag_inexact) >> 5 |
2286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & float_flag_underflow) >> 3 |
2287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & float_flag_overflow) >> 1 |
2288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & float_flag_divbyzero) << 1 |
2289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & float_flag_invalid) << 4;
2290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline char mips_ex_to_ieee(char xcpt)
2293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return (xcpt & FP_INEXACT) << 5 |
2295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & FP_UNDERFLOW) << 3 |
2296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & FP_OVERFLOW) << 1 |
2297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & FP_DIV0) >> 1 |
2298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli           (xcpt & FP_INVALID) >> 4;
2299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void update_fcr31(void)
2302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->active_fpu.fp_status));
2304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    SET_FP_CAUSE(env->active_fpu.fcr31, tmp);
2306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp)
2307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        helper_raise_exception(EXCP_FPE);
2308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else
2309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp);
2310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Float support.
2313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   Single precition routines have a "s" suffix, double precision a
2314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps",
2315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli   paired single lower "pl", paired single upper "pu".  */
2316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* unary operations, modifying fp status  */
2318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_sqrt_d(uint64_t fdt0)
2319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float64_sqrt(fdt0, &env->active_fpu.fp_status);
2321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_sqrt_s(uint32_t fst0)
2324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float32_sqrt(fst0, &env->active_fpu.fp_status);
2326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtd_s(uint32_t fst0)
2329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status);
2334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtd_w(uint32_t wt0)
2339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status);
2344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtd_l(uint64_t dt0)
2349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status);
2354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtl_d(uint64_t fdt0)
2359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
2364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtl_s(uint32_t fst0)
2371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
2376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtps_pw(uint64_t dt0)
2383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2;
2386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
2389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status);
2390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
2392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtpw_ps(uint64_t fdt0)
2395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wth2;
2398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
2401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status);
2402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) {
2404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wth2 = FLOAT_SNAN32;
2406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
2407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)wth2 << 32) | wt2;
2408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_d(uint64_t fdt0)
2411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status);
2416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_w(uint32_t wt0)
2421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status);
2426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_l(uint64_t dt0)
2431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status);
2436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_pl(uint32_t wt0)
2441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = wt0;
2446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_pu(uint32_t wth0)
2451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = wth0;
2456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvtw_s(uint32_t fst0)
2461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
2466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvtw_d(uint64_t fdt0)
2473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
2478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_roundl_d(uint64_t fdt0)
2485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
24885b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status);
2490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
2491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_roundl_s(uint32_t fst0)
2499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25025b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status);
2504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
2505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_roundw_d(uint64_t fdt0)
2513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25165b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status);
2518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
2519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_roundw_s(uint32_t fst0)
2527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25305b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status);
2532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
2533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_truncl_d(uint64_t fdt0)
2541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25445b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status);
2546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_truncl_s(uint32_t fst0)
2553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25565b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status);
2558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_truncw_d(uint64_t fdt0)
2565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25685b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status);
2570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_truncw_s(uint32_t fst0)
2577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25805b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status);
2582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ceill_d(uint64_t fdt0)
2589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
25925b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
2594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
2595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ceill_s(uint32_t fst0)
2603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26065b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
2608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
2609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ceilw_d(uint64_t fdt0)
2617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26205b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
2622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
2623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ceilw_s(uint32_t fst0)
2631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26345b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status);
2636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
2637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_floorl_d(uint64_t fdt0)
2645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26485b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
2650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status);
2651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_floorl_s(uint32_t fst0)
2659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;
2661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26625b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
2664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status);
2665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_SNAN64;
2669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;
2670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_floorw_d(uint64_t fdt0)
2673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26765b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
2678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status);
2679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_floorw_s(uint32_t fst0)
2687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;
2689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
26905b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status);
2692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status);
2693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    RESTORE_ROUNDING_MODE;
2694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID))
2696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_SNAN32;
2697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;
2698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* unary operations, not modifying fp status  */
2701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_UNOP(name)                                       \
2702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _d(uint64_t fdt0)                \
2703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
2704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float64_ ## name(fdt0);                             \
2705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                              \
2706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ ## name ## _s(uint32_t fst0)                \
2707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
2708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float32_ ## name(fst0);                             \
2709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                              \
2710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _ps(uint64_t fdt0)               \
2711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
2712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt0;                                              \
2713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wth0;                                             \
2714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                               \
2715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt0 = float32_ ## name(fdt0 & 0XFFFFFFFF);                 \
2716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wth0 = float32_ ## name(fdt0 >> 32);                       \
2717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)wth0 << 32) | wt0;                       \
2718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2719409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_UNOP(abs)
2720409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_UNOP(chs)
2721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_UNOP
2722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS specific unary operations */
2724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip_d(uint64_t fdt0)
2725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status);
2730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_recip_s(uint32_t fst0)
2735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status);
2740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt_d(uint64_t fdt0)
2745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status);
2750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status);
2751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_rsqrt_s(uint32_t fst0)
2756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status);
2761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status);
2762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip1_d(uint64_t fdt0)
2767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status);
2772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_recip1_s(uint32_t fst0)
2777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status);
2782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip1_ps(uint64_t fdt0)
2787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2;
2790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_div(FLOAT_ONE32, fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
2793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_div(FLOAT_ONE32, fdt0 >> 32, &env->active_fpu.fp_status);
2794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
2796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt1_d(uint64_t fdt0)
2799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t fdt2;
2801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status);
2804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status);
2805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_rsqrt1_s(uint32_t fst0)
2810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status);
2815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status);
2816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt1_ps(uint64_t fdt0)
2821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
2823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2;
2824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status);
2827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status);
2828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status);
2829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_div(FLOAT_ONE32, fsth2, &env->active_fpu.fp_status);
2830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
2832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_OP(name, p) void helper_float_##name##_##p(void)
2835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* binary operations */
2837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_BINOP(name)                                          \
2838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _d(uint64_t fdt0, uint64_t fdt1)     \
2839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                  \
2840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint64_t dt2;                                                  \
2841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                   \
2842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);            \
2843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    dt2 = float64_ ## name (fdt0, fdt1, &env->active_fpu.fp_status);     \
2844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                                \
2845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID)                \
2846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        dt2 = FLOAT_QNAN64;                                        \
2847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return dt2;                                                    \
2848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                                  \
2849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                   \
2850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ ## name ## _s(uint32_t fst0, uint32_t fst1)     \
2851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                  \
2852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;                                                  \
2853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                   \
2854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);            \
2855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status);     \
2856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                                \
2857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID)                \
2858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_QNAN32;                                        \
2859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return wt2;                                                    \
2860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                                  \
2861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                   \
2862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _ps(uint64_t fdt0, uint64_t fdt1)    \
2863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                  \
2864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;                             \
2865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;                                   \
2866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = fdt1 & 0XFFFFFFFF;                             \
2867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = fdt1 >> 32;                                   \
2868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wt2;                                                  \
2869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t wth2;                                                 \
2870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                   \
2871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);            \
2872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status);     \
2873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    wth2 = float32_ ## name (fsth0, fsth1, &env->active_fpu.fp_status);  \
2874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                                \
2875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) {              \
2876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wt2 = FLOAT_QNAN32;                                        \
2877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        wth2 = FLOAT_QNAN32;                                       \
2878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }                                                              \
2879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)wth2 << 32) | wt2;                           \
2880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2882409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(add)
2883409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(sub)
2884409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(mul)
2885409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(div)
2886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_BINOP
2887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* ternary operations */
2889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_TERNOP(name1, name2)                                        \
2890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1,  \
2891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                           uint64_t fdt2)                 \
2892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
2893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status);          \
2894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status);          \
2895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                                         \
2896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                          \
2897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1,  \
2898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                           uint32_t fst2)                 \
2899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
2900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status);          \
2901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status);          \
2902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                                         \
2903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                          \
2904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1, \
2905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                            uint64_t fdt2)                \
2906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
2907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;                                    \
2908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;                                          \
2909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = fdt1 & 0XFFFFFFFF;                                    \
2910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = fdt1 >> 32;                                          \
2911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2 = fdt2 & 0XFFFFFFFF;                                    \
2912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2 = fdt2 >> 32;                                          \
2913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                          \
2914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status);          \
2915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth0 = float32_ ## name1 (fsth0, fsth1, &env->active_fpu.fp_status);       \
2916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status);          \
2917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_ ## name2 (fsth0, fsth2, &env->active_fpu.fp_status);       \
2918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;                                \
2919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2921409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_TERNOP(mul, add)
2922409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_TERNOP(mul, sub)
2923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_TERNOP
2924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* negated ternary operations */
2926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_NTERNOP(name1, name2)                                       \
2927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_n ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \
2928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                           uint64_t fdt2)                 \
2929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
2930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status);          \
2931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status);          \
2932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float64_chs(fdt2);                                             \
2933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                                         \
2934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                          \
2935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_n ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \
2936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                           uint32_t fst2)                 \
2937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
2938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status);          \
2939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status);          \
2940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return float32_chs(fst2);                                             \
2941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                                         \
2942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                          \
2943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_n ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1,\
2944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                           uint64_t fdt2)                 \
2945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                                         \
2946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;                                    \
2947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;                                          \
2948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = fdt1 & 0XFFFFFFFF;                                    \
2949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = fdt1 >> 32;                                          \
2950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2 = fdt2 & 0XFFFFFFFF;                                    \
2951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2 = fdt2 >> 32;                                          \
2952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                          \
2953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status);          \
2954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth0 = float32_ ## name1 (fsth0, fsth1, &env->active_fpu.fp_status);       \
2955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status);          \
2956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_ ## name2 (fsth0, fsth2, &env->active_fpu.fp_status);       \
2957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_chs(fst2);                                             \
2958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_chs(fsth2);                                           \
2959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;                                \
2960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2962409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_NTERNOP(mul, add)
2963409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_NTERNOP(mul, sub)
2964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_NTERNOP
2965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS specific binary operations */
2967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip2_d(uint64_t fdt0, uint64_t fdt2)
2968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status);
2971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_chs(float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status));
2972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
2974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_recip2_s(uint32_t fst0, uint32_t fst2)
2977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status);
2980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status));
2981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
2983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
2984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip2_ps(uint64_t fdt0, uint64_t fdt2)
2986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
2987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;
2988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;
2989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2 = fdt2 & 0XFFFFFFFF;
2990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2 = fdt2 >> 32;
2991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
2992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
2993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status);
2994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status);
2995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status));
2996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_chs(float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status));
2997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
2998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
2999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt2_d(uint64_t fdt0, uint64_t fdt2)
3002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
3004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status);
3005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status);
3006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->active_fpu.fp_status));
3007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
3008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fdt2;
3009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_rsqrt2_s(uint32_t fst0, uint32_t fst2)
3012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
3014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status);
3015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status);
3016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status));
3017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
3018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return fst2;
3019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt2_ps(uint64_t fdt0, uint64_t fdt2)
3022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;
3024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;
3025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2 = fdt2 & 0XFFFFFFFF;
3026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2 = fdt2 >> 32;
3027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
3029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status);
3030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status);
3031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status);
3032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status);
3033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status));
3034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->active_fpu.fp_status));
3035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
3036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
3037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_addr_ps(uint64_t fdt0, uint64_t fdt1)
3040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;
3042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;
3043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = fdt1 & 0XFFFFFFFF;
3044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = fdt1 >> 32;
3045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
3046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2;
3047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
3049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_add (fst0, fsth0, &env->active_fpu.fp_status);
3050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_add (fst1, fsth1, &env->active_fpu.fp_status);
3051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
3052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
3053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_mulr_ps(uint64_t fdt0, uint64_t fdt1)
3056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = fdt0 & 0XFFFFFFFF;
3058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = fdt0 >> 32;
3059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = fdt1 & 0XFFFFFFFF;
3060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = fdt1 >> 32;
3061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst2;
3062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth2;
3063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    set_float_exception_flags(0, &env->active_fpu.fp_status);
3065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst2 = float32_mul (fst0, fsth0, &env->active_fpu.fp_status);
3066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fsth2 = float32_mul (fst1, fsth1, &env->active_fpu.fp_status);
3067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();
3068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    return ((uint64_t)fsth2 << 32) | fst2;
3069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* compare operations */
3072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_COND_D(op, cond)                                   \
3073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmp_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc)    \
3074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
3075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int c = cond;                                              \
3076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                            \
3077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (c)                                                     \
3078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc, env->active_fpu);                      \
3079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                       \
3080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc, env->active_fpu);                    \
3081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                              \
3082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmpabs_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \
3083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
3084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int c;                                                     \
3085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt0 = float64_abs(fdt0);                                  \
3086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fdt1 = float64_abs(fdt1);                                  \
3087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    c = cond;                                                  \
3088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                            \
3089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (c)                                                     \
3090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc, env->active_fpu);                      \
3091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                       \
3092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc, env->active_fpu);                    \
3093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM)
3096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (float64_is_signaling_nan(a) ||
3098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        float64_is_signaling_nan(b) ||
3099325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        (sig && (float64_is_any_nan(a) || float64_is_any_nan(b)))) {
3100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        float_raise(float_flag_invalid, status);
3101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 1;
3102325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    } else if (float64_is_any_nan(a) || float64_is_any_nan(b)) {
3103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 1;
3104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
3105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 0;
3106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
3107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false,
3110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */
3111409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(f,   (float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status), 0))
3112409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(un,  float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status))
3113409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(eq,  !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))
3114409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ueq, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status)  || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))
3115409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(olt, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))
3116409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ult, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status)  || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))
3117409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ole, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_le(fdt0, fdt1, &env->active_fpu.fp_status))
3118409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ule, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status)  || float64_le(fdt0, fdt1, &env->active_fpu.fp_status))
3119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false,
3120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */
3121409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(sf,  (float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status), 0))
3122409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ngle,float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status))
3123409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(seq, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))
3124409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ngl, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status)  || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))
3125409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(lt,  !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))
3126409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(nge, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status)  || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))
3127409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(le,  !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_le(fdt0, fdt1, &env->active_fpu.fp_status))
3128409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ngt, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status)  || float64_le(fdt0, fdt1, &env->active_fpu.fp_status))
3129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_COND_S(op, cond)                                   \
3131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmp_s_ ## op (uint32_t fst0, uint32_t fst1, int cc)    \
3132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
3133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int c = cond;                                              \
3134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                            \
3135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (c)                                                     \
3136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc, env->active_fpu);                      \
3137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                       \
3138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc, env->active_fpu);                    \
3139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                              \
3140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmpabs_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \
3141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                              \
3142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int c;                                                     \
3143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst0 = float32_abs(fst0);                                  \
3144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    fst1 = float32_abs(fst1);                                  \
3145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    c = cond;                                                  \
3146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                            \
3147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (c)                                                     \
3148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc, env->active_fpu);                      \
3149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                       \
3150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc, env->active_fpu);                    \
3151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM)
3154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{
3155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (float32_is_signaling_nan(a) ||
3156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        float32_is_signaling_nan(b) ||
3157325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli        (sig && (float32_is_any_nan(a) || float32_is_any_nan(b)))) {
3158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        float_raise(float_flag_invalid, status);
3159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 1;
3160325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli    } else if (float32_is_any_nan(a) || float32_is_any_nan(b)) {
3161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 1;
3162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    } else {
3163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        return 0;
3164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    }
3165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false,
3168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */
3169409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(f,   (float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 0))
3170409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(un,  float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status))
3171409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(eq,  !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status))
3172409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ueq, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)  || float32_eq(fst0, fst1, &env->active_fpu.fp_status))
3173409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(olt, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status))
3174409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ult, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)  || float32_lt(fst0, fst1, &env->active_fpu.fp_status))
3175409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ole, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status))
3176409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ule, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)  || float32_le(fst0, fst1, &env->active_fpu.fp_status))
3177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false,
3178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */
3179409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(sf,  (float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 0))
3180409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ngle,float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status))
3181409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(seq, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status))
3182409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ngl, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)  || float32_eq(fst0, fst1, &env->active_fpu.fp_status))
3183409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(lt,  !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status))
3184409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(nge, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)  || float32_lt(fst0, fst1, &env->active_fpu.fp_status))
3185409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(le,  !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status))
3186409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ngt, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)  || float32_le(fst0, fst1, &env->active_fpu.fp_status))
3187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_COND_PS(op, condl, condh)                           \
3189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc)    \
3190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                               \
3191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = float32_abs(fdt0 & 0XFFFFFFFF);             \
3192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = float32_abs(fdt0 >> 32);                   \
3193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = float32_abs(fdt1 & 0XFFFFFFFF);             \
3194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = float32_abs(fdt1 >> 32);                   \
3195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int cl = condl;                                             \
3196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int ch = condh;                                             \
3197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                \
3198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                             \
3199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (cl)                                                     \
3200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc, env->active_fpu);                       \
3201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                        \
3202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc, env->active_fpu);                     \
3203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ch)                                                     \
3204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc + 1, env->active_fpu);                   \
3205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                        \
3206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc + 1, env->active_fpu);                 \
3207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}                                                               \
3208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \
3209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{                                                               \
3210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst0 = float32_abs(fdt0 & 0XFFFFFFFF);             \
3211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth0 = float32_abs(fdt0 >> 32);                   \
3212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fst1 = float32_abs(fdt1 & 0XFFFFFFFF);             \
3213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    uint32_t fsth1 = float32_abs(fdt1 >> 32);                   \
3214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int cl = condl;                                             \
3215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    int ch = condh;                                             \
3216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                                                                \
3217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    update_fcr31();                                             \
3218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (cl)                                                     \
3219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc, env->active_fpu);                       \
3220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                        \
3221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc, env->active_fpu);                     \
3222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    if (ch)                                                     \
3223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        SET_FP_COND(cc + 1, env->active_fpu);                   \
3224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli    else                                                        \
3225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli        CLEAR_FP_COND(cc + 1, env->active_fpu);                 \
3226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}
3227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli
3228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false,
3229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */
3230409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(f,   (float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 0),
3231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 (float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status), 0))
3232409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(un,  float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status),
3233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status))
3234409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(eq,  !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)   && float32_eq(fst0, fst1, &env->active_fpu.fp_status),
3235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_eq(fsth0, fsth1, &env->active_fpu.fp_status))
3236409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ueq, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)    || float32_eq(fst0, fst1, &env->active_fpu.fp_status),
3237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status)  || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status))
3238409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(olt, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)   && float32_lt(fst0, fst1, &env->active_fpu.fp_status),
3239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_lt(fsth0, fsth1, &env->active_fpu.fp_status))
3240409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ult, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)    || float32_lt(fst0, fst1, &env->active_fpu.fp_status),
3241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status)  || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status))
3242409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ole, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)   && float32_le(fst0, fst1, &env->active_fpu.fp_status),
3243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_le(fsth0, fsth1, &env->active_fpu.fp_status))
3244409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ule, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)    || float32_le(fst0, fst1, &env->active_fpu.fp_status),
3245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status)  || float32_le(fsth0, fsth1, &env->active_fpu.fp_status))
3246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false,
3247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */
3248409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(sf,  (float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 0),
3249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 (float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status), 0))
3250409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ngle,float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status),
3251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status))
3252409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(seq, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)   && float32_eq(fst0, fst1, &env->active_fpu.fp_status),
3253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_eq(fsth0, fsth1, &env->active_fpu.fp_status))
3254409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ngl, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)    || float32_eq(fst0, fst1, &env->active_fpu.fp_status),
3255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status)  || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status))
3256409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(lt,  !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)   && float32_lt(fst0, fst1, &env->active_fpu.fp_status),
3257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_lt(fsth0, fsth1, &env->active_fpu.fp_status))
3258409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(nge, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)    || float32_lt(fst0, fst1, &env->active_fpu.fp_status),
3259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status)  || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status))
3260409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(le,  !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)   && float32_le(fst0, fst1, &env->active_fpu.fp_status),
3261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_le(fsth0, fsth1, &env->active_fpu.fp_status))
3262409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ngt, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)    || float32_le(fst0, fst1, &env->active_fpu.fp_status),
3263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli                 float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status)  || float32_le(fsth0, fsth1, &env->active_fpu.fp_status))
3264