1*6629f79fSPhilippe Mathieu-Daudé /* 2*6629f79fSPhilippe Mathieu-Daudé * MIPS VR5432 emulation helpers 3*6629f79fSPhilippe Mathieu-Daudé * 4*6629f79fSPhilippe Mathieu-Daudé * Copyright (c) 2004-2005 Jocelyn Mayer 5*6629f79fSPhilippe Mathieu-Daudé * 6*6629f79fSPhilippe Mathieu-Daudé * This library is free software; you can redistribute it and/or 7*6629f79fSPhilippe Mathieu-Daudé * modify it under the terms of the GNU Lesser General Public 8*6629f79fSPhilippe Mathieu-Daudé * License as published by the Free Software Foundation; either 9*6629f79fSPhilippe Mathieu-Daudé * version 2.1 of the License, or (at your option) any later version. 10*6629f79fSPhilippe Mathieu-Daudé * 11*6629f79fSPhilippe Mathieu-Daudé * This library is distributed in the hope that it will be useful, 12*6629f79fSPhilippe Mathieu-Daudé * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*6629f79fSPhilippe Mathieu-Daudé * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*6629f79fSPhilippe Mathieu-Daudé * Lesser General Public License for more details. 15*6629f79fSPhilippe Mathieu-Daudé * 16*6629f79fSPhilippe Mathieu-Daudé * You should have received a copy of the GNU Lesser General Public 17*6629f79fSPhilippe Mathieu-Daudé * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18*6629f79fSPhilippe Mathieu-Daudé * 19*6629f79fSPhilippe Mathieu-Daudé * SPDX-License-Identifier: LGPL-2.1-or-later 20*6629f79fSPhilippe Mathieu-Daudé */ 21*6629f79fSPhilippe Mathieu-Daudé 22*6629f79fSPhilippe Mathieu-Daudé #include "qemu/osdep.h" 23*6629f79fSPhilippe Mathieu-Daudé #include "cpu.h" 24*6629f79fSPhilippe Mathieu-Daudé #include "exec/helper-proto.h" 25*6629f79fSPhilippe Mathieu-Daudé 26*6629f79fSPhilippe Mathieu-Daudé /* 64 bits arithmetic for 32 bits hosts */ 27*6629f79fSPhilippe Mathieu-Daudé static inline uint64_t get_HILO(CPUMIPSState *env) 28*6629f79fSPhilippe Mathieu-Daudé { 29*6629f79fSPhilippe Mathieu-Daudé return ((uint64_t)(env->active_tc.HI[0]) << 32) | 30*6629f79fSPhilippe Mathieu-Daudé (uint32_t)env->active_tc.LO[0]; 31*6629f79fSPhilippe Mathieu-Daudé } 32*6629f79fSPhilippe Mathieu-Daudé 33*6629f79fSPhilippe Mathieu-Daudé static inline target_ulong set_HIT0_LO(CPUMIPSState *env, uint64_t HILO) 34*6629f79fSPhilippe Mathieu-Daudé { 35*6629f79fSPhilippe Mathieu-Daudé env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); 36*6629f79fSPhilippe Mathieu-Daudé return env->active_tc.HI[0] = (int32_t)(HILO >> 32); 37*6629f79fSPhilippe Mathieu-Daudé } 38*6629f79fSPhilippe Mathieu-Daudé 39*6629f79fSPhilippe Mathieu-Daudé static inline target_ulong set_HI_LOT0(CPUMIPSState *env, uint64_t HILO) 40*6629f79fSPhilippe Mathieu-Daudé { 41*6629f79fSPhilippe Mathieu-Daudé target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); 42*6629f79fSPhilippe Mathieu-Daudé env->active_tc.HI[0] = (int32_t)(HILO >> 32); 43*6629f79fSPhilippe Mathieu-Daudé return tmp; 44*6629f79fSPhilippe Mathieu-Daudé } 45*6629f79fSPhilippe Mathieu-Daudé 46*6629f79fSPhilippe Mathieu-Daudé /* Multiplication variants of the vr54xx. */ 47*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_muls(CPUMIPSState *env, target_ulong arg1, 48*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 49*6629f79fSPhilippe Mathieu-Daudé { 50*6629f79fSPhilippe Mathieu-Daudé return set_HI_LOT0(env, 0 - ((int64_t)(int32_t)arg1 * 51*6629f79fSPhilippe Mathieu-Daudé (int64_t)(int32_t)arg2)); 52*6629f79fSPhilippe Mathieu-Daudé } 53*6629f79fSPhilippe Mathieu-Daudé 54*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_mulsu(CPUMIPSState *env, target_ulong arg1, 55*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 56*6629f79fSPhilippe Mathieu-Daudé { 57*6629f79fSPhilippe Mathieu-Daudé return set_HI_LOT0(env, 0 - (uint64_t)(uint32_t)arg1 * 58*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 59*6629f79fSPhilippe Mathieu-Daudé } 60*6629f79fSPhilippe Mathieu-Daudé 61*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_macc(CPUMIPSState *env, target_ulong arg1, 62*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 63*6629f79fSPhilippe Mathieu-Daudé { 64*6629f79fSPhilippe Mathieu-Daudé return set_HI_LOT0(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 * 65*6629f79fSPhilippe Mathieu-Daudé (int64_t)(int32_t)arg2); 66*6629f79fSPhilippe Mathieu-Daudé } 67*6629f79fSPhilippe Mathieu-Daudé 68*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_macchi(CPUMIPSState *env, target_ulong arg1, 69*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 70*6629f79fSPhilippe Mathieu-Daudé { 71*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 * 72*6629f79fSPhilippe Mathieu-Daudé (int64_t)(int32_t)arg2); 73*6629f79fSPhilippe Mathieu-Daudé } 74*6629f79fSPhilippe Mathieu-Daudé 75*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_maccu(CPUMIPSState *env, target_ulong arg1, 76*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 77*6629f79fSPhilippe Mathieu-Daudé { 78*6629f79fSPhilippe Mathieu-Daudé return set_HI_LOT0(env, (uint64_t)get_HILO(env) + (uint64_t)(uint32_t)arg1 * 79*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 80*6629f79fSPhilippe Mathieu-Daudé } 81*6629f79fSPhilippe Mathieu-Daudé 82*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_macchiu(CPUMIPSState *env, target_ulong arg1, 83*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 84*6629f79fSPhilippe Mathieu-Daudé { 85*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, (uint64_t)get_HILO(env) + (uint64_t)(uint32_t)arg1 * 86*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 87*6629f79fSPhilippe Mathieu-Daudé } 88*6629f79fSPhilippe Mathieu-Daudé 89*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_msac(CPUMIPSState *env, target_ulong arg1, 90*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 91*6629f79fSPhilippe Mathieu-Daudé { 92*6629f79fSPhilippe Mathieu-Daudé return set_HI_LOT0(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 * 93*6629f79fSPhilippe Mathieu-Daudé (int64_t)(int32_t)arg2); 94*6629f79fSPhilippe Mathieu-Daudé } 95*6629f79fSPhilippe Mathieu-Daudé 96*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_msachi(CPUMIPSState *env, target_ulong arg1, 97*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 98*6629f79fSPhilippe Mathieu-Daudé { 99*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 * 100*6629f79fSPhilippe Mathieu-Daudé (int64_t)(int32_t)arg2); 101*6629f79fSPhilippe Mathieu-Daudé } 102*6629f79fSPhilippe Mathieu-Daudé 103*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_msacu(CPUMIPSState *env, target_ulong arg1, 104*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 105*6629f79fSPhilippe Mathieu-Daudé { 106*6629f79fSPhilippe Mathieu-Daudé return set_HI_LOT0(env, (uint64_t)get_HILO(env) - (uint64_t)(uint32_t)arg1 * 107*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 108*6629f79fSPhilippe Mathieu-Daudé } 109*6629f79fSPhilippe Mathieu-Daudé 110*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_msachiu(CPUMIPSState *env, target_ulong arg1, 111*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 112*6629f79fSPhilippe Mathieu-Daudé { 113*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, (uint64_t)get_HILO(env) - (uint64_t)(uint32_t)arg1 * 114*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 115*6629f79fSPhilippe Mathieu-Daudé } 116*6629f79fSPhilippe Mathieu-Daudé 117*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_mulhi(CPUMIPSState *env, target_ulong arg1, 118*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 119*6629f79fSPhilippe Mathieu-Daudé { 120*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); 121*6629f79fSPhilippe Mathieu-Daudé } 122*6629f79fSPhilippe Mathieu-Daudé 123*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_mulhiu(CPUMIPSState *env, target_ulong arg1, 124*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 125*6629f79fSPhilippe Mathieu-Daudé { 126*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, (uint64_t)(uint32_t)arg1 * 127*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 128*6629f79fSPhilippe Mathieu-Daudé } 129*6629f79fSPhilippe Mathieu-Daudé 130*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_mulshi(CPUMIPSState *env, target_ulong arg1, 131*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 132*6629f79fSPhilippe Mathieu-Daudé { 133*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, 0 - (int64_t)(int32_t)arg1 * 134*6629f79fSPhilippe Mathieu-Daudé (int64_t)(int32_t)arg2); 135*6629f79fSPhilippe Mathieu-Daudé } 136*6629f79fSPhilippe Mathieu-Daudé 137*6629f79fSPhilippe Mathieu-Daudé target_ulong helper_mulshiu(CPUMIPSState *env, target_ulong arg1, 138*6629f79fSPhilippe Mathieu-Daudé target_ulong arg2) 139*6629f79fSPhilippe Mathieu-Daudé { 140*6629f79fSPhilippe Mathieu-Daudé return set_HIT0_LO(env, 0 - (uint64_t)(uint32_t)arg1 * 141*6629f79fSPhilippe Mathieu-Daudé (uint64_t)(uint32_t)arg2); 142*6629f79fSPhilippe Mathieu-Daudé } 143