xref: /openbmc/qemu/target/mips/tcg/vr54xx_helper.c (revision d8ae530ec00368d4adfb996b5ef6c74cb4460504)
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 */
get_HILO(CPUMIPSState * env)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é 
set_HIT0_LO(CPUMIPSState * env,uint64_t HILO)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é 
set_HI_LOT0(CPUMIPSState * env,uint64_t HILO)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. */
helper_muls(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_mulsu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_macc(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_macchi(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_maccu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_macchiu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_msac(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_msachi(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_msacu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_msachiu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_mulhi(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_mulhiu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_mulshi(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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é 
helper_mulshiu(CPUMIPSState * env,target_ulong arg1,target_ulong arg2)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