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