op_helper.c revision bcde1092aca184dbd7860078af020de7d1e4e22f
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> 20409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "exec.h" 21409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 22e90d665cd63a0bc5c3306e1ee3e98ad362546b16David 'Digit' Turner#include "qemu/host-utils.h" 23409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "helper.h" 25409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/*****************************************************************************/ 26409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Exceptions processing helpers */ 27409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 28409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_raise_exception_err (uint32_t exception, int error_code) 29409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 30409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if 1 31409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (exception < 0x100) 32409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log("%s: %d %d\n", __func__, exception, error_code); 33409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 34409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->exception_index = exception; 35409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->error_code = error_code; 36409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_loop_exit(); 37409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 38409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 39409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_raise_exception (uint32_t exception) 40409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 41409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception_err(exception, 0); 42409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 43409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 44409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_interrupt_restart (void) 45409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 46409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (!(env->CP0_Status & (1 << CP0St_EXL)) && 47409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !(env->CP0_Status & (1 << CP0St_ERL)) && 48409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !(env->hflags & MIPS_HFLAG_DM) && 49409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->CP0_Status & (1 << CP0St_IE)) && 50409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->CP0_Status & env->CP0_Cause & CP0Ca_IP_mask)) { 51409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Cause &= ~(0x1f << CP0Ca_EC); 52409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_EXT_INTERRUPT); 53409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 54409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 55409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 56409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if !defined(CONFIG_USER_ONLY) 57409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void do_restore_state (void *pc_ptr) 58409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 59409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli TranslationBlock *tb; 60409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli unsigned long pc = (unsigned long) pc_ptr; 61409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 62409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tb = tb_find_pc (pc); 63409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (tb) { 64325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli cpu_restore_state (tb, env, pc); 65409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 66409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 67409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 68409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 69409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(CONFIG_USER_ONLY) 70409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_LD(name, insn, type) \ 71409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline type do_##name(target_ulong addr, int mem_idx) \ 72409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 73409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (type) insn##_raw(addr); \ 74409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 75409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else 76409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_LD(name, insn, type) \ 77409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline type do_##name(target_ulong addr, int mem_idx) \ 78409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 79409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch (mem_idx) \ 80409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli { \ 81409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 0: return (type) insn##_kernel(addr); break; \ 82409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 1: return (type) insn##_super(addr); break; \ 83409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli default: \ 84409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 2: return (type) insn##_user(addr); break; \ 85409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } \ 86409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 87409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 88409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD(lbu, ldub, uint8_t) 89409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD(lw, ldl, int32_t) 90409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64 91409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD(ld, ldq, int64_t) 92409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 93409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_LD 94409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 95409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(CONFIG_USER_ONLY) 96409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_ST(name, insn, type) \ 97409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void do_##name(target_ulong addr, type val, int mem_idx) \ 98409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 99409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli insn##_raw(addr, val); \ 100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else 102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_ST(name, insn, type) \ 103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void do_##name(target_ulong addr, type val, int mem_idx) \ 104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch (mem_idx) \ 106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli { \ 107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 0: insn##_kernel(addr, val); break; \ 108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 1: insn##_super(addr, val); break; \ 109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli default: \ 110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 2: insn##_user(addr, val); break; \ 111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } \ 112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 114409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST(sb, stb, uint8_t) 115409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST(sw, stl, uint32_t) 116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64 117409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST(sd, stq, uint64_t) 118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_ST 120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_clo (target_ulong arg1) 122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return clo32(arg1); 124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_clz (target_ulong arg1) 127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return clz32(arg1); 129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) 132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dclo (target_ulong arg1) 133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return clo64(arg1); 135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dclz (target_ulong arg1) 138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return clz64(arg1); 140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */ 142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* 64 bits arithmetic for 32 bits hosts */ 144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline uint64_t get_HILO (void) 145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)(env->active_tc.HI[0]) << 32) | (uint32_t)env->active_tc.LO[0]; 147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void set_HILO (uint64_t HILO) 150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.LO[0] = (int32_t)HILO; 152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.HI[0] = (int32_t)(HILO >> 32); 153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void set_HIT0_LO (target_ulong arg1, uint64_t HILO) 156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); 158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = env->active_tc.HI[0] = (int32_t)(HILO >> 32); 159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void set_HI_LOT0 (target_ulong arg1, uint64_t HILO) 162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); 164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.HI[0] = (int32_t)(HILO >> 32); 165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Multiplication variants of the vr54xx. */ 168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_muls (target_ulong arg1, target_ulong arg2) 169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HI_LOT0(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); 171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulsu (target_ulong arg1, target_ulong arg2) 176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HI_LOT0(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); 178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_macc (target_ulong arg1, target_ulong arg2) 183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HI_LOT0(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); 185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_macchi (target_ulong arg1, target_ulong arg2) 190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, ((int64_t)get_HILO()) + ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); 192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_maccu (target_ulong arg1, target_ulong arg2) 197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HI_LOT0(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); 199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_macchiu (target_ulong arg1, target_ulong arg2) 204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, ((uint64_t)get_HILO()) + ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); 206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msac (target_ulong arg1, target_ulong arg2) 211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HI_LOT0(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); 213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msachi (target_ulong arg1, target_ulong arg2) 218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, ((int64_t)get_HILO()) - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); 220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msacu (target_ulong arg1, target_ulong arg2) 225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HI_LOT0(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); 227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_msachiu (target_ulong arg1, target_ulong arg2) 232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, ((uint64_t)get_HILO()) - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); 234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulhi (target_ulong arg1, target_ulong arg2) 239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); 241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulhiu (target_ulong arg1, target_ulong arg2) 246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); 248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulshi (target_ulong arg1, target_ulong arg2) 253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, 0 - ((int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2)); 255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mulshiu (target_ulong arg1, target_ulong arg2) 260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_HIT0_LO(arg1, 0 - ((uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2)); 262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64 267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_dmult (target_ulong arg1, target_ulong arg2) 268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli muls64(&(env->active_tc.LO[0]), &(env->active_tc.HI[0]), arg1, arg2); 270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_dmultu (target_ulong arg1, target_ulong arg2) 273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mulu64(&(env->active_tc.LO[0]), &(env->active_tc.HI[0]), arg1, arg2); 275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY 279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 280bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnerstatic inline hwaddr do_translate_address(target_ulong address, int rw) 281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 282bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner hwaddr lladdr; 283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli lladdr = cpu_mips_translate_address(env, address, rw); 285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (lladdr == -1LL) { 287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_loop_exit(); 288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return lladdr; 290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_LD_ATOMIC(name, insn) \ 294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_##name(target_ulong arg, int mem_idx) \ 295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = do_translate_address(arg, 0); \ 297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->llval = do_##insn(arg, mem_idx); \ 298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->llval; \ 299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 300409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD_ATOMIC(ll, lw) 301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64 302409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_LD_ATOMIC(lld, ld) 303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_LD_ATOMIC 305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define HELPER_ST_ATOMIC(name, ld_insn, st_insn, almask) \ 307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_##name(target_ulong arg1, target_ulong arg2, int mem_idx) \ 308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_long tmp; \ 310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg2 & almask) { \ 312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_BadVAddr = arg2; \ 313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_AdES); \ 314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } \ 315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (do_translate_address(arg2, 1) == env->lladdr) { \ 316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_##ld_insn(arg2, mem_idx); \ 317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (tmp == env->llval) { \ 318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_##st_insn(arg2, arg1, mem_idx); \ 319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 1; \ 320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } \ 321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } \ 322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; \ 323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 324409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST_ATOMIC(sc, lw, sw, 0x3) 325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_MIPS64 326409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliHELPER_ST_ATOMIC(scd, ld, sd, 0x7) 327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef HELPER_ST_ATOMIC 329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_WORDS_BIGENDIAN 332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK(v) ((v) & 3) 333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_OFFSET(addr, offset) (addr + (offset)) 334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else 335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK(v) (((v) & 3) ^ 3) 336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_OFFSET(addr, offset) (addr - (offset)) 337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_lwl(target_ulong arg1, target_ulong arg2, int mem_idx) 340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong tmp; 342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(arg2, mem_idx); 344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0x00FFFFFF) | (tmp << 24); 345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) <= 2) { 347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 1), mem_idx); 348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFF00FFFF) | (tmp << 16); 349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) <= 1) { 352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 2), mem_idx); 353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFF00FF) | (tmp << 8); 354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) == 0) { 357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 3), mem_idx); 358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFF00) | tmp; 359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (int32_t)arg1; 361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_lwr(target_ulong arg1, target_ulong arg2, int mem_idx) 364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong tmp; 366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(arg2, mem_idx); 368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFF00) | tmp; 369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) >= 1) { 371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -1), mem_idx); 372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFF00FF) | (tmp << 8); 373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) >= 2) { 376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -2), mem_idx); 377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFF00FFFF) | (tmp << 16); 378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) == 3) { 381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -3), mem_idx); 382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0x00FFFFFF) | (tmp << 24); 383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (int32_t)arg1; 385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_swl(target_ulong arg1, target_ulong arg2, int mem_idx) 388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(arg2, (uint8_t)(arg1 >> 24), mem_idx); 390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) <= 2) 392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 16), mem_idx); 393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) <= 1) 395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 8), mem_idx); 396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) == 0) 398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 3), (uint8_t)arg1, mem_idx); 399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_swr(target_ulong arg1, target_ulong arg2, int mem_idx) 402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(arg2, (uint8_t)arg1, mem_idx); 404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) >= 1) 406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); 407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) >= 2) 409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); 410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK(arg2) == 3) 412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); 413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) 416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* "half" load and stores. We must do the memory access inline, 417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli or fault handling won't work. */ 418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifdef TARGET_WORDS_BIGENDIAN 420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK64(v) ((v) & 7) 421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#else 422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define GET_LMASK64(v) (((v) & 7) ^ 7) 423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_ldl(target_ulong arg1, target_ulong arg2, int mem_idx) 426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t tmp; 428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(arg2, mem_idx); 430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56); 431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 6) { 433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 1), mem_idx); 434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48); 435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 5) { 438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 2), mem_idx); 439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40); 440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 4) { 443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 3), mem_idx); 444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32); 445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 3) { 448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 4), mem_idx); 449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24); 450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 2) { 453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 5), mem_idx); 454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16); 455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 1) { 458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 6), mem_idx); 459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8); 460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) == 0) { 463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, 7), mem_idx); 464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFFFFFFFF00ULL) | tmp; 465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_ldr(target_ulong arg1, target_ulong arg2, int mem_idx) 471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t tmp; 473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(arg2, mem_idx); 475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFFFFFFFF00ULL) | tmp; 476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 1) { 478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -1), mem_idx); 479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8); 480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 2) { 483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -2), mem_idx); 484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16); 485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 3) { 488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -3), mem_idx); 489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24); 490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 4) { 493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -4), mem_idx); 494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32); 495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 5) { 498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -5), mem_idx); 499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40); 500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 6) { 503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -6), mem_idx); 504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48); 505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) == 7) { 508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp = do_lbu(GET_OFFSET(arg2, -7), mem_idx); 509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (arg1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56); 510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_sdl(target_ulong arg1, target_ulong arg2, int mem_idx) 516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(arg2, (uint8_t)(arg1 >> 56), mem_idx); 518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 6) 520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 48), mem_idx); 521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 5) 523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 40), mem_idx); 524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 4) 526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 3), (uint8_t)(arg1 >> 32), mem_idx); 527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 3) 529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 4), (uint8_t)(arg1 >> 24), mem_idx); 530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 2) 532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 5), (uint8_t)(arg1 >> 16), mem_idx); 533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 1) 535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 6), (uint8_t)(arg1 >> 8), mem_idx); 536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) <= 0) 538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, 7), (uint8_t)arg1, mem_idx); 539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_sdr(target_ulong arg1, target_ulong arg2, int mem_idx) 542409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 543409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(arg2, (uint8_t)arg1, mem_idx); 544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 1) 546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); 547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 2) 549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); 550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 3) 552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); 553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 4) 555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -4), (uint8_t)(arg1 >> 32), mem_idx); 556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 5) 558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -5), (uint8_t)(arg1 >> 40), mem_idx); 559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) >= 6) 561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -6), (uint8_t)(arg1 >> 48), mem_idx); 562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_LMASK64(arg2) == 7) 564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_sb(GET_OFFSET(arg2, -7), (uint8_t)(arg1 >> 56), mem_idx); 565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */ 567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY 569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* CP0 helpers */ 570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_mvpcontrol (void) 571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->mvp->CP0_MVPControl; 573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_mvpconf0 (void) 576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->mvp->CP0_MVPConf0; 578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_mvpconf1 (void) 581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->mvp->CP0_MVPConf1; 583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_random (void) 586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (int32_t)cpu_mips_get_random(env); 588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcstatus (void) 591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCStatus; 593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcstatus(void) 596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCStatus; 601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].CP0_TCStatus; 603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcbind (void) 606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCBind; 608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcbind(void) 611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCBind; 616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].CP0_TCBind; 618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcrestart (void) 621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.PC; 623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcrestart(void) 626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.PC; 631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].PC; 633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tchalt (void) 636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCHalt; 638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tchalt(void) 641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCHalt; 646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].CP0_TCHalt; 648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tccontext (void) 651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCContext; 653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tccontext(void) 656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCContext; 661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].CP0_TCContext; 663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcschedule (void) 666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCSchedule; 668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcschedule(void) 671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCSchedule; 676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].CP0_TCSchedule; 678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_tcschefback (void) 681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCScheFBack; 683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_tcschefback(void) 686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCScheFBack; 691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].CP0_TCScheFBack; 693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_count (void) 696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (int32_t)cpu_mips_get_count(env); 698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_entryhi(void) 701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int32_t tcstatus; 704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = env->active_tc.CP0_TCStatus; 707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = env->tcs[other_tc].CP0_TCStatus; 709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (env->CP0_EntryHi & ~0xff) | (tcstatus & 0xff); 711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_status(void) 714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong t0; 717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int32_t tcstatus; 718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = env->active_tc.CP0_TCStatus; 721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = env->tcs[other_tc].CP0_TCStatus; 723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli t0 = env->CP0_Status & ~0xf1000018; 725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli t0 |= tcstatus & (0xf << CP0TCSt_TCU0); 726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli t0 |= (tcstatus & (1 << CP0TCSt_TMX)) >> (CP0TCSt_TMX - CP0St_MX); 727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli t0 |= (tcstatus & (0x3 << CP0TCSt_TKSU)) >> (CP0TCSt_TKSU - CP0St_KSU); 728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return t0; 730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_lladdr (void) 733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (int32_t)(env->lladdr >> env->CP0_LLAddr_shift); 735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_watchlo (uint32_t sel) 738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (int32_t)env->CP0_WatchLo[sel]; 740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_watchhi (uint32_t sel) 743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->CP0_WatchHi[sel]; 745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfc0_debug (void) 748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong t0 = env->CP0_Debug; 750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->hflags & MIPS_HFLAG_DM) 751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli t0 |= 1 << CP0DB_DM; 752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return t0; 754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftc0_debug(void) 757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int32_t tcstatus; 760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = env->active_tc.CP0_Debug_tcstatus; 763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = env->tcs[other_tc].CP0_Debug_tcstatus; 765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* XXX: Might be wrong, check with EJTAG spec. */ 767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (env->CP0_Debug & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) | 768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (tcstatus & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt))); 769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) 772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tcrestart (void) 773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.PC; 775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tchalt (void) 778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCHalt; 780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tccontext (void) 783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCContext; 785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tcschedule (void) 788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCSchedule; 790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_tcschefback (void) 793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.CP0_TCScheFBack; 795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_lladdr (void) 798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->lladdr >> env->CP0_LLAddr_shift; 800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmfc0_watchlo (uint32_t sel) 803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->CP0_WatchLo[sel]; 805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* TARGET_MIPS64 */ 807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_index (target_ulong arg1) 809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int num = 1; 811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli unsigned int tmp = env->tlb->nb_tlb; 812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do { 814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tmp >>= 1; 815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli num <<= 1; 816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } while (tmp); 817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Index = (env->CP0_Index & 0x80000000) | (arg1 & (num - 1)); 818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_mvpcontrol (target_ulong arg1) 821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = 0; 823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) 826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (1 << CP0MVPCo_CPA) | (1 << CP0MVPCo_VPC) | 827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (1 << CP0MVPCo_EVP); 828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) 829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (1 << CP0MVPCo_STLB); 830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->mvp->CP0_MVPControl & ~mask) | (arg1 & mask); 831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Enable/disable shared TLB, enable/disable VPEs. 833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->mvp->CP0_MVPControl = newval; 835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpecontrol (target_ulong arg1) 838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask; 840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask = (1 << CP0VPECo_YSI) | (1 << CP0VPECo_GSI) | 843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (1 << CP0VPECo_TE) | (0xff << CP0VPECo_TargTC); 844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->CP0_VPEControl & ~mask) | (arg1 & mask); 845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Yield scheduler intercept not implemented. */ 847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Gating storage scheduler intercept not implemented. */ 848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Enable/disable TCs. 850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEControl = newval; 852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpeconf0 (target_ulong arg1) 855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = 0; 857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) { 860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_VPEConf0 & (1 << CP0VPEC0_VPA)) 861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (0xff << CP0VPEC0_XTC); 862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA); 863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->CP0_VPEConf0 & ~mask) | (arg1 & mask); 865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: TC exclusive handling due to ERL/EXL. 867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEConf0 = newval; 869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpeconf1 (target_ulong arg1) 872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = 0; 874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) 877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (0xff << CP0VPEC1_NCX) | (0xff << CP0VPEC1_NCP2) | 878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (0xff << CP0VPEC1_NCP1); 879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->CP0_VPEConf1 & ~mask) | (arg1 & mask); 880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* UDI not implemented. */ 882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* CP2 not implemented. */ 883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Handle FPU (CP1) binding. 885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEConf1 = newval; 887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_yqmask (target_ulong arg1) 890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Yield qualifier inputs not implemented. */ 892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_YQMask = 0x00000000; 893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_vpeopt (target_ulong arg1) 896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEOpt = arg1 & 0x0000ffff; 898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_entrylo0 (target_ulong arg1) 901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Large physaddr (PABITS) not implemented */ 903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* 1k pages not implemented */ 904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryLo0 = arg1 & 0x3FFFFFFF; 905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcstatus (target_ulong arg1) 908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = env->CP0_TCStatus_rw_bitmask; 910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->active_tc.CP0_TCStatus & ~mask) | (arg1 & mask); 913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Sync with CP0_Status. 915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus = newval; 917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcstatus (target_ulong arg1) 920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Sync with CP0_Status. 924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus = arg1; 927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCStatus = arg1; 929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcbind (target_ulong arg1) 932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = (1 << CP0TCBd_TBE); 934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 935409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) 937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (1 << CP0TCBd_CurVPE); 938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->active_tc.CP0_TCBind & ~mask) | (arg1 & mask); 939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCBind = newval; 940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcbind (target_ulong arg1) 943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 944409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 945409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = (1 << CP0TCBd_TBE); 946409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t newval; 947409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 948409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) 949409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= (1 << CP0TCBd_CurVPE); 950409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) { 951409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->active_tc.CP0_TCBind & ~mask) | (arg1 & mask); 952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCBind = newval; 953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli newval = (env->tcs[other_tc].CP0_TCBind & ~mask) | (arg1 & mask); 955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCBind = newval; 956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcrestart (target_ulong arg1) 960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC = arg1; 962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS); 963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = 0ULL; 964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* MIPS16 not implemented. */ 965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcrestart (target_ulong arg1) 968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) { 972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC = arg1; 973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS); 974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = 0ULL; 975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* MIPS16 not implemented. */ 976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].PC = arg1; 978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCStatus &= ~(1 << CP0TCSt_TDS); 979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = 0ULL; 980409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* MIPS16 not implemented. */ 981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 983409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tchalt (target_ulong arg1) 985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCHalt = arg1 & 0x1; 987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Halt TC / Restart (if allocated+active) TC. 989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tchalt (target_ulong arg1) 992409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 993409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 994409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 995409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Halt TC / Restart (if allocated+active) TC. 996409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 997409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 998409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCHalt = arg1; 999409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCHalt = arg1; 1001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1002409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1003409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tccontext (target_ulong arg1) 1004409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1005409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCContext = arg1; 1006409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1007409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1008409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tccontext (target_ulong arg1) 1009409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCContext = arg1; 1014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCContext = arg1; 1016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcschedule (target_ulong arg1) 1019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCSchedule = arg1; 1021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcschedule (target_ulong arg1) 1024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCSchedule = arg1; 1029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCSchedule = arg1; 1031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_tcschefback (target_ulong arg1) 1034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCScheFBack = arg1; 1036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_tcschefback (target_ulong arg1) 1039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCScheFBack = arg1; 1044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCScheFBack = arg1; 1046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_entrylo1 (target_ulong arg1) 1049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Large physaddr (PABITS) not implemented */ 1051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* 1k pages not implemented */ 1052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryLo1 = arg1 & 0x3FFFFFFF; 1053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_context (target_ulong arg1) 1056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Context = (env->CP0_Context & 0x007FFFFF) | (arg1 & ~0x007FFFFF); 1058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_pagemask (target_ulong arg1) 1061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* 1k pages not implemented */ 1063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_PageMask = arg1 & (0x1FFFFFFF & (TARGET_PAGE_MASK << 1)); 1064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_pagegrain (target_ulong arg1) 1067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* SmartMIPS not implemented */ 1069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Large physaddr (PABITS) not implemented */ 1070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* 1k pages not implemented */ 1071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_PageGrain = 0; 1072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_wired (target_ulong arg1) 1075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Wired = arg1 % env->tlb->nb_tlb; 1077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf0 (target_ulong arg1) 1080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_SRSConf0 |= arg1 & env->CP0_SRSConf0_rw_bitmask; 1082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf1 (target_ulong arg1) 1085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_SRSConf1 |= arg1 & env->CP0_SRSConf1_rw_bitmask; 1087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf2 (target_ulong arg1) 1090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_SRSConf2 |= arg1 & env->CP0_SRSConf2_rw_bitmask; 1092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf3 (target_ulong arg1) 1095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_SRSConf3 |= arg1 & env->CP0_SRSConf3_rw_bitmask; 1097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsconf4 (target_ulong arg1) 1100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_SRSConf4 |= arg1 & env->CP0_SRSConf4_rw_bitmask; 1102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_hwrena (target_ulong arg1) 1105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_HWREna = arg1 & 0x0000000F; 1107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_count (target_ulong arg1) 1110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_store_count(env, arg1); 1112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_entryhi (target_ulong arg1) 1115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong old, val; 1117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* 1k pages not implemented */ 1119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli val = arg1 & ((TARGET_PAGE_MASK << 1) | 0xFF); 1120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) 1121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli val &= env->SEGMask; 1122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 1123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli old = env->CP0_EntryHi; 1124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryHi = val; 1125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_Config3 & (1 << CP0C3_MT)) { 1126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t tcst = env->active_tc.CP0_TCStatus & ~0xff; 1127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus = tcst | (val & 0xff); 1128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* If the ASID changes, flush qemu's TLB. */ 1130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((old & 0xFF) != (val & 0xFF)) 1131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_tlb_flush(env, 1); 1132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_entryhi(target_ulong arg1) 1135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int32_t tcstatus; 1138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryHi = (env->CP0_EntryHi & 0xff) | (arg1 & ~0xff); 1140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) { 1141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = (env->active_tc.CP0_TCStatus & ~0xff) | (arg1 & 0xff); 1142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus = tcstatus; 1143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 1144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = (env->tcs[other_tc].CP0_TCStatus & ~0xff) | (arg1 & 0xff); 1145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCStatus = tcstatus; 1146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_compare (target_ulong arg1) 1150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_store_compare(env, arg1); 1152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_status (target_ulong arg1) 1155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t val, old; 1157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = env->CP0_Status_rw_bitmask; 1158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli val = arg1 & mask; 1160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli old = env->CP0_Status; 1161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Status = (env->CP0_Status & ~mask) | val; 1162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli compute_hflags(env); 1163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (qemu_loglevel_mask(CPU_LOG_EXEC)) { 1164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log("Status %08x (%08x) => %08x (%08x) Cause %08x", 1165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli old, old & env->CP0_Cause & CP0Ca_IP_mask, 1166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli val, val & env->CP0_Cause & CP0Ca_IP_mask, 1167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Cause); 1168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch (env->hflags & MIPS_HFLAG_KSU) { 1169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case MIPS_HFLAG_UM: qemu_log(", UM\n"); break; 1170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case MIPS_HFLAG_SM: qemu_log(", SM\n"); break; 1171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case MIPS_HFLAG_KM: qemu_log("\n"); break; 1172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli default: cpu_abort(env, "Invalid MMU mode!\n"); break; 1173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_update_irq(env); 1176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_status(target_ulong arg1) 1179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int32_t tcstatus = env->tcs[other_tc].CP0_TCStatus; 1182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Status = arg1 & ~0xf1000018; 1184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = (tcstatus & ~(0xf << CP0TCSt_TCU0)) | (arg1 & (0xf << CP0St_CU0)); 1185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = (tcstatus & ~(1 << CP0TCSt_TMX)) | ((arg1 & (1 << CP0St_MX)) << (CP0TCSt_TMX - CP0St_MX)); 1186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tcstatus = (tcstatus & ~(0x3 << CP0TCSt_TKSU)) | ((arg1 & (0x3 << CP0St_KSU)) << (CP0TCSt_TKSU - CP0St_KSU)); 1187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus = tcstatus; 1189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_TCStatus = tcstatus; 1191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_intctl (target_ulong arg1) 1194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* vectored interrupts not implemented, no performance counters. */ 1196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_IntCtl = (env->CP0_IntCtl & ~0x000002e0) | (arg1 & 0x000002e0); 1197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_srsctl (target_ulong arg1) 1200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = (0xf << CP0SRSCtl_ESS) | (0xf << CP0SRSCtl_PSS); 1202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_SRSCtl = (env->CP0_SRSCtl & ~mask) | (arg1 & mask); 1203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_cause (target_ulong arg1) 1206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t mask = 0x00C00300; 1208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t old = env->CP0_Cause; 1209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->insn_flags & ISA_MIPS32R2) 1211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask |= 1 << CP0Ca_DC; 1212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Cause = (env->CP0_Cause & ~mask) | (arg1 & mask); 1214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((old ^ env->CP0_Cause) & (1 << CP0Ca_DC)) { 1216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_Cause & (1 << CP0Ca_DC)) 1217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_stop_count(env); 1218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_start_count(env); 1220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Handle the software interrupt as an hardware one, as they 1223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli are very similar */ 1224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 & CP0Ca_IP_mask) { 1225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_update_irq(env); 1226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_ebase (target_ulong arg1) 1230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* vectored interrupts not implemented */ 1232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Multi-CPU not implemented */ 1233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EBase = 0x80000000 | (arg1 & 0x3FFFF000); 1234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_config0 (target_ulong arg1) 1237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Config0 = (env->CP0_Config0 & 0x81FFFFF8) | (arg1 & 0x00000007); 1239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_config2 (target_ulong arg1) 1242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* tertiary/secondary caches not implemented */ 1244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF); 1245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_lladdr (target_ulong arg1) 1248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_long mask = env->CP0_LLAddr_rw_bitmask; 1250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = arg1 << env->CP0_LLAddr_shift; 1251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = (env->lladdr & ~mask) | (arg1 & mask); 1252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_watchlo (target_ulong arg1, uint32_t sel) 1255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Watch exceptions for instructions, data loads, data stores 1257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli not implemented. */ 1258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_WatchLo[sel] = (arg1 & ~0x7); 1259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_watchhi (target_ulong arg1, uint32_t sel) 1262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_WatchHi[sel] = (arg1 & 0x40FF0FF8); 1264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_WatchHi[sel] &= ~(env->CP0_WatchHi[sel] & arg1 & 0x7); 1265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_xcontext (target_ulong arg1) 1268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong mask = (1ULL << (env->SEGBITS - 7)) - 1; 1270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_XContext = (env->CP0_XContext & mask) | (arg1 & ~mask); 1271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_framemask (target_ulong arg1) 1274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Framemask = arg1; /* XXX */ 1276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_debug (target_ulong arg1) 1279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (arg1 & 0x13300120); 1281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 & (1 << CP0DB_DM)) 1282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->hflags |= MIPS_HFLAG_DM; 1283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->hflags &= ~MIPS_HFLAG_DM; 1285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttc0_debug(target_ulong arg1) 1288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t val = arg1 & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt)); 1291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* XXX: Might be wrong, check with EJTAG spec. */ 1293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_Debug_tcstatus = val; 1295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].CP0_Debug_tcstatus = val; 1297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Debug = (env->CP0_Debug & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) | 1298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (arg1 & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))); 1299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_performance0 (target_ulong arg1) 1302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Performance0 = arg1 & 0x000007ff; 1304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_taglo (target_ulong arg1) 1307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_TagLo = arg1 & 0xFFFFFCF6; 1309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1311409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_datalo (target_ulong arg1) 1312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_DataLo = arg1; /* XXX */ 1314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_taghi (target_ulong arg1) 1317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_TagHi = arg1; /* XXX */ 1319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtc0_datahi (target_ulong arg1) 1322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_DataHi = arg1; /* XXX */ 1324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1325409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS MT functions */ 1327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftgpr(uint32_t sel) 1328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.gpr[sel]; 1333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].gpr[sel]; 1335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftlo(uint32_t sel) 1338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1339409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.LO[sel]; 1343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].LO[sel]; 1345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mfthi(uint32_t sel) 1348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.HI[sel]; 1353409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].HI[sel]; 1355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftacx(uint32_t sel) 1358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.ACX[sel]; 1363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].ACX[sel]; 1365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1367409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_mftdsp(void) 1368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->active_tc.DSPControl; 1373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->tcs[other_tc].DSPControl; 1375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttgpr(target_ulong arg1, uint32_t sel) 1378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1379409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.gpr[sel] = arg1; 1383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].gpr[sel] = arg1; 1385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttlo(target_ulong arg1, uint32_t sel) 1388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1391409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.LO[sel] = arg1; 1393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].LO[sel] = arg1; 1395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mtthi(target_ulong arg1, uint32_t sel) 1398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.HI[sel] = arg1; 1403409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].HI[sel] = arg1; 1405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttacx(target_ulong arg1, uint32_t sel) 1408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.ACX[sel] = arg1; 1413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].ACX[sel] = arg1; 1415409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_mttdsp(target_ulong arg1) 1418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); 1420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (other_tc == env->current_tc) 1422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.DSPControl = arg1; 1423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tcs[other_tc].DSPControl = arg1; 1425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS MT functions */ 1428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dmt(target_ulong arg1) 1429409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO 1431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = 0; 1432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // rt = arg1 1433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 1435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_emt(target_ulong arg1) 1438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO 1440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = 0; 1441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // rt = arg1 1442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1443409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 1444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_dvpe(target_ulong arg1) 1447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO 1449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = 0; 1450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // rt = arg1 1451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 1453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_evpe(target_ulong arg1) 1456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1457409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO 1458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = 0; 1459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // rt = arg1 1460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 1462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */ 1464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_fork(target_ulong arg1, target_ulong arg2) 1466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // arg1 = rt, arg2 = rs 1468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = 0; 1469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: store to TC register 1470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1471409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_yield(target_ulong arg1) 1473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 < 0) { 1475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* No scheduling policy implemented. */ 1476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 != -2) { 1477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_VPEControl & (1 << CP0VPECo_YSI) && 1478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.CP0_TCStatus & (1 << CP0TCSt_DT)) { 1479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); 1480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEControl |= 4 << CP0VPECo_EXCPT; 1481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_THREAD); 1482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else if (arg1 == 0) { 1485409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (0 /* TODO: TC underflow */) { 1486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); 1487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_THREAD); 1488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 1489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli // TODO: Deallocate TC 1490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else if (arg1 > 0) { 1492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Yield qualifier inputs not implemented. */ 1493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); 1494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_VPEControl |= 2 << CP0VPECo_EXCPT; 1495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_THREAD); 1496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->CP0_YQMask; 1498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1499409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#ifndef CONFIG_USER_ONLY 150155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearmanstatic void inline r4k_invalidate_tlb_shadow (CPUState *env, int idx) 1502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 150355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_tlb_t *tlb; 150455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman uint8_t ASID = env->CP0_EntryHi & 0xFF; 150555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 150655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb = &env->tlb->mmu.r4k.tlb[idx]; 150755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* The qemu TLB is flushed when the ASID changes, so no need to 150855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman flush these entries again. */ 150955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (tlb->G == 0 && tlb->ASID != ASID) { 151055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman return; 151155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 1512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1513409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 151455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearmanstatic void inline r4k_invalidate_tlb (CPUState *env, int idx) 1515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 151655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_tlb_t *tlb; 151755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong addr; 151855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong end; 151955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman uint8_t ASID = env->CP0_EntryHi & 0xFF; 152055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong mask; 152155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 152255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb = &env->tlb->mmu.r4k.tlb[idx]; 152355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* The qemu TLB is flushed when the ASID changes, so no need to 152455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman flush these entries again. */ 152555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (tlb->G == 0 && tlb->ASID != ASID) { 152655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman return; 1527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 152855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 152955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* 1k pages are not supported. */ 153055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1); 153155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (tlb->V0) { 153255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman addr = tlb->VPN & ~mask; 153355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#if defined(TARGET_MIPS64) 153455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) { 153555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman addr |= 0x3FFFFF0000000000ULL; 153655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 153755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#endif 153855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman end = addr | (mask >> 1); 153955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman while (addr < end) { 154055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb_flush_page (env, addr); 154155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman addr += TARGET_PAGE_SIZE; 154255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 154355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 154455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (tlb->V1) { 154555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman addr = (tlb->VPN & ~mask) | ((mask >> 1) + 1); 154655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#if defined(TARGET_MIPS64) 154755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) { 154855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman addr |= 0x3FFFFF0000000000ULL; 154955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 155055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman#endif 155155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman end = addr | mask; 155255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman while (addr - 1 < end) { 155355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb_flush_page (env, addr); 155455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman addr += TARGET_PAGE_SIZE; 155555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 155655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 155755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman} 155855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 155955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman/* TLB management */ 156055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearmanvoid cpu_mips_tlb_flush (CPUState *env, int flush_global) 156155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman{ 156255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* Flush qemu's TLB and discard all shadowed entries. */ 156355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb_flush (env, flush_global); 1564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void r4k_fill_tlb (int idx) 1567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli r4k_tlb_t *tlb; 1569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* XXX: detect conflicting TLBs and raise a MCHECK exception when needed */ 1571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb = &env->tlb->mmu.r4k.tlb[idx]; 1572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->VPN = env->CP0_EntryHi & (TARGET_PAGE_MASK << 1); 1573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if defined(TARGET_MIPS64) 1574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->VPN &= env->SEGMask; 1575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif 1576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->ASID = env->CP0_EntryHi & 0xFF; 1577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->PageMask = env->CP0_PageMask; 1578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->G = env->CP0_EntryLo0 & env->CP0_EntryLo1 & 1; 1579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->V0 = (env->CP0_EntryLo0 & 2) != 0; 1580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->D0 = (env->CP0_EntryLo0 & 4) != 0; 1581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->C0 = (env->CP0_EntryLo0 >> 3) & 0x7; 1582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->PFN[0] = (env->CP0_EntryLo0 >> 6) << 12; 1583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->V1 = (env->CP0_EntryLo1 & 2) != 0; 1584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->D1 = (env->CP0_EntryLo1 & 4) != 0; 1585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->C1 = (env->CP0_EntryLo1 >> 3) & 0x7; 1586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb->PFN[1] = (env->CP0_EntryLo1 >> 6) << 12; 1587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 158955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearmanvoid r4k_helper_ptw_tlbrefill(CPUState *target_env) 159055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman{ 159155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman CPUState *saved_env; 159255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 159355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* Save current 'env' value */ 159455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman saved_env = env; 159555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman env = target_env; 159655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 159755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* Do TLB load on behalf of Page Table Walk */ 159855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman int r = cpu_mips_get_random(env); 159955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_invalidate_tlb_shadow(env, r); 160055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_fill_tlb(r); 160155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 160255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* Restore 'env' value */ 160355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman env = saved_env; 160455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman} 160555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman 1606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbwi (void) 1607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 160855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_tlb_t *tlb; 160955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong tag; 161055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong VPN; 161155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong mask; 1612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 161355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* If tlbwi is trying to upgrading access permissions on current entry, 161455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman * we do not need to flush tlb hash table. 161555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman */ 161655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb = &env->tlb->mmu.r4k.tlb[env->CP0_Index % env->tlb->nb_tlb]; 161755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1); 161855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tag = env->CP0_EntryHi & ~mask; 161955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman VPN = tlb->VPN & ~mask; 162055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (VPN == tag) 162155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman { 162255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (tlb->ASID == (env->CP0_EntryHi & 0xFF)) 162355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman { 162455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->V0 = (env->CP0_EntryLo0 & 2) != 0; 162555ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->D0 = (env->CP0_EntryLo0 & 4) != 0; 162655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->C0 = (env->CP0_EntryLo0 >> 3) & 0x7; 162755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->PFN[0] = (env->CP0_EntryLo0 >> 6) << 12; 162855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->V1 = (env->CP0_EntryLo1 & 2) != 0; 162955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->D1 = (env->CP0_EntryLo1 & 4) != 0; 163055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->C1 = (env->CP0_EntryLo1 >> 3) & 0x7; 163155ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb->PFN[1] = (env->CP0_EntryLo1 >> 6) << 12; 163255ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman return; 163355ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 163455ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman } 1635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 163655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /*flush all the tlb cache */ 163755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman cpu_mips_tlb_flush (env, 1); 1638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 163955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_invalidate_tlb(env, env->CP0_Index % env->tlb->nb_tlb); 164055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_fill_tlb(env->CP0_Index % env->tlb->nb_tlb); 1641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbwr (void) 1644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int r = cpu_mips_get_random(env); 1646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 164755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman r4k_invalidate_tlb_shadow(env, r); 1648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli r4k_fill_tlb(r); 1649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbp (void) 1652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli r4k_tlb_t *tlb; 1654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong mask; 1655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong tag; 1656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong VPN; 1657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint8_t ASID; 1658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 165955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong addr; 166055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman target_ulong end; 1661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli ASID = env->CP0_EntryHi & 0xFF; 1663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for (i = 0; i < env->tlb->nb_tlb; i++) { 1664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb = &env->tlb->mmu.r4k.tlb[i]; 1665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* 1k pages are not supported. */ 1666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli mask = tlb->PageMask | ~(TARGET_PAGE_MASK << 1); 1667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tag = env->CP0_EntryHi & ~mask; 1668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli VPN = tlb->VPN & ~mask; 1669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Check ASID, virtual page number & size */ 167055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman if (unlikely((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag)) { 1671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* TLB match */ 1672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Index = i; 1673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 1674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (i == env->tlb->nb_tlb) { 167755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /* No match. Discard any shadow entries, if any of them match. */ 167855ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman int index = ((env->CP0_EntryHi>>5)&0x1ff00) | ASID; 167955ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman index |= (env->CP0_EntryHi>>13)&0x20000; 1680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Index |= 0x80000000; 1681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid r4k_helper_tlbr (void) 1685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli r4k_tlb_t *tlb; 1687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint8_t ASID; 1688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli ASID = env->CP0_EntryHi & 0xFF; 169055ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman tlb = &env->tlb->mmu.r4k.tlb[env->CP0_Index % env->tlb->nb_tlb]; 1691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* If this will change the current ASID, flush qemu's TLB. */ 1693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (ASID != tlb->ASID) 1694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_tlb_flush (env, 1); 1695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 169655ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman /*flush all the tlb cache */ 169755ff318b4e5382074e2049c996cb6df1041aff1bChris Dearman cpu_mips_tlb_flush (env, 1); 1698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryHi = tlb->VPN | tlb->ASID; 1700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_PageMask = tlb->PageMask; 1701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryLo0 = tlb->G | (tlb->V0 << 1) | (tlb->D0 << 2) | 1702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (tlb->C0 << 3) | (tlb->PFN[0] >> 6); 1703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_EntryLo1 = tlb->G | (tlb->V1 << 1) | (tlb->D1 << 2) | 1704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (tlb->C1 << 3) | (tlb->PFN[1] >> 6); 1705409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1706409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1707409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbwi(void) 1708409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->helper_tlbwi(); 1710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbwr(void) 1713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->helper_tlbwr(); 1715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbp(void) 1718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->helper_tlbp(); 1720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_tlbr(void) 1723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->helper_tlbr(); 1725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Specials */ 1728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_di (void) 1729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong t0 = env->CP0_Status; 1731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Status = t0 & ~(1 << CP0St_IE); 1733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_update_irq(env); 1734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return t0; 1736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_ei (void) 1739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong t0 = env->CP0_Status; 1741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Status = t0 | (1 << CP0St_IE); 1743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli cpu_mips_update_irq(env); 1744409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1745409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return t0; 1746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void debug_pre_eret (void) 1749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (qemu_loglevel_mask(CPU_LOG_EXEC)) { 1751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log("ERET: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx, 1752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC, env->CP0_EPC); 1753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_Status & (1 << CP0St_ERL)) 1754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log(" ErrorEPC " TARGET_FMT_lx, env->CP0_ErrorEPC); 1755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->hflags & MIPS_HFLAG_DM) 1756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC); 1757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log("\n"); 1758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void debug_post_eret (void) 1762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (qemu_loglevel_mask(CPU_LOG_EXEC)) { 1764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log(" => PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx, 1765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC, env->CP0_EPC); 1766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_Status & (1 << CP0St_ERL)) 1767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log(" ErrorEPC " TARGET_FMT_lx, env->CP0_ErrorEPC); 1768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->hflags & MIPS_HFLAG_DM) 1769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC); 1770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch (env->hflags & MIPS_HFLAG_KSU) { 1771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case MIPS_HFLAG_UM: qemu_log(", UM\n"); break; 1772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case MIPS_HFLAG_SM: qemu_log(", SM\n"); break; 1773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case MIPS_HFLAG_KM: qemu_log("\n"); break; 1774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli default: cpu_abort(env, "Invalid MMU mode!\n"); break; 1775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_eret (void) 1780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli debug_pre_eret(); 1782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->CP0_Status & (1 << CP0St_ERL)) { 1783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC = env->CP0_ErrorEPC; 1784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Status &= ~(1 << CP0St_ERL); 1785409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 1786409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC = env->CP0_EPC; 1787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_Status &= ~(1 << CP0St_EXL); 1788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli compute_hflags(env); 1790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli debug_post_eret(); 1791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = 1; 1792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_deret (void) 1795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli debug_pre_eret(); 1797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.PC = env->CP0_DEPC; 1798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->hflags &= MIPS_HFLAG_DM; 1799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli compute_hflags(env); 1800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli debug_post_eret(); 1801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->lladdr = 1; 1802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */ 1804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_cpunum(void) 1806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((env->hflags & MIPS_HFLAG_CP0) || 1808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->CP0_HWREna & (1 << 0))) 1809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->CP0_EBase & 0x3ff; 1810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_RI); 1812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 1814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_synci_step(void) 1817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((env->hflags & MIPS_HFLAG_CP0) || 1819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->CP0_HWREna & (1 << 1))) 1820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->SYNCI_Step; 1821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_RI); 1823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 1825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_cc(void) 1828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((env->hflags & MIPS_HFLAG_CP0) || 1830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->CP0_HWREna & (1 << 2))) 1831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->CP0_Count; 1832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_RI); 1834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 1836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_rdhwr_ccres(void) 1839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((env->hflags & MIPS_HFLAG_CP0) || 1841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->CP0_HWREna & (1 << 3))) 1842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return env->CCRes; 1843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_RI); 1845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 1847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_pmon (int function) 1850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli function /= 2; 1852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch (function) { 1853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 2: /* TODO: char inbyte(int waitflag); */ 1854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (env->active_tc.gpr[4] == 0) 1855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.gpr[2] = -1; 1856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Fall through */ 1857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 11: /* TODO: char inbyte (void); */ 1858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_tc.gpr[2] = -1; 1859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 1860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 3: 1861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 12: 1862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli printf("%c", (char)(env->active_tc.gpr[4] & 0xFF)); 1863409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 1864409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 17: 1865409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 1866409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 158: 1867409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli { 1868409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli unsigned char *fmt = (void *)(unsigned long)env->active_tc.gpr[4]; 1869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli printf("%s", fmt); 1870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 1872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_wait (void) 1876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->halted = 1; 1878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_HLT); 1879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#if !defined(CONFIG_USER_ONLY) 1882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void do_unaligned_access (target_ulong addr, int is_write, int is_user, void *retaddr); 1884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define MMUSUFFIX _mmu 1886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define ALIGNED_ONLY 1887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 0 1889852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h" 1890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 1 1892852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h" 1893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 2 1895852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h" 1896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define SHIFT 3 1898852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner#include "exec/softmmu_template.h" 1899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void do_unaligned_access (target_ulong addr, int is_write, int is_user, void *retaddr) 1901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->CP0_BadVAddr = addr; 1903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli do_restore_state (retaddr); 1904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception ((is_write == 1) ? EXCP_AdES : EXCP_AdEL); 1905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) 1908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli TranslationBlock *tb; 1910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CPUState *saved_env; 1911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli unsigned long pc; 1912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int ret; 1913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* XXX: hack to restore env in all cases, even if not called from 1915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli generated code */ 1916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli saved_env = env; 1917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env = cpu_single_env; 1918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli ret = cpu_mips_handle_mmu_fault(env, addr, is_write, mmu_idx, 1); 1919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (ret) { 1920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (retaddr) { 1921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* now we have a real cpu fault */ 1922409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli pc = (unsigned long)retaddr; 1923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tb = tb_find_pc(pc); 1924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (tb) { 1925409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* the PC is inside the translated code. It means that we have 1926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli a virtual CPU fault */ 1927325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli cpu_restore_state(tb, env, pc); 1928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception_err(env->exception_index, env->error_code); 1931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 1932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env = saved_env; 1933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1934409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 1935bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turnervoid do_unassigned_access(hwaddr addr, int is_write, int is_exec, 1936409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int unused, int size) 1937409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 1938409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (is_exec) 1939409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_IBE); 1940409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 1941409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_DBE); 1942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 1943325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli/* 1944325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli * The following functions are address translation helper functions 1945325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli * for fast memory access in QEMU. 1946325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli */ 1947325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapallistatic unsigned long v2p_mmu(target_ulong addr, int is_user) 1948325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli{ 1949325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli int index; 1950325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli target_ulong tlb_addr; 1951342a01fc826881e6b12b7673c7d2c280295f4d9eDuane Sand unsigned long physaddr; 1952325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli void *retaddr; 1953325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 1954325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); 1955325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalliredo: 1956325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli tlb_addr = env->tlb_table[is_user][index].addr_read; 1957325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli if ((addr & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { 1958325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli physaddr = addr + env->tlb_table[is_user][index].addend; 1959325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } else { 1960325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli /* the page is not in the TLB : fill it */ 1961325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli retaddr = GETPC(); 1962325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli tlb_fill(addr, 0, is_user, retaddr); 1963325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli goto redo; 1964325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } 1965325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli return physaddr; 1966325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli} 1967325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 1968325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli/* 1969325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli * translation from virtual address of simulated OS 1970325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli * to the address of simulation host (not the physical 1971325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli * address of simulated OS. 1972325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli */ 1973342a01fc826881e6b12b7673c7d2c280295f4d9eDuane Sandunsigned long v2p(target_ulong ptr, int is_user) 1974325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli{ 1975325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli CPUState *saved_env; 1976325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli int index; 1977325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli target_ulong addr; 1978342a01fc826881e6b12b7673c7d2c280295f4d9eDuane Sand unsigned long physaddr; 1979325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 1980325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli saved_env = env; 1981325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli env = cpu_single_env; 1982325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli addr = ptr; 1983325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); 1984325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli if (__builtin_expect(env->tlb_table[is_user][index].addr_read != 1985325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli (addr & TARGET_PAGE_MASK), 0)) { 1986325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli physaddr = v2p_mmu(addr, is_user); 1987325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } else { 1988342a01fc826881e6b12b7673c7d2c280295f4d9eDuane Sand physaddr = addr + env->tlb_table[is_user][index].addend; 1989325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } 1990325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli env = saved_env; 1991325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli return physaddr; 1992325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli} 1993325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 1994325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli/* copy a string from the simulated virtual space to a buffer in QEMU */ 1995325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapallivoid vstrcpy(target_ulong ptr, char *buf, int max) 1996325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli{ 1997325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli char *phys = 0; 1998325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli unsigned long page = 0; 1999325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 2000325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli if (buf == NULL) return; 2001325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 2002325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli while (max) { 2003325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli if ((ptr & TARGET_PAGE_MASK) != page) { 2004325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli phys = (char *)v2p(ptr, 0); 2005325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli page = ptr & TARGET_PAGE_MASK; 2006325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } 2007325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli *buf = *phys; 2008325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli if (*phys == '\0') 2009325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli return; 2010325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli ptr ++; 2011325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli buf ++; 2012325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli phys ++; 2013325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli max --; 2014325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } 2015325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli} 2016325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli 2017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#endif /* !CONFIG_USER_ONLY */ 2018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Complex FPU operations which may need stack space. */ 2020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_ONE32 make_float32(0x3f8 << 20) 2022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_ONE64 make_float64(0x3ffULL << 52) 2023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_TWO32 make_float32(1 << 30) 2024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_TWO64 make_float64(1ULL << 62) 2025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_QNAN32 0x7fbfffff 2026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_QNAN64 0x7ff7ffffffffffffULL 2027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_SNAN32 0x7fffffff 2028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_SNAN64 0x7fffffffffffffffULL 2029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* convert MIPS rounding mode in FCR31 to IEEE library */ 2031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic unsigned int ieee_rm[] = { 2032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float_round_nearest_even, 2033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float_round_to_zero, 2034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float_round_up, 2035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float_round_down 2036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli}; 2037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define RESTORE_ROUNDING_MODE \ 2039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], &env->active_fpu.fp_status) 2040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define RESTORE_FLUSH_MODE \ 2042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_flush_to_zero((env->active_fpu.fcr31 & (1 << 24)) != 0, &env->active_fpu.fp_status); 2043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallitarget_ulong helper_cfc1 (uint32_t reg) 2045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli target_ulong arg1; 2047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch (reg) { 2049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 0: 2050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (int32_t)env->active_fpu.fcr0; 2051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 25: 2053409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = ((env->active_fpu.fcr31 >> 24) & 0xfe) | ((env->active_fpu.fcr31 >> 23) & 0x1); 2054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2055409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 26: 2056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = env->active_fpu.fcr31 & 0x0003f07c; 2057409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 28: 2059409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (env->active_fpu.fcr31 & 0x00000f83) | ((env->active_fpu.fcr31 >> 22) & 0x4); 2060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2061409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli default: 2062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli arg1 = (int32_t)env->active_fpu.fcr31; 2063409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 2065409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return arg1; 2067409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_ctc1 (target_ulong arg1, uint32_t reg) 2070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2071409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli switch(reg) { 2072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 25: 2073409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 & 0xffffff00) 2074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return; 2075409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0x017fffff) | ((arg1 & 0xfe) << 24) | 2076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli ((arg1 & 0x1) << 23); 2077409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 26: 2079409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 & 0x007c0000) 2080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return; 2081409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfffc0f83) | (arg1 & 0x0003f07c); 2082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2083409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 28: 2084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 & 0x007c0000) 2085409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return; 2086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfefff07c) | (arg1 & 0x00000f83) | 2087409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli ((arg1 & 0x4) << 22); 2088409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2089409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli case 31: 2090409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (arg1 & 0x007c0000) 2091409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return; 2092409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->active_fpu.fcr31 = arg1; 2093409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli break; 2094409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli default: 2095409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return; 2096409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 2097409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* set rounding mode */ 2098409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2099409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* set flush-to-zero mode */ 2100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_FLUSH_MODE; 2101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & GET_FP_CAUSE(env->active_fpu.fcr31)) 2103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_FPE); 2104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline char ieee_ex_to_mips(char xcpt) 2107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (xcpt & float_flag_inexact) >> 5 | 2109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & float_flag_underflow) >> 3 | 2110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & float_flag_overflow) >> 1 | 2111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & float_flag_divbyzero) << 1 | 2112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & float_flag_invalid) << 4; 2113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline char mips_ex_to_ieee(char xcpt) 2116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return (xcpt & FP_INEXACT) << 5 | 2118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & FP_UNDERFLOW) << 3 | 2119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & FP_OVERFLOW) << 1 | 2120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & FP_DIV0) >> 1 | 2121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (xcpt & FP_INVALID) >> 4; 2122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic inline void update_fcr31(void) 2125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->active_fpu.fp_status)); 2127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_CAUSE(env->active_fpu.fcr31, tmp); 2129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp) 2130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli helper_raise_exception(EXCP_FPE); 2131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else 2132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp); 2133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* Float support. 2136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli Single precition routines have a "s" suffix, double precision a 2137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps", 2138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli paired single lower "pl", paired single upper "pu". */ 2139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* unary operations, modifying fp status */ 2141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_sqrt_d(uint64_t fdt0) 2142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float64_sqrt(fdt0, &env->active_fpu.fp_status); 2144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_sqrt_s(uint32_t fst0) 2147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float32_sqrt(fst0, &env->active_fpu.fp_status); 2149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtd_s(uint32_t fst0) 2152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); 2157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtd_w(uint32_t wt0) 2162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); 2167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtd_l(uint64_t dt0) 2172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); 2177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtl_d(uint64_t fdt0) 2182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 2187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtl_s(uint32_t fst0) 2194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 2199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtps_pw(uint64_t dt0) 2206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2; 2209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 2212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status); 2213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_cvtpw_ps(uint64_t fdt0) 2218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wth2; 2221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 2224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status); 2225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) { 2227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wth2 = FLOAT_SNAN32; 2229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 2230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)wth2 << 32) | wt2; 2231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_d(uint64_t fdt0) 2234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); 2239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_w(uint32_t wt0) 2244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); 2249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_l(uint64_t dt0) 2254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); 2259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_pl(uint32_t wt0) 2264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = wt0; 2269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvts_pu(uint32_t wth0) 2274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = wth0; 2279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvtw_s(uint32_t fst0) 2284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 2289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_cvtw_d(uint64_t fdt0) 2296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 2301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2307409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_roundl_d(uint64_t fdt0) 2308409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2309409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2310409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23115b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2312409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); 2313409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 2314409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2315409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2316409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2317409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2318409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2319409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2320409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2321409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_roundl_s(uint32_t fst0) 2322409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2323409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2324409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23255b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2326409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); 2327409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 2328409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2329409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2330409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2331409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2332409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2333409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2334409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2335409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_roundw_d(uint64_t fdt0) 2336409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2337409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2338409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23395b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2340409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); 2341409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 2342409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2343409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2344409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2345409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2346409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2347409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2348409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2349409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_roundw_s(uint32_t fst0) 2350409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2351409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2352409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23535b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2354409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); 2355409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 2356409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2357409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2358409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2359409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2360409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2361409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2362409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2363409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_truncl_d(uint64_t fdt0) 2364409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2365409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2366409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23675b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2368409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); 2369409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2370409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2371409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2372409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2373409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2374409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2375409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_truncl_s(uint32_t fst0) 2376409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2377409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2378409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23795b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2380409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); 2381409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2382409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2383409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2384409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2385409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2386409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2387409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_truncw_d(uint64_t fdt0) 2388409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2389409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2390409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 23915b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2392409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); 2393409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2394409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2395409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2396409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2397409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2398409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2399409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_truncw_s(uint32_t fst0) 2400409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2401409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2402409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24035b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2404409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); 2405409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2406409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2407409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2408409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2409409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2410409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2411409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ceill_d(uint64_t fdt0) 2412409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2413409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2414409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24155b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2416409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 2417409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 2418409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2419409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2420409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2421409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2422409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2423409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2424409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2425409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ceill_s(uint32_t fst0) 2426409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2427409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2428409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24295b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2430409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 2431409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 2432409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2433409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2434409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2435409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2436409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2437409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2438409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2439409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ceilw_d(uint64_t fdt0) 2440409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2441409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2442409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24435b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2444409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 2445409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 2446409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2447409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2448409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2449409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2450409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2451409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2452409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2453409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ceilw_s(uint32_t fst0) 2454409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2455409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2456409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24575b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2458409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); 2459409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 2460409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2461409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2462409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2463409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2464409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2465409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2466409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2467409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_floorl_d(uint64_t fdt0) 2468409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2469409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2470409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24715b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2472409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 2473409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); 2474409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2475409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2476409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2477409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2478409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2479409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2480409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2481409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_floorl_s(uint32_t fst0) 2482409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2483409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; 2484409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24855b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2486409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 2487409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); 2488409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2489409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2490409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2491409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_SNAN64; 2492409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; 2493409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2494409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2495409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_floorw_d(uint64_t fdt0) 2496409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2497409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2498409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 24995b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2500409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 2501409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); 2502409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2503409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2504409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2505409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2506409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2507409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2508409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2509409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_floorw_s(uint32_t fst0) 2510409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2511409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; 2512409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 25135b954e623db71d3df2d9af1825ec3815137a06a7Bhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2514409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); 2515409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); 2516409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli RESTORE_ROUNDING_MODE; 2517409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2518409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & (FP_OVERFLOW | FP_INVALID)) 2519409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_SNAN32; 2520409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; 2521409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2522409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2523409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* unary operations, not modifying fp status */ 2524409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_UNOP(name) \ 2525409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _d(uint64_t fdt0) \ 2526409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2527409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float64_ ## name(fdt0); \ 2528409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2529409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ ## name ## _s(uint32_t fst0) \ 2530409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2531409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float32_ ## name(fst0); \ 2532409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2533409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _ps(uint64_t fdt0) \ 2534409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2535409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt0; \ 2536409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wth0; \ 2537409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2538409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt0 = float32_ ## name(fdt0 & 0XFFFFFFFF); \ 2539409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wth0 = float32_ ## name(fdt0 >> 32); \ 2540409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)wth0 << 32) | wt0; \ 2541409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2542409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_UNOP(abs) 2543409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_UNOP(chs) 2544409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_UNOP 2545409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2546409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS specific unary operations */ 2547409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip_d(uint64_t fdt0) 2548409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2549409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2550409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2551409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2552409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status); 2553409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2554409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2555409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2556409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2557409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_recip_s(uint32_t fst0) 2558409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2559409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2560409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2561409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2562409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status); 2563409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2564409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2565409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2566409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2567409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt_d(uint64_t fdt0) 2568409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2569409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2570409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2571409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2572409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 2573409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status); 2574409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2575409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2576409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2577409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2578409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_rsqrt_s(uint32_t fst0) 2579409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2580409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2581409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2582409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2583409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); 2584409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); 2585409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2586409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2587409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2588409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2589409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip1_d(uint64_t fdt0) 2590409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2591409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2592409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2593409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2594409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_div(FLOAT_ONE64, fdt0, &env->active_fpu.fp_status); 2595409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2596409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2597409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2598409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2599409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_recip1_s(uint32_t fst0) 2600409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2601409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2602409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2603409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2604409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_div(FLOAT_ONE32, fst0, &env->active_fpu.fp_status); 2605409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2606409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2607409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2608409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2609409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip1_ps(uint64_t fdt0) 2610409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2611409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2612409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2; 2613409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2614409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2615409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_div(FLOAT_ONE32, fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 2616409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_div(FLOAT_ONE32, fdt0 >> 32, &env->active_fpu.fp_status); 2617409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2618409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2619409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2620409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2621409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt1_d(uint64_t fdt0) 2622409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2623409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2; 2624409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2625409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2626409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); 2627409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_div(FLOAT_ONE64, fdt2, &env->active_fpu.fp_status); 2628409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2629409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2630409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2631409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2632409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_rsqrt1_s(uint32_t fst0) 2633409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2634409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2635409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2636409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2637409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); 2638409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); 2639409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2640409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2641409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2642409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2643409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt1_ps(uint64_t fdt0) 2644409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2645409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2646409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2; 2647409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2648409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2649409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); 2650409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status); 2651409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_div(FLOAT_ONE32, fst2, &env->active_fpu.fp_status); 2652409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_div(FLOAT_ONE32, fsth2, &env->active_fpu.fp_status); 2653409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2654409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2655409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2656409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2657409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_OP(name, p) void helper_float_##name##_##p(void) 2658409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2659409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* binary operations */ 2660409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_BINOP(name) \ 2661409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _d(uint64_t fdt0, uint64_t fdt1) \ 2662409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2663409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t dt2; \ 2664409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2665409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); \ 2666409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = float64_ ## name (fdt0, fdt1, &env->active_fpu.fp_status); \ 2667409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2668409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) \ 2669409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli dt2 = FLOAT_QNAN64; \ 2670409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return dt2; \ 2671409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2672409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2673409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ ## name ## _s(uint32_t fst0, uint32_t fst1) \ 2674409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2675409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; \ 2676409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2677409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); \ 2678409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ 2679409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2680409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) \ 2681409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_QNAN32; \ 2682409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return wt2; \ 2683409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2684409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2685409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name ## _ps(uint64_t fdt0, uint64_t fdt1) \ 2686409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2687409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ 2688409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = fdt0 >> 32; \ 2689409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst1 = fdt1 & 0XFFFFFFFF; \ 2690409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth1 = fdt1 >> 32; \ 2691409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wt2; \ 2692409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t wth2; \ 2693409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2694409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); \ 2695409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ 2696409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wth2 = float32_ ## name (fsth0, fsth1, &env->active_fpu.fp_status); \ 2697409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2698409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (GET_FP_CAUSE(env->active_fpu.fcr31) & FP_INVALID) { \ 2699409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wt2 = FLOAT_QNAN32; \ 2700409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli wth2 = FLOAT_QNAN32; \ 2701409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } \ 2702409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)wth2 << 32) | wt2; \ 2703409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2704409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2705409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(add) 2706409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(sub) 2707409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(mul) 2708409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_BINOP(div) 2709409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_BINOP 2710409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2711409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* ternary operations */ 2712409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_TERNOP(name1, name2) \ 2713409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \ 2714409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2) \ 2715409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2716409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status); \ 2717409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status); \ 2718409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2719409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2720409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_ ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \ 2721409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2) \ 2722409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2723409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ 2724409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ 2725409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2726409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2727409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_ ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1, \ 2728409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2) \ 2729409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2730409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ 2731409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = fdt0 >> 32; \ 2732409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst1 = fdt1 & 0XFFFFFFFF; \ 2733409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth1 = fdt1 >> 32; \ 2734409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2 = fdt2 & 0XFFFFFFFF; \ 2735409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2 = fdt2 >> 32; \ 2736409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2737409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ 2738409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth0 = float32_ ## name1 (fsth0, fsth1, &env->active_fpu.fp_status); \ 2739409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ 2740409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_ ## name2 (fsth0, fsth2, &env->active_fpu.fp_status); \ 2741409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; \ 2742409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2743409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2744409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_TERNOP(mul, add) 2745409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_TERNOP(mul, sub) 2746409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_TERNOP 2747409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2748409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* negated ternary operations */ 2749409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FLOAT_NTERNOP(name1, name2) \ 2750409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_n ## name1 ## name2 ## _d(uint64_t fdt0, uint64_t fdt1, \ 2751409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2) \ 2752409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2753409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt0 = float64_ ## name1 (fdt0, fdt1, &env->active_fpu.fp_status); \ 2754409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_ ## name2 (fdt0, fdt2, &env->active_fpu.fp_status); \ 2755409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float64_chs(fdt2); \ 2756409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2757409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2758409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_n ## name1 ## name2 ## _s(uint32_t fst0, uint32_t fst1, \ 2759409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2) \ 2760409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2761409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ 2762409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ 2763409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return float32_chs(fst2); \ 2764409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2765409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2766409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_n ## name1 ## name2 ## _ps(uint64_t fdt0, uint64_t fdt1,\ 2767409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint64_t fdt2) \ 2768409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2769409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ 2770409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = fdt0 >> 32; \ 2771409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst1 = fdt1 & 0XFFFFFFFF; \ 2772409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth1 = fdt1 >> 32; \ 2773409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2 = fdt2 & 0XFFFFFFFF; \ 2774409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2 = fdt2 >> 32; \ 2775409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 2776409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst0 = float32_ ## name1 (fst0, fst1, &env->active_fpu.fp_status); \ 2777409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth0 = float32_ ## name1 (fsth0, fsth1, &env->active_fpu.fp_status); \ 2778409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_ ## name2 (fst0, fst2, &env->active_fpu.fp_status); \ 2779409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_ ## name2 (fsth0, fsth2, &env->active_fpu.fp_status); \ 2780409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_chs(fst2); \ 2781409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_chs(fsth2); \ 2782409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; \ 2783409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2784409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2785409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_NTERNOP(mul, add) 2786409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFLOAT_NTERNOP(mul, sub) 2787409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#undef FLOAT_NTERNOP 2788409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2789409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* MIPS specific binary operations */ 2790409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip2_d(uint64_t fdt0, uint64_t fdt2) 2791409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2792409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2793409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); 2794409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_chs(float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status)); 2795409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2796409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2797409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2798409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2799409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_recip2_s(uint32_t fst0, uint32_t fst2) 2800409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2801409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2802409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 2803409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status)); 2804409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2805409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2806409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2807409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2808409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_recip2_ps(uint64_t fdt0, uint64_t fdt2) 2809409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2810409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = fdt0 & 0XFFFFFFFF; 2811409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = fdt0 >> 32; 2812409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2 = fdt2 & 0XFFFFFFFF; 2813409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2 = fdt2 >> 32; 2814409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2815409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2816409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 2817409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); 2818409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_chs(float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status)); 2819409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_chs(float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status)); 2820409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2821409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2822409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2823409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2824409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt2_d(uint64_t fdt0, uint64_t fdt2) 2825409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2826409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2827409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); 2828409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_sub(fdt2, FLOAT_ONE64, &env->active_fpu.fp_status); 2829409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->active_fpu.fp_status)); 2830409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2831409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fdt2; 2832409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2833409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2834409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint32_t helper_float_rsqrt2_s(uint32_t fst0, uint32_t fst2) 2835409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2836409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2837409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 2838409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status); 2839409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); 2840409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2841409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return fst2; 2842409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2843409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2844409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_rsqrt2_ps(uint64_t fdt0, uint64_t fdt2) 2845409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2846409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = fdt0 & 0XFFFFFFFF; 2847409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = fdt0 >> 32; 2848409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2 = fdt2 & 0XFFFFFFFF; 2849409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2 = fdt2 >> 32; 2850409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2851409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2852409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); 2853409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); 2854409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_sub(fst2, FLOAT_ONE32, &env->active_fpu.fp_status); 2855409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_sub(fsth2, FLOAT_ONE32, &env->active_fpu.fp_status); 2856409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); 2857409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->active_fpu.fp_status)); 2858409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2859409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2860409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2861409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2862409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_addr_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 fst2; 2869409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2; 2870409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2871409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2872409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_add (fst0, fsth0, &env->active_fpu.fp_status); 2873409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_add (fst1, fsth1, &env->active_fpu.fp_status); 2874409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2875409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2876409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2877409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2878409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliuint64_t helper_float_mulr_ps(uint64_t fdt0, uint64_t fdt1) 2879409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2880409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = fdt0 & 0XFFFFFFFF; 2881409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = fdt0 >> 32; 2882409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst1 = fdt1 & 0XFFFFFFFF; 2883409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth1 = fdt1 >> 32; 2884409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst2; 2885409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth2; 2886409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2887409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli set_float_exception_flags(0, &env->active_fpu.fp_status); 2888409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst2 = float32_mul (fst0, fsth0, &env->active_fpu.fp_status); 2889409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fsth2 = float32_mul (fst1, fsth1, &env->active_fpu.fp_status); 2890409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); 2891409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return ((uint64_t)fsth2 << 32) | fst2; 2892409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2893409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2894409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* compare operations */ 2895409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_COND_D(op, cond) \ 2896409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmp_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ 2897409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2898409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int c = cond; \ 2899409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2900409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (c) \ 2901409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc, env->active_fpu); \ 2902409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 2903409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc, env->active_fpu); \ 2904409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2905409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmpabs_d_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ 2906409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2907409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int c; \ 2908409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt0 = float64_abs(fdt0); \ 2909409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fdt1 = float64_abs(fdt1); \ 2910409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli c = cond; \ 2911409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2912409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (c) \ 2913409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc, env->active_fpu); \ 2914409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 2915409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc, env->active_fpu); \ 2916409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2917409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2918409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM) 2919409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2920409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (float64_is_signaling_nan(a) || 2921409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float64_is_signaling_nan(b) || 2922325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli (sig && (float64_is_any_nan(a) || float64_is_any_nan(b)))) { 2923409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float_raise(float_flag_invalid, status); 2924409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 1; 2925325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } else if (float64_is_any_nan(a) || float64_is_any_nan(b)) { 2926409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 1; 2927409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 2928409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 2929409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 2930409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2931409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2932409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false, 2933409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */ 2934409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(f, (float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status), 0)) 2935409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(un, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status)) 2936409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(eq, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) 2937409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ueq, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) 2938409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(olt, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) 2939409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ult, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) 2940409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ole, !float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) && float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) 2941409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ule, float64_is_unordered(0, fdt1, fdt0, &env->active_fpu.fp_status) || float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) 2942409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false, 2943409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */ 2944409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(sf, (float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status), 0)) 2945409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ngle,float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status)) 2946409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(seq, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) 2947409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ngl, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) 2948409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(lt, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) 2949409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(nge, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) 2950409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(le, !float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) && float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) 2951409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_D(ngt, float64_is_unordered(1, fdt1, fdt0, &env->active_fpu.fp_status) || float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) 2952409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2953409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_COND_S(op, cond) \ 2954409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmp_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ 2955409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2956409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int c = cond; \ 2957409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2958409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (c) \ 2959409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc, env->active_fpu); \ 2960409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 2961409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc, env->active_fpu); \ 2962409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 2963409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmpabs_s_ ## op (uint32_t fst0, uint32_t fst1, int cc) \ 2964409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 2965409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int c; \ 2966409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst0 = float32_abs(fst0); \ 2967409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli fst1 = float32_abs(fst1); \ 2968409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli c = cond; \ 2969409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 2970409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (c) \ 2971409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc, env->active_fpu); \ 2972409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 2973409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc, env->active_fpu); \ 2974409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2975409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2976409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM) 2977409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 2978409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (float32_is_signaling_nan(a) || 2979409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_signaling_nan(b) || 2980325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli (sig && (float32_is_any_nan(a) || float32_is_any_nan(b)))) { 2981409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float_raise(float_flag_invalid, status); 2982409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 1; 2983325e19d19ff9e1fc9c6acb12eeb754563fc2e251Bhanu Chetlapalli } else if (float32_is_any_nan(a) || float32_is_any_nan(b)) { 2984409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 1; 2985409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } else { 2986409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 2987409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 2988409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 2989409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 2990409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false, 2991409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */ 2992409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(f, (float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 0)) 2993409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(un, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status)) 2994409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(eq, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status)) 2995409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ueq, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status)) 2996409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(olt, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status)) 2997409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ult, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status)) 2998409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ole, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status)) 2999409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ule, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status)) 3000409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false, 3001409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */ 3002409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(sf, (float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 0)) 3003409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ngle,float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status)) 3004409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(seq, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status)) 3005409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ngl, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status)) 3006409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(lt, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status)) 3007409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(nge, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status)) 3008409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(le, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status)) 3009409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_S(ngt, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status)) 3010409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 3011409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#define FOP_COND_PS(op, condl, condh) \ 3012409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmp_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ 3013409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 3014409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \ 3015409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = float32_abs(fdt0 >> 32); \ 3016409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \ 3017409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth1 = float32_abs(fdt1 >> 32); \ 3018409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int cl = condl; \ 3019409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int ch = condh; \ 3020409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 3021409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 3022409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (cl) \ 3023409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc, env->active_fpu); \ 3024409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 3025409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc, env->active_fpu); \ 3026409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (ch) \ 3027409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc + 1, env->active_fpu); \ 3028409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 3029409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc + 1, env->active_fpu); \ 3030409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} \ 3031409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid helper_cmpabs_ps_ ## op (uint64_t fdt0, uint64_t fdt1, int cc) \ 3032409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ \ 3033409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \ 3034409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth0 = float32_abs(fdt0 >> 32); \ 3035409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \ 3036409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint32_t fsth1 = float32_abs(fdt1 >> 32); \ 3037409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int cl = condl; \ 3038409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int ch = condh; \ 3039409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli \ 3040409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli update_fcr31(); \ 3041409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (cl) \ 3042409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc, env->active_fpu); \ 3043409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 3044409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc, env->active_fpu); \ 3045409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (ch) \ 3046409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli SET_FP_COND(cc + 1, env->active_fpu); \ 3047409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli else \ 3048409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CLEAR_FP_COND(cc + 1, env->active_fpu); \ 3049409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 3050409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 3051409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false, 3052409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */ 3053409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(f, (float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 0), 3054409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status), 0)) 3055409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(un, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status), 3056409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status)) 3057409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(eq, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status), 3058409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) 3059409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ueq, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status), 3060409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) 3061409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(olt, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status), 3062409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) 3063409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ult, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status), 3064409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) 3065409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ole, !float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status), 3066409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) && float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) 3067409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ule, float32_is_unordered(0, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status), 3068409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(0, fsth1, fsth0, &env->active_fpu.fp_status) || float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) 3069409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli/* NOTE: the comma operator will make "cond" to eval to false, 3070409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli * but float*_is_unordered() is still called. */ 3071409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(sf, (float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 0), 3072409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status), 0)) 3073409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ngle,float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status), 3074409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status)) 3075409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(seq, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_eq(fst0, fst1, &env->active_fpu.fp_status), 3076409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) 3077409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ngl, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status), 3078409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) 3079409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(lt, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_lt(fst0, fst1, &env->active_fpu.fp_status), 3080409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) 3081409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(nge, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status), 3082409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) 3083409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(le, !float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) && float32_le(fst0, fst1, &env->active_fpu.fp_status), 3084409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli !float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) && float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) 3085409c7b66435cf5947cab6bf0710f92507317f22eBhanu ChetlapalliFOP_COND_PS(ngt, float32_is_unordered(1, fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status), 3086409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli float32_is_unordered(1, fsth1, fsth0, &env->active_fpu.fp_status) || float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) 3087