]> Git Repo - qemu.git/blame - target-mips/op.c
Fix MIPS64 R2 instructions.
[qemu.git] / target-mips / op.c
CommitLineData
6af0bf9c
FB
1/*
2 * MIPS emulation micro-operations for qemu.
5fafdf24 3 *
6af0bf9c 4 * Copyright (c) 2004-2005 Jocelyn Mayer
6ea83fed 5 * Copyright (c) 2006 Marius Groeger (FPU operations)
93b12ccc 6 * Copyright (c) 2007 Thiemo Seufer (64-bit FPU support)
6af0bf9c
FB
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23#include "config.h"
24#include "exec.h"
05f778c8 25#include "host-utils.h"
6af0bf9c 26
1b351e52 27#ifndef CALL_FROM_TB0
5a5012ec 28#define CALL_FROM_TB0(func) func()
1b351e52
FB
29#endif
30#ifndef CALL_FROM_TB1
5a5012ec 31#define CALL_FROM_TB1(func, arg0) func(arg0)
1b351e52
FB
32#endif
33#ifndef CALL_FROM_TB1_CONST16
5a5012ec 34#define CALL_FROM_TB1_CONST16(func, arg0) CALL_FROM_TB1(func, arg0)
1b351e52
FB
35#endif
36#ifndef CALL_FROM_TB2
5a5012ec 37#define CALL_FROM_TB2(func, arg0, arg1) func(arg0, arg1)
1b351e52
FB
38#endif
39#ifndef CALL_FROM_TB2_CONST16
40#define CALL_FROM_TB2_CONST16(func, arg0, arg1) \
5a5012ec 41 CALL_FROM_TB2(func, arg0, arg1)
1b351e52
FB
42#endif
43#ifndef CALL_FROM_TB3
5a5012ec 44#define CALL_FROM_TB3(func, arg0, arg1, arg2) func(arg0, arg1, arg2)
1b351e52
FB
45#endif
46#ifndef CALL_FROM_TB4
47#define CALL_FROM_TB4(func, arg0, arg1, arg2, arg3) \
5a5012ec 48 func(arg0, arg1, arg2, arg3)
1b351e52
FB
49#endif
50
6af0bf9c
FB
51#define REG 1
52#include "op_template.c"
53#undef REG
54#define REG 2
55#include "op_template.c"
56#undef REG
57#define REG 3
58#include "op_template.c"
59#undef REG
60#define REG 4
61#include "op_template.c"
62#undef REG
63#define REG 5
64#include "op_template.c"
65#undef REG
66#define REG 6
67#include "op_template.c"
68#undef REG
69#define REG 7
70#include "op_template.c"
71#undef REG
72#define REG 8
73#include "op_template.c"
74#undef REG
75#define REG 9
76#include "op_template.c"
77#undef REG
78#define REG 10
79#include "op_template.c"
80#undef REG
81#define REG 11
82#include "op_template.c"
83#undef REG
84#define REG 12
85#include "op_template.c"
86#undef REG
87#define REG 13
88#include "op_template.c"
89#undef REG
90#define REG 14
91#include "op_template.c"
92#undef REG
93#define REG 15
94#include "op_template.c"
95#undef REG
96#define REG 16
97#include "op_template.c"
98#undef REG
99#define REG 17
100#include "op_template.c"
101#undef REG
102#define REG 18
103#include "op_template.c"
104#undef REG
105#define REG 19
106#include "op_template.c"
107#undef REG
108#define REG 20
109#include "op_template.c"
110#undef REG
111#define REG 21
112#include "op_template.c"
113#undef REG
114#define REG 22
115#include "op_template.c"
116#undef REG
117#define REG 23
118#include "op_template.c"
119#undef REG
120#define REG 24
121#include "op_template.c"
122#undef REG
123#define REG 25
124#include "op_template.c"
125#undef REG
126#define REG 26
127#include "op_template.c"
128#undef REG
129#define REG 27
130#include "op_template.c"
131#undef REG
132#define REG 28
133#include "op_template.c"
134#undef REG
135#define REG 29
136#include "op_template.c"
137#undef REG
138#define REG 30
139#include "op_template.c"
140#undef REG
141#define REG 31
142#include "op_template.c"
143#undef REG
144
c570fd16 145#define TN
6af0bf9c
FB
146#include "op_template.c"
147#undef TN
148
5a5012ec 149#define FREG 0
6ea83fed 150#include "fop_template.c"
5a5012ec
TS
151#undef FREG
152#define FREG 1
6ea83fed 153#include "fop_template.c"
5a5012ec
TS
154#undef FREG
155#define FREG 2
6ea83fed 156#include "fop_template.c"
5a5012ec
TS
157#undef FREG
158#define FREG 3
6ea83fed 159#include "fop_template.c"
5a5012ec
TS
160#undef FREG
161#define FREG 4
6ea83fed 162#include "fop_template.c"
5a5012ec
TS
163#undef FREG
164#define FREG 5
6ea83fed 165#include "fop_template.c"
5a5012ec
TS
166#undef FREG
167#define FREG 6
6ea83fed 168#include "fop_template.c"
5a5012ec
TS
169#undef FREG
170#define FREG 7
6ea83fed 171#include "fop_template.c"
5a5012ec
TS
172#undef FREG
173#define FREG 8
6ea83fed 174#include "fop_template.c"
5a5012ec
TS
175#undef FREG
176#define FREG 9
6ea83fed 177#include "fop_template.c"
5a5012ec
TS
178#undef FREG
179#define FREG 10
6ea83fed 180#include "fop_template.c"
5a5012ec
TS
181#undef FREG
182#define FREG 11
6ea83fed 183#include "fop_template.c"
5a5012ec
TS
184#undef FREG
185#define FREG 12
6ea83fed 186#include "fop_template.c"
5a5012ec
TS
187#undef FREG
188#define FREG 13
6ea83fed 189#include "fop_template.c"
5a5012ec
TS
190#undef FREG
191#define FREG 14
6ea83fed 192#include "fop_template.c"
5a5012ec
TS
193#undef FREG
194#define FREG 15
6ea83fed 195#include "fop_template.c"
5a5012ec
TS
196#undef FREG
197#define FREG 16
6ea83fed 198#include "fop_template.c"
5a5012ec
TS
199#undef FREG
200#define FREG 17
6ea83fed 201#include "fop_template.c"
5a5012ec
TS
202#undef FREG
203#define FREG 18
6ea83fed 204#include "fop_template.c"
5a5012ec
TS
205#undef FREG
206#define FREG 19
6ea83fed 207#include "fop_template.c"
5a5012ec
TS
208#undef FREG
209#define FREG 20
6ea83fed 210#include "fop_template.c"
5a5012ec
TS
211#undef FREG
212#define FREG 21
6ea83fed 213#include "fop_template.c"
5a5012ec
TS
214#undef FREG
215#define FREG 22
6ea83fed 216#include "fop_template.c"
5a5012ec
TS
217#undef FREG
218#define FREG 23
6ea83fed 219#include "fop_template.c"
5a5012ec
TS
220#undef FREG
221#define FREG 24
6ea83fed 222#include "fop_template.c"
5a5012ec
TS
223#undef FREG
224#define FREG 25
6ea83fed 225#include "fop_template.c"
5a5012ec
TS
226#undef FREG
227#define FREG 26
6ea83fed 228#include "fop_template.c"
5a5012ec
TS
229#undef FREG
230#define FREG 27
6ea83fed 231#include "fop_template.c"
5a5012ec
TS
232#undef FREG
233#define FREG 28
6ea83fed 234#include "fop_template.c"
5a5012ec
TS
235#undef FREG
236#define FREG 29
6ea83fed 237#include "fop_template.c"
5a5012ec
TS
238#undef FREG
239#define FREG 30
6ea83fed 240#include "fop_template.c"
5a5012ec
TS
241#undef FREG
242#define FREG 31
6ea83fed 243#include "fop_template.c"
5a5012ec 244#undef FREG
6ea83fed
FB
245
246#define FTN
247#include "fop_template.c"
248#undef FTN
249
6af0bf9c
FB
250void op_dup_T0 (void)
251{
252 T2 = T0;
8f6f6026 253 FORCE_RET();
6af0bf9c
FB
254}
255
256void op_load_HI (void)
257{
ead9360e 258 T0 = env->HI[PARAM1][env->current_tc];
8f6f6026 259 FORCE_RET();
6af0bf9c
FB
260}
261
262void op_store_HI (void)
263{
ead9360e 264 env->HI[PARAM1][env->current_tc] = T0;
8f6f6026 265 FORCE_RET();
6af0bf9c
FB
266}
267
268void op_load_LO (void)
269{
ead9360e 270 T0 = env->LO[PARAM1][env->current_tc];
8f6f6026 271 FORCE_RET();
6af0bf9c
FB
272}
273
274void op_store_LO (void)
275{
ead9360e 276 env->LO[PARAM1][env->current_tc] = T0;
8f6f6026 277 FORCE_RET();
6af0bf9c
FB
278}
279
280/* Load and store */
281#define MEMSUFFIX _raw
282#include "op_mem.c"
283#undef MEMSUFFIX
284#if !defined(CONFIG_USER_ONLY)
285#define MEMSUFFIX _user
286#include "op_mem.c"
287#undef MEMSUFFIX
288
623a930e
TS
289#define MEMSUFFIX _super
290#include "op_mem.c"
291#undef MEMSUFFIX
292
6af0bf9c
FB
293#define MEMSUFFIX _kernel
294#include "op_mem.c"
295#undef MEMSUFFIX
296#endif
297
a6763a58
TS
298/* Addresses computation */
299void op_addr_add (void)
300{
301/* For compatibility with 32-bit code, data reference in user mode
302 with Status_UX = 0 should be casted to 32-bit and sign extended.
303 See the MIPS64 PRA manual, section 4.10. */
d26bc211 304#if defined(TARGET_MIPS64)
623a930e 305 if (((env->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) &&
a6763a58
TS
306 !(env->CP0_Status & (1 << CP0St_UX)))
307 T0 = (int64_t)(int32_t)(T0 + T1);
308 else
309#endif
310 T0 += T1;
8f6f6026 311 FORCE_RET();
a6763a58
TS
312}
313
6af0bf9c
FB
314/* Arithmetic */
315void op_add (void)
316{
5dc4b744 317 T0 = (int32_t)((int32_t)T0 + (int32_t)T1);
8f6f6026 318 FORCE_RET();
6af0bf9c
FB
319}
320
321void op_addo (void)
322{
323 target_ulong tmp;
324
c570fd16
TS
325 tmp = (int32_t)T0;
326 T0 = (int32_t)T0 + (int32_t)T1;
76e050c2 327 if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 31) {
c570fd16 328 /* operands of same sign, result different sign */
1579a72e 329 CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
6af0bf9c 330 }
5dc4b744 331 T0 = (int32_t)T0;
8f6f6026 332 FORCE_RET();
6af0bf9c
FB
333}
334
335void op_sub (void)
336{
5dc4b744 337 T0 = (int32_t)((int32_t)T0 - (int32_t)T1);
8f6f6026 338 FORCE_RET();
6af0bf9c
FB
339}
340
341void op_subo (void)
342{
343 target_ulong tmp;
344
c570fd16 345 tmp = (int32_t)T0;
6af0bf9c 346 T0 = (int32_t)T0 - (int32_t)T1;
76e050c2 347 if (((tmp ^ T1) & (tmp ^ T0)) >> 31) {
c570fd16 348 /* operands of different sign, first operand and result different sign */
1579a72e 349 CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
6af0bf9c 350 }
5dc4b744 351 T0 = (int32_t)T0;
8f6f6026 352 FORCE_RET();
6af0bf9c
FB
353}
354
355void op_mul (void)
356{
5dc4b744 357 T0 = (int32_t)((int32_t)T0 * (int32_t)T1);
8f6f6026 358 FORCE_RET();
6af0bf9c
FB
359}
360
80c27194
TS
361#if HOST_LONG_BITS < 64
362void op_div (void)
363{
364 CALL_FROM_TB0(do_div);
8f6f6026 365 FORCE_RET();
80c27194
TS
366}
367#else
6af0bf9c
FB
368void op_div (void)
369{
370 if (T1 != 0) {
ead9360e
TS
371 env->LO[0][env->current_tc] = (int32_t)((int64_t)(int32_t)T0 / (int32_t)T1);
372 env->HI[0][env->current_tc] = (int32_t)((int64_t)(int32_t)T0 % (int32_t)T1);
6af0bf9c 373 }
8f6f6026 374 FORCE_RET();
6af0bf9c 375}
80c27194 376#endif
6af0bf9c
FB
377
378void op_divu (void)
c570fd16
TS
379{
380 if (T1 != 0) {
ead9360e
TS
381 env->LO[0][env->current_tc] = (int32_t)((uint32_t)T0 / (uint32_t)T1);
382 env->HI[0][env->current_tc] = (int32_t)((uint32_t)T0 % (uint32_t)T1);
c570fd16 383 }
8f6f6026 384 FORCE_RET();
c570fd16
TS
385}
386
d26bc211 387#if defined(TARGET_MIPS64)
c570fd16
TS
388/* Arithmetic */
389void op_dadd (void)
390{
391 T0 += T1;
8f6f6026 392 FORCE_RET();
c570fd16
TS
393}
394
395void op_daddo (void)
396{
397 target_long tmp;
398
399 tmp = T0;
400 T0 += T1;
401 if (((tmp ^ T1 ^ (-1)) & (T0 ^ T1)) >> 63) {
402 /* operands of same sign, result different sign */
1579a72e 403 CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
c570fd16 404 }
8f6f6026 405 FORCE_RET();
c570fd16
TS
406}
407
408void op_dsub (void)
409{
410 T0 -= T1;
8f6f6026 411 FORCE_RET();
c570fd16
TS
412}
413
414void op_dsubo (void)
415{
416 target_long tmp;
417
418 tmp = T0;
419 T0 = (int64_t)T0 - (int64_t)T1;
420 if (((tmp ^ T1) & (tmp ^ T0)) >> 63) {
421 /* operands of different sign, first operand and result different sign */
1579a72e 422 CALL_FROM_TB1(do_raise_exception, EXCP_OVERFLOW);
c570fd16 423 }
8f6f6026 424 FORCE_RET();
c570fd16
TS
425}
426
427void op_dmul (void)
428{
429 T0 = (int64_t)T0 * (int64_t)T1;
8f6f6026 430 FORCE_RET();
c570fd16
TS
431}
432
c570fd16
TS
433/* Those might call libgcc functions. */
434void op_ddiv (void)
435{
436 do_ddiv();
8f6f6026 437 FORCE_RET();
c570fd16
TS
438}
439
80c27194 440#if TARGET_LONG_BITS > HOST_LONG_BITS
c570fd16
TS
441void op_ddivu (void)
442{
443 do_ddivu();
8f6f6026 444 FORCE_RET();
c570fd16
TS
445}
446#else
c570fd16 447void op_ddivu (void)
6af0bf9c
FB
448{
449 if (T1 != 0) {
ead9360e
TS
450 env->LO[0][env->current_tc] = T0 / T1;
451 env->HI[0][env->current_tc] = T0 % T1;
6af0bf9c 452 }
8f6f6026 453 FORCE_RET();
6af0bf9c 454}
c570fd16 455#endif
d26bc211 456#endif /* TARGET_MIPS64 */
6af0bf9c
FB
457
458/* Logical */
459void op_and (void)
460{
461 T0 &= T1;
8f6f6026 462 FORCE_RET();
6af0bf9c
FB
463}
464
465void op_nor (void)
466{
467 T0 = ~(T0 | T1);
8f6f6026 468 FORCE_RET();
6af0bf9c
FB
469}
470
471void op_or (void)
472{
473 T0 |= T1;
8f6f6026 474 FORCE_RET();
6af0bf9c
FB
475}
476
477void op_xor (void)
478{
479 T0 ^= T1;
8f6f6026 480 FORCE_RET();
6af0bf9c
FB
481}
482
483void op_sll (void)
484{
5a63bcb2 485 T0 = (int32_t)((uint32_t)T0 << T1);
8f6f6026 486 FORCE_RET();
6af0bf9c
FB
487}
488
489void op_sra (void)
490{
5a63bcb2 491 T0 = (int32_t)((int32_t)T0 >> T1);
8f6f6026 492 FORCE_RET();
6af0bf9c
FB
493}
494
495void op_srl (void)
496{
5a63bcb2 497 T0 = (int32_t)((uint32_t)T0 >> T1);
8f6f6026 498 FORCE_RET();
6af0bf9c
FB
499}
500
7a387fff
TS
501void op_rotr (void)
502{
503 target_ulong tmp;
504
505 if (T1) {
5a63bcb2
TS
506 tmp = (int32_t)((uint32_t)T0 << (0x20 - T1));
507 T0 = (int32_t)((uint32_t)T0 >> T1) | tmp;
508 }
8f6f6026 509 FORCE_RET();
7a387fff
TS
510}
511
6af0bf9c
FB
512void op_sllv (void)
513{
5dc4b744 514 T0 = (int32_t)((uint32_t)T1 << ((uint32_t)T0 & 0x1F));
8f6f6026 515 FORCE_RET();
6af0bf9c
FB
516}
517
518void op_srav (void)
519{
5dc4b744 520 T0 = (int32_t)((int32_t)T1 >> (T0 & 0x1F));
8f6f6026 521 FORCE_RET();
6af0bf9c
FB
522}
523
524void op_srlv (void)
525{
5dc4b744 526 T0 = (int32_t)((uint32_t)T1 >> (T0 & 0x1F));
8f6f6026 527 FORCE_RET();
6af0bf9c
FB
528}
529
7a387fff
TS
530void op_rotrv (void)
531{
532 target_ulong tmp;
533
534 T0 &= 0x1F;
535 if (T0) {
5dc4b744
TS
536 tmp = (int32_t)((uint32_t)T1 << (0x20 - T0));
537 T0 = (int32_t)((uint32_t)T1 >> T0) | tmp;
7a387fff
TS
538 } else
539 T0 = T1;
8f6f6026 540 FORCE_RET();
7a387fff
TS
541}
542
6af0bf9c
FB
543void op_clo (void)
544{
05f778c8 545 T0 = clo32(T0);
8f6f6026 546 FORCE_RET();
6af0bf9c
FB
547}
548
549void op_clz (void)
550{
05f778c8 551 T0 = clz32(T0);
8f6f6026 552 FORCE_RET();
6af0bf9c
FB
553}
554
d26bc211 555#if defined(TARGET_MIPS64)
c570fd16
TS
556
557#if TARGET_LONG_BITS > HOST_LONG_BITS
558/* Those might call libgcc functions. */
559void op_dsll (void)
6af0bf9c 560{
c570fd16 561 CALL_FROM_TB0(do_dsll);
8f6f6026 562 FORCE_RET();
6af0bf9c
FB
563}
564
c570fd16 565void op_dsll32 (void)
6af0bf9c 566{
c570fd16 567 CALL_FROM_TB0(do_dsll32);
8f6f6026 568 FORCE_RET();
6af0bf9c
FB
569}
570
c570fd16 571void op_dsra (void)
6af0bf9c 572{
c570fd16 573 CALL_FROM_TB0(do_dsra);
8f6f6026 574 FORCE_RET();
6af0bf9c
FB
575}
576
c570fd16 577void op_dsra32 (void)
6af0bf9c 578{
c570fd16 579 CALL_FROM_TB0(do_dsra32);
8f6f6026 580 FORCE_RET();
6af0bf9c
FB
581}
582
c570fd16 583void op_dsrl (void)
6af0bf9c 584{
c570fd16 585 CALL_FROM_TB0(do_dsrl);
8f6f6026 586 FORCE_RET();
c570fd16 587}
6af0bf9c 588
c570fd16
TS
589void op_dsrl32 (void)
590{
591 CALL_FROM_TB0(do_dsrl32);
8f6f6026 592 FORCE_RET();
6af0bf9c
FB
593}
594
c570fd16 595void op_drotr (void)
6af0bf9c 596{
c570fd16 597 CALL_FROM_TB0(do_drotr);
8f6f6026 598 FORCE_RET();
c570fd16 599}
6af0bf9c 600
c570fd16
TS
601void op_drotr32 (void)
602{
603 CALL_FROM_TB0(do_drotr32);
8f6f6026 604 FORCE_RET();
6af0bf9c
FB
605}
606
c570fd16 607void op_dsllv (void)
6af0bf9c 608{
c570fd16 609 CALL_FROM_TB0(do_dsllv);
8f6f6026 610 FORCE_RET();
c570fd16 611}
6af0bf9c 612
c570fd16
TS
613void op_dsrav (void)
614{
615 CALL_FROM_TB0(do_dsrav);
8f6f6026 616 FORCE_RET();
6af0bf9c
FB
617}
618
c570fd16 619void op_dsrlv (void)
6af0bf9c 620{
c570fd16 621 CALL_FROM_TB0(do_dsrlv);
8f6f6026 622 FORCE_RET();
c570fd16 623}
6af0bf9c 624
c570fd16
TS
625void op_drotrv (void)
626{
627 CALL_FROM_TB0(do_drotrv);
8f6f6026 628 FORCE_RET();
6af0bf9c 629}
c570fd16 630
05f778c8
TS
631void op_dclo (void)
632{
633 CALL_FROM_TB0(do_dclo);
8f6f6026 634 FORCE_RET();
05f778c8
TS
635}
636
637void op_dclz (void)
638{
639 CALL_FROM_TB0(do_dclz);
8f6f6026 640 FORCE_RET();
05f778c8
TS
641}
642
c570fd16
TS
643#else /* TARGET_LONG_BITS > HOST_LONG_BITS */
644
645void op_dsll (void)
646{
647 T0 = T0 << T1;
8f6f6026 648 FORCE_RET();
c570fd16
TS
649}
650
651void op_dsll32 (void)
652{
653 T0 = T0 << (T1 + 32);
8f6f6026 654 FORCE_RET();
c570fd16
TS
655}
656
657void op_dsra (void)
658{
659 T0 = (int64_t)T0 >> T1;
8f6f6026 660 FORCE_RET();
c570fd16
TS
661}
662
663void op_dsra32 (void)
664{
665 T0 = (int64_t)T0 >> (T1 + 32);
8f6f6026 666 FORCE_RET();
c570fd16
TS
667}
668
669void op_dsrl (void)
670{
671 T0 = T0 >> T1;
8f6f6026 672 FORCE_RET();
c570fd16
TS
673}
674
675void op_dsrl32 (void)
676{
677 T0 = T0 >> (T1 + 32);
8f6f6026 678 FORCE_RET();
c570fd16
TS
679}
680
681void op_drotr (void)
682{
683 target_ulong tmp;
684
685 if (T1) {
c6d6dd7c
TS
686 tmp = T0 << (0x40 - T1);
687 T0 = (T0 >> T1) | tmp;
5a63bcb2 688 }
8f6f6026 689 FORCE_RET();
c570fd16
TS
690}
691
692void op_drotr32 (void)
693{
694 target_ulong tmp;
695
c6d6dd7c
TS
696 tmp = T0 << (0x40 - (32 + T1));
697 T0 = (T0 >> (32 + T1)) | tmp;
8f6f6026 698 FORCE_RET();
c570fd16
TS
699}
700
701void op_dsllv (void)
702{
703 T0 = T1 << (T0 & 0x3F);
8f6f6026 704 FORCE_RET();
c570fd16
TS
705}
706
707void op_dsrav (void)
708{
709 T0 = (int64_t)T1 >> (T0 & 0x3F);
8f6f6026 710 FORCE_RET();
c570fd16
TS
711}
712
713void op_dsrlv (void)
714{
715 T0 = T1 >> (T0 & 0x3F);
8f6f6026 716 FORCE_RET();
c570fd16
TS
717}
718
719void op_drotrv (void)
720{
721 target_ulong tmp;
722
723 T0 &= 0x3F;
724 if (T0) {
c6d6dd7c
TS
725 tmp = T1 << (0x40 - T0);
726 T0 = (T1 >> T0) | tmp;
c570fd16 727 } else
c6d6dd7c 728 T0 = T1;
8f6f6026 729 FORCE_RET();
c570fd16 730}
c570fd16
TS
731
732void op_dclo (void)
733{
05f778c8 734 T0 = clo64(T0);
8f6f6026 735 FORCE_RET();
c570fd16
TS
736}
737
738void op_dclz (void)
739{
05f778c8 740 T0 = clz64(T0);
8f6f6026 741 FORCE_RET();
c570fd16 742}
05f778c8 743#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */
d26bc211 744#endif /* TARGET_MIPS64 */
c570fd16
TS
745
746/* 64 bits arithmetic */
747#if TARGET_LONG_BITS > HOST_LONG_BITS
6af0bf9c
FB
748void op_mult (void)
749{
750 CALL_FROM_TB0(do_mult);
8f6f6026 751 FORCE_RET();
6af0bf9c
FB
752}
753
754void op_multu (void)
755{
756 CALL_FROM_TB0(do_multu);
8f6f6026 757 FORCE_RET();
6af0bf9c
FB
758}
759
760void op_madd (void)
761{
762 CALL_FROM_TB0(do_madd);
8f6f6026 763 FORCE_RET();
6af0bf9c
FB
764}
765
766void op_maddu (void)
767{
768 CALL_FROM_TB0(do_maddu);
8f6f6026 769 FORCE_RET();
6af0bf9c
FB
770}
771
772void op_msub (void)
773{
774 CALL_FROM_TB0(do_msub);
8f6f6026 775 FORCE_RET();
6af0bf9c
FB
776}
777
778void op_msubu (void)
779{
780 CALL_FROM_TB0(do_msubu);
8f6f6026 781 FORCE_RET();
6af0bf9c 782}
c570fd16
TS
783
784#else /* TARGET_LONG_BITS > HOST_LONG_BITS */
785
aa343735 786static always_inline uint64_t get_HILO (void)
c570fd16 787{
ead9360e
TS
788 return ((uint64_t)env->HI[0][env->current_tc] << 32) |
789 ((uint64_t)(uint32_t)env->LO[0][env->current_tc]);
c570fd16
TS
790}
791
aa343735 792static always_inline void set_HILO (uint64_t HILO)
c570fd16 793{
ead9360e
TS
794 env->LO[0][env->current_tc] = (int32_t)(HILO & 0xFFFFFFFF);
795 env->HI[0][env->current_tc] = (int32_t)(HILO >> 32);
c570fd16
TS
796}
797
798void op_mult (void)
799{
800 set_HILO((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1);
8f6f6026 801 FORCE_RET();
c570fd16
TS
802}
803
804void op_multu (void)
805{
806 set_HILO((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1);
8f6f6026 807 FORCE_RET();
c570fd16
TS
808}
809
810void op_madd (void)
811{
812 int64_t tmp;
813
814 tmp = ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1);
815 set_HILO((int64_t)get_HILO() + tmp);
8f6f6026 816 FORCE_RET();
c570fd16
TS
817}
818
819void op_maddu (void)
820{
821 uint64_t tmp;
822
823 tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1);
824 set_HILO(get_HILO() + tmp);
8f6f6026 825 FORCE_RET();
c570fd16
TS
826}
827
828void op_msub (void)
829{
830 int64_t tmp;
831
832 tmp = ((int64_t)(int32_t)T0 * (int64_t)(int32_t)T1);
833 set_HILO((int64_t)get_HILO() - tmp);
8f6f6026 834 FORCE_RET();
c570fd16
TS
835}
836
837void op_msubu (void)
838{
839 uint64_t tmp;
840
841 tmp = ((uint64_t)(uint32_t)T0 * (uint64_t)(uint32_t)T1);
842 set_HILO(get_HILO() - tmp);
8f6f6026 843 FORCE_RET();
c570fd16
TS
844}
845#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */
846
d26bc211 847#if defined(TARGET_MIPS64)
c570fd16
TS
848void op_dmult (void)
849{
5592a750 850 CALL_FROM_TB4(muls64, &(env->LO[0][env->current_tc]), &(env->HI[0][env->current_tc]), T0, T1);
8f6f6026 851 FORCE_RET();
c570fd16
TS
852}
853
854void op_dmultu (void)
855{
5592a750 856 CALL_FROM_TB4(mulu64, &(env->LO[0][env->current_tc]), &(env->HI[0][env->current_tc]), T0, T1);
8f6f6026 857 FORCE_RET();
c570fd16 858}
6af0bf9c
FB
859#endif
860
861/* Conditional moves */
862void op_movn (void)
863{
864 if (T1 != 0)
ead9360e 865 env->gpr[PARAM1][env->current_tc] = T0;
8f6f6026 866 FORCE_RET();
6af0bf9c
FB
867}
868
869void op_movz (void)
870{
871 if (T1 == 0)
ead9360e 872 env->gpr[PARAM1][env->current_tc] = T0;
8f6f6026 873 FORCE_RET();
6af0bf9c
FB
874}
875
7a387fff
TS
876void op_movf (void)
877{
ead9360e 878 if (!(env->fpu->fcr31 & PARAM1))
5a5012ec 879 T0 = T1;
8f6f6026 880 FORCE_RET();
7a387fff
TS
881}
882
883void op_movt (void)
884{
ead9360e 885 if (env->fpu->fcr31 & PARAM1)
5a5012ec 886 T0 = T1;
8f6f6026 887 FORCE_RET();
7a387fff
TS
888}
889
6af0bf9c
FB
890/* Tests */
891#define OP_COND(name, cond) \
892void glue(op_, name) (void) \
893{ \
894 if (cond) { \
895 T0 = 1; \
896 } else { \
897 T0 = 0; \
898 } \
8f6f6026 899 FORCE_RET(); \
6af0bf9c
FB
900}
901
902OP_COND(eq, T0 == T1);
903OP_COND(ne, T0 != T1);
f469b9db 904OP_COND(ge, (target_long)T0 >= (target_long)T1);
6af0bf9c 905OP_COND(geu, T0 >= T1);
f469b9db 906OP_COND(lt, (target_long)T0 < (target_long)T1);
6af0bf9c 907OP_COND(ltu, T0 < T1);
f469b9db
TS
908OP_COND(gez, (target_long)T0 >= 0);
909OP_COND(gtz, (target_long)T0 > 0);
910OP_COND(lez, (target_long)T0 <= 0);
911OP_COND(ltz, (target_long)T0 < 0);
6af0bf9c 912
7a387fff 913/* Branches */
c53be334
FB
914void OPPROTO op_goto_tb0(void)
915{
916 GOTO_TB(op_goto_tb0, PARAM1, 0);
8f6f6026 917 FORCE_RET();
c53be334
FB
918}
919
920void OPPROTO op_goto_tb1(void)
921{
922 GOTO_TB(op_goto_tb1, PARAM1, 1);
8f6f6026 923 FORCE_RET();
c53be334 924}
6af0bf9c
FB
925
926/* Branch to register */
927void op_save_breg_target (void)
928{
929 env->btarget = T2;
8f6f6026 930 FORCE_RET();
6af0bf9c
FB
931}
932
933void op_restore_breg_target (void)
934{
935 T2 = env->btarget;
8f6f6026 936 FORCE_RET();
6af0bf9c
FB
937}
938
939void op_breg (void)
940{
ead9360e 941 env->PC[env->current_tc] = T2;
8f6f6026 942 FORCE_RET();
6af0bf9c
FB
943}
944
6af0bf9c
FB
945void op_save_btarget (void)
946{
947 env->btarget = PARAM1;
8f6f6026 948 FORCE_RET();
6af0bf9c
FB
949}
950
d26bc211 951#if defined(TARGET_MIPS64)
9b9e4393
TS
952void op_save_btarget64 (void)
953{
954 env->btarget = ((uint64_t)PARAM1 << 32) | (uint32_t)PARAM2;
8f6f6026 955 FORCE_RET();
9b9e4393
TS
956}
957#endif
958
6af0bf9c
FB
959/* Conditional branch */
960void op_set_bcond (void)
961{
962 T2 = T0;
8f6f6026 963 FORCE_RET();
6af0bf9c
FB
964}
965
966void op_save_bcond (void)
967{
968 env->bcond = T2;
8f6f6026 969 FORCE_RET();
6af0bf9c
FB
970}
971
972void op_restore_bcond (void)
973{
974 T2 = env->bcond;
8f6f6026 975 FORCE_RET();
6af0bf9c
FB
976}
977
c53be334 978void op_jnz_T2 (void)
6af0bf9c 979{
c53be334
FB
980 if (T2)
981 GOTO_LABEL_PARAM(1);
8f6f6026 982 FORCE_RET();
6af0bf9c
FB
983}
984
985/* CP0 functions */
873eb012 986void op_mfc0_index (void)
6af0bf9c 987{
9c2149c8 988 T0 = env->CP0_Index;
8f6f6026 989 FORCE_RET();
873eb012
TS
990}
991
ead9360e
TS
992void op_mfc0_mvpcontrol (void)
993{
994 T0 = env->mvp->CP0_MVPControl;
8f6f6026 995 FORCE_RET();
ead9360e
TS
996}
997
998void op_mfc0_mvpconf0 (void)
999{
1000 T0 = env->mvp->CP0_MVPConf0;
8f6f6026 1001 FORCE_RET();
ead9360e
TS
1002}
1003
1004void op_mfc0_mvpconf1 (void)
1005{
1006 T0 = env->mvp->CP0_MVPConf1;
8f6f6026 1007 FORCE_RET();
ead9360e
TS
1008}
1009
873eb012
TS
1010void op_mfc0_random (void)
1011{
1012 CALL_FROM_TB0(do_mfc0_random);
8f6f6026 1013 FORCE_RET();
873eb012
TS
1014}
1015
ead9360e
TS
1016void op_mfc0_vpecontrol (void)
1017{
1018 T0 = env->CP0_VPEControl;
8f6f6026 1019 FORCE_RET();
ead9360e
TS
1020}
1021
1022void op_mfc0_vpeconf0 (void)
1023{
1024 T0 = env->CP0_VPEConf0;
8f6f6026 1025 FORCE_RET();
ead9360e
TS
1026}
1027
1028void op_mfc0_vpeconf1 (void)
1029{
1030 T0 = env->CP0_VPEConf1;
8f6f6026 1031 FORCE_RET();
ead9360e
TS
1032}
1033
1034void op_mfc0_yqmask (void)
1035{
1036 T0 = env->CP0_YQMask;
8f6f6026 1037 FORCE_RET();
ead9360e
TS
1038}
1039
1040void op_mfc0_vpeschedule (void)
1041{
1042 T0 = env->CP0_VPESchedule;
8f6f6026 1043 FORCE_RET();
ead9360e
TS
1044}
1045
1046void op_mfc0_vpeschefback (void)
1047{
1048 T0 = env->CP0_VPEScheFBack;
8f6f6026 1049 FORCE_RET();
ead9360e
TS
1050}
1051
1052void op_mfc0_vpeopt (void)
1053{
1054 T0 = env->CP0_VPEOpt;
8f6f6026 1055 FORCE_RET();
ead9360e
TS
1056}
1057
873eb012
TS
1058void op_mfc0_entrylo0 (void)
1059{
9c2149c8 1060 T0 = (int32_t)env->CP0_EntryLo0;
8f6f6026 1061 FORCE_RET();
873eb012
TS
1062}
1063
ead9360e
TS
1064void op_mfc0_tcstatus (void)
1065{
1066 T0 = env->CP0_TCStatus[env->current_tc];
8f6f6026 1067 FORCE_RET();
ead9360e
TS
1068}
1069
1070void op_mftc0_tcstatus(void)
1071{
1072 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1073
1074 T0 = env->CP0_TCStatus[other_tc];
8f6f6026 1075 FORCE_RET();
ead9360e
TS
1076}
1077
1078void op_mfc0_tcbind (void)
1079{
1080 T0 = env->CP0_TCBind[env->current_tc];
8f6f6026 1081 FORCE_RET();
ead9360e
TS
1082}
1083
1084void op_mftc0_tcbind(void)
1085{
1086 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1087
1088 T0 = env->CP0_TCBind[other_tc];
8f6f6026 1089 FORCE_RET();
ead9360e
TS
1090}
1091
1092void op_mfc0_tcrestart (void)
1093{
1094 T0 = env->PC[env->current_tc];
8f6f6026 1095 FORCE_RET();
ead9360e
TS
1096}
1097
1098void op_mftc0_tcrestart(void)
1099{
1100 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1101
1102 T0 = env->PC[other_tc];
8f6f6026 1103 FORCE_RET();
ead9360e
TS
1104}
1105
1106void op_mfc0_tchalt (void)
1107{
1108 T0 = env->CP0_TCHalt[env->current_tc];
8f6f6026 1109 FORCE_RET();
ead9360e
TS
1110}
1111
1112void op_mftc0_tchalt(void)
1113{
1114 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1115
1116 T0 = env->CP0_TCHalt[other_tc];
8f6f6026 1117 FORCE_RET();
ead9360e
TS
1118}
1119
1120void op_mfc0_tccontext (void)
1121{
1122 T0 = env->CP0_TCContext[env->current_tc];
8f6f6026 1123 FORCE_RET();
ead9360e
TS
1124}
1125
1126void op_mftc0_tccontext(void)
1127{
1128 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1129
1130 T0 = env->CP0_TCContext[other_tc];
8f6f6026 1131 FORCE_RET();
ead9360e
TS
1132}
1133
1134void op_mfc0_tcschedule (void)
1135{
1136 T0 = env->CP0_TCSchedule[env->current_tc];
8f6f6026 1137 FORCE_RET();
ead9360e
TS
1138}
1139
1140void op_mftc0_tcschedule(void)
1141{
1142 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1143
1144 T0 = env->CP0_TCSchedule[other_tc];
8f6f6026 1145 FORCE_RET();
ead9360e
TS
1146}
1147
1148void op_mfc0_tcschefback (void)
1149{
1150 T0 = env->CP0_TCScheFBack[env->current_tc];
8f6f6026 1151 FORCE_RET();
ead9360e
TS
1152}
1153
1154void op_mftc0_tcschefback(void)
1155{
1156 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1157
1158 T0 = env->CP0_TCScheFBack[other_tc];
8f6f6026 1159 FORCE_RET();
ead9360e
TS
1160}
1161
873eb012
TS
1162void op_mfc0_entrylo1 (void)
1163{
9c2149c8 1164 T0 = (int32_t)env->CP0_EntryLo1;
8f6f6026 1165 FORCE_RET();
873eb012
TS
1166}
1167
1168void op_mfc0_context (void)
1169{
9c2149c8 1170 T0 = (int32_t)env->CP0_Context;
8f6f6026 1171 FORCE_RET();
873eb012
TS
1172}
1173
1174void op_mfc0_pagemask (void)
1175{
9c2149c8 1176 T0 = env->CP0_PageMask;
8f6f6026 1177 FORCE_RET();
873eb012
TS
1178}
1179
7a387fff
TS
1180void op_mfc0_pagegrain (void)
1181{
9c2149c8 1182 T0 = env->CP0_PageGrain;
8f6f6026 1183 FORCE_RET();
7a387fff
TS
1184}
1185
873eb012
TS
1186void op_mfc0_wired (void)
1187{
9c2149c8 1188 T0 = env->CP0_Wired;
8f6f6026 1189 FORCE_RET();
873eb012
TS
1190}
1191
ead9360e
TS
1192void op_mfc0_srsconf0 (void)
1193{
1194 T0 = env->CP0_SRSConf0;
8f6f6026 1195 FORCE_RET();
ead9360e
TS
1196}
1197
1198void op_mfc0_srsconf1 (void)
1199{
1200 T0 = env->CP0_SRSConf1;
8f6f6026 1201 FORCE_RET();
ead9360e
TS
1202}
1203
1204void op_mfc0_srsconf2 (void)
1205{
1206 T0 = env->CP0_SRSConf2;
8f6f6026 1207 FORCE_RET();
ead9360e
TS
1208}
1209
1210void op_mfc0_srsconf3 (void)
1211{
1212 T0 = env->CP0_SRSConf3;
8f6f6026 1213 FORCE_RET();
ead9360e
TS
1214}
1215
1216void op_mfc0_srsconf4 (void)
1217{
1218 T0 = env->CP0_SRSConf4;
8f6f6026 1219 FORCE_RET();
ead9360e
TS
1220}
1221
7a387fff
TS
1222void op_mfc0_hwrena (void)
1223{
9c2149c8 1224 T0 = env->CP0_HWREna;
8f6f6026 1225 FORCE_RET();
7a387fff
TS
1226}
1227
873eb012
TS
1228void op_mfc0_badvaddr (void)
1229{
9c2149c8 1230 T0 = (int32_t)env->CP0_BadVAddr;
8f6f6026 1231 FORCE_RET();
873eb012
TS
1232}
1233
1234void op_mfc0_count (void)
1235{
1236 CALL_FROM_TB0(do_mfc0_count);
8f6f6026 1237 FORCE_RET();
873eb012
TS
1238}
1239
1240void op_mfc0_entryhi (void)
1241{
9c2149c8 1242 T0 = (int32_t)env->CP0_EntryHi;
8f6f6026 1243 FORCE_RET();
873eb012
TS
1244}
1245
ead9360e
TS
1246void op_mftc0_entryhi(void)
1247{
1248 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1249
1250 T0 = (env->CP0_EntryHi & ~0xff) | (env->CP0_TCStatus[other_tc] & 0xff);
8f6f6026 1251 FORCE_RET();
ead9360e
TS
1252}
1253
873eb012
TS
1254void op_mfc0_compare (void)
1255{
9c2149c8 1256 T0 = env->CP0_Compare;
8f6f6026 1257 FORCE_RET();
873eb012
TS
1258}
1259
1260void op_mfc0_status (void)
1261{
9c2149c8 1262 T0 = env->CP0_Status;
8f6f6026 1263 FORCE_RET();
873eb012
TS
1264}
1265
ead9360e
TS
1266void op_mftc0_status(void)
1267{
1268 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1269 uint32_t tcstatus = env->CP0_TCStatus[other_tc];
1270
1271 T0 = env->CP0_Status & ~0xf1000018;
1272 T0 |= tcstatus & (0xf << CP0TCSt_TCU0);
1273 T0 |= (tcstatus & (1 << CP0TCSt_TMX)) >> (CP0TCSt_TMX - CP0St_MX);
623a930e 1274 T0 |= (tcstatus & (0x3 << CP0TCSt_TKSU)) >> (CP0TCSt_TKSU - CP0St_KSU);
8f6f6026 1275 FORCE_RET();
ead9360e
TS
1276}
1277
7a387fff
TS
1278void op_mfc0_intctl (void)
1279{
9c2149c8 1280 T0 = env->CP0_IntCtl;
8f6f6026 1281 FORCE_RET();
7a387fff
TS
1282}
1283
1284void op_mfc0_srsctl (void)
1285{
9c2149c8 1286 T0 = env->CP0_SRSCtl;
8f6f6026 1287 FORCE_RET();
9c2149c8
TS
1288}
1289
1290void op_mfc0_srsmap (void)
1291{
1292 T0 = env->CP0_SRSMap;
8f6f6026 1293 FORCE_RET();
7a387fff
TS
1294}
1295
873eb012
TS
1296void op_mfc0_cause (void)
1297{
9c2149c8 1298 T0 = env->CP0_Cause;
8f6f6026 1299 FORCE_RET();
873eb012
TS
1300}
1301
1302void op_mfc0_epc (void)
1303{
9c2149c8 1304 T0 = (int32_t)env->CP0_EPC;
8f6f6026 1305 FORCE_RET();
873eb012
TS
1306}
1307
1308void op_mfc0_prid (void)
1309{
9c2149c8 1310 T0 = env->CP0_PRid;
8f6f6026 1311 FORCE_RET();
873eb012
TS
1312}
1313
7a387fff
TS
1314void op_mfc0_ebase (void)
1315{
b29a0341 1316 T0 = env->CP0_EBase;
8f6f6026 1317 FORCE_RET();
7a387fff
TS
1318}
1319
873eb012
TS
1320void op_mfc0_config0 (void)
1321{
9c2149c8 1322 T0 = env->CP0_Config0;
8f6f6026 1323 FORCE_RET();
873eb012
TS
1324}
1325
1326void op_mfc0_config1 (void)
1327{
9c2149c8 1328 T0 = env->CP0_Config1;
8f6f6026 1329 FORCE_RET();
873eb012
TS
1330}
1331
7a387fff
TS
1332void op_mfc0_config2 (void)
1333{
9c2149c8 1334 T0 = env->CP0_Config2;
8f6f6026 1335 FORCE_RET();
7a387fff
TS
1336}
1337
1338void op_mfc0_config3 (void)
1339{
9c2149c8 1340 T0 = env->CP0_Config3;
8f6f6026 1341 FORCE_RET();
7a387fff
TS
1342}
1343
e397ee33
TS
1344void op_mfc0_config6 (void)
1345{
1346 T0 = env->CP0_Config6;
8f6f6026 1347 FORCE_RET();
e397ee33
TS
1348}
1349
1350void op_mfc0_config7 (void)
1351{
1352 T0 = env->CP0_Config7;
8f6f6026 1353 FORCE_RET();
e397ee33
TS
1354}
1355
873eb012
TS
1356void op_mfc0_lladdr (void)
1357{
9c2149c8 1358 T0 = (int32_t)env->CP0_LLAddr >> 4;
8f6f6026 1359 FORCE_RET();
873eb012
TS
1360}
1361
fd88b6ab 1362void op_mfc0_watchlo (void)
873eb012 1363{
fd88b6ab 1364 T0 = (int32_t)env->CP0_WatchLo[PARAM1];
8f6f6026 1365 FORCE_RET();
873eb012
TS
1366}
1367
fd88b6ab 1368void op_mfc0_watchhi (void)
873eb012 1369{
fd88b6ab 1370 T0 = env->CP0_WatchHi[PARAM1];
8f6f6026 1371 FORCE_RET();
873eb012
TS
1372}
1373
7a387fff
TS
1374void op_mfc0_xcontext (void)
1375{
9c2149c8 1376 T0 = (int32_t)env->CP0_XContext;
8f6f6026 1377 FORCE_RET();
7a387fff
TS
1378}
1379
1380void op_mfc0_framemask (void)
1381{
1382 T0 = env->CP0_Framemask;
8f6f6026 1383 FORCE_RET();
7a387fff
TS
1384}
1385
873eb012
TS
1386void op_mfc0_debug (void)
1387{
9c2149c8 1388 T0 = env->CP0_Debug;
873eb012
TS
1389 if (env->hflags & MIPS_HFLAG_DM)
1390 T0 |= 1 << CP0DB_DM;
8f6f6026 1391 FORCE_RET();
873eb012
TS
1392}
1393
ead9360e
TS
1394void op_mftc0_debug(void)
1395{
1396 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1397
1398 /* XXX: Might be wrong, check with EJTAG spec. */
1399 T0 = (env->CP0_Debug & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) |
1400 (env->CP0_Debug_tcstatus[other_tc] &
1401 ((1 << CP0DB_SSt) | (1 << CP0DB_Halt)));
8f6f6026 1402 FORCE_RET();
ead9360e
TS
1403}
1404
873eb012
TS
1405void op_mfc0_depc (void)
1406{
9c2149c8 1407 T0 = (int32_t)env->CP0_DEPC;
8f6f6026 1408 FORCE_RET();
873eb012
TS
1409}
1410
7a387fff
TS
1411void op_mfc0_performance0 (void)
1412{
9c2149c8 1413 T0 = env->CP0_Performance0;
8f6f6026 1414 FORCE_RET();
7a387fff
TS
1415}
1416
873eb012
TS
1417void op_mfc0_taglo (void)
1418{
9c2149c8 1419 T0 = env->CP0_TagLo;
8f6f6026 1420 FORCE_RET();
873eb012
TS
1421}
1422
1423void op_mfc0_datalo (void)
1424{
9c2149c8 1425 T0 = env->CP0_DataLo;
8f6f6026 1426 FORCE_RET();
873eb012
TS
1427}
1428
7a387fff
TS
1429void op_mfc0_taghi (void)
1430{
9c2149c8 1431 T0 = env->CP0_TagHi;
8f6f6026 1432 FORCE_RET();
7a387fff
TS
1433}
1434
1435void op_mfc0_datahi (void)
1436{
9c2149c8 1437 T0 = env->CP0_DataHi;
8f6f6026 1438 FORCE_RET();
7a387fff
TS
1439}
1440
873eb012
TS
1441void op_mfc0_errorepc (void)
1442{
9c2149c8 1443 T0 = (int32_t)env->CP0_ErrorEPC;
8f6f6026 1444 FORCE_RET();
873eb012
TS
1445}
1446
1447void op_mfc0_desave (void)
1448{
9c2149c8 1449 T0 = env->CP0_DESAVE;
8f6f6026 1450 FORCE_RET();
6af0bf9c
FB
1451}
1452
8c0fdd85 1453void op_mtc0_index (void)
6af0bf9c 1454{
60445285
TS
1455 int num = 1;
1456 unsigned int tmp = env->tlb->nb_tlb;
1457
1458 do {
1459 tmp >>= 1;
1460 num <<= 1;
1461 } while (tmp);
1462 env->CP0_Index = (env->CP0_Index & 0x80000000) | (T0 & (num - 1));
8f6f6026 1463 FORCE_RET();
ead9360e
TS
1464}
1465
1466void op_mtc0_mvpcontrol (void)
1467{
1468 uint32_t mask = 0;
1469 uint32_t newval;
1470
1471 if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP))
1472 mask |= (1 << CP0MVPCo_CPA) | (1 << CP0MVPCo_VPC) |
1473 (1 << CP0MVPCo_EVP);
1474 if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1475 mask |= (1 << CP0MVPCo_STLB);
1476 newval = (env->mvp->CP0_MVPControl & ~mask) | (T0 & mask);
1477
1478 // TODO: Enable/disable shared TLB, enable/disable VPEs.
1479
1480 env->mvp->CP0_MVPControl = newval;
8f6f6026 1481 FORCE_RET();
ead9360e
TS
1482}
1483
1484void op_mtc0_vpecontrol (void)
1485{
1486 uint32_t mask;
1487 uint32_t newval;
1488
1489 mask = (1 << CP0VPECo_YSI) | (1 << CP0VPECo_GSI) |
1490 (1 << CP0VPECo_TE) | (0xff << CP0VPECo_TargTC);
1491 newval = (env->CP0_VPEControl & ~mask) | (T0 & mask);
1492
1493 /* Yield scheduler intercept not implemented. */
1494 /* Gating storage scheduler intercept not implemented. */
1495
1496 // TODO: Enable/disable TCs.
1497
1498 env->CP0_VPEControl = newval;
8f6f6026 1499 FORCE_RET();
ead9360e
TS
1500}
1501
1502void op_mtc0_vpeconf0 (void)
1503{
1504 uint32_t mask = 0;
1505 uint32_t newval;
1506
1507 if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) {
1508 if (env->CP0_VPEConf0 & (1 << CP0VPEC0_VPA))
1509 mask |= (0xff << CP0VPEC0_XTC);
1510 mask |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
1511 }
1512 newval = (env->CP0_VPEConf0 & ~mask) | (T0 & mask);
1513
1514 // TODO: TC exclusive handling due to ERL/EXL.
1515
1516 env->CP0_VPEConf0 = newval;
8f6f6026 1517 FORCE_RET();
ead9360e
TS
1518}
1519
1520void op_mtc0_vpeconf1 (void)
1521{
1522 uint32_t mask = 0;
1523 uint32_t newval;
1524
1525 if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1526 mask |= (0xff << CP0VPEC1_NCX) | (0xff << CP0VPEC1_NCP2) |
1527 (0xff << CP0VPEC1_NCP1);
1528 newval = (env->CP0_VPEConf1 & ~mask) | (T0 & mask);
1529
1530 /* UDI not implemented. */
1531 /* CP2 not implemented. */
1532
1533 // TODO: Handle FPU (CP1) binding.
1534
1535 env->CP0_VPEConf1 = newval;
8f6f6026 1536 FORCE_RET();
ead9360e
TS
1537}
1538
1539void op_mtc0_yqmask (void)
1540{
1541 /* Yield qualifier inputs not implemented. */
1542 env->CP0_YQMask = 0x00000000;
8f6f6026 1543 FORCE_RET();
ead9360e
TS
1544}
1545
1546void op_mtc0_vpeschedule (void)
1547{
1548 env->CP0_VPESchedule = T0;
8f6f6026 1549 FORCE_RET();
ead9360e
TS
1550}
1551
1552void op_mtc0_vpeschefback (void)
1553{
1554 env->CP0_VPEScheFBack = T0;
8f6f6026 1555 FORCE_RET();
ead9360e
TS
1556}
1557
1558void op_mtc0_vpeopt (void)
1559{
1560 env->CP0_VPEOpt = T0 & 0x0000ffff;
8f6f6026 1561 FORCE_RET();
8c0fdd85
TS
1562}
1563
1564void op_mtc0_entrylo0 (void)
1565{
7a387fff
TS
1566 /* Large physaddr not implemented */
1567 /* 1k pages not implemented */
f1b0aa5d 1568 env->CP0_EntryLo0 = T0 & 0x3FFFFFFF;
8f6f6026 1569 FORCE_RET();
8c0fdd85
TS
1570}
1571
ead9360e
TS
1572void op_mtc0_tcstatus (void)
1573{
1574 uint32_t mask = env->CP0_TCStatus_rw_bitmask;
1575 uint32_t newval;
1576
1577 newval = (env->CP0_TCStatus[env->current_tc] & ~mask) | (T0 & mask);
1578
1579 // TODO: Sync with CP0_Status.
1580
1581 env->CP0_TCStatus[env->current_tc] = newval;
8f6f6026 1582 FORCE_RET();
ead9360e
TS
1583}
1584
1585void op_mttc0_tcstatus (void)
1586{
1587 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1588
1589 // TODO: Sync with CP0_Status.
1590
1591 env->CP0_TCStatus[other_tc] = T0;
8f6f6026 1592 FORCE_RET();
ead9360e
TS
1593}
1594
1595void op_mtc0_tcbind (void)
1596{
1597 uint32_t mask = (1 << CP0TCBd_TBE);
1598 uint32_t newval;
1599
1600 if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1601 mask |= (1 << CP0TCBd_CurVPE);
1602 newval = (env->CP0_TCBind[env->current_tc] & ~mask) | (T0 & mask);
1603 env->CP0_TCBind[env->current_tc] = newval;
8f6f6026 1604 FORCE_RET();
ead9360e
TS
1605}
1606
1607void op_mttc0_tcbind (void)
1608{
1609 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1610 uint32_t mask = (1 << CP0TCBd_TBE);
1611 uint32_t newval;
1612
1613 if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC))
1614 mask |= (1 << CP0TCBd_CurVPE);
1615 newval = (env->CP0_TCBind[other_tc] & ~mask) | (T0 & mask);
1616 env->CP0_TCBind[other_tc] = newval;
8f6f6026 1617 FORCE_RET();
ead9360e
TS
1618}
1619
1620void op_mtc0_tcrestart (void)
1621{
1622 env->PC[env->current_tc] = T0;
1623 env->CP0_TCStatus[env->current_tc] &= ~(1 << CP0TCSt_TDS);
1624 env->CP0_LLAddr = 0ULL;
1625 /* MIPS16 not implemented. */
8f6f6026 1626 FORCE_RET();
ead9360e
TS
1627}
1628
1629void op_mttc0_tcrestart (void)
1630{
1631 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1632
1633 env->PC[other_tc] = T0;
1634 env->CP0_TCStatus[other_tc] &= ~(1 << CP0TCSt_TDS);
1635 env->CP0_LLAddr = 0ULL;
1636 /* MIPS16 not implemented. */
8f6f6026 1637 FORCE_RET();
ead9360e
TS
1638}
1639
1640void op_mtc0_tchalt (void)
1641{
1642 env->CP0_TCHalt[env->current_tc] = T0 & 0x1;
1643
1644 // TODO: Halt TC / Restart (if allocated+active) TC.
1645
8f6f6026 1646 FORCE_RET();
ead9360e
TS
1647}
1648
1649void op_mttc0_tchalt (void)
1650{
1651 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1652
1653 // TODO: Halt TC / Restart (if allocated+active) TC.
1654
1655 env->CP0_TCHalt[other_tc] = T0;
8f6f6026 1656 FORCE_RET();
ead9360e
TS
1657}
1658
1659void op_mtc0_tccontext (void)
1660{
1661 env->CP0_TCContext[env->current_tc] = T0;
8f6f6026 1662 FORCE_RET();
ead9360e
TS
1663}
1664
1665void op_mttc0_tccontext (void)
1666{
1667 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1668
1669 env->CP0_TCContext[other_tc] = T0;
8f6f6026 1670 FORCE_RET();
ead9360e
TS
1671}
1672
1673void op_mtc0_tcschedule (void)
1674{
1675 env->CP0_TCSchedule[env->current_tc] = T0;
8f6f6026 1676 FORCE_RET();
ead9360e
TS
1677}
1678
1679void op_mttc0_tcschedule (void)
1680{
1681 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1682
1683 env->CP0_TCSchedule[other_tc] = T0;
8f6f6026 1684 FORCE_RET();
ead9360e
TS
1685}
1686
1687void op_mtc0_tcschefback (void)
1688{
1689 env->CP0_TCScheFBack[env->current_tc] = T0;
8f6f6026 1690 FORCE_RET();
ead9360e
TS
1691}
1692
1693void op_mttc0_tcschefback (void)
1694{
1695 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1696
1697 env->CP0_TCScheFBack[other_tc] = T0;
8f6f6026 1698 FORCE_RET();
ead9360e
TS
1699}
1700
8c0fdd85
TS
1701void op_mtc0_entrylo1 (void)
1702{
7a387fff
TS
1703 /* Large physaddr not implemented */
1704 /* 1k pages not implemented */
f1b0aa5d 1705 env->CP0_EntryLo1 = T0 & 0x3FFFFFFF;
8f6f6026 1706 FORCE_RET();
8c0fdd85
TS
1707}
1708
1709void op_mtc0_context (void)
1710{
534ce69f 1711 env->CP0_Context = (env->CP0_Context & 0x007FFFFF) | (T0 & ~0x007FFFFF);
8f6f6026 1712 FORCE_RET();
8c0fdd85
TS
1713}
1714
1715void op_mtc0_pagemask (void)
1716{
7a387fff 1717 /* 1k pages not implemented */
f2e9ebef 1718 env->CP0_PageMask = T0 & (0x1FFFFFFF & (TARGET_PAGE_MASK << 1));
8f6f6026 1719 FORCE_RET();
7a387fff
TS
1720}
1721
1722void op_mtc0_pagegrain (void)
1723{
1724 /* SmartMIPS not implemented */
1725 /* Large physaddr not implemented */
1726 /* 1k pages not implemented */
1727 env->CP0_PageGrain = 0;
8f6f6026 1728 FORCE_RET();
8c0fdd85
TS
1729}
1730
1731void op_mtc0_wired (void)
1732{
ead9360e 1733 env->CP0_Wired = T0 % env->tlb->nb_tlb;
8f6f6026 1734 FORCE_RET();
ead9360e
TS
1735}
1736
1737void op_mtc0_srsconf0 (void)
1738{
1739 env->CP0_SRSConf0 |= T0 & env->CP0_SRSConf0_rw_bitmask;
8f6f6026 1740 FORCE_RET();
ead9360e
TS
1741}
1742
1743void op_mtc0_srsconf1 (void)
1744{
1745 env->CP0_SRSConf1 |= T0 & env->CP0_SRSConf1_rw_bitmask;
8f6f6026 1746 FORCE_RET();
ead9360e
TS
1747}
1748
1749void op_mtc0_srsconf2 (void)
1750{
1751 env->CP0_SRSConf2 |= T0 & env->CP0_SRSConf2_rw_bitmask;
8f6f6026 1752 FORCE_RET();
ead9360e
TS
1753}
1754
1755void op_mtc0_srsconf3 (void)
1756{
1757 env->CP0_SRSConf3 |= T0 & env->CP0_SRSConf3_rw_bitmask;
8f6f6026 1758 FORCE_RET();
ead9360e
TS
1759}
1760
1761void op_mtc0_srsconf4 (void)
1762{
1763 env->CP0_SRSConf4 |= T0 & env->CP0_SRSConf4_rw_bitmask;
8f6f6026 1764 FORCE_RET();
7a387fff
TS
1765}
1766
1767void op_mtc0_hwrena (void)
1768{
1769 env->CP0_HWREna = T0 & 0x0000000F;
8f6f6026 1770 FORCE_RET();
8c0fdd85
TS
1771}
1772
1773void op_mtc0_count (void)
1774{
1775 CALL_FROM_TB2(cpu_mips_store_count, env, T0);
8f6f6026 1776 FORCE_RET();
8c0fdd85
TS
1777}
1778
1779void op_mtc0_entryhi (void)
1780{
0feef828 1781 target_ulong old, val;
8c0fdd85 1782
7a387fff 1783 /* 1k pages not implemented */
100ce988 1784 val = T0 & ((TARGET_PAGE_MASK << 1) | 0xFF);
d26bc211 1785#if defined(TARGET_MIPS64)
e034e2c3 1786 val &= env->SEGMask;
100ce988 1787#endif
8c0fdd85
TS
1788 old = env->CP0_EntryHi;
1789 env->CP0_EntryHi = val;
ead9360e
TS
1790 if (env->CP0_Config3 & (1 << CP0C3_MT)) {
1791 uint32_t tcst = env->CP0_TCStatus[env->current_tc] & ~0xff;
1792 env->CP0_TCStatus[env->current_tc] = tcst | (val & 0xff);
1793 }
8c0fdd85
TS
1794 /* If the ASID changes, flush qemu's TLB. */
1795 if ((old & 0xFF) != (val & 0xFF))
1796 CALL_FROM_TB2(cpu_mips_tlb_flush, env, 1);
8f6f6026 1797 FORCE_RET();
8c0fdd85
TS
1798}
1799
ead9360e
TS
1800void op_mttc0_entryhi(void)
1801{
1802 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1803
1804 env->CP0_EntryHi = (env->CP0_EntryHi & 0xff) | (T0 & ~0xff);
1805 env->CP0_TCStatus[other_tc] = (env->CP0_TCStatus[other_tc] & ~0xff) | (T0 & 0xff);
8f6f6026 1806 FORCE_RET();
ead9360e
TS
1807}
1808
8c0fdd85
TS
1809void op_mtc0_compare (void)
1810{
1811 CALL_FROM_TB2(cpu_mips_store_compare, env, T0);
8f6f6026 1812 FORCE_RET();
8c0fdd85
TS
1813}
1814
1815void op_mtc0_status (void)
1816{
4de9b249 1817 uint32_t val, old;
ead9360e 1818 uint32_t mask = env->CP0_Status_rw_bitmask;
8c0fdd85 1819
f1b0aa5d 1820 val = T0 & mask;
8c0fdd85 1821 old = env->CP0_Status;
5a5012ec 1822 env->CP0_Status = (env->CP0_Status & ~mask) | val;
08fa4bab 1823 CALL_FROM_TB1(compute_hflags, env);
f41c52f1
TS
1824 if (loglevel & CPU_LOG_EXEC)
1825 CALL_FROM_TB2(do_mtc0_status_debug, old, val);
4de9b249 1826 CALL_FROM_TB1(cpu_mips_update_irq, env);
8f6f6026 1827 FORCE_RET();
8c0fdd85
TS
1828}
1829
ead9360e
TS
1830void op_mttc0_status(void)
1831{
1832 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1833 uint32_t tcstatus = env->CP0_TCStatus[other_tc];
1834
1835 env->CP0_Status = T0 & ~0xf1000018;
1836 tcstatus = (tcstatus & ~(0xf << CP0TCSt_TCU0)) | (T0 & (0xf << CP0St_CU0));
1837 tcstatus = (tcstatus & ~(1 << CP0TCSt_TMX)) | ((T0 & (1 << CP0St_MX)) << (CP0TCSt_TMX - CP0St_MX));
623a930e 1838 tcstatus = (tcstatus & ~(0x3 << CP0TCSt_TKSU)) | ((T0 & (0x3 << CP0St_KSU)) << (CP0TCSt_TKSU - CP0St_KSU));
ead9360e 1839 env->CP0_TCStatus[other_tc] = tcstatus;
8f6f6026 1840 FORCE_RET();
ead9360e
TS
1841}
1842
7a387fff
TS
1843void op_mtc0_intctl (void)
1844{
42532189
TS
1845 /* vectored interrupts not implemented, no performance counters. */
1846 env->CP0_IntCtl = (env->CP0_IntCtl & ~0x000002e0) | (T0 & 0x000002e0);
8f6f6026 1847 FORCE_RET();
7a387fff
TS
1848}
1849
1850void op_mtc0_srsctl (void)
1851{
ead9360e
TS
1852 uint32_t mask = (0xf << CP0SRSCtl_ESS) | (0xf << CP0SRSCtl_PSS);
1853 env->CP0_SRSCtl = (env->CP0_SRSCtl & ~mask) | (T0 & mask);
8f6f6026 1854 FORCE_RET();
7a387fff
TS
1855}
1856
9c2149c8
TS
1857void op_mtc0_srsmap (void)
1858{
ead9360e 1859 env->CP0_SRSMap = T0;
8f6f6026 1860 FORCE_RET();
9c2149c8
TS
1861}
1862
8c0fdd85
TS
1863void op_mtc0_cause (void)
1864{
39d51eb8 1865 uint32_t mask = 0x00C00300;
42532189 1866 uint32_t old = env->CP0_Cause;
39d51eb8 1867
e189e748 1868 if (env->insn_flags & ISA_MIPS32R2)
39d51eb8
TS
1869 mask |= 1 << CP0Ca_DC;
1870
e58c8ba5 1871 env->CP0_Cause = (env->CP0_Cause & ~mask) | (T0 & mask);
8c0fdd85 1872
42532189
TS
1873 if ((old ^ env->CP0_Cause) & (1 << CP0Ca_DC)) {
1874 if (env->CP0_Cause & (1 << CP0Ca_DC))
1875 CALL_FROM_TB1(cpu_mips_stop_count, env);
1876 else
1877 CALL_FROM_TB1(cpu_mips_start_count, env);
1878 }
1879
4de9b249
TS
1880 /* Handle the software interrupt as an hardware one, as they
1881 are very similar */
1882 if (T0 & CP0Ca_IP_mask) {
1883 CALL_FROM_TB1(cpu_mips_update_irq, env);
8c0fdd85 1884 }
8f6f6026 1885 FORCE_RET();
8c0fdd85
TS
1886}
1887
1888void op_mtc0_epc (void)
1889{
f1b0aa5d 1890 env->CP0_EPC = T0;
8f6f6026 1891 FORCE_RET();
8c0fdd85
TS
1892}
1893
7a387fff
TS
1894void op_mtc0_ebase (void)
1895{
1896 /* vectored interrupts not implemented */
1897 /* Multi-CPU not implemented */
b29a0341 1898 env->CP0_EBase = 0x80000000 | (T0 & 0x3FFFF000);
8f6f6026 1899 FORCE_RET();
7a387fff
TS
1900}
1901
8c0fdd85
TS
1902void op_mtc0_config0 (void)
1903{
7bfd934a 1904 env->CP0_Config0 = (env->CP0_Config0 & 0x81FFFFF8) | (T0 & 0x00000007);
8f6f6026 1905 FORCE_RET();
8c0fdd85
TS
1906}
1907
7a387fff
TS
1908void op_mtc0_config2 (void)
1909{
1910 /* tertiary/secondary caches not implemented */
1911 env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF);
8f6f6026 1912 FORCE_RET();
7a387fff
TS
1913}
1914
fd88b6ab 1915void op_mtc0_watchlo (void)
8c0fdd85 1916{
4e7a4a4e
TS
1917 /* Watch exceptions for instructions, data loads, data stores
1918 not implemented. */
fd88b6ab 1919 env->CP0_WatchLo[PARAM1] = (T0 & ~0x7);
8f6f6026 1920 FORCE_RET();
8c0fdd85
TS
1921}
1922
fd88b6ab 1923void op_mtc0_watchhi (void)
8c0fdd85 1924{
fd88b6ab
TS
1925 env->CP0_WatchHi[PARAM1] = (T0 & 0x40FF0FF8);
1926 env->CP0_WatchHi[PARAM1] &= ~(env->CP0_WatchHi[PARAM1] & T0 & 0x7);
8f6f6026 1927 FORCE_RET();
8c0fdd85
TS
1928}
1929
ead9360e
TS
1930void op_mtc0_xcontext (void)
1931{
1932 target_ulong mask = (1ULL << (env->SEGBITS - 7)) - 1;
1933 env->CP0_XContext = (env->CP0_XContext & mask) | (T0 & ~mask);
8f6f6026 1934 FORCE_RET();
ead9360e
TS
1935}
1936
7a387fff
TS
1937void op_mtc0_framemask (void)
1938{
1939 env->CP0_Framemask = T0; /* XXX */
8f6f6026 1940 FORCE_RET();
7a387fff
TS
1941}
1942
8c0fdd85
TS
1943void op_mtc0_debug (void)
1944{
1945 env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (T0 & 0x13300120);
1946 if (T0 & (1 << CP0DB_DM))
1947 env->hflags |= MIPS_HFLAG_DM;
1948 else
1949 env->hflags &= ~MIPS_HFLAG_DM;
8f6f6026 1950 FORCE_RET();
8c0fdd85
TS
1951}
1952
ead9360e
TS
1953void op_mttc0_debug(void)
1954{
1955 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
1956
1957 /* XXX: Might be wrong, check with EJTAG spec. */
1958 env->CP0_Debug_tcstatus[other_tc] = T0 & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt));
1959 env->CP0_Debug = (env->CP0_Debug & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) |
1960 (T0 & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt)));
8f6f6026 1961 FORCE_RET();
ead9360e
TS
1962}
1963
8c0fdd85
TS
1964void op_mtc0_depc (void)
1965{
f1b0aa5d 1966 env->CP0_DEPC = T0;
8f6f6026 1967 FORCE_RET();
8c0fdd85
TS
1968}
1969
7a387fff
TS
1970void op_mtc0_performance0 (void)
1971{
1b6fd0bc 1972 env->CP0_Performance0 = T0 & 0x000007ff;
8f6f6026 1973 FORCE_RET();
7a387fff
TS
1974}
1975
8c0fdd85
TS
1976void op_mtc0_taglo (void)
1977{
9c2149c8 1978 env->CP0_TagLo = T0 & 0xFFFFFCF6;
8f6f6026 1979 FORCE_RET();
8c0fdd85
TS
1980}
1981
7a387fff
TS
1982void op_mtc0_datalo (void)
1983{
1984 env->CP0_DataLo = T0; /* XXX */
8f6f6026 1985 FORCE_RET();
7a387fff
TS
1986}
1987
1988void op_mtc0_taghi (void)
1989{
1990 env->CP0_TagHi = T0; /* XXX */
8f6f6026 1991 FORCE_RET();
7a387fff
TS
1992}
1993
1994void op_mtc0_datahi (void)
1995{
1996 env->CP0_DataHi = T0; /* XXX */
8f6f6026 1997 FORCE_RET();
7a387fff
TS
1998}
1999
8c0fdd85
TS
2000void op_mtc0_errorepc (void)
2001{
f1b0aa5d 2002 env->CP0_ErrorEPC = T0;
8f6f6026 2003 FORCE_RET();
8c0fdd85
TS
2004}
2005
2006void op_mtc0_desave (void)
2007{
2008 env->CP0_DESAVE = T0;
8f6f6026 2009 FORCE_RET();
6af0bf9c
FB
2010}
2011
d26bc211 2012#if defined(TARGET_MIPS64)
ead9360e 2013void op_dmfc0_yqmask (void)
f1b0aa5d 2014{
ead9360e 2015 T0 = env->CP0_YQMask;
8f6f6026 2016 FORCE_RET();
ead9360e
TS
2017}
2018
2019void op_dmfc0_vpeschedule (void)
2020{
2021 T0 = env->CP0_VPESchedule;
8f6f6026 2022 FORCE_RET();
ead9360e
TS
2023}
2024
2025void op_dmfc0_vpeschefback (void)
2026{
2027 T0 = env->CP0_VPEScheFBack;
8f6f6026 2028 FORCE_RET();
f1b0aa5d
TS
2029}
2030
9c2149c8
TS
2031void op_dmfc0_entrylo0 (void)
2032{
2033 T0 = env->CP0_EntryLo0;
8f6f6026 2034 FORCE_RET();
9c2149c8
TS
2035}
2036
ead9360e
TS
2037void op_dmfc0_tcrestart (void)
2038{
2039 T0 = env->PC[env->current_tc];
8f6f6026 2040 FORCE_RET();
ead9360e
TS
2041}
2042
2043void op_dmfc0_tchalt (void)
2044{
2045 T0 = env->CP0_TCHalt[env->current_tc];
8f6f6026 2046 FORCE_RET();
ead9360e
TS
2047}
2048
2049void op_dmfc0_tccontext (void)
2050{
2051 T0 = env->CP0_TCContext[env->current_tc];
8f6f6026 2052 FORCE_RET();
ead9360e
TS
2053}
2054
2055void op_dmfc0_tcschedule (void)
2056{
2057 T0 = env->CP0_TCSchedule[env->current_tc];
8f6f6026 2058 FORCE_RET();
ead9360e
TS
2059}
2060
2061void op_dmfc0_tcschefback (void)
2062{
2063 T0 = env->CP0_TCScheFBack[env->current_tc];
8f6f6026 2064 FORCE_RET();
ead9360e
TS
2065}
2066
9c2149c8
TS
2067void op_dmfc0_entrylo1 (void)
2068{
2069 T0 = env->CP0_EntryLo1;
8f6f6026 2070 FORCE_RET();
9c2149c8
TS
2071}
2072
2073void op_dmfc0_context (void)
2074{
2075 T0 = env->CP0_Context;
8f6f6026 2076 FORCE_RET();
9c2149c8
TS
2077}
2078
2079void op_dmfc0_badvaddr (void)
2080{
2081 T0 = env->CP0_BadVAddr;
8f6f6026 2082 FORCE_RET();
9c2149c8
TS
2083}
2084
2085void op_dmfc0_entryhi (void)
2086{
2087 T0 = env->CP0_EntryHi;
8f6f6026 2088 FORCE_RET();
9c2149c8
TS
2089}
2090
2091void op_dmfc0_epc (void)
2092{
2093 T0 = env->CP0_EPC;
8f6f6026 2094 FORCE_RET();
9c2149c8
TS
2095}
2096
9c2149c8
TS
2097void op_dmfc0_lladdr (void)
2098{
2099 T0 = env->CP0_LLAddr >> 4;
8f6f6026 2100 FORCE_RET();
9c2149c8
TS
2101}
2102
fd88b6ab 2103void op_dmfc0_watchlo (void)
9c2149c8 2104{
fd88b6ab 2105 T0 = env->CP0_WatchLo[PARAM1];
8f6f6026 2106 FORCE_RET();
9c2149c8
TS
2107}
2108
2109void op_dmfc0_xcontext (void)
2110{
2111 T0 = env->CP0_XContext;
8f6f6026 2112 FORCE_RET();
9c2149c8
TS
2113}
2114
2115void op_dmfc0_depc (void)
2116{
2117 T0 = env->CP0_DEPC;
8f6f6026 2118 FORCE_RET();
9c2149c8
TS
2119}
2120
2121void op_dmfc0_errorepc (void)
2122{
2123 T0 = env->CP0_ErrorEPC;
8f6f6026 2124 FORCE_RET();
9c2149c8 2125}
d26bc211 2126#endif /* TARGET_MIPS64 */
9c2149c8 2127
ead9360e
TS
2128/* MIPS MT functions */
2129void op_mftgpr(void)
2130{
2131 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2132
2133 T0 = env->gpr[PARAM1][other_tc];
8f6f6026 2134 FORCE_RET();
ead9360e
TS
2135}
2136
2137void op_mftlo(void)
2138{
2139 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2140
2141 T0 = env->LO[PARAM1][other_tc];
8f6f6026 2142 FORCE_RET();
ead9360e
TS
2143}
2144
2145void op_mfthi(void)
2146{
2147 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2148
2149 T0 = env->HI[PARAM1][other_tc];
8f6f6026 2150 FORCE_RET();
ead9360e
TS
2151}
2152
2153void op_mftacx(void)
2154{
2155 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2156
2157 T0 = env->ACX[PARAM1][other_tc];
8f6f6026 2158 FORCE_RET();
ead9360e
TS
2159}
2160
2161void op_mftdsp(void)
2162{
2163 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2164
2165 T0 = env->DSPControl[other_tc];
8f6f6026 2166 FORCE_RET();
ead9360e
TS
2167}
2168
2169void op_mttgpr(void)
2170{
2171 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2172
2173 T0 = env->gpr[PARAM1][other_tc];
8f6f6026 2174 FORCE_RET();
ead9360e
TS
2175}
2176
2177void op_mttlo(void)
2178{
2179 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2180
2181 T0 = env->LO[PARAM1][other_tc];
8f6f6026 2182 FORCE_RET();
ead9360e
TS
2183}
2184
2185void op_mtthi(void)
2186{
2187 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2188
2189 T0 = env->HI[PARAM1][other_tc];
8f6f6026 2190 FORCE_RET();
ead9360e
TS
2191}
2192
2193void op_mttacx(void)
2194{
2195 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2196
2197 T0 = env->ACX[PARAM1][other_tc];
8f6f6026 2198 FORCE_RET();
ead9360e
TS
2199}
2200
2201void op_mttdsp(void)
2202{
2203 int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
2204
2205 T0 = env->DSPControl[other_tc];
8f6f6026 2206 FORCE_RET();
ead9360e
TS
2207}
2208
2209
2210void op_dmt(void)
2211{
2212 // TODO
2213 T0 = 0;
2214 // rt = T0
8f6f6026 2215 FORCE_RET();
ead9360e
TS
2216}
2217
2218void op_emt(void)
2219{
2220 // TODO
2221 T0 = 0;
2222 // rt = T0
8f6f6026 2223 FORCE_RET();
ead9360e
TS
2224}
2225
2226void op_dvpe(void)
2227{
2228 // TODO
2229 T0 = 0;
2230 // rt = T0
8f6f6026 2231 FORCE_RET();
ead9360e
TS
2232}
2233
2234void op_evpe(void)
2235{
2236 // TODO
2237 T0 = 0;
2238 // rt = T0
8f6f6026 2239 FORCE_RET();
ead9360e
TS
2240}
2241
2242void op_fork(void)
2243{
2244 // T0 = rt, T1 = rs
2245 T0 = 0;
2246 // TODO: store to TC register
8f6f6026 2247 FORCE_RET();
ead9360e
TS
2248}
2249
2250void op_yield(void)
2251{
2252 if (T0 < 0) {
2253 /* No scheduling policy implemented. */
2254 if (T0 != -2) {
2255 if (env->CP0_VPEControl & (1 << CP0VPECo_YSI) &&
2256 env->CP0_TCStatus[env->current_tc] & (1 << CP0TCSt_DT)) {
2257 env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT);
2258 env->CP0_VPEControl |= 4 << CP0VPECo_EXCPT;
2259 CALL_FROM_TB1(do_raise_exception, EXCP_THREAD);
2260 }
2261 }
2262 } else if (T0 == 0) {
2263 if (0 /* TODO: TC underflow */) {
2264 env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT);
2265 CALL_FROM_TB1(do_raise_exception, EXCP_THREAD);
2266 } else {
2267 // TODO: Deallocate TC
2268 }
2269 } else if (T0 > 0) {
2270 /* Yield qualifier inputs not implemented. */
2271 env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT);
2272 env->CP0_VPEControl |= 2 << CP0VPECo_EXCPT;
2273 CALL_FROM_TB1(do_raise_exception, EXCP_THREAD);
2274 }
2275 T0 = env->CP0_YQMask;
8f6f6026 2276 FORCE_RET();
ead9360e
TS
2277}
2278
5a5012ec 2279/* CP1 functions */
6ea83fed
FB
2280#if 0
2281# define DEBUG_FPU_STATE() CALL_FROM_TB1(dump_fpu, env)
2282#else
2283# define DEBUG_FPU_STATE() do { } while(0)
2284#endif
2285
5a5012ec
TS
2286void op_cfc1 (void)
2287{
ead9360e 2288 CALL_FROM_TB1(do_cfc1, PARAM1);
5a5012ec 2289 DEBUG_FPU_STATE();
8f6f6026 2290 FORCE_RET();
5a5012ec
TS
2291}
2292
2293void op_ctc1 (void)
2294{
ead9360e 2295 CALL_FROM_TB1(do_ctc1, PARAM1);
6ea83fed 2296 DEBUG_FPU_STATE();
8f6f6026 2297 FORCE_RET();
6ea83fed
FB
2298}
2299
2300void op_mfc1 (void)
2301{
6ad38722 2302 T0 = (int32_t)WT0;
6ea83fed 2303 DEBUG_FPU_STATE();
8f6f6026 2304 FORCE_RET();
6ea83fed
FB
2305}
2306
2307void op_mtc1 (void)
2308{
2309 WT0 = T0;
2310 DEBUG_FPU_STATE();
8f6f6026 2311 FORCE_RET();
6ea83fed
FB
2312}
2313
5a5012ec
TS
2314void op_dmfc1 (void)
2315{
2316 T0 = DT0;
2317 DEBUG_FPU_STATE();
8f6f6026 2318 FORCE_RET();
5a5012ec
TS
2319}
2320
2321void op_dmtc1 (void)
2322{
2323 DT0 = T0;
2324 DEBUG_FPU_STATE();
8f6f6026 2325 FORCE_RET();
5a5012ec
TS
2326}
2327
2328void op_mfhc1 (void)
2329{
6ad38722 2330 T0 = (int32_t)WTH0;
5a5012ec 2331 DEBUG_FPU_STATE();
8f6f6026 2332 FORCE_RET();
5a5012ec
TS
2333}
2334
2335void op_mthc1 (void)
2336{
2337 WTH0 = T0;
2338 DEBUG_FPU_STATE();
8f6f6026 2339 FORCE_RET();
5a5012ec
TS
2340}
2341
6ea83fed
FB
2342/* Float support.
2343 Single precition routines have a "s" suffix, double precision a
5a5012ec
TS
2344 "d" suffix, 32bit integer "w", 64bit integer "l", paired singe "ps",
2345 paired single lowwer "pl", paired single upper "pu". */
6ea83fed
FB
2346
2347#define FLOAT_OP(name, p) void OPPROTO op_float_##name##_##p(void)
2348
dd016883
FB
2349FLOAT_OP(cvtd, s)
2350{
fd4a04eb 2351 CALL_FROM_TB0(do_float_cvtd_s);
dd016883 2352 DEBUG_FPU_STATE();
8f6f6026 2353 FORCE_RET();
dd016883 2354}
6ea83fed
FB
2355FLOAT_OP(cvtd, w)
2356{
fd4a04eb 2357 CALL_FROM_TB0(do_float_cvtd_w);
5a5012ec 2358 DEBUG_FPU_STATE();
8f6f6026 2359 FORCE_RET();
5a5012ec
TS
2360}
2361FLOAT_OP(cvtd, l)
2362{
fd4a04eb 2363 CALL_FROM_TB0(do_float_cvtd_l);
5a5012ec 2364 DEBUG_FPU_STATE();
8f6f6026 2365 FORCE_RET();
5a5012ec
TS
2366}
2367FLOAT_OP(cvtl, d)
2368{
fd4a04eb 2369 CALL_FROM_TB0(do_float_cvtl_d);
5a5012ec 2370 DEBUG_FPU_STATE();
8f6f6026 2371 FORCE_RET();
5a5012ec
TS
2372}
2373FLOAT_OP(cvtl, s)
2374{
fd4a04eb 2375 CALL_FROM_TB0(do_float_cvtl_s);
5a5012ec 2376 DEBUG_FPU_STATE();
8f6f6026 2377 FORCE_RET();
5a5012ec
TS
2378}
2379FLOAT_OP(cvtps, s)
2380{
2381 WT2 = WT0;
2382 WTH2 = WT1;
2383 DEBUG_FPU_STATE();
8f6f6026 2384 FORCE_RET();
5a5012ec
TS
2385}
2386FLOAT_OP(cvtps, pw)
2387{
fd4a04eb 2388 CALL_FROM_TB0(do_float_cvtps_pw);
5a5012ec 2389 DEBUG_FPU_STATE();
8f6f6026 2390 FORCE_RET();
5a5012ec
TS
2391}
2392FLOAT_OP(cvtpw, ps)
2393{
fd4a04eb 2394 CALL_FROM_TB0(do_float_cvtpw_ps);
6ea83fed 2395 DEBUG_FPU_STATE();
8f6f6026 2396 FORCE_RET();
6ea83fed 2397}
dd016883
FB
2398FLOAT_OP(cvts, d)
2399{
fd4a04eb 2400 CALL_FROM_TB0(do_float_cvts_d);
dd016883 2401 DEBUG_FPU_STATE();
8f6f6026 2402 FORCE_RET();
dd016883 2403}
6ea83fed
FB
2404FLOAT_OP(cvts, w)
2405{
fd4a04eb 2406 CALL_FROM_TB0(do_float_cvts_w);
5a5012ec 2407 DEBUG_FPU_STATE();
8f6f6026 2408 FORCE_RET();
5a5012ec
TS
2409}
2410FLOAT_OP(cvts, l)
2411{
fd4a04eb 2412 CALL_FROM_TB0(do_float_cvts_l);
5a5012ec 2413 DEBUG_FPU_STATE();
8f6f6026 2414 FORCE_RET();
5a5012ec
TS
2415}
2416FLOAT_OP(cvts, pl)
2417{
fd4a04eb 2418 CALL_FROM_TB0(do_float_cvts_pl);
5a5012ec 2419 DEBUG_FPU_STATE();
8f6f6026 2420 FORCE_RET();
5a5012ec
TS
2421}
2422FLOAT_OP(cvts, pu)
2423{
fd4a04eb 2424 CALL_FROM_TB0(do_float_cvts_pu);
6ea83fed 2425 DEBUG_FPU_STATE();
8f6f6026 2426 FORCE_RET();
6ea83fed
FB
2427}
2428FLOAT_OP(cvtw, s)
2429{
fd4a04eb 2430 CALL_FROM_TB0(do_float_cvtw_s);
6ea83fed 2431 DEBUG_FPU_STATE();
8f6f6026 2432 FORCE_RET();
6ea83fed
FB
2433}
2434FLOAT_OP(cvtw, d)
2435{
fd4a04eb 2436 CALL_FROM_TB0(do_float_cvtw_d);
5a5012ec 2437 DEBUG_FPU_STATE();
8f6f6026 2438 FORCE_RET();
5a5012ec
TS
2439}
2440
2441FLOAT_OP(pll, ps)
2442{
2443 DT2 = ((uint64_t)WT0 << 32) | WT1;
2444 DEBUG_FPU_STATE();
8f6f6026 2445 FORCE_RET();
5a5012ec
TS
2446}
2447FLOAT_OP(plu, ps)
2448{
2449 DT2 = ((uint64_t)WT0 << 32) | WTH1;
2450 DEBUG_FPU_STATE();
8f6f6026 2451 FORCE_RET();
5a5012ec
TS
2452}
2453FLOAT_OP(pul, ps)
2454{
2455 DT2 = ((uint64_t)WTH0 << 32) | WT1;
2456 DEBUG_FPU_STATE();
8f6f6026 2457 FORCE_RET();
5a5012ec
TS
2458}
2459FLOAT_OP(puu, ps)
2460{
2461 DT2 = ((uint64_t)WTH0 << 32) | WTH1;
6ea83fed 2462 DEBUG_FPU_STATE();
8f6f6026 2463 FORCE_RET();
6ea83fed
FB
2464}
2465
fd4a04eb
TS
2466#define FLOAT_ROUNDOP(op, ttype, stype) \
2467FLOAT_OP(op ## ttype, stype) \
2468{ \
2469 CALL_FROM_TB0(do_float_ ## op ## ttype ## _ ## stype); \
2470 DEBUG_FPU_STATE(); \
8f6f6026 2471 FORCE_RET(); \
6ea83fed
FB
2472}
2473
fd4a04eb
TS
2474FLOAT_ROUNDOP(round, l, d)
2475FLOAT_ROUNDOP(round, l, s)
2476FLOAT_ROUNDOP(round, w, d)
2477FLOAT_ROUNDOP(round, w, s)
6ea83fed 2478
fd4a04eb
TS
2479FLOAT_ROUNDOP(trunc, l, d)
2480FLOAT_ROUNDOP(trunc, l, s)
2481FLOAT_ROUNDOP(trunc, w, d)
2482FLOAT_ROUNDOP(trunc, w, s)
6ea83fed 2483
fd4a04eb
TS
2484FLOAT_ROUNDOP(ceil, l, d)
2485FLOAT_ROUNDOP(ceil, l, s)
2486FLOAT_ROUNDOP(ceil, w, d)
2487FLOAT_ROUNDOP(ceil, w, s)
2488
2489FLOAT_ROUNDOP(floor, l, d)
2490FLOAT_ROUNDOP(floor, l, s)
2491FLOAT_ROUNDOP(floor, w, d)
2492FLOAT_ROUNDOP(floor, w, s)
2493#undef FLOAR_ROUNDOP
6ea83fed 2494
5a5012ec
TS
2495FLOAT_OP(movf, d)
2496{
ead9360e 2497 if (!(env->fpu->fcr31 & PARAM1))
5a5012ec
TS
2498 DT2 = DT0;
2499 DEBUG_FPU_STATE();
8f6f6026 2500 FORCE_RET();
5a5012ec
TS
2501}
2502FLOAT_OP(movf, s)
2503{
ead9360e 2504 if (!(env->fpu->fcr31 & PARAM1))
5a5012ec
TS
2505 WT2 = WT0;
2506 DEBUG_FPU_STATE();
8f6f6026 2507 FORCE_RET();
5a5012ec
TS
2508}
2509FLOAT_OP(movf, ps)
2510{
ead9360e 2511 if (!(env->fpu->fcr31 & PARAM1)) {
5a5012ec
TS
2512 WT2 = WT0;
2513 WTH2 = WTH0;
2514 }
2515 DEBUG_FPU_STATE();
8f6f6026 2516 FORCE_RET();
5a5012ec
TS
2517}
2518FLOAT_OP(movt, d)
2519{
ead9360e 2520 if (env->fpu->fcr31 & PARAM1)
5a5012ec
TS
2521 DT2 = DT0;
2522 DEBUG_FPU_STATE();
8f6f6026 2523 FORCE_RET();
5a5012ec
TS
2524}
2525FLOAT_OP(movt, s)
2526{
ead9360e 2527 if (env->fpu->fcr31 & PARAM1)
5a5012ec
TS
2528 WT2 = WT0;
2529 DEBUG_FPU_STATE();
8f6f6026 2530 FORCE_RET();
5a5012ec
TS
2531}
2532FLOAT_OP(movt, ps)
2533{
ead9360e 2534 if (env->fpu->fcr31 & PARAM1) {
5a5012ec
TS
2535 WT2 = WT0;
2536 WTH2 = WTH0;
2537 }
2538 DEBUG_FPU_STATE();
8f6f6026 2539 FORCE_RET();
5a5012ec
TS
2540}
2541FLOAT_OP(movz, d)
2542{
2543 if (!T0)
2544 DT2 = DT0;
2545 DEBUG_FPU_STATE();
8f6f6026 2546 FORCE_RET();
5a5012ec
TS
2547}
2548FLOAT_OP(movz, s)
2549{
2550 if (!T0)
2551 WT2 = WT0;
2552 DEBUG_FPU_STATE();
8f6f6026 2553 FORCE_RET();
5a5012ec
TS
2554}
2555FLOAT_OP(movz, ps)
2556{
2557 if (!T0) {
2558 WT2 = WT0;
2559 WTH2 = WTH0;
2560 }
2561 DEBUG_FPU_STATE();
8f6f6026 2562 FORCE_RET();
5a5012ec
TS
2563}
2564FLOAT_OP(movn, d)
2565{
2566 if (T0)
2567 DT2 = DT0;
2568 DEBUG_FPU_STATE();
8f6f6026 2569 FORCE_RET();
5a5012ec
TS
2570}
2571FLOAT_OP(movn, s)
2572{
2573 if (T0)
2574 WT2 = WT0;
2575 DEBUG_FPU_STATE();
8f6f6026 2576 FORCE_RET();
5a5012ec
TS
2577}
2578FLOAT_OP(movn, ps)
2579{
2580 if (T0) {
2581 WT2 = WT0;
2582 WTH2 = WTH0;
2583 }
2584 DEBUG_FPU_STATE();
8f6f6026 2585 FORCE_RET();
5a5012ec
TS
2586}
2587
57fa1fb3 2588/* operations calling helpers, for s, d and ps */
8f6f6026 2589#define FLOAT_HOP(name) \
6ea83fed
FB
2590FLOAT_OP(name, d) \
2591{ \
fd4a04eb 2592 CALL_FROM_TB0(do_float_ ## name ## _d); \
6ea83fed 2593 DEBUG_FPU_STATE(); \
8f6f6026 2594 FORCE_RET(); \
6ea83fed
FB
2595} \
2596FLOAT_OP(name, s) \
2597{ \
fd4a04eb 2598 CALL_FROM_TB0(do_float_ ## name ## _s); \
5a5012ec 2599 DEBUG_FPU_STATE(); \
8f6f6026 2600 FORCE_RET(); \
5a5012ec
TS
2601} \
2602FLOAT_OP(name, ps) \
2603{ \
fd4a04eb 2604 CALL_FROM_TB0(do_float_ ## name ## _ps); \
6ea83fed 2605 DEBUG_FPU_STATE(); \
8f6f6026 2606 FORCE_RET(); \
6ea83fed 2607}
57fa1fb3
TS
2608FLOAT_HOP(add)
2609FLOAT_HOP(sub)
2610FLOAT_HOP(mul)
2611FLOAT_HOP(div)
2612FLOAT_HOP(recip2)
2613FLOAT_HOP(rsqrt2)
2614FLOAT_HOP(rsqrt1)
2615FLOAT_HOP(recip1)
2616#undef FLOAT_HOP
2617
2618/* operations calling helpers, for s and d */
2619#define FLOAT_HOP(name) \
2620FLOAT_OP(name, d) \
2621{ \
2622 CALL_FROM_TB0(do_float_ ## name ## _d); \
2623 DEBUG_FPU_STATE(); \
8f6f6026 2624 FORCE_RET(); \
57fa1fb3
TS
2625} \
2626FLOAT_OP(name, s) \
2627{ \
2628 CALL_FROM_TB0(do_float_ ## name ## _s); \
2629 DEBUG_FPU_STATE(); \
8f6f6026 2630 FORCE_RET(); \
57fa1fb3
TS
2631}
2632FLOAT_HOP(rsqrt)
2633FLOAT_HOP(recip)
2634#undef FLOAT_HOP
6ea83fed 2635
57fa1fb3
TS
2636/* operations calling helpers, for ps */
2637#define FLOAT_HOP(name) \
2638FLOAT_OP(name, ps) \
2639{ \
2640 CALL_FROM_TB0(do_float_ ## name ## _ps); \
2641 DEBUG_FPU_STATE(); \
8f6f6026 2642 FORCE_RET(); \
fbcc6828 2643}
57fa1fb3
TS
2644FLOAT_HOP(addr)
2645FLOAT_HOP(mulr)
2646#undef FLOAT_HOP
fbcc6828 2647
5a5012ec
TS
2648/* ternary operations */
2649#define FLOAT_TERNOP(name1, name2) \
2650FLOAT_OP(name1 ## name2, d) \
2651{ \
ead9360e
TS
2652 FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \
2653 FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \
5a5012ec 2654 DEBUG_FPU_STATE(); \
8f6f6026 2655 FORCE_RET(); \
5a5012ec
TS
2656} \
2657FLOAT_OP(name1 ## name2, s) \
2658{ \
ead9360e
TS
2659 FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
2660 FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
5a5012ec 2661 DEBUG_FPU_STATE(); \
8f6f6026 2662 FORCE_RET(); \
5a5012ec
TS
2663} \
2664FLOAT_OP(name1 ## name2, ps) \
2665{ \
ead9360e
TS
2666 FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
2667 FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \
2668 FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
2669 FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \
5a5012ec 2670 DEBUG_FPU_STATE(); \
8f6f6026 2671 FORCE_RET(); \
5a5012ec
TS
2672}
2673FLOAT_TERNOP(mul, add)
2674FLOAT_TERNOP(mul, sub)
2675#undef FLOAT_TERNOP
2676
fbcc6828
TS
2677/* negated ternary operations */
2678#define FLOAT_NTERNOP(name1, name2) \
2679FLOAT_OP(n ## name1 ## name2, d) \
2680{ \
ead9360e
TS
2681 FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \
2682 FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \
5747c073 2683 FDT2 = float64_chs(FDT2); \
fbcc6828 2684 DEBUG_FPU_STATE(); \
8f6f6026 2685 FORCE_RET(); \
fbcc6828
TS
2686} \
2687FLOAT_OP(n ## name1 ## name2, s) \
2688{ \
ead9360e
TS
2689 FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
2690 FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
5747c073 2691 FST2 = float32_chs(FST2); \
fbcc6828 2692 DEBUG_FPU_STATE(); \
8f6f6026 2693 FORCE_RET(); \
fbcc6828
TS
2694} \
2695FLOAT_OP(n ## name1 ## name2, ps) \
2696{ \
ead9360e
TS
2697 FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
2698 FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \
2699 FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
2700 FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \
5747c073
PB
2701 FST2 = float32_chs(FST2); \
2702 FSTH2 = float32_chs(FSTH2); \
fbcc6828 2703 DEBUG_FPU_STATE(); \
8f6f6026 2704 FORCE_RET(); \
fbcc6828
TS
2705}
2706FLOAT_NTERNOP(mul, add)
2707FLOAT_NTERNOP(mul, sub)
2708#undef FLOAT_NTERNOP
2709
6ea83fed
FB
2710/* unary operations, modifying fp status */
2711#define FLOAT_UNOP(name) \
2712FLOAT_OP(name, d) \
2713{ \
8f6f6026 2714 FDT2 = float64_ ## name(FDT0, &env->fpu->fp_status); \
6ea83fed 2715 DEBUG_FPU_STATE(); \
8f6f6026 2716 FORCE_RET(); \
6ea83fed
FB
2717} \
2718FLOAT_OP(name, s) \
2719{ \
8f6f6026 2720 FST2 = float32_ ## name(FST0, &env->fpu->fp_status); \
6ea83fed 2721 DEBUG_FPU_STATE(); \
8f6f6026 2722 FORCE_RET(); \
6ea83fed
FB
2723}
2724FLOAT_UNOP(sqrt)
2725#undef FLOAT_UNOP
2726
2727/* unary operations, not modifying fp status */
2728#define FLOAT_UNOP(name) \
2729FLOAT_OP(name, d) \
2730{ \
2731 FDT2 = float64_ ## name(FDT0); \
2732 DEBUG_FPU_STATE(); \
8f6f6026 2733 FORCE_RET(); \
6ea83fed
FB
2734} \
2735FLOAT_OP(name, s) \
2736{ \
2737 FST2 = float32_ ## name(FST0); \
2738 DEBUG_FPU_STATE(); \
8f6f6026 2739 FORCE_RET(); \
5a5012ec
TS
2740} \
2741FLOAT_OP(name, ps) \
2742{ \
2743 FST2 = float32_ ## name(FST0); \
2744 FSTH2 = float32_ ## name(FSTH0); \
2745 DEBUG_FPU_STATE(); \
8f6f6026 2746 FORCE_RET(); \
6ea83fed
FB
2747}
2748FLOAT_UNOP(abs)
2749FLOAT_UNOP(chs)
2750#undef FLOAT_UNOP
2751
2752FLOAT_OP(mov, d)
2753{
2754 FDT2 = FDT0;
2755 DEBUG_FPU_STATE();
8f6f6026 2756 FORCE_RET();
6ea83fed
FB
2757}
2758FLOAT_OP(mov, s)
2759{
2760 FST2 = FST0;
2761 DEBUG_FPU_STATE();
8f6f6026 2762 FORCE_RET();
6ea83fed 2763}
5a5012ec
TS
2764FLOAT_OP(mov, ps)
2765{
2766 FST2 = FST0;
2767 FSTH2 = FSTH0;
2768 DEBUG_FPU_STATE();
8f6f6026 2769 FORCE_RET();
5a5012ec
TS
2770}
2771FLOAT_OP(alnv, ps)
2772{
2773 switch (T0 & 0x7) {
2774 case 0:
2775 FST2 = FST0;
2776 FSTH2 = FSTH0;
2777 break;
2778 case 4:
2779#ifdef TARGET_WORDS_BIGENDIAN
2780 FSTH2 = FST0;
2781 FST2 = FSTH1;
2782#else
2783 FSTH2 = FST1;
2784 FST2 = FSTH0;
2785#endif
2786 break;
2787 default: /* unpredictable */
2788 break;
2789 }
2790 DEBUG_FPU_STATE();
8f6f6026 2791 FORCE_RET();
5a5012ec 2792}
6ea83fed
FB
2793
2794#ifdef CONFIG_SOFTFLOAT
2795#define clear_invalid() do { \
ead9360e 2796 int flags = get_float_exception_flags(&env->fpu->fp_status); \
6ea83fed 2797 flags &= ~float_flag_invalid; \
8f6f6026 2798 set_float_exception_flags(flags, &env->fpu->fp_status); \
6ea83fed
FB
2799} while(0)
2800#else
2801#define clear_invalid() do { } while(0)
2802#endif
2803
2804extern void dump_fpu_s(CPUState *env);
2805
fd4a04eb
TS
2806#define CMP_OP(fmt, op) \
2807void OPPROTO op_cmp ## _ ## fmt ## _ ## op(void) \
2808{ \
2809 CALL_FROM_TB1(do_cmp ## _ ## fmt ## _ ## op, PARAM1); \
2810 DEBUG_FPU_STATE(); \
8f6f6026 2811 FORCE_RET(); \
fd4a04eb
TS
2812} \
2813void OPPROTO op_cmpabs ## _ ## fmt ## _ ## op(void) \
2814{ \
2815 CALL_FROM_TB1(do_cmpabs ## _ ## fmt ## _ ## op, PARAM1); \
2816 DEBUG_FPU_STATE(); \
8f6f6026 2817 FORCE_RET(); \
fd4a04eb
TS
2818}
2819#define CMP_OPS(op) \
2820CMP_OP(d, op) \
2821CMP_OP(s, op) \
2822CMP_OP(ps, op)
2823
2824CMP_OPS(f)
2825CMP_OPS(un)
2826CMP_OPS(eq)
2827CMP_OPS(ueq)
2828CMP_OPS(olt)
2829CMP_OPS(ult)
2830CMP_OPS(ole)
2831CMP_OPS(ule)
2832CMP_OPS(sf)
2833CMP_OPS(ngle)
2834CMP_OPS(seq)
2835CMP_OPS(ngl)
2836CMP_OPS(lt)
2837CMP_OPS(nge)
2838CMP_OPS(le)
2839CMP_OPS(ngt)
2840#undef CMP_OPS
2841#undef CMP_OP
6ea83fed
FB
2842
2843void op_bc1f (void)
2844{
ead9360e 2845 T0 = !!(~GET_FP_COND(env->fpu) & (0x1 << PARAM1));
5a5012ec 2846 DEBUG_FPU_STATE();
8f6f6026 2847 FORCE_RET();
5a5012ec 2848}
fd4a04eb 2849void op_bc1any2f (void)
5a5012ec 2850{
ead9360e 2851 T0 = !!(~GET_FP_COND(env->fpu) & (0x3 << PARAM1));
5a5012ec 2852 DEBUG_FPU_STATE();
8f6f6026 2853 FORCE_RET();
5a5012ec 2854}
fd4a04eb 2855void op_bc1any4f (void)
5a5012ec 2856{
ead9360e 2857 T0 = !!(~GET_FP_COND(env->fpu) & (0xf << PARAM1));
6ea83fed 2858 DEBUG_FPU_STATE();
8f6f6026 2859 FORCE_RET();
6ea83fed
FB
2860}
2861
2862void op_bc1t (void)
2863{
ead9360e 2864 T0 = !!(GET_FP_COND(env->fpu) & (0x1 << PARAM1));
5a5012ec 2865 DEBUG_FPU_STATE();
8f6f6026 2866 FORCE_RET();
5a5012ec 2867}
fd4a04eb 2868void op_bc1any2t (void)
5a5012ec 2869{
ead9360e 2870 T0 = !!(GET_FP_COND(env->fpu) & (0x3 << PARAM1));
5a5012ec 2871 DEBUG_FPU_STATE();
8f6f6026 2872 FORCE_RET();
5a5012ec 2873}
fd4a04eb 2874void op_bc1any4t (void)
5a5012ec 2875{
ead9360e 2876 T0 = !!(GET_FP_COND(env->fpu) & (0xf << PARAM1));
6ea83fed 2877 DEBUG_FPU_STATE();
8f6f6026 2878 FORCE_RET();
6ea83fed 2879}
6ea83fed 2880
6af0bf9c
FB
2881void op_tlbwi (void)
2882{
ead9360e 2883 CALL_FROM_TB0(env->tlb->do_tlbwi);
8f6f6026 2884 FORCE_RET();
6af0bf9c
FB
2885}
2886
2887void op_tlbwr (void)
2888{
ead9360e 2889 CALL_FROM_TB0(env->tlb->do_tlbwr);
8f6f6026 2890 FORCE_RET();
6af0bf9c
FB
2891}
2892
2893void op_tlbp (void)
2894{
ead9360e 2895 CALL_FROM_TB0(env->tlb->do_tlbp);
8f6f6026 2896 FORCE_RET();
6af0bf9c
FB
2897}
2898
2899void op_tlbr (void)
2900{
ead9360e 2901 CALL_FROM_TB0(env->tlb->do_tlbr);
8f6f6026 2902 FORCE_RET();
6af0bf9c 2903}
6af0bf9c
FB
2904
2905/* Specials */
6f5b89a0
TS
2906#if defined (CONFIG_USER_ONLY)
2907void op_tls_value (void)
2908{
5a5012ec 2909 T0 = env->tls_value;
6f5b89a0
TS
2910}
2911#endif
2912
6af0bf9c
FB
2913void op_pmon (void)
2914{
2915 CALL_FROM_TB1(do_pmon, PARAM1);
8f6f6026 2916 FORCE_RET();
7a387fff
TS
2917}
2918
2919void op_di (void)
2920{
7a387fff 2921 T0 = env->CP0_Status;
4de9b249
TS
2922 env->CP0_Status = T0 & ~(1 << CP0St_IE);
2923 CALL_FROM_TB1(cpu_mips_update_irq, env);
8f6f6026 2924 FORCE_RET();
7a387fff
TS
2925}
2926
2927void op_ei (void)
2928{
7a387fff 2929 T0 = env->CP0_Status;
4de9b249
TS
2930 env->CP0_Status = T0 | (1 << CP0St_IE);
2931 CALL_FROM_TB1(cpu_mips_update_irq, env);
8f6f6026 2932 FORCE_RET();
6af0bf9c
FB
2933}
2934
2935void op_trap (void)
2936{
2937 if (T0) {
1579a72e 2938 CALL_FROM_TB1(do_raise_exception, EXCP_TRAP);
6af0bf9c 2939 }
8f6f6026 2940 FORCE_RET();
6af0bf9c
FB
2941}
2942
4ad40f36
FB
2943void op_debug (void)
2944{
7a387fff 2945 CALL_FROM_TB1(do_raise_exception, EXCP_DEBUG);
8f6f6026 2946 FORCE_RET();
4ad40f36
FB
2947}
2948
6af0bf9c
FB
2949void op_set_lladdr (void)
2950{
2951 env->CP0_LLAddr = T2;
8f6f6026 2952 FORCE_RET();
6af0bf9c
FB
2953}
2954
f41c52f1
TS
2955void debug_pre_eret (void);
2956void debug_post_eret (void);
6af0bf9c
FB
2957void op_eret (void)
2958{
f41c52f1
TS
2959 if (loglevel & CPU_LOG_EXEC)
2960 CALL_FROM_TB0(debug_pre_eret);
24c7b0e3 2961 if (env->CP0_Status & (1 << CP0St_ERL)) {
ead9360e 2962 env->PC[env->current_tc] = env->CP0_ErrorEPC;
24c7b0e3 2963 env->CP0_Status &= ~(1 << CP0St_ERL);
51e11d9e 2964 } else {
ead9360e 2965 env->PC[env->current_tc] = env->CP0_EPC;
24c7b0e3 2966 env->CP0_Status &= ~(1 << CP0St_EXL);
51e11d9e 2967 }
08fa4bab 2968 CALL_FROM_TB1(compute_hflags, env);
f41c52f1
TS
2969 if (loglevel & CPU_LOG_EXEC)
2970 CALL_FROM_TB0(debug_post_eret);
6af0bf9c 2971 env->CP0_LLAddr = 1;
8f6f6026 2972 FORCE_RET();
6af0bf9c
FB
2973}
2974
2975void op_deret (void)
2976{
f41c52f1
TS
2977 if (loglevel & CPU_LOG_EXEC)
2978 CALL_FROM_TB0(debug_pre_eret);
ead9360e 2979 env->PC[env->current_tc] = env->CP0_DEPC;
08fa4bab
TS
2980 env->hflags &= MIPS_HFLAG_DM;
2981 CALL_FROM_TB1(compute_hflags, env);
f41c52f1
TS
2982 if (loglevel & CPU_LOG_EXEC)
2983 CALL_FROM_TB0(debug_post_eret);
24c7b0e3 2984 env->CP0_LLAddr = 1;
8f6f6026 2985 FORCE_RET();
7a387fff
TS
2986}
2987
2988void op_rdhwr_cpunum(void)
2989{
387a8fe5
TS
2990 if ((env->hflags & MIPS_HFLAG_CP0) ||
2991 (env->CP0_HWREna & (1 << 0)))
1579a72e 2992 T0 = env->CP0_EBase & 0x3ff;
7a387fff 2993 else
1579a72e 2994 CALL_FROM_TB1(do_raise_exception, EXCP_RI);
8f6f6026 2995 FORCE_RET();
7a387fff
TS
2996}
2997
2998void op_rdhwr_synci_step(void)
2999{
387a8fe5
TS
3000 if ((env->hflags & MIPS_HFLAG_CP0) ||
3001 (env->CP0_HWREna & (1 << 1)))
1579a72e 3002 T0 = env->SYNCI_Step;
7a387fff 3003 else
1579a72e 3004 CALL_FROM_TB1(do_raise_exception, EXCP_RI);
8f6f6026 3005 FORCE_RET();
7a387fff
TS
3006}
3007
3008void op_rdhwr_cc(void)
3009{
387a8fe5
TS
3010 if ((env->hflags & MIPS_HFLAG_CP0) ||
3011 (env->CP0_HWREna & (1 << 2)))
1579a72e 3012 T0 = env->CP0_Count;
7a387fff 3013 else
1579a72e 3014 CALL_FROM_TB1(do_raise_exception, EXCP_RI);
8f6f6026 3015 FORCE_RET();
7a387fff
TS
3016}
3017
3018void op_rdhwr_ccres(void)
3019{
387a8fe5
TS
3020 if ((env->hflags & MIPS_HFLAG_CP0) ||
3021 (env->CP0_HWREna & (1 << 3)))
1579a72e 3022 T0 = env->CCRes;
7a387fff 3023 else
1579a72e 3024 CALL_FROM_TB1(do_raise_exception, EXCP_RI);
8f6f6026 3025 FORCE_RET();
1579a72e
TS
3026}
3027
6af0bf9c
FB
3028void op_save_state (void)
3029{
3030 env->hflags = PARAM1;
8f6f6026 3031 FORCE_RET();
6af0bf9c
FB
3032}
3033
3034void op_save_pc (void)
3035{
ead9360e 3036 env->PC[env->current_tc] = PARAM1;
8f6f6026 3037 FORCE_RET();
6af0bf9c
FB
3038}
3039
d26bc211 3040#if defined(TARGET_MIPS64)
9b9e4393
TS
3041void op_save_pc64 (void)
3042{
ead9360e 3043 env->PC[env->current_tc] = ((uint64_t)PARAM1 << 32) | (uint32_t)PARAM2;
8f6f6026 3044 FORCE_RET();
9b9e4393
TS
3045}
3046#endif
3047
16c00cb2
TS
3048void op_interrupt_restart (void)
3049{
3050 if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
3051 !(env->CP0_Status & (1 << CP0St_ERL)) &&
3052 !(env->hflags & MIPS_HFLAG_DM) &&
3053 (env->CP0_Status & (1 << CP0St_IE)) &&
3054 (env->CP0_Status & env->CP0_Cause & CP0Ca_IP_mask)) {
3055 env->CP0_Cause &= ~(0x1f << CP0Ca_EC);
3056 CALL_FROM_TB1(do_raise_exception, EXCP_EXT_INTERRUPT);
3057 }
8f6f6026 3058 FORCE_RET();
16c00cb2
TS
3059}
3060
6af0bf9c
FB
3061void op_raise_exception (void)
3062{
3063 CALL_FROM_TB1(do_raise_exception, PARAM1);
8f6f6026 3064 FORCE_RET();
6af0bf9c
FB
3065}
3066
3067void op_raise_exception_err (void)
3068{
3069 CALL_FROM_TB2(do_raise_exception_err, PARAM1, PARAM2);
8f6f6026 3070 FORCE_RET();
6af0bf9c
FB
3071}
3072
3073void op_exit_tb (void)
3074{
3075 EXIT_TB();
8f6f6026 3076 FORCE_RET();
6af0bf9c
FB
3077}
3078
4ad40f36
FB
3079void op_wait (void)
3080{
3081 env->halted = 1;
3082 CALL_FROM_TB1(do_raise_exception, EXCP_HLT);
8f6f6026 3083 FORCE_RET();
7a387fff
TS
3084}
3085
3086/* Bitfield operations. */
3087void op_ext(void)
3088{
3089 unsigned int pos = PARAM1;
3090 unsigned int size = PARAM2;
3091
c6d6dd7c 3092 T0 = (int32_t)((T1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0));
8f6f6026 3093 FORCE_RET();
7a387fff
TS
3094}
3095
3096void op_ins(void)
3097{
3098 unsigned int pos = PARAM1;
3099 unsigned int size = PARAM2;
f757d6ff 3100 target_ulong mask = ((size < 32) ? ((1 << size) - 1) : ~0) << pos;
7a387fff 3101
c6d6dd7c 3102 T0 = (int32_t)((T0 & ~mask) | ((T1 << pos) & mask));
8f6f6026 3103 FORCE_RET();
7a387fff
TS
3104}
3105
3106void op_wsbh(void)
3107{
c6d6dd7c 3108 T0 = (int32_t)(((T1 << 8) & ~0x00FF00FF) | ((T1 >> 8) & 0x00FF00FF));
8f6f6026 3109 FORCE_RET();
7a387fff
TS
3110}
3111
d26bc211 3112#if defined(TARGET_MIPS64)
c570fd16
TS
3113void op_dext(void)
3114{
3115 unsigned int pos = PARAM1;
3116 unsigned int size = PARAM2;
3117
c6d6dd7c 3118 T0 = (T1 >> pos) & ((size < 64) ? ((1ULL << size) - 1) : ~0ULL);
8f6f6026 3119 FORCE_RET();
c570fd16
TS
3120}
3121
3122void op_dins(void)
3123{
3124 unsigned int pos = PARAM1;
3125 unsigned int size = PARAM2;
c6d6dd7c 3126 target_ulong mask = ((size < 64) ? ((1ULL << size) - 1) : ~0ULL) << pos;
c570fd16 3127
171b31e7 3128 T0 = (T0 & ~mask) | ((T1 << pos) & mask);
8f6f6026 3129 FORCE_RET();
c570fd16
TS
3130}
3131
7a387fff
TS
3132void op_dsbh(void)
3133{
3134 T0 = ((T1 << 8) & ~0x00FF00FF00FF00FFULL) | ((T1 >> 8) & 0x00FF00FF00FF00FFULL);
8f6f6026 3135 FORCE_RET();
7a387fff
TS
3136}
3137
3138void op_dshd(void)
3139{
c6d6dd7c
TS
3140 T1 = ((T1 << 16) & ~0x0000FFFF0000FFFFULL) | ((T1 >> 16) & 0x0000FFFF0000FFFFULL);
3141 T0 = (T1 << 32) | (T1 >> 32);
8f6f6026 3142 FORCE_RET();
7a387fff 3143}
c570fd16 3144#endif
7a387fff
TS
3145
3146void op_seb(void)
3147{
3148 T0 = ((T1 & 0xFF) ^ 0x80) - 0x80;
8f6f6026 3149 FORCE_RET();
7a387fff
TS
3150}
3151
3152void op_seh(void)
3153{
3154 T0 = ((T1 & 0xFFFF) ^ 0x8000) - 0x8000;
8f6f6026 3155 FORCE_RET();
4ad40f36 3156}
This page took 0.571596 seconds and 4 git commands to generate.