2 * MIPS VR5432 emulation helpers
4 * Copyright (c) 2004-2005 Jocelyn Mayer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 * SPDX-License-Identifier: LGPL-2.1-or-later
22 #include "qemu/osdep.h"
24 #include "exec/helper-proto.h"
26 /* 64 bits arithmetic for 32 bits hosts */
27 static inline uint64_t get_HILO(CPUMIPSState
*env
)
29 return ((uint64_t)(env
->active_tc
.HI
[0]) << 32) |
30 (uint32_t)env
->active_tc
.LO
[0];
33 static inline target_ulong
set_HIT0_LO(CPUMIPSState
*env
, uint64_t HILO
)
35 env
->active_tc
.LO
[0] = (int32_t)(HILO
& 0xFFFFFFFF);
36 return env
->active_tc
.HI
[0] = (int32_t)(HILO
>> 32);
39 static inline target_ulong
set_HI_LOT0(CPUMIPSState
*env
, uint64_t HILO
)
41 target_ulong tmp
= env
->active_tc
.LO
[0] = (int32_t)(HILO
& 0xFFFFFFFF);
42 env
->active_tc
.HI
[0] = (int32_t)(HILO
>> 32);
46 /* Multiplication variants of the vr54xx. */
47 target_ulong
helper_muls(CPUMIPSState
*env
, target_ulong arg1
,
50 return set_HI_LOT0(env
, 0 - ((int64_t)(int32_t)arg1
*
51 (int64_t)(int32_t)arg2
));
54 target_ulong
helper_mulsu(CPUMIPSState
*env
, target_ulong arg1
,
57 return set_HI_LOT0(env
, 0 - (uint64_t)(uint32_t)arg1
*
58 (uint64_t)(uint32_t)arg2
);
61 target_ulong
helper_macc(CPUMIPSState
*env
, target_ulong arg1
,
64 return set_HI_LOT0(env
, (int64_t)get_HILO(env
) + (int64_t)(int32_t)arg1
*
65 (int64_t)(int32_t)arg2
);
68 target_ulong
helper_macchi(CPUMIPSState
*env
, target_ulong arg1
,
71 return set_HIT0_LO(env
, (int64_t)get_HILO(env
) + (int64_t)(int32_t)arg1
*
72 (int64_t)(int32_t)arg2
);
75 target_ulong
helper_maccu(CPUMIPSState
*env
, target_ulong arg1
,
78 return set_HI_LOT0(env
, (uint64_t)get_HILO(env
) + (uint64_t)(uint32_t)arg1
*
79 (uint64_t)(uint32_t)arg2
);
82 target_ulong
helper_macchiu(CPUMIPSState
*env
, target_ulong arg1
,
85 return set_HIT0_LO(env
, (uint64_t)get_HILO(env
) + (uint64_t)(uint32_t)arg1
*
86 (uint64_t)(uint32_t)arg2
);
89 target_ulong
helper_msac(CPUMIPSState
*env
, target_ulong arg1
,
92 return set_HI_LOT0(env
, (int64_t)get_HILO(env
) - (int64_t)(int32_t)arg1
*
93 (int64_t)(int32_t)arg2
);
96 target_ulong
helper_msachi(CPUMIPSState
*env
, target_ulong arg1
,
99 return set_HIT0_LO(env
, (int64_t)get_HILO(env
) - (int64_t)(int32_t)arg1
*
100 (int64_t)(int32_t)arg2
);
103 target_ulong
helper_msacu(CPUMIPSState
*env
, target_ulong arg1
,
106 return set_HI_LOT0(env
, (uint64_t)get_HILO(env
) - (uint64_t)(uint32_t)arg1
*
107 (uint64_t)(uint32_t)arg2
);
110 target_ulong
helper_msachiu(CPUMIPSState
*env
, target_ulong arg1
,
113 return set_HIT0_LO(env
, (uint64_t)get_HILO(env
) - (uint64_t)(uint32_t)arg1
*
114 (uint64_t)(uint32_t)arg2
);
117 target_ulong
helper_mulhi(CPUMIPSState
*env
, target_ulong arg1
,
120 return set_HIT0_LO(env
, (int64_t)(int32_t)arg1
* (int64_t)(int32_t)arg2
);
123 target_ulong
helper_mulhiu(CPUMIPSState
*env
, target_ulong arg1
,
126 return set_HIT0_LO(env
, (uint64_t)(uint32_t)arg1
*
127 (uint64_t)(uint32_t)arg2
);
130 target_ulong
helper_mulshi(CPUMIPSState
*env
, target_ulong arg1
,
133 return set_HIT0_LO(env
, 0 - (int64_t)(int32_t)arg1
*
134 (int64_t)(int32_t)arg2
);
137 target_ulong
helper_mulshiu(CPUMIPSState
*env
, target_ulong arg1
,
140 return set_HIT0_LO(env
, 0 - (uint64_t)(uint32_t)arg1
*
141 (uint64_t)(uint32_t)arg2
);