1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include "qemu/osdep.h"
23#include "cpu.h"
24#include "exec/helper-proto.h"
25
26
27static inline uint64_t get_HILO(CPUMIPSState *env)
28{
29 return ((uint64_t)(env->active_tc.HI[0]) << 32) |
30 (uint32_t)env->active_tc.LO[0];
31}
32
33static inline target_ulong set_HIT0_LO(CPUMIPSState *env, uint64_t HILO)
34{
35 env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF);
36 return env->active_tc.HI[0] = (int32_t)(HILO >> 32);
37}
38
39static inline target_ulong set_HI_LOT0(CPUMIPSState *env, uint64_t HILO)
40{
41 target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF);
42 env->active_tc.HI[0] = (int32_t)(HILO >> 32);
43 return tmp;
44}
45
46
47target_ulong helper_muls(CPUMIPSState *env, target_ulong arg1,
48 target_ulong arg2)
49{
50 return set_HI_LOT0(env, 0 - ((int64_t)(int32_t)arg1 *
51 (int64_t)(int32_t)arg2));
52}
53
54target_ulong helper_mulsu(CPUMIPSState *env, target_ulong arg1,
55 target_ulong arg2)
56{
57 return set_HI_LOT0(env, 0 - (uint64_t)(uint32_t)arg1 *
58 (uint64_t)(uint32_t)arg2);
59}
60
61target_ulong helper_macc(CPUMIPSState *env, target_ulong arg1,
62 target_ulong arg2)
63{
64 return set_HI_LOT0(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 *
65 (int64_t)(int32_t)arg2);
66}
67
68target_ulong helper_macchi(CPUMIPSState *env, target_ulong arg1,
69 target_ulong arg2)
70{
71 return set_HIT0_LO(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 *
72 (int64_t)(int32_t)arg2);
73}
74
75target_ulong helper_maccu(CPUMIPSState *env, target_ulong arg1,
76 target_ulong arg2)
77{
78 return set_HI_LOT0(env, (uint64_t)get_HILO(env) + (uint64_t)(uint32_t)arg1 *
79 (uint64_t)(uint32_t)arg2);
80}
81
82target_ulong helper_macchiu(CPUMIPSState *env, target_ulong arg1,
83 target_ulong arg2)
84{
85 return set_HIT0_LO(env, (uint64_t)get_HILO(env) + (uint64_t)(uint32_t)arg1 *
86 (uint64_t)(uint32_t)arg2);
87}
88
89target_ulong helper_msac(CPUMIPSState *env, target_ulong arg1,
90 target_ulong arg2)
91{
92 return set_HI_LOT0(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 *
93 (int64_t)(int32_t)arg2);
94}
95
96target_ulong helper_msachi(CPUMIPSState *env, target_ulong arg1,
97 target_ulong arg2)
98{
99 return set_HIT0_LO(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 *
100 (int64_t)(int32_t)arg2);
101}
102
103target_ulong helper_msacu(CPUMIPSState *env, target_ulong arg1,
104 target_ulong arg2)
105{
106 return set_HI_LOT0(env, (uint64_t)get_HILO(env) - (uint64_t)(uint32_t)arg1 *
107 (uint64_t)(uint32_t)arg2);
108}
109
110target_ulong helper_msachiu(CPUMIPSState *env, target_ulong arg1,
111 target_ulong arg2)
112{
113 return set_HIT0_LO(env, (uint64_t)get_HILO(env) - (uint64_t)(uint32_t)arg1 *
114 (uint64_t)(uint32_t)arg2);
115}
116
117target_ulong helper_mulhi(CPUMIPSState *env, target_ulong arg1,
118 target_ulong arg2)
119{
120 return set_HIT0_LO(env, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2);
121}
122
123target_ulong helper_mulhiu(CPUMIPSState *env, target_ulong arg1,
124 target_ulong arg2)
125{
126 return set_HIT0_LO(env, (uint64_t)(uint32_t)arg1 *
127 (uint64_t)(uint32_t)arg2);
128}
129
130target_ulong helper_mulshi(CPUMIPSState *env, target_ulong arg1,
131 target_ulong arg2)
132{
133 return set_HIT0_LO(env, 0 - (int64_t)(int32_t)arg1 *
134 (int64_t)(int32_t)arg2);
135}
136
137target_ulong helper_mulshiu(CPUMIPSState *env, target_ulong arg1,
138 target_ulong arg2)
139{
140 return set_HIT0_LO(env, 0 - (uint64_t)(uint32_t)arg1 *
141 (uint64_t)(uint32_t)arg2);
142}
143