Statistics
| Branch: | Revision:

root / target-mips / op.c @ 1e8a7cfd

History | View | Annotate | Download (10.4 kB)

1 6af0bf9c bellard
/*
2 6af0bf9c bellard
 *  MIPS emulation micro-operations for qemu.
3 6af0bf9c bellard
 * 
4 6af0bf9c bellard
 *  Copyright (c) 2004-2005 Jocelyn Mayer
5 6af0bf9c bellard
 *
6 6af0bf9c bellard
 * This library is free software; you can redistribute it and/or
7 6af0bf9c bellard
 * modify it under the terms of the GNU Lesser General Public
8 6af0bf9c bellard
 * License as published by the Free Software Foundation; either
9 6af0bf9c bellard
 * version 2 of the License, or (at your option) any later version.
10 6af0bf9c bellard
 *
11 6af0bf9c bellard
 * This library is distributed in the hope that it will be useful,
12 6af0bf9c bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 6af0bf9c bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 6af0bf9c bellard
 * Lesser General Public License for more details.
15 6af0bf9c bellard
 *
16 6af0bf9c bellard
 * You should have received a copy of the GNU Lesser General Public
17 6af0bf9c bellard
 * License along with this library; if not, write to the Free Software
18 6af0bf9c bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 6af0bf9c bellard
 */
20 6af0bf9c bellard
21 6af0bf9c bellard
#include "config.h"
22 6af0bf9c bellard
#include "exec.h"
23 6af0bf9c bellard
24 1b351e52 bellard
#ifndef CALL_FROM_TB0
25 1b351e52 bellard
#define CALL_FROM_TB0(func) func();
26 1b351e52 bellard
#endif
27 1b351e52 bellard
#ifndef CALL_FROM_TB1
28 1b351e52 bellard
#define CALL_FROM_TB1(func, arg0) func(arg0);
29 1b351e52 bellard
#endif
30 1b351e52 bellard
#ifndef CALL_FROM_TB1_CONST16
31 1b351e52 bellard
#define CALL_FROM_TB1_CONST16(func, arg0) CALL_FROM_TB1(func, arg0);
32 1b351e52 bellard
#endif
33 1b351e52 bellard
#ifndef CALL_FROM_TB2
34 1b351e52 bellard
#define CALL_FROM_TB2(func, arg0, arg1) func(arg0, arg1);
35 1b351e52 bellard
#endif
36 1b351e52 bellard
#ifndef CALL_FROM_TB2_CONST16
37 1b351e52 bellard
#define CALL_FROM_TB2_CONST16(func, arg0, arg1)     \
38 1b351e52 bellard
CALL_FROM_TB2(func, arg0, arg1);
39 1b351e52 bellard
#endif
40 1b351e52 bellard
#ifndef CALL_FROM_TB3
41 1b351e52 bellard
#define CALL_FROM_TB3(func, arg0, arg1, arg2) func(arg0, arg1, arg2);
42 1b351e52 bellard
#endif
43 1b351e52 bellard
#ifndef CALL_FROM_TB4
44 1b351e52 bellard
#define CALL_FROM_TB4(func, arg0, arg1, arg2, arg3) \
45 1b351e52 bellard
        func(arg0, arg1, arg2, arg3);
46 1b351e52 bellard
#endif
47 1b351e52 bellard
48 6af0bf9c bellard
#define REG 1
49 6af0bf9c bellard
#include "op_template.c"
50 6af0bf9c bellard
#undef REG
51 6af0bf9c bellard
#define REG 2
52 6af0bf9c bellard
#include "op_template.c"
53 6af0bf9c bellard
#undef REG
54 6af0bf9c bellard
#define REG 3
55 6af0bf9c bellard
#include "op_template.c"
56 6af0bf9c bellard
#undef REG
57 6af0bf9c bellard
#define REG 4
58 6af0bf9c bellard
#include "op_template.c"
59 6af0bf9c bellard
#undef REG
60 6af0bf9c bellard
#define REG 5
61 6af0bf9c bellard
#include "op_template.c"
62 6af0bf9c bellard
#undef REG
63 6af0bf9c bellard
#define REG 6
64 6af0bf9c bellard
#include "op_template.c"
65 6af0bf9c bellard
#undef REG
66 6af0bf9c bellard
#define REG 7
67 6af0bf9c bellard
#include "op_template.c"
68 6af0bf9c bellard
#undef REG
69 6af0bf9c bellard
#define REG 8
70 6af0bf9c bellard
#include "op_template.c"
71 6af0bf9c bellard
#undef REG
72 6af0bf9c bellard
#define REG 9
73 6af0bf9c bellard
#include "op_template.c"
74 6af0bf9c bellard
#undef REG
75 6af0bf9c bellard
#define REG 10
76 6af0bf9c bellard
#include "op_template.c"
77 6af0bf9c bellard
#undef REG
78 6af0bf9c bellard
#define REG 11
79 6af0bf9c bellard
#include "op_template.c"
80 6af0bf9c bellard
#undef REG
81 6af0bf9c bellard
#define REG 12
82 6af0bf9c bellard
#include "op_template.c"
83 6af0bf9c bellard
#undef REG
84 6af0bf9c bellard
#define REG 13
85 6af0bf9c bellard
#include "op_template.c"
86 6af0bf9c bellard
#undef REG
87 6af0bf9c bellard
#define REG 14
88 6af0bf9c bellard
#include "op_template.c"
89 6af0bf9c bellard
#undef REG
90 6af0bf9c bellard
#define REG 15
91 6af0bf9c bellard
#include "op_template.c"
92 6af0bf9c bellard
#undef REG
93 6af0bf9c bellard
#define REG 16
94 6af0bf9c bellard
#include "op_template.c"
95 6af0bf9c bellard
#undef REG
96 6af0bf9c bellard
#define REG 17
97 6af0bf9c bellard
#include "op_template.c"
98 6af0bf9c bellard
#undef REG
99 6af0bf9c bellard
#define REG 18
100 6af0bf9c bellard
#include "op_template.c"
101 6af0bf9c bellard
#undef REG
102 6af0bf9c bellard
#define REG 19
103 6af0bf9c bellard
#include "op_template.c"
104 6af0bf9c bellard
#undef REG
105 6af0bf9c bellard
#define REG 20
106 6af0bf9c bellard
#include "op_template.c"
107 6af0bf9c bellard
#undef REG
108 6af0bf9c bellard
#define REG 21
109 6af0bf9c bellard
#include "op_template.c"
110 6af0bf9c bellard
#undef REG
111 6af0bf9c bellard
#define REG 22
112 6af0bf9c bellard
#include "op_template.c"
113 6af0bf9c bellard
#undef REG
114 6af0bf9c bellard
#define REG 23
115 6af0bf9c bellard
#include "op_template.c"
116 6af0bf9c bellard
#undef REG
117 6af0bf9c bellard
#define REG 24
118 6af0bf9c bellard
#include "op_template.c"
119 6af0bf9c bellard
#undef REG
120 6af0bf9c bellard
#define REG 25
121 6af0bf9c bellard
#include "op_template.c"
122 6af0bf9c bellard
#undef REG
123 6af0bf9c bellard
#define REG 26
124 6af0bf9c bellard
#include "op_template.c"
125 6af0bf9c bellard
#undef REG
126 6af0bf9c bellard
#define REG 27
127 6af0bf9c bellard
#include "op_template.c"
128 6af0bf9c bellard
#undef REG
129 6af0bf9c bellard
#define REG 28
130 6af0bf9c bellard
#include "op_template.c"
131 6af0bf9c bellard
#undef REG
132 6af0bf9c bellard
#define REG 29
133 6af0bf9c bellard
#include "op_template.c"
134 6af0bf9c bellard
#undef REG
135 6af0bf9c bellard
#define REG 30
136 6af0bf9c bellard
#include "op_template.c"
137 6af0bf9c bellard
#undef REG
138 6af0bf9c bellard
#define REG 31
139 6af0bf9c bellard
#include "op_template.c"
140 6af0bf9c bellard
#undef REG
141 6af0bf9c bellard
142 6af0bf9c bellard
#define TN T0
143 6af0bf9c bellard
#include "op_template.c"
144 6af0bf9c bellard
#undef TN
145 6af0bf9c bellard
#define TN T1
146 6af0bf9c bellard
#include "op_template.c"
147 6af0bf9c bellard
#undef TN
148 6af0bf9c bellard
#define TN T2
149 6af0bf9c bellard
#include "op_template.c"
150 6af0bf9c bellard
#undef TN
151 6af0bf9c bellard
152 6af0bf9c bellard
void op_dup_T0 (void)
153 6af0bf9c bellard
{
154 6af0bf9c bellard
    T2 = T0;
155 6af0bf9c bellard
    RETURN();
156 6af0bf9c bellard
}
157 6af0bf9c bellard
158 6af0bf9c bellard
void op_load_HI (void)
159 6af0bf9c bellard
{
160 6af0bf9c bellard
    T0 = env->HI;
161 6af0bf9c bellard
    RETURN();
162 6af0bf9c bellard
}
163 6af0bf9c bellard
164 6af0bf9c bellard
void op_store_HI (void)
165 6af0bf9c bellard
{
166 6af0bf9c bellard
    env->HI = T0;
167 6af0bf9c bellard
    RETURN();
168 6af0bf9c bellard
}
169 6af0bf9c bellard
170 6af0bf9c bellard
void op_load_LO (void)
171 6af0bf9c bellard
{
172 6af0bf9c bellard
    T0 = env->LO;
173 6af0bf9c bellard
    RETURN();
174 6af0bf9c bellard
}
175 6af0bf9c bellard
176 6af0bf9c bellard
void op_store_LO (void)
177 6af0bf9c bellard
{
178 6af0bf9c bellard
    env->LO = T0;
179 6af0bf9c bellard
    RETURN();
180 6af0bf9c bellard
}
181 6af0bf9c bellard
182 6af0bf9c bellard
/* Load and store */
183 6af0bf9c bellard
#define MEMSUFFIX _raw
184 6af0bf9c bellard
#include "op_mem.c"
185 6af0bf9c bellard
#undef MEMSUFFIX
186 6af0bf9c bellard
#if !defined(CONFIG_USER_ONLY)
187 6af0bf9c bellard
#define MEMSUFFIX _user
188 6af0bf9c bellard
#include "op_mem.c"
189 6af0bf9c bellard
#undef MEMSUFFIX
190 6af0bf9c bellard
191 6af0bf9c bellard
#define MEMSUFFIX _kernel
192 6af0bf9c bellard
#include "op_mem.c"
193 6af0bf9c bellard
#undef MEMSUFFIX
194 6af0bf9c bellard
#endif
195 6af0bf9c bellard
196 6af0bf9c bellard
/* Arithmetic */
197 6af0bf9c bellard
void op_add (void)
198 6af0bf9c bellard
{
199 6af0bf9c bellard
    T0 += T1;
200 6af0bf9c bellard
    RETURN();
201 6af0bf9c bellard
}
202 6af0bf9c bellard
203 6af0bf9c bellard
void op_addo (void)
204 6af0bf9c bellard
{
205 6af0bf9c bellard
    target_ulong tmp;
206 6af0bf9c bellard
207 6af0bf9c bellard
    tmp = T0;
208 6af0bf9c bellard
    T0 += T1;
209 6af0bf9c bellard
    if ((T0 >> 31) ^ (T1 >> 31) ^ (tmp >> 31)) {
210 6af0bf9c bellard
        CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
211 6af0bf9c bellard
    }
212 6af0bf9c bellard
    RETURN();
213 6af0bf9c bellard
}
214 6af0bf9c bellard
215 6af0bf9c bellard
void op_sub (void)
216 6af0bf9c bellard
{
217 6af0bf9c bellard
    T0 -= T1;
218 6af0bf9c bellard
    RETURN();
219 6af0bf9c bellard
}
220 6af0bf9c bellard
221 6af0bf9c bellard
void op_subo (void)
222 6af0bf9c bellard
{
223 6af0bf9c bellard
    target_ulong tmp;
224 6af0bf9c bellard
225 6af0bf9c bellard
    tmp = T0;
226 6af0bf9c bellard
    T0 = (int32_t)T0 - (int32_t)T1;
227 6af0bf9c bellard
    if (!((T0 >> 31) ^ (T1 >> 31) ^ (tmp >> 31))) {
228 6af0bf9c bellard
        CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
229 6af0bf9c bellard
    }
230 6af0bf9c bellard
    RETURN();
231 6af0bf9c bellard
}
232 6af0bf9c bellard
233 6af0bf9c bellard
void op_mul (void)
234 6af0bf9c bellard
{
235 6af0bf9c bellard
    T0 = (int32_t)T0 * (int32_t)T1;
236 6af0bf9c bellard
    RETURN();
237 6af0bf9c bellard
}
238 6af0bf9c bellard
239 6af0bf9c bellard
void op_div (void)
240 6af0bf9c bellard
{
241 6af0bf9c bellard
    if (T1 != 0) {
242 6af0bf9c bellard
        env->LO = (int32_t)T0 / (int32_t)T1;
243 6af0bf9c bellard
        env->HI = (int32_t)T0 % (int32_t)T1;
244 6af0bf9c bellard
    }
245 6af0bf9c bellard
    RETURN();
246 6af0bf9c bellard
}
247 6af0bf9c bellard
248 6af0bf9c bellard
void op_divu (void)
249 6af0bf9c bellard
{
250 6af0bf9c bellard
    if (T1 != 0) {
251 6af0bf9c bellard
        env->LO = T0 / T1;
252 6af0bf9c bellard
        env->HI = T0 % T1;
253 6af0bf9c bellard
    }
254 6af0bf9c bellard
    RETURN();
255 6af0bf9c bellard
}
256 6af0bf9c bellard
257 6af0bf9c bellard
/* Logical */
258 6af0bf9c bellard
void op_and (void)
259 6af0bf9c bellard
{
260 6af0bf9c bellard
    T0 &= T1;
261 6af0bf9c bellard
    RETURN();
262 6af0bf9c bellard
}
263 6af0bf9c bellard
264 6af0bf9c bellard
void op_nor (void)
265 6af0bf9c bellard
{
266 6af0bf9c bellard
    T0 = ~(T0 | T1);
267 6af0bf9c bellard
    RETURN();
268 6af0bf9c bellard
}
269 6af0bf9c bellard
270 6af0bf9c bellard
void op_or (void)
271 6af0bf9c bellard
{
272 6af0bf9c bellard
    T0 |= T1;
273 6af0bf9c bellard
    RETURN();
274 6af0bf9c bellard
}
275 6af0bf9c bellard
276 6af0bf9c bellard
void op_xor (void)
277 6af0bf9c bellard
{
278 6af0bf9c bellard
    T0 ^= T1;
279 6af0bf9c bellard
    RETURN();
280 6af0bf9c bellard
}
281 6af0bf9c bellard
282 6af0bf9c bellard
void op_sll (void)
283 6af0bf9c bellard
{
284 6af0bf9c bellard
    T0 = T0 << T1;
285 6af0bf9c bellard
    RETURN();
286 6af0bf9c bellard
}
287 6af0bf9c bellard
288 6af0bf9c bellard
void op_sra (void)
289 6af0bf9c bellard
{
290 6af0bf9c bellard
    T0 = (int32_t)T0 >> T1;
291 6af0bf9c bellard
    RETURN();
292 6af0bf9c bellard
}
293 6af0bf9c bellard
294 6af0bf9c bellard
void op_srl (void)
295 6af0bf9c bellard
{
296 6af0bf9c bellard
    T0 = T0 >> T1;
297 6af0bf9c bellard
    RETURN();
298 6af0bf9c bellard
}
299 6af0bf9c bellard
300 6af0bf9c bellard
void op_sllv (void)
301 6af0bf9c bellard
{
302 6af0bf9c bellard
    T0 = T1 << (T0 & 0x1F);
303 6af0bf9c bellard
    RETURN();
304 6af0bf9c bellard
}
305 6af0bf9c bellard
306 6af0bf9c bellard
void op_srav (void)
307 6af0bf9c bellard
{
308 6af0bf9c bellard
    T0 = (int32_t)T1 >> (T0 & 0x1F);
309 6af0bf9c bellard
    RETURN();
310 6af0bf9c bellard
}
311 6af0bf9c bellard
312 6af0bf9c bellard
void op_srlv (void)
313 6af0bf9c bellard
{
314 6af0bf9c bellard
    T0 = T1 >> (T0 & 0x1F);
315 6af0bf9c bellard
    RETURN();
316 6af0bf9c bellard
}
317 6af0bf9c bellard
318 6af0bf9c bellard
void op_clo (void)
319 6af0bf9c bellard
{
320 6af0bf9c bellard
    int n;
321 6af0bf9c bellard
322 6af0bf9c bellard
    if (T0 == (target_ulong)-1) {
323 6af0bf9c bellard
        T0 = 32;
324 6af0bf9c bellard
    } else {
325 6af0bf9c bellard
        for (n = 0; n < 32; n++) {
326 6af0bf9c bellard
            if (!(T0 & (1 << 31)))
327 6af0bf9c bellard
                break;
328 6af0bf9c bellard
            T0 = T0 << 1;
329 6af0bf9c bellard
        }
330 6af0bf9c bellard
        T0 = n;
331 6af0bf9c bellard
    }
332 6af0bf9c bellard
    RETURN();
333 6af0bf9c bellard
}
334 6af0bf9c bellard
335 6af0bf9c bellard
void op_clz (void)
336 6af0bf9c bellard
{
337 6af0bf9c bellard
    int n;
338 6af0bf9c bellard
339 6af0bf9c bellard
    if (T0 == 0) {
340 6af0bf9c bellard
        T0 = 32;
341 6af0bf9c bellard
    } else {
342 6af0bf9c bellard
        for (n = 0; n < 32; n++) {
343 6af0bf9c bellard
            if (T0 & (1 << 31))
344 6af0bf9c bellard
                break;
345 6af0bf9c bellard
            T0 = T0 << 1;
346 6af0bf9c bellard
        }
347 6af0bf9c bellard
        T0 = n;
348 6af0bf9c bellard
    }
349 6af0bf9c bellard
    RETURN();
350 6af0bf9c bellard
}
351 6af0bf9c bellard
352 6af0bf9c bellard
/* 64 bits arithmetic */
353 6af0bf9c bellard
#if (HOST_LONG_BITS == 64)
354 6af0bf9c bellard
static inline uint64_t get_HILO (void)
355 6af0bf9c bellard
{
356 6af0bf9c bellard
    return ((uint64_t)env->HI << 32) | (uint64_t)env->LO;
357 6af0bf9c bellard
}
358 6af0bf9c bellard
359 6af0bf9c bellard
static inline void set_HILO (uint64_t HILO)
360 6af0bf9c bellard
{
361 6af0bf9c bellard
    env->LO = HILO & 0xFFFFFFFF;
362 6af0bf9c bellard
    env->HI = HILO >> 32;
363 6af0bf9c bellard
}
364 6af0bf9c bellard
365 6af0bf9c bellard
void op_mult (void)
366 6af0bf9c bellard
{
367 6af0bf9c bellard
    set_HILO((int64_t)T0 * (int64_t)T1);
368 6af0bf9c bellard
    RETURN();
369 6af0bf9c bellard
}
370 6af0bf9c bellard
371 6af0bf9c bellard
void op_multu (void)
372 6af0bf9c bellard
{
373 6af0bf9c bellard
    set_HILO((uint64_t)T0 * (uint64_t)T1);
374 6af0bf9c bellard
    RETURN();
375 6af0bf9c bellard
}
376 6af0bf9c bellard
377 6af0bf9c bellard
void op_madd (void)
378 6af0bf9c bellard
{
379 6af0bf9c bellard
    int64_t tmp;
380 6af0bf9c bellard
381 6af0bf9c bellard
    tmp = ((int64_t)T0 * (int64_t)T1);
382 6af0bf9c bellard
    set_HILO((int64_t)get_HILO() + tmp);
383 6af0bf9c bellard
    RETURN();
384 6af0bf9c bellard
}
385 6af0bf9c bellard
386 6af0bf9c bellard
void op_maddu (void)
387 6af0bf9c bellard
{
388 6af0bf9c bellard
    uint64_t tmp;
389 6af0bf9c bellard
390 6af0bf9c bellard
    tmp = ((uint64_t)T0 * (uint64_t)T1);
391 6af0bf9c bellard
    set_HILO(get_HILO() + tmp);
392 6af0bf9c bellard
    RETURN();
393 6af0bf9c bellard
}
394 6af0bf9c bellard
395 6af0bf9c bellard
void op_msub (void)
396 6af0bf9c bellard
{
397 6af0bf9c bellard
    int64_t tmp;
398 6af0bf9c bellard
399 6af0bf9c bellard
    tmp = ((int64_t)T0 * (int64_t)T1);
400 6af0bf9c bellard
    set_HILO((int64_t)get_HILO() - tmp);
401 6af0bf9c bellard
    RETURN();
402 6af0bf9c bellard
}
403 6af0bf9c bellard
404 6af0bf9c bellard
void op_msubu (void)
405 6af0bf9c bellard
{
406 6af0bf9c bellard
    uint64_t tmp;
407 6af0bf9c bellard
408 6af0bf9c bellard
    tmp = ((uint64_t)T0 * (uint64_t)T1);
409 6af0bf9c bellard
    set_HILO(get_HILO() - tmp);
410 6af0bf9c bellard
    RETURN();
411 6af0bf9c bellard
}
412 6af0bf9c bellard
#else
413 6af0bf9c bellard
void op_mult (void)
414 6af0bf9c bellard
{
415 6af0bf9c bellard
    CALL_FROM_TB0(do_mult);
416 6af0bf9c bellard
    RETURN();
417 6af0bf9c bellard
}
418 6af0bf9c bellard
419 6af0bf9c bellard
void op_multu (void)
420 6af0bf9c bellard
{
421 6af0bf9c bellard
    CALL_FROM_TB0(do_multu);
422 6af0bf9c bellard
    RETURN();
423 6af0bf9c bellard
}
424 6af0bf9c bellard
425 6af0bf9c bellard
void op_madd (void)
426 6af0bf9c bellard
{
427 6af0bf9c bellard
    CALL_FROM_TB0(do_madd);
428 6af0bf9c bellard
    RETURN();
429 6af0bf9c bellard
}
430 6af0bf9c bellard
431 6af0bf9c bellard
void op_maddu (void)
432 6af0bf9c bellard
{
433 6af0bf9c bellard
    CALL_FROM_TB0(do_maddu);
434 6af0bf9c bellard
    RETURN();
435 6af0bf9c bellard
}
436 6af0bf9c bellard
437 6af0bf9c bellard
void op_msub (void)
438 6af0bf9c bellard
{
439 6af0bf9c bellard
    CALL_FROM_TB0(do_msub);
440 6af0bf9c bellard
    RETURN();
441 6af0bf9c bellard
}
442 6af0bf9c bellard
443 6af0bf9c bellard
void op_msubu (void)
444 6af0bf9c bellard
{
445 6af0bf9c bellard
    CALL_FROM_TB0(do_msubu);
446 6af0bf9c bellard
    RETURN();
447 6af0bf9c bellard
}
448 6af0bf9c bellard
#endif
449 6af0bf9c bellard
450 6af0bf9c bellard
/* Conditional moves */
451 6af0bf9c bellard
void op_movn (void)
452 6af0bf9c bellard
{
453 6af0bf9c bellard
    if (T1 != 0)
454 6af0bf9c bellard
        env->gpr[PARAM1] = T0;
455 6af0bf9c bellard
    RETURN();
456 6af0bf9c bellard
}
457 6af0bf9c bellard
458 6af0bf9c bellard
void op_movz (void)
459 6af0bf9c bellard
{
460 6af0bf9c bellard
    if (T1 == 0)
461 6af0bf9c bellard
        env->gpr[PARAM1] = T0;
462 6af0bf9c bellard
    RETURN();
463 6af0bf9c bellard
}
464 6af0bf9c bellard
465 6af0bf9c bellard
/* Tests */
466 6af0bf9c bellard
#define OP_COND(name, cond) \
467 6af0bf9c bellard
void glue(op_, name) (void) \
468 6af0bf9c bellard
{                           \
469 6af0bf9c bellard
    if (cond) {             \
470 6af0bf9c bellard
        T0 = 1;             \
471 6af0bf9c bellard
    } else {                \
472 6af0bf9c bellard
        T0 = 0;             \
473 6af0bf9c bellard
    }                       \
474 6af0bf9c bellard
    RETURN();               \
475 6af0bf9c bellard
}
476 6af0bf9c bellard
477 6af0bf9c bellard
OP_COND(eq, T0 == T1);
478 6af0bf9c bellard
OP_COND(ne, T0 != T1);
479 6af0bf9c bellard
OP_COND(ge, (int32_t)T0 >= (int32_t)T1);
480 6af0bf9c bellard
OP_COND(geu, T0 >= T1);
481 6af0bf9c bellard
OP_COND(lt, (int32_t)T0 < (int32_t)T1);
482 6af0bf9c bellard
OP_COND(ltu, T0 < T1);
483 6af0bf9c bellard
OP_COND(gez, (int32_t)T0 >= 0);
484 6af0bf9c bellard
OP_COND(gtz, (int32_t)T0 > 0);
485 6af0bf9c bellard
OP_COND(lez, (int32_t)T0 <= 0);
486 6af0bf9c bellard
OP_COND(ltz, (int32_t)T0 < 0);
487 6af0bf9c bellard
488 6af0bf9c bellard
/* Branchs */
489 6af0bf9c bellard
//#undef USE_DIRECT_JUMP
490 6af0bf9c bellard
#define EIP env->PC
491 6af0bf9c bellard
492 6af0bf9c bellard
/* Branch to register */
493 6af0bf9c bellard
void op_save_breg_target (void)
494 6af0bf9c bellard
{
495 6af0bf9c bellard
    env->btarget = T2;
496 6af0bf9c bellard
}
497 6af0bf9c bellard
498 6af0bf9c bellard
void op_restore_breg_target (void)
499 6af0bf9c bellard
{
500 6af0bf9c bellard
    T2 = env->btarget;
501 6af0bf9c bellard
}
502 6af0bf9c bellard
503 6af0bf9c bellard
void op_breg (void)
504 6af0bf9c bellard
{
505 6af0bf9c bellard
    env->PC = T2;
506 6af0bf9c bellard
    RETURN();
507 6af0bf9c bellard
}
508 6af0bf9c bellard
509 6af0bf9c bellard
/* Unconditional branch */
510 6af0bf9c bellard
void op_branch (void)
511 6af0bf9c bellard
{
512 6af0bf9c bellard
    JUMP_TB(branch, PARAM1, 0, PARAM2);
513 6af0bf9c bellard
    RETURN();
514 6af0bf9c bellard
}
515 6af0bf9c bellard
516 6af0bf9c bellard
void op_save_btarget (void)
517 6af0bf9c bellard
{
518 6af0bf9c bellard
    env->btarget = PARAM1;
519 6af0bf9c bellard
    RETURN();
520 6af0bf9c bellard
}
521 6af0bf9c bellard
522 6af0bf9c bellard
/* Conditional branch */
523 6af0bf9c bellard
void op_set_bcond (void)
524 6af0bf9c bellard
{
525 6af0bf9c bellard
    T2 = T0;
526 6af0bf9c bellard
    RETURN();
527 6af0bf9c bellard
}
528 6af0bf9c bellard
529 6af0bf9c bellard
void op_save_bcond (void)
530 6af0bf9c bellard
{
531 6af0bf9c bellard
    env->bcond = T2;
532 6af0bf9c bellard
    RETURN();
533 6af0bf9c bellard
}
534 6af0bf9c bellard
535 6af0bf9c bellard
void op_restore_bcond (void)
536 6af0bf9c bellard
{
537 6af0bf9c bellard
    T2 = env->bcond;
538 6af0bf9c bellard
    RETURN();
539 6af0bf9c bellard
}
540 6af0bf9c bellard
541 6af0bf9c bellard
void op_bcond (void)
542 6af0bf9c bellard
{
543 6af0bf9c bellard
    if (T2) {
544 6af0bf9c bellard
        JUMP_TB(bcond, PARAM1, 0, PARAM2);
545 6af0bf9c bellard
    } else {
546 6af0bf9c bellard
        JUMP_TB(bcond, PARAM1, 1, PARAM3);
547 6af0bf9c bellard
    }
548 6af0bf9c bellard
    RETURN();
549 6af0bf9c bellard
}
550 6af0bf9c bellard
551 6af0bf9c bellard
/* Likely branch (used to skip the delay slot) */
552 6af0bf9c bellard
void op_blikely (void)
553 6af0bf9c bellard
{
554 6af0bf9c bellard
    /* If the test is false, skip the delay slot */
555 6af0bf9c bellard
    if (T2 == 0) {
556 6af0bf9c bellard
        env->hflags = PARAM3;
557 6af0bf9c bellard
        JUMP_TB(blikely, PARAM1, 1, PARAM2);
558 6af0bf9c bellard
    }
559 6af0bf9c bellard
    RETURN();
560 6af0bf9c bellard
}
561 6af0bf9c bellard
562 6af0bf9c bellard
/* CP0 functions */
563 6af0bf9c bellard
void op_mfc0 (void)
564 6af0bf9c bellard
{
565 6af0bf9c bellard
    CALL_FROM_TB2(do_mfc0, PARAM1, PARAM2);
566 6af0bf9c bellard
    RETURN();
567 6af0bf9c bellard
}
568 6af0bf9c bellard
569 6af0bf9c bellard
void op_mtc0 (void)
570 6af0bf9c bellard
{
571 6af0bf9c bellard
    CALL_FROM_TB2(do_mtc0, PARAM1, PARAM2);
572 6af0bf9c bellard
    RETURN();
573 6af0bf9c bellard
}
574 6af0bf9c bellard
575 6af0bf9c bellard
#if defined(MIPS_USES_R4K_TLB)
576 6af0bf9c bellard
void op_tlbwi (void)
577 6af0bf9c bellard
{
578 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbwi);
579 6af0bf9c bellard
    RETURN();
580 6af0bf9c bellard
}
581 6af0bf9c bellard
582 6af0bf9c bellard
void op_tlbwr (void)
583 6af0bf9c bellard
{
584 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbwr);
585 6af0bf9c bellard
    RETURN();
586 6af0bf9c bellard
}
587 6af0bf9c bellard
588 6af0bf9c bellard
void op_tlbp (void)
589 6af0bf9c bellard
{
590 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbp);
591 6af0bf9c bellard
    RETURN();
592 6af0bf9c bellard
}
593 6af0bf9c bellard
594 6af0bf9c bellard
void op_tlbr (void)
595 6af0bf9c bellard
{
596 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbr);
597 6af0bf9c bellard
    RETURN();
598 6af0bf9c bellard
}
599 6af0bf9c bellard
#endif
600 6af0bf9c bellard
601 6af0bf9c bellard
/* Specials */
602 6af0bf9c bellard
void op_pmon (void)
603 6af0bf9c bellard
{
604 6af0bf9c bellard
    CALL_FROM_TB1(do_pmon, PARAM1);
605 6af0bf9c bellard
}
606 6af0bf9c bellard
607 6af0bf9c bellard
void op_trap (void)
608 6af0bf9c bellard
{
609 6af0bf9c bellard
    if (T0) {
610 6af0bf9c bellard
        CALL_FROM_TB1(do_raise_exception, EXCP_TRAP);
611 6af0bf9c bellard
    }
612 6af0bf9c bellard
    RETURN();
613 6af0bf9c bellard
}
614 6af0bf9c bellard
615 6af0bf9c bellard
void op_set_lladdr (void)
616 6af0bf9c bellard
{
617 6af0bf9c bellard
    env->CP0_LLAddr = T2;
618 6af0bf9c bellard
}
619 6af0bf9c bellard
620 6af0bf9c bellard
void debug_eret (void);
621 6af0bf9c bellard
void op_eret (void)
622 6af0bf9c bellard
{
623 6af0bf9c bellard
    CALL_FROM_TB0(debug_eret);
624 51e11d9e bellard
    if (env->hflags & MIPS_HFLAG_ERL) {
625 6af0bf9c bellard
        env->PC = env->CP0_ErrorEPC;
626 51e11d9e bellard
        env->hflags &= ~MIPS_HFLAG_ERL;
627 51e11d9e bellard
    } else {
628 6af0bf9c bellard
        env->PC = env->CP0_EPC;
629 51e11d9e bellard
        env->hflags &= ~MIPS_HFLAG_EXL;
630 51e11d9e bellard
    }
631 6af0bf9c bellard
    env->CP0_LLAddr = 1;
632 6af0bf9c bellard
}
633 6af0bf9c bellard
634 6af0bf9c bellard
void op_deret (void)
635 6af0bf9c bellard
{
636 6af0bf9c bellard
    CALL_FROM_TB0(debug_eret);
637 6af0bf9c bellard
    env->PC = env->CP0_DEPC;
638 6af0bf9c bellard
}
639 6af0bf9c bellard
640 6af0bf9c bellard
void op_save_state (void)
641 6af0bf9c bellard
{
642 6af0bf9c bellard
    env->hflags = PARAM1;
643 6af0bf9c bellard
    RETURN();
644 6af0bf9c bellard
}
645 6af0bf9c bellard
646 6af0bf9c bellard
void op_save_pc (void)
647 6af0bf9c bellard
{
648 6af0bf9c bellard
    env->PC = PARAM1;
649 6af0bf9c bellard
    RETURN();
650 6af0bf9c bellard
}
651 6af0bf9c bellard
652 6af0bf9c bellard
void op_raise_exception (void)
653 6af0bf9c bellard
{
654 6af0bf9c bellard
    CALL_FROM_TB1(do_raise_exception, PARAM1);
655 6af0bf9c bellard
    RETURN();
656 6af0bf9c bellard
}
657 6af0bf9c bellard
658 6af0bf9c bellard
void op_raise_exception_err (void)
659 6af0bf9c bellard
{
660 6af0bf9c bellard
    CALL_FROM_TB2(do_raise_exception_err, PARAM1, PARAM2);
661 6af0bf9c bellard
    RETURN();
662 6af0bf9c bellard
}
663 6af0bf9c bellard
664 6af0bf9c bellard
void op_exit_tb (void)
665 6af0bf9c bellard
{
666 6af0bf9c bellard
    EXIT_TB();
667 6af0bf9c bellard
}