Statistics
| Branch: | Revision:

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

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 76e050c2 bellard
    if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 31) {
210 76e050c2 bellard
       /* operands of same sign, result different sign */
211 4ad40f36 bellard
        CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW);
212 6af0bf9c bellard
    }
213 6af0bf9c bellard
    RETURN();
214 6af0bf9c bellard
}
215 6af0bf9c bellard
216 6af0bf9c bellard
void op_sub (void)
217 6af0bf9c bellard
{
218 6af0bf9c bellard
    T0 -= T1;
219 6af0bf9c bellard
    RETURN();
220 6af0bf9c bellard
}
221 6af0bf9c bellard
222 6af0bf9c bellard
void op_subo (void)
223 6af0bf9c bellard
{
224 6af0bf9c bellard
    target_ulong tmp;
225 6af0bf9c bellard
226 6af0bf9c bellard
    tmp = T0;
227 6af0bf9c bellard
    T0 = (int32_t)T0 - (int32_t)T1;
228 76e050c2 bellard
    if (((tmp ^ T1) & (tmp ^ T0)) >> 31) {
229 76e050c2 bellard
       /* operands of different sign, first operand and result different sign */
230 4ad40f36 bellard
        CALL_FROM_TB1(do_raise_exception_direct, EXCP_OVERFLOW);
231 6af0bf9c bellard
    }
232 6af0bf9c bellard
    RETURN();
233 6af0bf9c bellard
}
234 6af0bf9c bellard
235 6af0bf9c bellard
void op_mul (void)
236 6af0bf9c bellard
{
237 6af0bf9c bellard
    T0 = (int32_t)T0 * (int32_t)T1;
238 6af0bf9c bellard
    RETURN();
239 6af0bf9c bellard
}
240 6af0bf9c bellard
241 6af0bf9c bellard
void op_div (void)
242 6af0bf9c bellard
{
243 6af0bf9c bellard
    if (T1 != 0) {
244 6af0bf9c bellard
        env->LO = (int32_t)T0 / (int32_t)T1;
245 6af0bf9c bellard
        env->HI = (int32_t)T0 % (int32_t)T1;
246 6af0bf9c bellard
    }
247 6af0bf9c bellard
    RETURN();
248 6af0bf9c bellard
}
249 6af0bf9c bellard
250 6af0bf9c bellard
void op_divu (void)
251 6af0bf9c bellard
{
252 6af0bf9c bellard
    if (T1 != 0) {
253 6af0bf9c bellard
        env->LO = T0 / T1;
254 6af0bf9c bellard
        env->HI = T0 % T1;
255 6af0bf9c bellard
    }
256 6af0bf9c bellard
    RETURN();
257 6af0bf9c bellard
}
258 6af0bf9c bellard
259 6af0bf9c bellard
/* Logical */
260 6af0bf9c bellard
void op_and (void)
261 6af0bf9c bellard
{
262 6af0bf9c bellard
    T0 &= T1;
263 6af0bf9c bellard
    RETURN();
264 6af0bf9c bellard
}
265 6af0bf9c bellard
266 6af0bf9c bellard
void op_nor (void)
267 6af0bf9c bellard
{
268 6af0bf9c bellard
    T0 = ~(T0 | T1);
269 6af0bf9c bellard
    RETURN();
270 6af0bf9c bellard
}
271 6af0bf9c bellard
272 6af0bf9c bellard
void op_or (void)
273 6af0bf9c bellard
{
274 6af0bf9c bellard
    T0 |= T1;
275 6af0bf9c bellard
    RETURN();
276 6af0bf9c bellard
}
277 6af0bf9c bellard
278 6af0bf9c bellard
void op_xor (void)
279 6af0bf9c bellard
{
280 6af0bf9c bellard
    T0 ^= T1;
281 6af0bf9c bellard
    RETURN();
282 6af0bf9c bellard
}
283 6af0bf9c bellard
284 6af0bf9c bellard
void op_sll (void)
285 6af0bf9c bellard
{
286 6af0bf9c bellard
    T0 = T0 << T1;
287 6af0bf9c bellard
    RETURN();
288 6af0bf9c bellard
}
289 6af0bf9c bellard
290 6af0bf9c bellard
void op_sra (void)
291 6af0bf9c bellard
{
292 6af0bf9c bellard
    T0 = (int32_t)T0 >> T1;
293 6af0bf9c bellard
    RETURN();
294 6af0bf9c bellard
}
295 6af0bf9c bellard
296 6af0bf9c bellard
void op_srl (void)
297 6af0bf9c bellard
{
298 6af0bf9c bellard
    T0 = T0 >> T1;
299 6af0bf9c bellard
    RETURN();
300 6af0bf9c bellard
}
301 6af0bf9c bellard
302 6af0bf9c bellard
void op_sllv (void)
303 6af0bf9c bellard
{
304 6af0bf9c bellard
    T0 = T1 << (T0 & 0x1F);
305 6af0bf9c bellard
    RETURN();
306 6af0bf9c bellard
}
307 6af0bf9c bellard
308 6af0bf9c bellard
void op_srav (void)
309 6af0bf9c bellard
{
310 6af0bf9c bellard
    T0 = (int32_t)T1 >> (T0 & 0x1F);
311 6af0bf9c bellard
    RETURN();
312 6af0bf9c bellard
}
313 6af0bf9c bellard
314 6af0bf9c bellard
void op_srlv (void)
315 6af0bf9c bellard
{
316 6af0bf9c bellard
    T0 = T1 >> (T0 & 0x1F);
317 6af0bf9c bellard
    RETURN();
318 6af0bf9c bellard
}
319 6af0bf9c bellard
320 6af0bf9c bellard
void op_clo (void)
321 6af0bf9c bellard
{
322 6af0bf9c bellard
    int n;
323 6af0bf9c bellard
324 6af0bf9c bellard
    if (T0 == (target_ulong)-1) {
325 6af0bf9c bellard
        T0 = 32;
326 6af0bf9c bellard
    } else {
327 6af0bf9c bellard
        for (n = 0; n < 32; n++) {
328 6af0bf9c bellard
            if (!(T0 & (1 << 31)))
329 6af0bf9c bellard
                break;
330 6af0bf9c bellard
            T0 = T0 << 1;
331 6af0bf9c bellard
        }
332 6af0bf9c bellard
        T0 = n;
333 6af0bf9c bellard
    }
334 6af0bf9c bellard
    RETURN();
335 6af0bf9c bellard
}
336 6af0bf9c bellard
337 6af0bf9c bellard
void op_clz (void)
338 6af0bf9c bellard
{
339 6af0bf9c bellard
    int n;
340 6af0bf9c bellard
341 6af0bf9c bellard
    if (T0 == 0) {
342 6af0bf9c bellard
        T0 = 32;
343 6af0bf9c bellard
    } else {
344 6af0bf9c bellard
        for (n = 0; n < 32; n++) {
345 6af0bf9c bellard
            if (T0 & (1 << 31))
346 6af0bf9c bellard
                break;
347 6af0bf9c bellard
            T0 = T0 << 1;
348 6af0bf9c bellard
        }
349 6af0bf9c bellard
        T0 = n;
350 6af0bf9c bellard
    }
351 6af0bf9c bellard
    RETURN();
352 6af0bf9c bellard
}
353 6af0bf9c bellard
354 6af0bf9c bellard
/* 64 bits arithmetic */
355 6af0bf9c bellard
#if (HOST_LONG_BITS == 64)
356 6af0bf9c bellard
static inline uint64_t get_HILO (void)
357 6af0bf9c bellard
{
358 6af0bf9c bellard
    return ((uint64_t)env->HI << 32) | (uint64_t)env->LO;
359 6af0bf9c bellard
}
360 6af0bf9c bellard
361 6af0bf9c bellard
static inline void set_HILO (uint64_t HILO)
362 6af0bf9c bellard
{
363 6af0bf9c bellard
    env->LO = HILO & 0xFFFFFFFF;
364 6af0bf9c bellard
    env->HI = HILO >> 32;
365 6af0bf9c bellard
}
366 6af0bf9c bellard
367 6af0bf9c bellard
void op_mult (void)
368 6af0bf9c bellard
{
369 4ad40f36 bellard
    set_HILO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1);
370 6af0bf9c bellard
    RETURN();
371 6af0bf9c bellard
}
372 6af0bf9c bellard
373 6af0bf9c bellard
void op_multu (void)
374 6af0bf9c bellard
{
375 6af0bf9c bellard
    set_HILO((uint64_t)T0 * (uint64_t)T1);
376 6af0bf9c bellard
    RETURN();
377 6af0bf9c bellard
}
378 6af0bf9c bellard
379 6af0bf9c bellard
void op_madd (void)
380 6af0bf9c bellard
{
381 6af0bf9c bellard
    int64_t tmp;
382 6af0bf9c bellard
383 4ad40f36 bellard
    tmp = ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1);
384 6af0bf9c bellard
    set_HILO((int64_t)get_HILO() + tmp);
385 6af0bf9c bellard
    RETURN();
386 6af0bf9c bellard
}
387 6af0bf9c bellard
388 6af0bf9c bellard
void op_maddu (void)
389 6af0bf9c bellard
{
390 6af0bf9c bellard
    uint64_t tmp;
391 6af0bf9c bellard
392 6af0bf9c bellard
    tmp = ((uint64_t)T0 * (uint64_t)T1);
393 6af0bf9c bellard
    set_HILO(get_HILO() + tmp);
394 6af0bf9c bellard
    RETURN();
395 6af0bf9c bellard
}
396 6af0bf9c bellard
397 6af0bf9c bellard
void op_msub (void)
398 6af0bf9c bellard
{
399 6af0bf9c bellard
    int64_t tmp;
400 6af0bf9c bellard
401 4ad40f36 bellard
    tmp = ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1);
402 6af0bf9c bellard
    set_HILO((int64_t)get_HILO() - tmp);
403 6af0bf9c bellard
    RETURN();
404 6af0bf9c bellard
}
405 6af0bf9c bellard
406 6af0bf9c bellard
void op_msubu (void)
407 6af0bf9c bellard
{
408 6af0bf9c bellard
    uint64_t tmp;
409 6af0bf9c bellard
410 6af0bf9c bellard
    tmp = ((uint64_t)T0 * (uint64_t)T1);
411 6af0bf9c bellard
    set_HILO(get_HILO() - tmp);
412 6af0bf9c bellard
    RETURN();
413 6af0bf9c bellard
}
414 6af0bf9c bellard
#else
415 6af0bf9c bellard
void op_mult (void)
416 6af0bf9c bellard
{
417 6af0bf9c bellard
    CALL_FROM_TB0(do_mult);
418 6af0bf9c bellard
    RETURN();
419 6af0bf9c bellard
}
420 6af0bf9c bellard
421 6af0bf9c bellard
void op_multu (void)
422 6af0bf9c bellard
{
423 6af0bf9c bellard
    CALL_FROM_TB0(do_multu);
424 6af0bf9c bellard
    RETURN();
425 6af0bf9c bellard
}
426 6af0bf9c bellard
427 6af0bf9c bellard
void op_madd (void)
428 6af0bf9c bellard
{
429 6af0bf9c bellard
    CALL_FROM_TB0(do_madd);
430 6af0bf9c bellard
    RETURN();
431 6af0bf9c bellard
}
432 6af0bf9c bellard
433 6af0bf9c bellard
void op_maddu (void)
434 6af0bf9c bellard
{
435 6af0bf9c bellard
    CALL_FROM_TB0(do_maddu);
436 6af0bf9c bellard
    RETURN();
437 6af0bf9c bellard
}
438 6af0bf9c bellard
439 6af0bf9c bellard
void op_msub (void)
440 6af0bf9c bellard
{
441 6af0bf9c bellard
    CALL_FROM_TB0(do_msub);
442 6af0bf9c bellard
    RETURN();
443 6af0bf9c bellard
}
444 6af0bf9c bellard
445 6af0bf9c bellard
void op_msubu (void)
446 6af0bf9c bellard
{
447 6af0bf9c bellard
    CALL_FROM_TB0(do_msubu);
448 6af0bf9c bellard
    RETURN();
449 6af0bf9c bellard
}
450 6af0bf9c bellard
#endif
451 6af0bf9c bellard
452 6af0bf9c bellard
/* Conditional moves */
453 6af0bf9c bellard
void op_movn (void)
454 6af0bf9c bellard
{
455 6af0bf9c bellard
    if (T1 != 0)
456 6af0bf9c bellard
        env->gpr[PARAM1] = T0;
457 6af0bf9c bellard
    RETURN();
458 6af0bf9c bellard
}
459 6af0bf9c bellard
460 6af0bf9c bellard
void op_movz (void)
461 6af0bf9c bellard
{
462 6af0bf9c bellard
    if (T1 == 0)
463 6af0bf9c bellard
        env->gpr[PARAM1] = T0;
464 6af0bf9c bellard
    RETURN();
465 6af0bf9c bellard
}
466 6af0bf9c bellard
467 6af0bf9c bellard
/* Tests */
468 6af0bf9c bellard
#define OP_COND(name, cond) \
469 6af0bf9c bellard
void glue(op_, name) (void) \
470 6af0bf9c bellard
{                           \
471 6af0bf9c bellard
    if (cond) {             \
472 6af0bf9c bellard
        T0 = 1;             \
473 6af0bf9c bellard
    } else {                \
474 6af0bf9c bellard
        T0 = 0;             \
475 6af0bf9c bellard
    }                       \
476 6af0bf9c bellard
    RETURN();               \
477 6af0bf9c bellard
}
478 6af0bf9c bellard
479 6af0bf9c bellard
OP_COND(eq, T0 == T1);
480 6af0bf9c bellard
OP_COND(ne, T0 != T1);
481 6af0bf9c bellard
OP_COND(ge, (int32_t)T0 >= (int32_t)T1);
482 6af0bf9c bellard
OP_COND(geu, T0 >= T1);
483 6af0bf9c bellard
OP_COND(lt, (int32_t)T0 < (int32_t)T1);
484 6af0bf9c bellard
OP_COND(ltu, T0 < T1);
485 6af0bf9c bellard
OP_COND(gez, (int32_t)T0 >= 0);
486 6af0bf9c bellard
OP_COND(gtz, (int32_t)T0 > 0);
487 6af0bf9c bellard
OP_COND(lez, (int32_t)T0 <= 0);
488 6af0bf9c bellard
OP_COND(ltz, (int32_t)T0 < 0);
489 6af0bf9c bellard
490 6af0bf9c bellard
/* Branchs */
491 6af0bf9c bellard
//#undef USE_DIRECT_JUMP
492 c53be334 bellard
493 c53be334 bellard
void OPPROTO op_goto_tb0(void)
494 c53be334 bellard
{
495 c53be334 bellard
    GOTO_TB(op_goto_tb0, PARAM1, 0);
496 c53be334 bellard
}
497 c53be334 bellard
498 c53be334 bellard
void OPPROTO op_goto_tb1(void)
499 c53be334 bellard
{
500 c53be334 bellard
    GOTO_TB(op_goto_tb1, PARAM1, 1);
501 c53be334 bellard
}
502 6af0bf9c bellard
503 6af0bf9c bellard
/* Branch to register */
504 6af0bf9c bellard
void op_save_breg_target (void)
505 6af0bf9c bellard
{
506 6af0bf9c bellard
    env->btarget = T2;
507 6af0bf9c bellard
}
508 6af0bf9c bellard
509 6af0bf9c bellard
void op_restore_breg_target (void)
510 6af0bf9c bellard
{
511 6af0bf9c bellard
    T2 = env->btarget;
512 6af0bf9c bellard
}
513 6af0bf9c bellard
514 6af0bf9c bellard
void op_breg (void)
515 6af0bf9c bellard
{
516 6af0bf9c bellard
    env->PC = T2;
517 6af0bf9c bellard
    RETURN();
518 6af0bf9c bellard
}
519 6af0bf9c bellard
520 6af0bf9c bellard
void op_save_btarget (void)
521 6af0bf9c bellard
{
522 6af0bf9c bellard
    env->btarget = PARAM1;
523 6af0bf9c bellard
    RETURN();
524 6af0bf9c bellard
}
525 6af0bf9c bellard
526 6af0bf9c bellard
/* Conditional branch */
527 6af0bf9c bellard
void op_set_bcond (void)
528 6af0bf9c bellard
{
529 6af0bf9c bellard
    T2 = T0;
530 6af0bf9c bellard
    RETURN();
531 6af0bf9c bellard
}
532 6af0bf9c bellard
533 6af0bf9c bellard
void op_save_bcond (void)
534 6af0bf9c bellard
{
535 6af0bf9c bellard
    env->bcond = T2;
536 6af0bf9c bellard
    RETURN();
537 6af0bf9c bellard
}
538 6af0bf9c bellard
539 6af0bf9c bellard
void op_restore_bcond (void)
540 6af0bf9c bellard
{
541 6af0bf9c bellard
    T2 = env->bcond;
542 6af0bf9c bellard
    RETURN();
543 6af0bf9c bellard
}
544 6af0bf9c bellard
545 c53be334 bellard
void op_jnz_T2 (void)
546 6af0bf9c bellard
{
547 c53be334 bellard
    if (T2)
548 c53be334 bellard
        GOTO_LABEL_PARAM(1);
549 6af0bf9c bellard
    RETURN();
550 6af0bf9c bellard
}
551 6af0bf9c bellard
552 6af0bf9c bellard
/* CP0 functions */
553 6af0bf9c bellard
void op_mfc0 (void)
554 6af0bf9c bellard
{
555 6af0bf9c bellard
    CALL_FROM_TB2(do_mfc0, PARAM1, PARAM2);
556 6af0bf9c bellard
    RETURN();
557 6af0bf9c bellard
}
558 6af0bf9c bellard
559 6af0bf9c bellard
void op_mtc0 (void)
560 6af0bf9c bellard
{
561 6af0bf9c bellard
    CALL_FROM_TB2(do_mtc0, PARAM1, PARAM2);
562 6af0bf9c bellard
    RETURN();
563 6af0bf9c bellard
}
564 6af0bf9c bellard
565 6af0bf9c bellard
#if defined(MIPS_USES_R4K_TLB)
566 6af0bf9c bellard
void op_tlbwi (void)
567 6af0bf9c bellard
{
568 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbwi);
569 6af0bf9c bellard
    RETURN();
570 6af0bf9c bellard
}
571 6af0bf9c bellard
572 6af0bf9c bellard
void op_tlbwr (void)
573 6af0bf9c bellard
{
574 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbwr);
575 6af0bf9c bellard
    RETURN();
576 6af0bf9c bellard
}
577 6af0bf9c bellard
578 6af0bf9c bellard
void op_tlbp (void)
579 6af0bf9c bellard
{
580 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbp);
581 6af0bf9c bellard
    RETURN();
582 6af0bf9c bellard
}
583 6af0bf9c bellard
584 6af0bf9c bellard
void op_tlbr (void)
585 6af0bf9c bellard
{
586 6af0bf9c bellard
    CALL_FROM_TB0(do_tlbr);
587 6af0bf9c bellard
    RETURN();
588 6af0bf9c bellard
}
589 6af0bf9c bellard
#endif
590 6af0bf9c bellard
591 6af0bf9c bellard
/* Specials */
592 6af0bf9c bellard
void op_pmon (void)
593 6af0bf9c bellard
{
594 6af0bf9c bellard
    CALL_FROM_TB1(do_pmon, PARAM1);
595 6af0bf9c bellard
}
596 6af0bf9c bellard
597 6af0bf9c bellard
void op_trap (void)
598 6af0bf9c bellard
{
599 6af0bf9c bellard
    if (T0) {
600 4ad40f36 bellard
        CALL_FROM_TB1(do_raise_exception_direct, EXCP_TRAP);
601 6af0bf9c bellard
    }
602 6af0bf9c bellard
    RETURN();
603 6af0bf9c bellard
}
604 6af0bf9c bellard
605 4ad40f36 bellard
void op_debug (void)
606 4ad40f36 bellard
{
607 ce2f4b3c bellard
  CALL_FROM_TB1(do_raise_exception, EXCP_DEBUG);
608 4ad40f36 bellard
}
609 4ad40f36 bellard
610 6af0bf9c bellard
void op_set_lladdr (void)
611 6af0bf9c bellard
{
612 6af0bf9c bellard
    env->CP0_LLAddr = T2;
613 6af0bf9c bellard
}
614 6af0bf9c bellard
615 6af0bf9c bellard
void debug_eret (void);
616 6af0bf9c bellard
void op_eret (void)
617 6af0bf9c bellard
{
618 6af0bf9c bellard
    CALL_FROM_TB0(debug_eret);
619 51e11d9e bellard
    if (env->hflags & MIPS_HFLAG_ERL) {
620 6af0bf9c bellard
        env->PC = env->CP0_ErrorEPC;
621 51e11d9e bellard
        env->hflags &= ~MIPS_HFLAG_ERL;
622 51e11d9e bellard
    } else {
623 6af0bf9c bellard
        env->PC = env->CP0_EPC;
624 51e11d9e bellard
        env->hflags &= ~MIPS_HFLAG_EXL;
625 51e11d9e bellard
    }
626 6af0bf9c bellard
    env->CP0_LLAddr = 1;
627 6af0bf9c bellard
}
628 6af0bf9c bellard
629 6af0bf9c bellard
void op_deret (void)
630 6af0bf9c bellard
{
631 6af0bf9c bellard
    CALL_FROM_TB0(debug_eret);
632 6af0bf9c bellard
    env->PC = env->CP0_DEPC;
633 6af0bf9c bellard
}
634 6af0bf9c bellard
635 6af0bf9c bellard
void op_save_state (void)
636 6af0bf9c bellard
{
637 6af0bf9c bellard
    env->hflags = PARAM1;
638 6af0bf9c bellard
    RETURN();
639 6af0bf9c bellard
}
640 6af0bf9c bellard
641 6af0bf9c bellard
void op_save_pc (void)
642 6af0bf9c bellard
{
643 6af0bf9c bellard
    env->PC = PARAM1;
644 6af0bf9c bellard
    RETURN();
645 6af0bf9c bellard
}
646 6af0bf9c bellard
647 6af0bf9c bellard
void op_raise_exception (void)
648 6af0bf9c bellard
{
649 6af0bf9c bellard
    CALL_FROM_TB1(do_raise_exception, PARAM1);
650 6af0bf9c bellard
    RETURN();
651 6af0bf9c bellard
}
652 6af0bf9c bellard
653 6af0bf9c bellard
void op_raise_exception_err (void)
654 6af0bf9c bellard
{
655 6af0bf9c bellard
    CALL_FROM_TB2(do_raise_exception_err, PARAM1, PARAM2);
656 6af0bf9c bellard
    RETURN();
657 6af0bf9c bellard
}
658 6af0bf9c bellard
659 6af0bf9c bellard
void op_exit_tb (void)
660 6af0bf9c bellard
{
661 6af0bf9c bellard
    EXIT_TB();
662 6af0bf9c bellard
}
663 6af0bf9c bellard
664 4ad40f36 bellard
void op_wait (void)
665 4ad40f36 bellard
{
666 4ad40f36 bellard
    env->halted = 1;
667 4ad40f36 bellard
    CALL_FROM_TB1(do_raise_exception, EXCP_HLT);
668 4ad40f36 bellard
}