Upload Tizen:Base source
[external/gdb.git] / sim / mips / mips.igen
1 // -*- C -*-
2 //
3 //    <insn> ::=
4 //        <insn-word> { "+" <insn-word> }
5 //        ":" <format-name>
6 //        ":" <filter-flags>
7 //        ":" <options>
8 //        ":" <name>
9 //        <nl>
10 //        { <insn-model> }
11 //        { <insn-mnemonic> }
12 //        <code-block>
13 //
14
15
16 // IGEN config - mips16
17 // :option:16::insn-bit-size:16
18 // :option:16::hi-bit-nr:15
19 :option:16::insn-specifying-widths:true
20 :option:16::gen-delayed-branch:false
21
22 // IGEN config - mips32/64..
23 // :option:32::insn-bit-size:32
24 // :option:32::hi-bit-nr:31
25 :option:32::insn-specifying-widths:true
26 :option:32::gen-delayed-branch:false
27
28
29 // Generate separate simulators for each target
30 // :option:::multi-sim:true
31
32
33 // Models known by this simulator are defined below.
34 //
35 // When placing models in the instruction descriptions, please place
36 // them one per line, in the order given here.
37
38 //  MIPS ISAs:
39 //
40 //  Instructions and related functions for these models are included in
41 //  this file.
42 :model:::mipsI:mips3000:
43 :model:::mipsII:mips6000:
44 :model:::mipsIII:mips4000:
45 :model:::mipsIV:mips8000:
46 :model:::mipsV:mipsisaV:
47 :model:::mips32:mipsisa32:
48 :model:::mips32r2:mipsisa32r2:
49 :model:::mips64:mipsisa64:
50 :model:::mips64r2:mipsisa64r2:
51
52 //  Vendor ISAs:
53 //
54 //  Standard MIPS ISA instructions used for these models are listed here,
55 //  as are functions needed by those standard instructions.  Instructions
56 //  which are model-dependent and which are not in the standard MIPS ISAs
57 //  (or which pre-date or use different encodings than the standard
58 //  instructions) are (for the most part) in separate .igen files.
59 :model:::vr4100:mips4100:               // vr.igen
60 :model:::vr4120:mips4120:
61 :model:::vr5000:mips5000:
62 :model:::vr5400:mips5400:
63 :model:::vr5500:mips5500:
64 :model:::r3900:mips3900:                // tx.igen
65
66 //  MIPS Application Specific Extensions (ASEs)
67 //
68 //  Instructions for the ASEs are in separate .igen files.
69 //  ASEs add instructions on to a base ISA.
70 :model:::mips16:mips16:                 // m16.igen (and m16.dc)
71 :model:::mips16e:mips16e:               // m16e.igen
72 :model:::mips3d:mips3d:                 // mips3d.igen
73 :model:::mdmx:mdmx:                     // mdmx.igen
74 :model:::dsp:dsp:                       // dsp.igen
75 :model:::dsp2:dsp2:                     // dsp2.igen
76 :model:::smartmips:smartmips:           // smartmips.igen
77
78 //  Vendor Extensions
79 //
80 //  Instructions specific to these extensions are in separate .igen files.
81 //  Extensions add instructions on to a base ISA.
82 :model:::sb1:sb1:                       // sb1.igen
83
84
85 // Pseudo instructions known by IGEN
86 :internal::::illegal:
87 {
88   SignalException (ReservedInstruction, 0);
89 }
90
91
92 // Pseudo instructions known by interp.c
93 // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
94 000000,5.*,5.*,5.*,5.OP,000101:SPECIAL:32::RSVD
95 "rsvd <OP>"
96 {
97   SignalException (ReservedInstruction, instruction_0);
98 }
99
100
101
102 // Helper:
103 //
104 // Simulate a 32 bit delayslot instruction
105 //
106
107 :function:::address_word:delayslot32:address_word target
108 {
109   instruction_word delay_insn;
110   sim_events_slip (SD, 1);
111   DSPC = CIA;
112   CIA = CIA + 4; /* NOTE not mips16 */
113   STATE |= simDELAYSLOT;
114   delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
115   ENGINE_ISSUE_PREFIX_HOOK();
116   idecode_issue (CPU_, delay_insn, (CIA));
117   STATE &= ~simDELAYSLOT;
118   return target;
119 }
120
121 :function:::address_word:nullify_next_insn32:
122 {
123   sim_events_slip (SD, 1);
124   dotrace (SD, CPU, tracefh, 2, CIA + 4, 4, "load instruction");
125   return CIA + 8;
126 }
127
128
129 // Helper:
130 //
131 // Calculate an effective address given a base and an offset.
132 //
133
134 :function:::address_word:loadstore_ea:address_word base, address_word offset
135 *mipsI:
136 *mipsII:
137 *mipsIII:
138 *mipsIV:
139 *mipsV:
140 *mips32:
141 *mips32r2:
142 *vr4100:
143 *vr5000:
144 *r3900:
145 {
146   return base + offset;
147 }
148
149 :function:::address_word:loadstore_ea:address_word base, address_word offset
150 *mips64:
151 *mips64r2:
152 {
153 #if 0 /* XXX FIXME: enable this only after some additional testing.  */
154   /* If in user mode and UX is not set, use 32-bit compatibility effective
155      address computations as defined in the MIPS64 Architecture for
156      Programmers Volume III, Revision 0.95, section 4.9.  */
157   if ((SR & (status_KSU_mask|status_EXL|status_ERL|status_UX))
158       == (ksu_user << status_KSU_shift))
159     return (address_word)((signed32)base + (signed32)offset);
160 #endif
161   return base + offset;
162 }
163
164
165 // Helper:
166 //
167 // Check that a 32-bit register value is properly sign-extended.
168 // (See NotWordValue in ISA spec.)
169 //
170
171 :function:::int:not_word_value:unsigned_word value
172 *mipsI:
173 *mipsII:
174 *mipsIII:
175 *mipsIV:
176 *mipsV:
177 *vr4100:
178 *vr5000:
179 *r3900:
180 *mips32:
181 *mips32r2:
182 *mips64:
183 *mips64r2:
184 {
185 #if WITH_TARGET_WORD_BITSIZE == 64
186   return value != (((value & 0xffffffff) ^ 0x80000000) - 0x80000000);
187 #else
188   return 0;
189 #endif
190 }
191
192 // Helper:
193 //
194 // Handle UNPREDICTABLE operation behaviour.  The goal here is to prevent
195 // theoretically portable code which invokes non-portable behaviour from
196 // running with no indication of the portability issue.
197 // (See definition of UNPREDICTABLE in ISA spec.)
198 //
199
200 :function:::void:unpredictable:
201 *mipsI:
202 *mipsII:
203 *mipsIII:
204 *mipsIV:
205 *mipsV:
206 *vr4100:
207 *vr5000:
208 *r3900:
209 {
210 }
211
212 :function:::void:unpredictable:
213 *mips32:
214 *mips32r2:
215 *mips64:
216 *mips64r2:
217 {
218   unpredictable_action (CPU, CIA);
219 }
220
221
222 // Helpers:
223 //
224 // Check that an access to a HI/LO register meets timing requirements
225 //
226 // In all MIPS ISAs,
227 //
228 //      OP {HI and LO} followed by MT{LO or HI} (and not MT{HI or LO})
229 //      makes subsequent MF{HI or LO} UNPREDICTABLE. (1)
230 //
231 // The following restrictions exist for MIPS I - MIPS III:
232 //
233 //      MF{HI or LO} followed by MT{HI or LO} w/ less than 2 instructions
234 //      in between makes MF UNPREDICTABLE. (2)
235 //
236 //      MF{HI or LO} followed by OP {HI and LO} w/ less than 2 instructions
237 //      in between makes MF UNPREDICTABLE. (3)
238 //
239 // On the r3900, restriction (2) is not present, and restriction (3) is not
240 // present for multiplication.
241 //
242 // Unfortunately, there seems to be some confusion about whether the last
243 // two restrictions should apply to "MIPS IV" as well.  One edition of
244 // the MIPS IV ISA says they do, but references in later ISA documents
245 // suggest they don't.
246 //
247 // In reality, some MIPS IV parts, such as the VR5000 and VR5400, do have
248 // these restrictions, while others, like the VR5500, don't.  To accomodate
249 // such differences, the MIPS IV and MIPS V version of these helper functions
250 // use auxillary routines to determine whether the restriction applies.
251
252 // check_mf_cycles:
253 //
254 // Helper used by check_mt_hilo, check_mult_hilo, and check_div_hilo
255 // to check for restrictions (2) and (3) above.
256 //
257 :function:::int:check_mf_cycles:hilo_history *history, signed64 time, const char *new
258 {
259   if (history->mf.timestamp + 3 > time)
260     {
261       sim_engine_abort (SD, CPU, CIA, "HILO: %s: %s at 0x%08lx too close to MF at 0x%08lx\n",
262                         itable[MY_INDEX].name,
263                         new, (long) CIA,
264                         (long) history->mf.cia);
265       return 0;
266     }
267   return 1;
268 }
269
270
271 // check_mt_hilo:
272 //
273 // Check for restriction (2) above (for ISAs/processors that have it),
274 // and record timestamps for restriction (1) above.
275 //
276 :function:::int:check_mt_hilo:hilo_history *history
277 *mipsI:
278 *mipsII:
279 *mipsIII:
280 *vr4100:
281 *vr5000:
282 {
283   signed64 time = sim_events_time (SD);
284   int ok = check_mf_cycles (SD_, history, time, "MT");
285   history->mt.timestamp = time;
286   history->mt.cia = CIA;
287   return ok;
288 }
289
290 :function:::int:check_mt_hilo:hilo_history *history
291 *mipsIV:
292 *mipsV:
293 {
294   signed64 time = sim_events_time (SD);
295   int ok = (! MIPS_MACH_HAS_MT_HILO_HAZARD (SD)
296             || check_mf_cycles (SD_, history, time, "MT"));
297   history->mt.timestamp = time;
298   history->mt.cia = CIA;
299   return ok;
300 }
301
302 :function:::int:check_mt_hilo:hilo_history *history
303 *mips32:
304 *mips32r2:
305 *mips64:
306 *mips64r2:
307 *r3900:
308 {
309   signed64 time = sim_events_time (SD);
310   history->mt.timestamp = time;
311   history->mt.cia = CIA;
312   return 1;
313 }
314
315
316 // check_mf_hilo:
317 //
318 // Check for restriction (1) above, and record timestamps for
319 // restriction (2) and (3) above.
320 //
321 :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer
322 *mipsI:
323 *mipsII:
324 *mipsIII:
325 *mipsIV:
326 *mipsV:
327 *mips32:
328 *mips32r2:
329 *mips64:
330 *mips64r2:
331 *vr4100:
332 *vr5000:
333 *r3900:
334 {
335   signed64 time = sim_events_time (SD);
336   int ok = 1;
337   if (peer != NULL
338       && peer->mt.timestamp > history->op.timestamp
339       && history->mt.timestamp < history->op.timestamp
340       && ! (history->mf.timestamp > history->op.timestamp
341             && history->mf.timestamp < peer->mt.timestamp)
342       && ! (peer->mf.timestamp > history->op.timestamp
343             && peer->mf.timestamp < peer->mt.timestamp))
344     {
345       /* The peer has been written to since the last OP yet we have
346          not */
347       sim_engine_abort (SD, CPU, CIA, "HILO: %s: MF at 0x%08lx following OP at 0x%08lx corrupted by MT at 0x%08lx\n",
348                         itable[MY_INDEX].name,
349                         (long) CIA,
350                         (long) history->op.cia,
351                         (long) peer->mt.cia);
352       ok = 0;
353     }
354   history->mf.timestamp = time;
355   history->mf.cia = CIA;
356   return ok;
357 }
358
359
360
361 // check_mult_hilo:
362 //
363 // Check for restriction (3) above (for ISAs/processors that have it)
364 // for MULT ops, and record timestamps for restriction (1) above.
365 //
366 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
367 *mipsI:
368 *mipsII:
369 *mipsIII:
370 *vr4100:
371 *vr5000:
372 {
373   signed64 time = sim_events_time (SD);
374   int ok = (check_mf_cycles (SD_, hi, time, "OP")
375             && check_mf_cycles (SD_, lo, time, "OP"));
376   hi->op.timestamp = time;
377   lo->op.timestamp = time;
378   hi->op.cia = CIA;
379   lo->op.cia = CIA;
380   return ok;
381 }
382
383 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
384 *mipsIV:
385 *mipsV:
386 {
387   signed64 time = sim_events_time (SD);
388   int ok = (! MIPS_MACH_HAS_MULT_HILO_HAZARD (SD)
389             || (check_mf_cycles (SD_, hi, time, "OP")
390                 && check_mf_cycles (SD_, lo, time, "OP")));
391   hi->op.timestamp = time;
392   lo->op.timestamp = time;
393   hi->op.cia = CIA;
394   lo->op.cia = CIA;
395   return ok;
396 }
397
398 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
399 *mips32:
400 *mips32r2:
401 *mips64:
402 *mips64r2:
403 *r3900:
404 {
405   /* FIXME: could record the fact that a stall occured if we want */
406   signed64 time = sim_events_time (SD);
407   hi->op.timestamp = time;
408   lo->op.timestamp = time;
409   hi->op.cia = CIA;
410   lo->op.cia = CIA;
411   return 1;
412 }
413
414
415 // check_div_hilo:
416 //
417 // Check for restriction (3) above (for ISAs/processors that have it)
418 // for DIV ops, and record timestamps for restriction (1) above.
419 //
420 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
421 *mipsI:
422 *mipsII:
423 *mipsIII:
424 *vr4100:
425 *vr5000:
426 *r3900:
427 {
428   signed64 time = sim_events_time (SD);
429   int ok = (check_mf_cycles (SD_, hi, time, "OP")
430             && check_mf_cycles (SD_, lo, time, "OP"));
431   hi->op.timestamp = time;
432   lo->op.timestamp = time;
433   hi->op.cia = CIA;
434   lo->op.cia = CIA;
435   return ok;
436 }
437
438 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
439 *mipsIV:
440 *mipsV:
441 {
442   signed64 time = sim_events_time (SD);
443   int ok = (! MIPS_MACH_HAS_DIV_HILO_HAZARD (SD)
444             || (check_mf_cycles (SD_, hi, time, "OP")
445                 && check_mf_cycles (SD_, lo, time, "OP")));
446   hi->op.timestamp = time;
447   lo->op.timestamp = time;
448   hi->op.cia = CIA;
449   lo->op.cia = CIA;
450   return ok;
451 }
452
453 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
454 *mips32:
455 *mips32r2:
456 *mips64:
457 *mips64r2:
458 {
459   signed64 time = sim_events_time (SD);
460   hi->op.timestamp = time;
461   lo->op.timestamp = time;
462   hi->op.cia = CIA;
463   lo->op.cia = CIA;
464   return 1;
465 }
466
467
468 // Helper:
469 //
470 // Check that the 64-bit instruction can currently be used, and signal
471 // a ReservedInstruction exception if not.
472 //
473
474 :function:::void:check_u64:instruction_word insn
475 *mipsIII:
476 *mipsIV:
477 *mipsV:
478 *vr4100:
479 *vr5000:
480 *vr5400:
481 *vr5500:
482 {
483   // The check should be similar to mips64 for any with PX/UX bit equivalents.
484 }
485
486 :function:::void:check_u64:instruction_word insn
487 *mips16e:
488 *mips64:
489 *mips64r2:
490 {
491 #if 0 /* XXX FIXME: enable this only after some additional testing.  */
492   if (UserMode && (SR & (status_UX|status_PX)) == 0)
493     SignalException (ReservedInstruction, insn);
494 #endif
495 }
496
497
498
499 //
500 // MIPS Architecture:
501 //
502 //        CPU Instruction Set (mipsI - mipsV, mips32/r2, mips64/r2)
503 //
504
505
506
507 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
508 "add r<RD>, r<RS>, r<RT>"
509 *mipsI:
510 *mipsII:
511 *mipsIII:
512 *mipsIV:
513 *mipsV:
514 *mips32:
515 *mips32r2:
516 *mips64:
517 *mips64r2:
518 *vr4100:
519 *vr5000:
520 *r3900:
521 {
522   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
523     Unpredictable ();
524   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
525   {
526     ALU32_BEGIN (GPR[RS]);
527     ALU32_ADD (GPR[RT]);
528     ALU32_END (GPR[RD]);   /* This checks for overflow.  */
529   }
530   TRACE_ALU_RESULT (GPR[RD]);
531 }
532
533
534
535 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
536 "addi r<RT>, r<RS>, <IMMEDIATE>"
537 *mipsI:
538 *mipsII:
539 *mipsIII:
540 *mipsIV:
541 *mipsV:
542 *mips32:
543 *mips32r2:
544 *mips64:
545 *mips64r2:
546 *vr4100:
547 *vr5000:
548 *r3900:
549 {
550   if (NotWordValue (GPR[RS]))
551     Unpredictable ();
552   TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
553   {
554     ALU32_BEGIN (GPR[RS]);
555     ALU32_ADD (EXTEND16 (IMMEDIATE));
556     ALU32_END (GPR[RT]);   /* This checks for overflow.  */
557   }
558   TRACE_ALU_RESULT (GPR[RT]);
559 }
560
561
562
563 :function:::void:do_addiu:int rs, int rt, unsigned16 immediate
564 {
565   if (NotWordValue (GPR[rs]))
566     Unpredictable ();
567   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
568   GPR[rt] = EXTEND32 (GPR[rs] + EXTEND16 (immediate));
569   TRACE_ALU_RESULT (GPR[rt]);
570 }
571
572 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
573 "addiu r<RT>, r<RS>, <IMMEDIATE>"
574 *mipsI:
575 *mipsII:
576 *mipsIII:
577 *mipsIV:
578 *mipsV:
579 *mips32:
580 *mips32r2:
581 *mips64:
582 *mips64r2:
583 *vr4100:
584 *vr5000:
585 *r3900:
586 {
587   do_addiu (SD_, RS, RT, IMMEDIATE);
588 }
589
590
591
592 :function:::void:do_addu:int rs, int rt, int rd
593 {
594   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
595     Unpredictable ();
596   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
597   GPR[rd] = EXTEND32 (GPR[rs] + GPR[rt]);
598   TRACE_ALU_RESULT (GPR[rd]);
599 }
600
601 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
602 "addu r<RD>, r<RS>, r<RT>"
603 *mipsI:
604 *mipsII:
605 *mipsIII:
606 *mipsIV:
607 *mipsV:
608 *mips32:
609 *mips32r2:
610 *mips64:
611 *mips64r2:
612 *vr4100:
613 *vr5000:
614 *r3900:
615 {
616   do_addu (SD_, RS, RT, RD);
617 }
618
619
620
621 :function:::void:do_and:int rs, int rt, int rd
622 {
623   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
624   GPR[rd] = GPR[rs] & GPR[rt];
625   TRACE_ALU_RESULT (GPR[rd]);
626 }
627
628 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
629 "and r<RD>, r<RS>, r<RT>"
630 *mipsI:
631 *mipsII:
632 *mipsIII:
633 *mipsIV:
634 *mipsV:
635 *mips32:
636 *mips32r2:
637 *mips64:
638 *mips64r2:
639 *vr4100:
640 *vr5000:
641 *r3900:
642 {
643   do_and (SD_, RS, RT, RD);
644 }
645
646
647
648 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
649 "andi r<RT>, r<RS>, %#lx<IMMEDIATE>"
650 *mipsI:
651 *mipsII:
652 *mipsIII:
653 *mipsIV:
654 *mipsV:
655 *mips32:
656 *mips32r2:
657 *mips64:
658 *mips64r2:
659 *vr4100:
660 *vr5000:
661 *r3900:
662 {
663   TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
664   GPR[RT] = GPR[RS] & IMMEDIATE;
665   TRACE_ALU_RESULT (GPR[RT]);
666 }
667
668
669
670 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
671 "beq r<RS>, r<RT>, <OFFSET>"
672 *mipsI:
673 *mipsII:
674 *mipsIII:
675 *mipsIV:
676 *mipsV:
677 *mips32:
678 *mips32r2:
679 *mips64:
680 *mips64r2:
681 *vr4100:
682 *vr5000:
683 *r3900:
684 {
685   address_word offset = EXTEND16 (OFFSET) << 2;
686   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
687     {
688       DELAY_SLOT (NIA + offset);
689     }
690 }
691
692
693
694 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
695 "beql r<RS>, r<RT>, <OFFSET>"
696 *mipsII:
697 *mipsIII:
698 *mipsIV:
699 *mipsV:
700 *mips32:
701 *mips32r2:
702 *mips64:
703 *mips64r2:
704 *vr4100:
705 *vr5000:
706 *r3900:
707 {
708   address_word offset = EXTEND16 (OFFSET) << 2;
709   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
710     {
711       DELAY_SLOT (NIA + offset);
712     }
713   else
714     NULLIFY_NEXT_INSTRUCTION ();
715 }
716
717
718
719 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
720 "bgez r<RS>, <OFFSET>"
721 *mipsI:
722 *mipsII:
723 *mipsIII:
724 *mipsIV:
725 *mipsV:
726 *mips32:
727 *mips32r2:
728 *mips64:
729 *mips64r2:
730 *vr4100:
731 *vr5000:
732 *r3900:
733 {
734   address_word offset = EXTEND16 (OFFSET) << 2;
735   if ((signed_word) GPR[RS] >= 0)
736     {
737       DELAY_SLOT (NIA + offset);
738     }
739 }
740
741
742
743 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
744 "bgezal r<RS>, <OFFSET>"
745 *mipsI:
746 *mipsII:
747 *mipsIII:
748 *mipsIV:
749 *mipsV:
750 *mips32:
751 *mips32r2:
752 *mips64:
753 *mips64r2:
754 *vr4100:
755 *vr5000:
756 *r3900:
757 {
758   address_word offset = EXTEND16 (OFFSET) << 2;
759   if (RS == 31)
760     Unpredictable ();
761   RA = (CIA + 8);
762   if ((signed_word) GPR[RS] >= 0)
763     {
764       DELAY_SLOT (NIA + offset);
765     }
766 }
767
768
769
770 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
771 "bgezall r<RS>, <OFFSET>"
772 *mipsII:
773 *mipsIII:
774 *mipsIV:
775 *mipsV:
776 *mips32:
777 *mips32r2:
778 *mips64:
779 *mips64r2:
780 *vr4100:
781 *vr5000:
782 *r3900:
783 {
784   address_word offset = EXTEND16 (OFFSET) << 2;
785   if (RS == 31)
786     Unpredictable ();
787   RA = (CIA + 8);
788   /* NOTE: The branch occurs AFTER the next instruction has been
789      executed */
790   if ((signed_word) GPR[RS] >= 0)
791     {
792       DELAY_SLOT (NIA + offset);
793     }
794   else
795     NULLIFY_NEXT_INSTRUCTION ();
796 }
797
798
799
800 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
801 "bgezl r<RS>, <OFFSET>"
802 *mipsII:
803 *mipsIII:
804 *mipsIV:
805 *mipsV:
806 *mips32:
807 *mips32r2:
808 *mips64:
809 *mips64r2:
810 *vr4100:
811 *vr5000:
812 *r3900:
813 {
814   address_word offset = EXTEND16 (OFFSET) << 2;
815   if ((signed_word) GPR[RS] >= 0)
816     {
817       DELAY_SLOT (NIA + offset);
818     }
819   else
820     NULLIFY_NEXT_INSTRUCTION ();
821 }
822
823
824
825 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
826 "bgtz r<RS>, <OFFSET>"
827 *mipsI:
828 *mipsII:
829 *mipsIII:
830 *mipsIV:
831 *mipsV:
832 *mips32:
833 *mips32r2:
834 *mips64:
835 *mips64r2:
836 *vr4100:
837 *vr5000:
838 *r3900:
839 {
840   address_word offset = EXTEND16 (OFFSET) << 2;
841   if ((signed_word) GPR[RS] > 0)
842     {
843       DELAY_SLOT (NIA + offset);
844     }
845 }
846
847
848
849 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
850 "bgtzl r<RS>, <OFFSET>"
851 *mipsII:
852 *mipsIII:
853 *mipsIV:
854 *mipsV:
855 *mips32:
856 *mips32r2:
857 *mips64:
858 *mips64r2:
859 *vr4100:
860 *vr5000:
861 *r3900:
862 {
863   address_word offset = EXTEND16 (OFFSET) << 2;
864   /* NOTE: The branch occurs AFTER the next instruction has been
865      executed */
866   if ((signed_word) GPR[RS] > 0)
867     {
868       DELAY_SLOT (NIA + offset);
869     }
870   else
871     NULLIFY_NEXT_INSTRUCTION ();
872 }
873
874
875
876 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
877 "blez r<RS>, <OFFSET>"
878 *mipsI:
879 *mipsII:
880 *mipsIII:
881 *mipsIV:
882 *mipsV:
883 *mips32:
884 *mips32r2:
885 *mips64:
886 *mips64r2:
887 *vr4100:
888 *vr5000:
889 *r3900:
890 {
891   address_word offset = EXTEND16 (OFFSET) << 2;
892   /* NOTE: The branch occurs AFTER the next instruction has been
893      executed */
894   if ((signed_word) GPR[RS] <= 0)
895     {
896       DELAY_SLOT (NIA + offset);
897     }
898 }
899
900
901
902 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
903 "bgezl r<RS>, <OFFSET>"
904 *mipsII:
905 *mipsIII:
906 *mipsIV:
907 *mipsV:
908 *mips32:
909 *mips32r2:
910 *mips64:
911 *mips64r2:
912 *vr4100:
913 *vr5000:
914 *r3900:
915 {
916   address_word offset = EXTEND16 (OFFSET) << 2;
917   if ((signed_word) GPR[RS] <= 0)
918     {
919       DELAY_SLOT (NIA + offset);
920     }
921   else
922     NULLIFY_NEXT_INSTRUCTION ();
923 }
924
925
926
927 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
928 "bltz r<RS>, <OFFSET>"
929 *mipsI:
930 *mipsII:
931 *mipsIII:
932 *mipsIV:
933 *mipsV:
934 *mips32:
935 *mips32r2:
936 *mips64:
937 *mips64r2:
938 *vr4100:
939 *vr5000:
940 *r3900:
941 {
942   address_word offset = EXTEND16 (OFFSET) << 2;
943   if ((signed_word) GPR[RS] < 0)
944     {
945       DELAY_SLOT (NIA + offset);
946     }
947 }
948
949
950
951 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
952 "bltzal r<RS>, <OFFSET>"
953 *mipsI:
954 *mipsII:
955 *mipsIII:
956 *mipsIV:
957 *mipsV:
958 *mips32:
959 *mips32r2:
960 *mips64:
961 *mips64r2:
962 *vr4100:
963 *vr5000:
964 *r3900:
965 {
966   address_word offset = EXTEND16 (OFFSET) << 2;
967   if (RS == 31)
968     Unpredictable ();
969   RA = (CIA + 8);
970   /* NOTE: The branch occurs AFTER the next instruction has been
971      executed */
972   if ((signed_word) GPR[RS] < 0)
973     {
974       DELAY_SLOT (NIA + offset);
975     }
976 }
977
978
979
980 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
981 "bltzall r<RS>, <OFFSET>"
982 *mipsII:
983 *mipsIII:
984 *mipsIV:
985 *mipsV:
986 *mips32:
987 *mips32r2:
988 *mips64:
989 *mips64r2:
990 *vr4100:
991 *vr5000:
992 *r3900:
993 {
994   address_word offset = EXTEND16 (OFFSET) << 2;
995   if (RS == 31)
996     Unpredictable ();
997   RA = (CIA + 8);
998   if ((signed_word) GPR[RS] < 0)
999     {
1000       DELAY_SLOT (NIA + offset);
1001     }
1002   else
1003     NULLIFY_NEXT_INSTRUCTION ();
1004 }
1005
1006
1007
1008 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
1009 "bltzl r<RS>, <OFFSET>"
1010 *mipsII:
1011 *mipsIII:
1012 *mipsIV:
1013 *mipsV:
1014 *mips32:
1015 *mips32r2:
1016 *mips64:
1017 *mips64r2:
1018 *vr4100:
1019 *vr5000:
1020 *r3900:
1021 {
1022   address_word offset = EXTEND16 (OFFSET) << 2;
1023   /* NOTE: The branch occurs AFTER the next instruction has been
1024      executed */
1025   if ((signed_word) GPR[RS] < 0)
1026     {
1027       DELAY_SLOT (NIA + offset);
1028     }
1029   else
1030     NULLIFY_NEXT_INSTRUCTION ();
1031 }
1032
1033
1034
1035 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
1036 "bne r<RS>, r<RT>, <OFFSET>"
1037 *mipsI:
1038 *mipsII:
1039 *mipsIII:
1040 *mipsIV:
1041 *mipsV:
1042 *mips32:
1043 *mips32r2:
1044 *mips64:
1045 *mips64r2:
1046 *vr4100:
1047 *vr5000:
1048 *r3900:
1049 {
1050   address_word offset = EXTEND16 (OFFSET) << 2;
1051   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
1052     {
1053       DELAY_SLOT (NIA + offset);
1054     }
1055 }
1056
1057
1058
1059 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
1060 "bnel r<RS>, r<RT>, <OFFSET>"
1061 *mipsII:
1062 *mipsIII:
1063 *mipsIV:
1064 *mipsV:
1065 *mips32:
1066 *mips32r2:
1067 *mips64:
1068 *mips64r2:
1069 *vr4100:
1070 *vr5000:
1071 *r3900:
1072 {
1073   address_word offset = EXTEND16 (OFFSET) << 2;
1074   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
1075     {
1076       DELAY_SLOT (NIA + offset);
1077     }
1078   else
1079     NULLIFY_NEXT_INSTRUCTION ();
1080 }
1081
1082
1083
1084 000000,20.CODE,001101:SPECIAL:32::BREAK
1085 "break %#lx<CODE>"
1086 *mipsI:
1087 *mipsII:
1088 *mipsIII:
1089 *mipsIV:
1090 *mipsV:
1091 *mips32:
1092 *mips32r2:
1093 *mips64:
1094 *mips64r2:
1095 *vr4100:
1096 *vr5000:
1097 *r3900:
1098 {
1099   /* Check for some break instruction which are reserved for use by the simulator.  */
1100   unsigned int break_code = instruction_0 & HALT_INSTRUCTION_MASK;
1101   if (break_code == (HALT_INSTRUCTION  & HALT_INSTRUCTION_MASK) ||
1102       break_code == (HALT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
1103     {
1104       sim_engine_halt (SD, CPU, NULL, cia,
1105                        sim_exited, (unsigned int)(A0 & 0xFFFFFFFF));
1106     }
1107   else if (break_code == (BREAKPOINT_INSTRUCTION  & HALT_INSTRUCTION_MASK) ||
1108            break_code == (BREAKPOINT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
1109     {
1110       if (STATE & simDELAYSLOT)
1111         PC = cia - 4; /* reference the branch instruction */
1112       else
1113         PC = cia;
1114       SignalException (BreakPoint, instruction_0);
1115     }
1116
1117   else
1118     {
1119       /* If we get this far, we're not an instruction reserved by the sim.  Raise
1120          the exception. */
1121       SignalException (BreakPoint, instruction_0);
1122     }
1123 }
1124
1125
1126
1127 011100,5.RS,5.RT,5.RD,00000,100001:SPECIAL2:32::CLO
1128 "clo r<RD>, r<RS>"
1129 *mips32:
1130 *mips32r2:
1131 *mips64:
1132 *mips64r2:
1133 *vr5500:
1134 {
1135   unsigned32 temp = GPR[RS];
1136   unsigned32 i, mask;
1137   if (RT != RD)
1138     Unpredictable ();
1139   if (NotWordValue (GPR[RS]))
1140     Unpredictable ();
1141   TRACE_ALU_INPUT1 (GPR[RS]);
1142   for (mask = ((unsigned32)1<<31), i = 0; i < 32; ++i)
1143     {
1144       if ((temp & mask) == 0)
1145         break;
1146       mask >>= 1;
1147     }
1148   GPR[RD] = EXTEND32 (i);
1149   TRACE_ALU_RESULT (GPR[RD]);
1150 }
1151
1152
1153
1154 011100,5.RS,5.RT,5.RD,00000,100000:SPECIAL2:32::CLZ
1155 "clz r<RD>, r<RS>"
1156 *mips32:
1157 *mips32r2:
1158 *mips64:
1159 *mips64r2:
1160 *vr5500:
1161 {
1162   unsigned32 temp = GPR[RS];
1163   unsigned32 i, mask;
1164   if (RT != RD)
1165     Unpredictable ();
1166   if (NotWordValue (GPR[RS]))
1167     Unpredictable ();
1168   TRACE_ALU_INPUT1 (GPR[RS]);
1169   for (mask = ((unsigned32)1<<31), i = 0; i < 32; ++i)
1170     {
1171       if ((temp & mask) != 0)
1172         break;
1173       mask >>= 1;
1174     }
1175   GPR[RD] = EXTEND32 (i);
1176   TRACE_ALU_RESULT (GPR[RD]);
1177 }
1178
1179
1180
1181 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
1182 "dadd r<RD>, r<RS>, r<RT>"
1183 *mipsIII:
1184 *mipsIV:
1185 *mipsV:
1186 *mips64:
1187 *mips64r2:
1188 *vr4100:
1189 *vr5000:
1190 {
1191   check_u64 (SD_, instruction_0);
1192   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
1193   {
1194     ALU64_BEGIN (GPR[RS]);
1195     ALU64_ADD (GPR[RT]);
1196     ALU64_END (GPR[RD]);   /* This checks for overflow.  */
1197   }
1198   TRACE_ALU_RESULT (GPR[RD]);
1199 }
1200
1201
1202
1203 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
1204 "daddi r<RT>, r<RS>, <IMMEDIATE>"
1205 *mipsIII:
1206 *mipsIV:
1207 *mipsV:
1208 *mips64:
1209 *mips64r2:
1210 *vr4100:
1211 *vr5000:
1212 {
1213   check_u64 (SD_, instruction_0);
1214   TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
1215   {
1216     ALU64_BEGIN (GPR[RS]);
1217     ALU64_ADD (EXTEND16 (IMMEDIATE));
1218     ALU64_END (GPR[RT]);   /* This checks for overflow.  */
1219   }
1220   TRACE_ALU_RESULT (GPR[RT]);
1221 }
1222
1223
1224
1225 :function:::void:do_daddiu:int rs, int rt, unsigned16 immediate
1226 {
1227   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
1228   GPR[rt] = GPR[rs] + EXTEND16 (immediate);
1229   TRACE_ALU_RESULT (GPR[rt]);
1230 }
1231
1232 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
1233 "daddiu r<RT>, r<RS>, <IMMEDIATE>"
1234 *mipsIII:
1235 *mipsIV:
1236 *mipsV:
1237 *mips64:
1238 *mips64r2:
1239 *vr4100:
1240 *vr5000:
1241 {
1242   check_u64 (SD_, instruction_0);
1243   do_daddiu (SD_, RS, RT, IMMEDIATE);
1244 }
1245
1246
1247
1248 :function:::void:do_daddu:int rs, int rt, int rd
1249 {
1250   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1251   GPR[rd] = GPR[rs] + GPR[rt];
1252   TRACE_ALU_RESULT (GPR[rd]);
1253 }
1254
1255 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
1256 "daddu r<RD>, r<RS>, r<RT>"
1257 *mipsIII:
1258 *mipsIV:
1259 *mipsV:
1260 *mips64:
1261 *mips64r2:
1262 *vr4100:
1263 *vr5000:
1264 {
1265   check_u64 (SD_, instruction_0);
1266   do_daddu (SD_, RS, RT, RD);
1267 }
1268
1269
1270
1271 011100,5.RS,5.RT,5.RD,00000,100101:SPECIAL2:64::DCLO
1272 "dclo r<RD>, r<RS>"
1273 *mips64:
1274 *mips64r2:
1275 *vr5500:
1276 {
1277   unsigned64 temp = GPR[RS];
1278   unsigned32 i;
1279   unsigned64 mask;
1280   check_u64 (SD_, instruction_0);
1281   if (RT != RD)
1282     Unpredictable ();
1283   TRACE_ALU_INPUT1 (GPR[RS]);
1284   for (mask = ((unsigned64)1<<63), i = 0; i < 64; ++i)
1285     {
1286       if ((temp & mask) == 0)
1287         break;
1288       mask >>= 1;
1289     }
1290   GPR[RD] = EXTEND32 (i);
1291   TRACE_ALU_RESULT (GPR[RD]);
1292 }
1293
1294
1295
1296 011100,5.RS,5.RT,5.RD,00000,100100:SPECIAL2:64::DCLZ
1297 "dclz r<RD>, r<RS>"
1298 *mips64:
1299 *mips64r2:
1300 *vr5500:
1301 {
1302   unsigned64 temp = GPR[RS];
1303   unsigned32 i;
1304   unsigned64 mask;
1305   check_u64 (SD_, instruction_0);
1306   if (RT != RD)
1307     Unpredictable ();
1308   TRACE_ALU_INPUT1 (GPR[RS]);
1309   for (mask = ((unsigned64)1<<63), i = 0; i < 64; ++i)
1310     {
1311       if ((temp & mask) != 0)
1312         break;
1313       mask >>= 1;
1314     }
1315   GPR[RD] = EXTEND32 (i);
1316   TRACE_ALU_RESULT (GPR[RD]);
1317 }
1318
1319
1320
1321 :function:::void:do_ddiv:int rs, int rt
1322 {
1323   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1324   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1325   {
1326     signed64 n = GPR[rs];
1327     signed64 d = GPR[rt];
1328     signed64 hi;
1329     signed64 lo;
1330     if (d == 0)
1331       {
1332         lo = SIGNED64 (0x8000000000000000);
1333         hi = 0;
1334       }
1335     else if (d == -1 && n == SIGNED64 (0x8000000000000000))
1336       {
1337         lo = SIGNED64 (0x8000000000000000);
1338         hi = 0;
1339       }
1340     else
1341       {
1342         lo = (n / d);
1343         hi = (n % d);
1344       }
1345     HI = hi;
1346     LO = lo;
1347   }
1348   TRACE_ALU_RESULT2 (HI, LO);
1349 }
1350
1351 000000,5.RS,5.RT,0000000000,011110:SPECIAL:64::DDIV
1352 "ddiv r<RS>, r<RT>"
1353 *mipsIII:
1354 *mipsIV:
1355 *mipsV:
1356 *mips64:
1357 *mips64r2:
1358 *vr4100:
1359 *vr5000:
1360 {
1361   check_u64 (SD_, instruction_0);
1362   do_ddiv (SD_, RS, RT);
1363 }
1364
1365
1366
1367 :function:::void:do_ddivu:int rs, int rt
1368 {
1369   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1370   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1371   {
1372     unsigned64 n = GPR[rs];
1373     unsigned64 d = GPR[rt];
1374     unsigned64 hi;
1375     unsigned64 lo;
1376     if (d == 0)
1377       {
1378         lo = SIGNED64 (0x8000000000000000);
1379         hi = 0;
1380       }
1381     else
1382       {
1383         lo = (n / d);
1384         hi = (n % d);
1385       }
1386     HI = hi;
1387     LO = lo;
1388   }
1389   TRACE_ALU_RESULT2 (HI, LO);
1390 }
1391
1392 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
1393 "ddivu r<RS>, r<RT>"
1394 *mipsIII:
1395 *mipsIV:
1396 *mipsV:
1397 *mips64:
1398 *mips64r2:
1399 *vr4100:
1400 *vr5000:
1401 {
1402   check_u64 (SD_, instruction_0);
1403   do_ddivu (SD_, RS, RT);
1404 }
1405
1406 :function:::void:do_div:int rs, int rt
1407 {
1408   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1409   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1410   {
1411     signed32 n = GPR[rs];
1412     signed32 d = GPR[rt];
1413     if (d == 0)
1414       {
1415         LO = EXTEND32 (0x80000000);
1416         HI = EXTEND32 (0);
1417       }
1418     else if (n == SIGNED32 (0x80000000) && d == -1)
1419       {
1420         LO = EXTEND32 (0x80000000);
1421         HI = EXTEND32 (0);
1422       }
1423     else
1424       {
1425         LO = EXTEND32 (n / d);
1426         HI = EXTEND32 (n % d);
1427       }
1428   }
1429   TRACE_ALU_RESULT2 (HI, LO);
1430 }
1431
1432 000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV
1433 "div r<RS>, r<RT>"
1434 *mipsI:
1435 *mipsII:
1436 *mipsIII:
1437 *mipsIV:
1438 *mipsV:
1439 *mips32:
1440 *mips32r2:
1441 *mips64:
1442 *mips64r2:
1443 *vr4100:
1444 *vr5000:
1445 *r3900:
1446 {
1447   do_div (SD_, RS, RT);
1448 }
1449
1450
1451
1452 :function:::void:do_divu:int rs, int rt
1453 {
1454   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1455   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1456   {
1457     unsigned32 n = GPR[rs];
1458     unsigned32 d = GPR[rt];
1459     if (d == 0)
1460       {
1461         LO = EXTEND32 (0x80000000);
1462         HI = EXTEND32 (0);
1463       }
1464     else
1465       {
1466         LO = EXTEND32 (n / d);
1467         HI = EXTEND32 (n % d);
1468       }
1469   }
1470   TRACE_ALU_RESULT2 (HI, LO);
1471 }
1472
1473 000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU
1474 "divu r<RS>, r<RT>"
1475 *mipsI:
1476 *mipsII:
1477 *mipsIII:
1478 *mipsIV:
1479 *mipsV:
1480 *mips32:
1481 *mips32r2:
1482 *mips64:
1483 *mips64r2:
1484 *vr4100:
1485 *vr5000:
1486 *r3900:
1487 {
1488   do_divu (SD_, RS, RT);
1489 }
1490
1491
1492 :function:::void:do_dmultx:int rs, int rt, int rd, int signed_p
1493 {
1494   unsigned64 lo;
1495   unsigned64 hi;
1496   unsigned64 m00;
1497   unsigned64 m01;
1498   unsigned64 m10;
1499   unsigned64 m11;
1500   unsigned64 mid;
1501   int sign;
1502   unsigned64 op1 = GPR[rs];
1503   unsigned64 op2 = GPR[rt];
1504   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1505   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1506   /* make signed multiply unsigned */
1507   sign = 0;
1508   if (signed_p)
1509     {
1510       if ((signed64) op1 < 0)
1511         {
1512           op1 = - op1;
1513           ++sign;
1514         }
1515       if ((signed64) op2 < 0)
1516         {
1517           op2 = - op2;
1518           ++sign;
1519         }
1520     }
1521   /* multiply out the 4 sub products */
1522   m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2));
1523   m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2));
1524   m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2));
1525   m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2));
1526   /* add the products */
1527   mid = ((unsigned64) VH4_8 (m00)
1528          + (unsigned64) VL4_8 (m10)
1529          + (unsigned64) VL4_8 (m01));
1530   lo = U8_4 (mid, m00);
1531   hi = (m11
1532         + (unsigned64) VH4_8 (mid)
1533         + (unsigned64) VH4_8 (m01)
1534         + (unsigned64) VH4_8 (m10));
1535   /* fix the sign */
1536   if (sign & 1)
1537     {
1538       lo = -lo;
1539       if (lo == 0)
1540         hi = -hi;
1541       else
1542         hi = -hi - 1;
1543     }
1544   /* save the result HI/LO (and a gpr) */
1545   LO = lo;
1546   HI = hi;
1547   if (rd != 0)
1548     GPR[rd] = lo;
1549   TRACE_ALU_RESULT2 (HI, LO);
1550 }
1551
1552 :function:::void:do_dmult:int rs, int rt, int rd
1553 {
1554   do_dmultx (SD_, rs, rt, rd, 1);
1555 }
1556
1557 000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT
1558 "dmult r<RS>, r<RT>"
1559 *mipsIII:
1560 *mipsIV:
1561 *mipsV:
1562 *mips64:
1563 *mips64r2:
1564 *vr4100:
1565 {
1566   check_u64 (SD_, instruction_0);
1567   do_dmult (SD_, RS, RT, 0);
1568 }
1569
1570 000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT
1571 "dmult r<RS>, r<RT>":RD == 0
1572 "dmult r<RD>, r<RS>, r<RT>"
1573 *vr5000:
1574 {
1575   check_u64 (SD_, instruction_0);
1576   do_dmult (SD_, RS, RT, RD);
1577 }
1578
1579
1580
1581 :function:::void:do_dmultu:int rs, int rt, int rd
1582 {
1583   do_dmultx (SD_, rs, rt, rd, 0);
1584 }
1585
1586 000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU
1587 "dmultu r<RS>, r<RT>"
1588 *mipsIII:
1589 *mipsIV:
1590 *mipsV:
1591 *mips64:
1592 *mips64r2:
1593 *vr4100:
1594 {
1595   check_u64 (SD_, instruction_0);
1596   do_dmultu (SD_, RS, RT, 0);
1597 }
1598
1599 000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU
1600 "dmultu r<RD>, r<RS>, r<RT>":RD == 0
1601 "dmultu r<RS>, r<RT>"
1602 *vr5000:
1603 {
1604   check_u64 (SD_, instruction_0);
1605   do_dmultu (SD_, RS, RT, RD);
1606 }
1607
1608
1609 :function:::unsigned64:do_dror:unsigned64 x,unsigned64 y
1610 {
1611   unsigned64 result;
1612
1613   y &= 63;
1614   TRACE_ALU_INPUT2 (x, y);
1615   result = ROTR64 (x, y);
1616   TRACE_ALU_RESULT (result);
1617   return result;
1618 }
1619
1620 000000,00001,5.RT,5.RD,5.SHIFT,111010::64::DROR
1621 "dror r<RD>, r<RT>, <SHIFT>"
1622 *mips64r2:
1623 *vr5400:
1624 *vr5500:
1625 {
1626   check_u64 (SD_, instruction_0);
1627   GPR[RD] = do_dror (SD_, GPR[RT], SHIFT);
1628 }
1629
1630 000000,00001,5.RT,5.RD,5.SHIFT,111110::64::DROR32
1631 "dror32 r<RD>, r<RT>, <SHIFT>"
1632 *mips64r2:
1633 *vr5400:
1634 *vr5500:
1635 {
1636   check_u64 (SD_, instruction_0);
1637   GPR[RD] = do_dror (SD_, GPR[RT], SHIFT + 32);
1638 }
1639
1640 000000,5.RS,5.RT,5.RD,00001,010110::64::DRORV
1641 "drorv r<RD>, r<RT>, r<RS>"
1642 *mips64r2:
1643 *vr5400:
1644 *vr5500:
1645 {
1646   check_u64 (SD_, instruction_0);
1647   GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]);
1648 }
1649
1650
1651 :function:::void:do_dsll:int rt, int rd, int shift
1652 {
1653   TRACE_ALU_INPUT2 (GPR[rt], shift);
1654   GPR[rd] = GPR[rt] << shift;
1655   TRACE_ALU_RESULT (GPR[rd]);
1656 }
1657
1658 000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
1659 "dsll r<RD>, r<RT>, <SHIFT>"
1660 *mipsIII:
1661 *mipsIV:
1662 *mipsV:
1663 *mips64:
1664 *mips64r2:
1665 *vr4100:
1666 *vr5000:
1667 {
1668   check_u64 (SD_, instruction_0);
1669   do_dsll (SD_, RT, RD, SHIFT);
1670 }
1671
1672
1673 000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
1674 "dsll32 r<RD>, r<RT>, <SHIFT>"
1675 *mipsIII:
1676 *mipsIV:
1677 *mipsV:
1678 *mips64:
1679 *mips64r2:
1680 *vr4100:
1681 *vr5000:
1682 {
1683   int s = 32 + SHIFT;
1684   check_u64 (SD_, instruction_0);
1685   TRACE_ALU_INPUT2 (GPR[RT], s);
1686   GPR[RD] = GPR[RT] << s;
1687   TRACE_ALU_RESULT (GPR[RD]);
1688 }
1689
1690 :function:::void:do_dsllv:int rs, int rt, int rd
1691 {
1692   int s = MASKED64 (GPR[rs], 5, 0);
1693   TRACE_ALU_INPUT2 (GPR[rt], s);
1694   GPR[rd] = GPR[rt] << s;
1695   TRACE_ALU_RESULT (GPR[rd]);
1696 }
1697
1698 000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV
1699 "dsllv r<RD>, r<RT>, r<RS>"
1700 *mipsIII:
1701 *mipsIV:
1702 *mipsV:
1703 *mips64:
1704 *mips64r2:
1705 *vr4100:
1706 *vr5000:
1707 {
1708   check_u64 (SD_, instruction_0);
1709   do_dsllv (SD_, RS, RT, RD);
1710 }
1711
1712 :function:::void:do_dsra:int rt, int rd, int shift
1713 {
1714   TRACE_ALU_INPUT2 (GPR[rt], shift);
1715   GPR[rd] = ((signed64) GPR[rt]) >> shift;
1716   TRACE_ALU_RESULT (GPR[rd]);
1717 }
1718
1719
1720 000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
1721 "dsra r<RD>, r<RT>, <SHIFT>"
1722 *mipsIII:
1723 *mipsIV:
1724 *mipsV:
1725 *mips64:
1726 *mips64r2:
1727 *vr4100:
1728 *vr5000:
1729 {
1730   check_u64 (SD_, instruction_0);
1731   do_dsra (SD_, RT, RD, SHIFT);
1732 }
1733
1734
1735 000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
1736 "dsra32 r<RD>, r<RT>, <SHIFT>"
1737 *mipsIII:
1738 *mipsIV:
1739 *mipsV:
1740 *mips64:
1741 *mips64r2:
1742 *vr4100:
1743 *vr5000:
1744 {
1745   int s = 32 + SHIFT;
1746   check_u64 (SD_, instruction_0);
1747   TRACE_ALU_INPUT2 (GPR[RT], s);
1748   GPR[RD] = ((signed64) GPR[RT]) >> s;
1749   TRACE_ALU_RESULT (GPR[RD]);
1750 }
1751
1752
1753 :function:::void:do_dsrav:int rs, int rt, int rd
1754 {
1755   int s = MASKED64 (GPR[rs], 5, 0);
1756   TRACE_ALU_INPUT2 (GPR[rt], s);
1757   GPR[rd] = ((signed64) GPR[rt]) >> s;
1758   TRACE_ALU_RESULT (GPR[rd]);
1759 }
1760
1761 000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV
1762 "dsrav r<RD>, r<RT>, r<RS>"
1763 *mipsIII:
1764 *mipsIV:
1765 *mipsV:
1766 *mips64:
1767 *mips64r2:
1768 *vr4100:
1769 *vr5000:
1770 {
1771   check_u64 (SD_, instruction_0);
1772   do_dsrav (SD_, RS, RT, RD);
1773 }
1774
1775 :function:::void:do_dsrl:int rt, int rd, int shift
1776 {
1777   TRACE_ALU_INPUT2 (GPR[rt], shift);
1778   GPR[rd] = (unsigned64) GPR[rt] >> shift;
1779   TRACE_ALU_RESULT (GPR[rd]);
1780 }
1781
1782
1783 000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
1784 "dsrl r<RD>, r<RT>, <SHIFT>"
1785 *mipsIII:
1786 *mipsIV:
1787 *mipsV:
1788 *mips64:
1789 *mips64r2:
1790 *vr4100:
1791 *vr5000:
1792 {
1793   check_u64 (SD_, instruction_0);
1794   do_dsrl (SD_, RT, RD, SHIFT);
1795 }
1796
1797
1798 000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
1799 "dsrl32 r<RD>, r<RT>, <SHIFT>"
1800 *mipsIII:
1801 *mipsIV:
1802 *mipsV:
1803 *mips64:
1804 *mips64r2:
1805 *vr4100:
1806 *vr5000:
1807 {
1808   int s = 32 + SHIFT;
1809   check_u64 (SD_, instruction_0);
1810   TRACE_ALU_INPUT2 (GPR[RT], s);
1811   GPR[RD] = (unsigned64) GPR[RT] >> s;
1812   TRACE_ALU_RESULT (GPR[RD]);
1813 }
1814
1815
1816 :function:::void:do_dsrlv:int rs, int rt, int rd
1817 {
1818   int s = MASKED64 (GPR[rs], 5, 0);
1819   TRACE_ALU_INPUT2 (GPR[rt], s);
1820   GPR[rd] = (unsigned64) GPR[rt] >> s;
1821   TRACE_ALU_RESULT (GPR[rd]);
1822 }
1823
1824
1825
1826 000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV
1827 "dsrlv r<RD>, r<RT>, r<RS>"
1828 *mipsIII:
1829 *mipsIV:
1830 *mipsV:
1831 *mips64:
1832 *mips64r2:
1833 *vr4100:
1834 *vr5000:
1835 {
1836   check_u64 (SD_, instruction_0);
1837   do_dsrlv (SD_, RS, RT, RD);
1838 }
1839
1840
1841 000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB
1842 "dsub r<RD>, r<RS>, r<RT>"
1843 *mipsIII:
1844 *mipsIV:
1845 *mipsV:
1846 *mips64:
1847 *mips64r2:
1848 *vr4100:
1849 *vr5000:
1850 {
1851   check_u64 (SD_, instruction_0);
1852   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
1853   {
1854     ALU64_BEGIN (GPR[RS]);
1855     ALU64_SUB (GPR[RT]);
1856     ALU64_END (GPR[RD]);   /* This checks for overflow.  */
1857   }
1858   TRACE_ALU_RESULT (GPR[RD]);
1859 }
1860
1861
1862 :function:::void:do_dsubu:int rs, int rt, int rd
1863 {
1864   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1865   GPR[rd] = GPR[rs] - GPR[rt];
1866   TRACE_ALU_RESULT (GPR[rd]);
1867 }
1868
1869 000000,5.RS,5.RT,5.RD,00000,101111:SPECIAL:64::DSUBU
1870 "dsubu r<RD>, r<RS>, r<RT>"
1871 *mipsIII:
1872 *mipsIV:
1873 *mipsV:
1874 *mips64:
1875 *mips64r2:
1876 *vr4100:
1877 *vr5000:
1878 {
1879   check_u64 (SD_, instruction_0);
1880   do_dsubu (SD_, RS, RT, RD);
1881 }
1882
1883
1884 000010,26.INSTR_INDEX:NORMAL:32::J
1885 "j <INSTR_INDEX>"
1886 *mipsI:
1887 *mipsII:
1888 *mipsIII:
1889 *mipsIV:
1890 *mipsV:
1891 *mips32:
1892 *mips32r2:
1893 *mips64:
1894 *mips64r2:
1895 *vr4100:
1896 *vr5000:
1897 *r3900:
1898 {
1899   /* NOTE: The region used is that of the delay slot NIA and NOT the
1900      current instruction */
1901   address_word region = (NIA & MASK (63, 28));
1902   DELAY_SLOT (region | (INSTR_INDEX << 2));
1903 }
1904
1905
1906 000011,26.INSTR_INDEX:NORMAL:32::JAL
1907 "jal <INSTR_INDEX>"
1908 *mipsI:
1909 *mipsII:
1910 *mipsIII:
1911 *mipsIV:
1912 *mipsV:
1913 *mips32:
1914 *mips32r2:
1915 *mips64:
1916 *mips64r2:
1917 *vr4100:
1918 *vr5000:
1919 *r3900:
1920 {
1921   /* NOTE: The region used is that of the delay slot and NOT the
1922      current instruction */
1923   address_word region = (NIA & MASK (63, 28));
1924   GPR[31] = CIA + 8;
1925   DELAY_SLOT (region | (INSTR_INDEX << 2));
1926 }
1927
1928 000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR
1929 "jalr r<RS>":RD == 31
1930 "jalr r<RD>, r<RS>"
1931 *mipsI:
1932 *mipsII:
1933 *mipsIII:
1934 *mipsIV:
1935 *mipsV:
1936 *mips32:
1937 *mips32r2:
1938 *mips64:
1939 *mips64r2:
1940 *vr4100:
1941 *vr5000:
1942 *r3900:
1943 {
1944   address_word temp = GPR[RS];
1945   GPR[RD] = CIA + 8;
1946   DELAY_SLOT (temp);
1947 }
1948
1949 000000,5.RS,00000,5.RD,10000,001001:SPECIAL:32::JALR_HB
1950 "jalr.hb r<RS>":RD == 31
1951 "jalr.hb r<RD>, r<RS>"
1952 *mips32r2:
1953 *mips64r2:
1954 {
1955   address_word temp = GPR[RS];
1956   GPR[RD] = CIA + 8;
1957   DELAY_SLOT (temp);
1958 }
1959
1960 000000,5.RS,0000000000,00000,001000:SPECIAL:32::JR
1961 "jr r<RS>"
1962 *mipsI:
1963 *mipsII:
1964 *mipsIII:
1965 *mipsIV:
1966 *mipsV:
1967 *mips32:
1968 *mips32r2:
1969 *mips64:
1970 *mips64r2:
1971 *vr4100:
1972 *vr5000:
1973 *r3900:
1974 {
1975   DELAY_SLOT (GPR[RS]);
1976 }
1977
1978 000000,5.RS,0000000000,10000,001000:SPECIAL:32::JR_HB
1979 "jr.hb r<RS>"
1980 *mips32r2:
1981 *mips64r2:
1982 {
1983   DELAY_SLOT (GPR[RS]);
1984 }
1985
1986 :function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset
1987 {
1988   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1989   address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
1990   address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
1991   unsigned int byte;
1992   address_word paddr;
1993   int uncached;
1994   unsigned64 memval;
1995   address_word vaddr;
1996
1997   vaddr = loadstore_ea (SD_, base, offset);
1998   if ((vaddr & access) != 0)
1999     {
2000       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);
2001     }
2002   AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2003   paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
2004   LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isDATA, isREAL);
2005   byte = ((vaddr & mask) ^ bigendiancpu);
2006   return (memval >> (8 * byte));
2007 }
2008
2009 :function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt
2010 {
2011   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2012   address_word reverseendian = (ReverseEndian ? -1 : 0);
2013   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
2014   unsigned int byte;
2015   unsigned int word;
2016   address_word paddr;
2017   int uncached;
2018   unsigned64 memval;
2019   address_word vaddr;
2020   int nr_lhs_bits;
2021   int nr_rhs_bits;
2022   unsigned_word lhs_mask;
2023   unsigned_word temp;
2024
2025   vaddr = loadstore_ea (SD_, base, offset);
2026   AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2027   paddr = (paddr ^ (reverseendian & mask));
2028   if (BigEndianMem == 0)
2029     paddr = paddr & ~access;
2030
2031   /* compute where within the word/mem we are */
2032   byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
2033   word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
2034   nr_lhs_bits = 8 * byte + 8;
2035   nr_rhs_bits = 8 * access - 8 * byte;
2036   /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
2037
2038   /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
2039            (long) ((unsigned64) vaddr >> 32), (long) vaddr,
2040            (long) ((unsigned64) paddr >> 32), (long) paddr,
2041            word, byte, nr_lhs_bits, nr_rhs_bits); */
2042
2043   LoadMemory (&memval, NULL, uncached, byte, paddr, vaddr, isDATA, isREAL);
2044   if (word == 0)
2045     {
2046       /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */
2047       temp = (memval << nr_rhs_bits);
2048     }
2049   else
2050     {
2051       /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */
2052       temp = (memval >> nr_lhs_bits);
2053     }
2054   lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits);
2055   rt = (rt & ~lhs_mask) | (temp & lhs_mask);
2056
2057   /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n",
2058            (long) ((unsigned64) memval >> 32), (long) memval,
2059            (long) ((unsigned64) temp >> 32), (long) temp,
2060            (long) ((unsigned64) lhs_mask >> 32), (long) lhs_mask,
2061            (long) (rt >> 32), (long) rt); */
2062   return rt;
2063 }
2064
2065 :function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt
2066 {
2067   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2068   address_word reverseendian = (ReverseEndian ? -1 : 0);
2069   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
2070   unsigned int byte;
2071   address_word paddr;
2072   int uncached;
2073   unsigned64 memval;
2074   address_word vaddr;
2075
2076   vaddr = loadstore_ea (SD_, base, offset);
2077   AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2078   /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */
2079   paddr = (paddr ^ (reverseendian & mask));
2080   if (BigEndianMem != 0)
2081     paddr = paddr & ~access;
2082   byte = ((vaddr & mask) ^ (bigendiancpu & mask));
2083   /* NOTE: SPEC is wrong, had `byte' not `access - byte'.  See SW. */
2084   LoadMemory (&memval, NULL, uncached, access - (access & byte), paddr, vaddr, isDATA, isREAL);
2085   /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n",
2086      (long) paddr, byte, (long) paddr, (long) memval); */
2087   {
2088     unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0);
2089     rt &= ~screen;
2090     rt |= (memval >> (8 * byte)) & screen;
2091   }
2092   return rt;
2093 }
2094
2095
2096 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
2097 "lb r<RT>, <OFFSET>(r<BASE>)"
2098 *mipsI:
2099 *mipsII:
2100 *mipsIII:
2101 *mipsIV:
2102 *mipsV:
2103 *mips32:
2104 *mips32r2:
2105 *mips64:
2106 *mips64r2:
2107 *vr4100:
2108 *vr5000:
2109 *r3900:
2110 {
2111   GPR[RT] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET)));
2112 }
2113
2114
2115 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
2116 "lbu r<RT>, <OFFSET>(r<BASE>)"
2117 *mipsI:
2118 *mipsII:
2119 *mipsIII:
2120 *mipsIV:
2121 *mipsV:
2122 *mips32:
2123 *mips32r2:
2124 *mips64:
2125 *mips64r2:
2126 *vr4100:
2127 *vr5000:
2128 *r3900:
2129 {
2130   GPR[RT] = do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET));
2131 }
2132
2133
2134 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
2135 "ld r<RT>, <OFFSET>(r<BASE>)"
2136 *mipsIII:
2137 *mipsIV:
2138 *mipsV:
2139 *mips64:
2140 *mips64r2:
2141 *vr4100:
2142 *vr5000:
2143 {
2144   check_u64 (SD_, instruction_0);
2145   GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
2146 }
2147
2148
2149 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
2150 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2151 *mipsII:
2152 *mipsIII:
2153 *mipsIV:
2154 *mipsV:
2155 *mips32:
2156 *mips32r2:
2157 *mips64:
2158 *mips64r2:
2159 *vr4100:
2160 *vr5000:
2161 *r3900:
2162 {
2163   COP_LD (ZZ, RT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
2164 }
2165
2166
2167
2168
2169 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
2170 "ldl r<RT>, <OFFSET>(r<BASE>)"
2171 *mipsIII:
2172 *mipsIV:
2173 *mipsV:
2174 *mips64:
2175 *mips64r2:
2176 *vr4100:
2177 *vr5000:
2178 {
2179   check_u64 (SD_, instruction_0);
2180   GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2181 }
2182
2183
2184 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
2185 "ldr r<RT>, <OFFSET>(r<BASE>)"
2186 *mipsIII:
2187 *mipsIV:
2188 *mipsV:
2189 *mips64:
2190 *mips64r2:
2191 *vr4100:
2192 *vr5000:
2193 {
2194   check_u64 (SD_, instruction_0);
2195   GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2196 }
2197
2198
2199 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
2200 "lh r<RT>, <OFFSET>(r<BASE>)"
2201 *mipsI:
2202 *mipsII:
2203 *mipsIII:
2204 *mipsIV:
2205 *mipsV:
2206 *mips32:
2207 *mips32r2:
2208 *mips64:
2209 *mips64r2:
2210 *vr4100:
2211 *vr5000:
2212 *r3900:
2213 {
2214   GPR[RT] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET)));
2215 }
2216
2217
2218 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
2219 "lhu r<RT>, <OFFSET>(r<BASE>)"
2220 *mipsI:
2221 *mipsII:
2222 *mipsIII:
2223 *mipsIV:
2224 *mipsV:
2225 *mips32:
2226 *mips32r2:
2227 *mips64:
2228 *mips64r2:
2229 *vr4100:
2230 *vr5000:
2231 *r3900:
2232 {
2233   GPR[RT] = do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET));
2234 }
2235
2236
2237 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
2238 "ll r<RT>, <OFFSET>(r<BASE>)"
2239 *mipsII:
2240 *mipsIII:
2241 *mipsIV:
2242 *mipsV:
2243 *mips32:
2244 *mips32r2:
2245 *mips64:
2246 *mips64r2:
2247 *vr4100:
2248 *vr5000:
2249 {
2250   address_word base = GPR[BASE];
2251   address_word offset = EXTEND16 (OFFSET);
2252   {
2253     address_word vaddr = loadstore_ea (SD_, base, offset);
2254     address_word paddr;
2255     int uncached;
2256     if ((vaddr & 3) != 0)
2257       {
2258         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer, sim_core_unaligned_signal);
2259       }
2260     else
2261       {
2262         if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2263           {
2264             unsigned64 memval = 0;
2265             unsigned64 memval1 = 0;
2266             unsigned64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2267             unsigned int shift = 2;
2268             unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2269             unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2270             unsigned int byte;
2271             paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2272             LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2273             byte = ((vaddr & mask) ^ (bigend << shift));
2274             GPR[RT] = EXTEND32 (memval >> (8 * byte));
2275             LLBIT = 1;
2276           }
2277       }
2278   }
2279 }
2280
2281
2282 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
2283 "lld r<RT>, <OFFSET>(r<BASE>)"
2284 *mipsIII:
2285 *mipsIV:
2286 *mipsV:
2287 *mips64:
2288 *mips64r2:
2289 *vr4100:
2290 *vr5000:
2291 {
2292   address_word base = GPR[BASE];
2293   address_word offset = EXTEND16 (OFFSET);
2294   check_u64 (SD_, instruction_0);
2295   {
2296     address_word vaddr = loadstore_ea (SD_, base, offset);
2297     address_word paddr;
2298     int uncached;
2299     if ((vaddr & 7) != 0)
2300       {
2301         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer, sim_core_unaligned_signal);
2302       }
2303     else
2304       {
2305         if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2306           {
2307             unsigned64 memval = 0;
2308             unsigned64 memval1 = 0;
2309             LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
2310             GPR[RT] = memval;
2311             LLBIT = 1;
2312           }
2313       }
2314   }
2315 }
2316
2317
2318 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
2319 "lui r<RT>, %#lx<IMMEDIATE>"
2320 *mipsI:
2321 *mipsII:
2322 *mipsIII:
2323 *mipsIV:
2324 *mipsV:
2325 *mips32:
2326 *mips32r2:
2327 *mips64:
2328 *mips64r2:
2329 *vr4100:
2330 *vr5000:
2331 *r3900:
2332 {
2333   TRACE_ALU_INPUT1 (IMMEDIATE);
2334   GPR[RT] = EXTEND32 (IMMEDIATE << 16);
2335   TRACE_ALU_RESULT (GPR[RT]);
2336 }
2337
2338
2339 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
2340 "lw r<RT>, <OFFSET>(r<BASE>)"
2341 *mipsI:
2342 *mipsII:
2343 *mipsIII:
2344 *mipsIV:
2345 *mipsV:
2346 *mips32:
2347 *mips32r2:
2348 *mips64:
2349 *mips64r2:
2350 *vr4100:
2351 *vr5000:
2352 *r3900:
2353 {
2354   GPR[RT] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
2355 }
2356
2357
2358 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
2359 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2360 *mipsI:
2361 *mipsII:
2362 *mipsIII:
2363 *mipsIV:
2364 *mipsV:
2365 *mips32:
2366 *mips32r2:
2367 *mips64:
2368 *mips64r2:
2369 *vr4100:
2370 *vr5000:
2371 *r3900:
2372 {
2373   COP_LW (ZZ, RT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
2374 }
2375
2376
2377 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
2378 "lwl r<RT>, <OFFSET>(r<BASE>)"
2379 *mipsI:
2380 *mipsII:
2381 *mipsIII:
2382 *mipsIV:
2383 *mipsV:
2384 *mips32:
2385 *mips32r2:
2386 *mips64:
2387 *mips64r2:
2388 *vr4100:
2389 *vr5000:
2390 *r3900:
2391 {
2392   GPR[RT] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));
2393 }
2394
2395
2396 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
2397 "lwr r<RT>, <OFFSET>(r<BASE>)"
2398 *mipsI:
2399 *mipsII:
2400 *mipsIII:
2401 *mipsIV:
2402 *mipsV:
2403 *mips32:
2404 *mips32r2:
2405 *mips64:
2406 *mips64r2:
2407 *vr4100:
2408 *vr5000:
2409 *r3900:
2410 {
2411   GPR[RT] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));
2412 }
2413
2414
2415 100111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LWU
2416 "lwu r<RT>, <OFFSET>(r<BASE>)"
2417 *mipsIII:
2418 *mipsIV:
2419 *mipsV:
2420 *mips64:
2421 *mips64r2:
2422 *vr4100:
2423 *vr5000:
2424 {
2425   check_u64 (SD_, instruction_0);
2426   GPR[RT] = do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET));
2427 }
2428
2429
2430
2431 011100,5.RS,5.RT,00000,00000,000000:SPECIAL2:32::MADD
2432 "madd r<RS>, r<RT>"
2433 *mips32:
2434 *mips64:
2435 *vr5500:
2436 {
2437   signed64 temp;
2438   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2439   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2440     Unpredictable ();
2441   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2442   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2443           + ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2444   LO = EXTEND32 (temp);
2445   HI = EXTEND32 (VH4_8 (temp));
2446   TRACE_ALU_RESULT2 (HI, LO);
2447 }
2448
2449
2450 011100,5.RS,5.RT,000,2.AC,00000,000000:SPECIAL2:32::MADD
2451 "madd r<RS>, r<RT>":AC == 0
2452 "madd ac<AC>, r<RS>, r<RT>"
2453 *mips32r2:
2454 *mips64r2:
2455 *dsp2:
2456 {
2457   signed64 temp;
2458   if (AC == 0)
2459     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2460   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2461     Unpredictable ();
2462   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2463   temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2464           + ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2465   DSPLO(AC) = EXTEND32 (temp);
2466   DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2467   if (AC == 0)
2468     TRACE_ALU_RESULT2 (HI, LO);
2469 }
2470
2471
2472 011100,5.RS,5.RT,00000,00000,000001:SPECIAL2:32::MADDU
2473 "maddu r<RS>, r<RT>"
2474 *mips32:
2475 *mips64:
2476 *vr5500:
2477 {
2478   unsigned64 temp;
2479   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2480   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2481     Unpredictable ();
2482   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2483   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2484           + ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2485   ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp;  /* SmartMIPS */ 
2486   LO = EXTEND32 (temp);
2487   HI = EXTEND32 (VH4_8 (temp));
2488   TRACE_ALU_RESULT2 (HI, LO);
2489 }
2490
2491
2492 011100,5.RS,5.RT,000,2.AC,00000,000001:SPECIAL2:32::MADDU
2493 "maddu r<RS>, r<RT>":AC == 0
2494 "maddu ac<AC>, r<RS>, r<RT>"
2495 *mips32r2:
2496 *mips64r2:
2497 *dsp2:
2498 {
2499   unsigned64 temp;
2500   if (AC == 0)
2501     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2502   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2503     Unpredictable ();
2504   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2505   temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2506           + ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2507   if (AC == 0)
2508     ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp;  /* SmartMIPS */
2509   DSPLO(AC) = EXTEND32 (temp);
2510   DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2511   if (AC == 0)
2512     TRACE_ALU_RESULT2 (HI, LO);
2513 }
2514
2515
2516 :function:::void:do_mfhi:int rd
2517 {
2518   check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
2519   TRACE_ALU_INPUT1 (HI);
2520   GPR[rd] = HI;
2521   TRACE_ALU_RESULT (GPR[rd]);
2522 }
2523
2524 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
2525 "mfhi r<RD>"
2526 *mipsI:
2527 *mipsII:
2528 *mipsIII:
2529 *mipsIV:
2530 *mipsV:
2531 *vr4100:
2532 *vr5000:
2533 *r3900:
2534 *mips32:
2535 *mips64:
2536 {
2537   do_mfhi (SD_, RD);
2538 }
2539
2540
2541 000000,000,2.AC,00000,5.RD,00000,010000:SPECIAL:32::MFHI
2542 "mfhi r<RD>":AC == 0
2543 "mfhi r<RD>, ac<AC>"
2544 *mips32r2:
2545 *mips64r2:
2546 *dsp:
2547 {
2548   if (AC == 0)
2549     do_mfhi (SD_, RD);
2550   else
2551     GPR[RD] = DSPHI(AC);
2552 }
2553
2554
2555 :function:::void:do_mflo:int rd
2556 {
2557   check_mf_hilo (SD_, LOHISTORY, HIHISTORY);
2558   TRACE_ALU_INPUT1 (LO);
2559   GPR[rd] = LO;
2560   TRACE_ALU_RESULT (GPR[rd]);
2561 }
2562
2563 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2564 "mflo r<RD>"
2565 *mipsI:
2566 *mipsII:
2567 *mipsIII:
2568 *mipsIV:
2569 *mipsV:
2570 *vr4100:
2571 *vr5000:
2572 *r3900:
2573 *mips32:
2574 *mips64:
2575 {
2576   do_mflo (SD_, RD);
2577 }
2578
2579
2580 000000,000,2.AC,00000,5.RD,00000,010010:SPECIAL:32::MFLO
2581 "mflo r<RD>":AC == 0
2582 "mflo r<RD>, ac<AC>"
2583 *mips32r2:
2584 *mips64r2:
2585 *dsp:
2586 {
2587   if (AC == 0)
2588     do_mflo (SD_, RD);
2589   else
2590     GPR[RD] = DSPLO(AC);
2591 }
2592
2593
2594 000000,5.RS,5.RT,5.RD,00000,001011:SPECIAL:32::MOVN
2595 "movn r<RD>, r<RS>, r<RT>"
2596 *mipsIV:
2597 *mipsV:
2598 *mips32:
2599 *mips32r2:
2600 *mips64:
2601 *mips64r2:
2602 *vr5000:
2603 {
2604   if (GPR[RT] != 0)
2605     {
2606       GPR[RD] = GPR[RS];
2607       TRACE_ALU_RESULT (GPR[RD]);
2608     }
2609 }
2610
2611
2612
2613 000000,5.RS,5.RT,5.RD,00000,001010:SPECIAL:32::MOVZ
2614 "movz r<RD>, r<RS>, r<RT>"
2615 *mipsIV:
2616 *mipsV:
2617 *mips32:
2618 *mips32r2:
2619 *mips64:
2620 *mips64r2:
2621 *vr5000:
2622 {
2623   if (GPR[RT] == 0)
2624     {
2625       GPR[RD] = GPR[RS];
2626       TRACE_ALU_RESULT (GPR[RD]);
2627     }
2628 }
2629
2630
2631
2632 011100,5.RS,5.RT,00000,00000,000100:SPECIAL2:32::MSUB
2633 "msub r<RS>, r<RT>"
2634 *mips32:
2635 *mips64:
2636 *vr5500:
2637 {
2638   signed64 temp;
2639   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2640   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2641     Unpredictable ();
2642   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2643   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2644           - ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2645   LO = EXTEND32 (temp);
2646   HI = EXTEND32 (VH4_8 (temp));
2647   TRACE_ALU_RESULT2 (HI, LO);
2648 }
2649
2650
2651 011100,5.RS,5.RT,000,2.AC,00000,000100:SPECIAL2:32::MSUB
2652 "msub r<RS>, r<RT>":AC == 0
2653 "msub ac<AC>, r<RS>, r<RT>"
2654 *mips32r2:
2655 *mips64r2:
2656 *dsp2:
2657 {
2658   signed64 temp;
2659   if (AC == 0)
2660     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2661   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2662     Unpredictable ();
2663   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2664   temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2665           - ((signed64) EXTEND32 (GPR[RT]) * (signed64) EXTEND32 (GPR[RS])));
2666   DSPLO(AC) = EXTEND32 (temp);
2667   DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2668   if (AC == 0)
2669     TRACE_ALU_RESULT2 (HI, LO);
2670 }
2671
2672
2673 011100,5.RS,5.RT,00000,00000,000101:SPECIAL2:32::MSUBU
2674 "msubu r<RS>, r<RT>"
2675 *mips32:
2676 *mips64:
2677 *vr5500:
2678 {
2679   unsigned64 temp;
2680   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2681   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2682     Unpredictable ();
2683   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2684   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
2685           - ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2686   LO = EXTEND32 (temp);
2687   HI = EXTEND32 (VH4_8 (temp));
2688   TRACE_ALU_RESULT2 (HI, LO);
2689 }
2690
2691
2692 011100,5.RS,5.RT,000,2.AC,00000,000101:SPECIAL2:32::MSUBU
2693 "msubu r<RS>, r<RT>":AC == 0
2694 "msubu ac<AC>, r<RS>, r<RT>"
2695 *mips32r2:
2696 *mips64r2:
2697 *dsp2:
2698 {
2699   unsigned64 temp;
2700   if (AC == 0)
2701     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2702   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2703     Unpredictable ();
2704   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2705   temp = (U8_4 (VL4_8 (DSPHI(AC)), VL4_8 (DSPLO(AC)))
2706           - ((unsigned64) VL4_8 (GPR[RS]) * (unsigned64) VL4_8 (GPR[RT])));
2707   DSPLO(AC) = EXTEND32 (temp);
2708   DSPHI(AC) = EXTEND32 (VH4_8 (temp));
2709   if (AC == 0)
2710     TRACE_ALU_RESULT2 (HI, LO);
2711 }
2712
2713
2714 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2715 "mthi r<RS>"
2716 *mipsI:
2717 *mipsII:
2718 *mipsIII:
2719 *mipsIV:
2720 *mipsV:
2721 *vr4100:
2722 *vr5000:
2723 *r3900:
2724 *mips32:
2725 *mips64:
2726 {
2727   check_mt_hilo (SD_, HIHISTORY);
2728   HI = GPR[RS];
2729 }
2730
2731
2732 000000,5.RS,00000,000,2.AC,00000,010001:SPECIAL:32::MTHI
2733 "mthi r<RS>":AC == 0
2734 "mthi r<RS>, ac<AC>"
2735 *mips32r2:
2736 *mips64r2:
2737 *dsp:
2738 {
2739   if (AC == 0)
2740     check_mt_hilo (SD_, HIHISTORY);
2741   DSPHI(AC) = GPR[RS];
2742 }
2743
2744
2745 000000,5.RS,000000000000000,010011:SPECIAL:32::MTLO
2746 "mtlo r<RS>"
2747 *mipsI:
2748 *mipsII:
2749 *mipsIII:
2750 *mipsIV:
2751 *mipsV:
2752 *vr4100:
2753 *vr5000:
2754 *r3900:
2755 *mips32:
2756 *mips64:
2757 {
2758   check_mt_hilo (SD_, LOHISTORY);
2759   LO = GPR[RS];
2760 }
2761
2762
2763 000000,5.RS,00000,000,2.AC,00000,010011:SPECIAL:32::MTLO
2764 "mtlo r<RS>":AC == 0
2765 "mtlo r<RS>, ac<AC>"
2766 *mips32r2:
2767 *mips64r2:
2768 *dsp:
2769 {
2770   if (AC == 0)
2771     check_mt_hilo (SD_, LOHISTORY);
2772   DSPLO(AC) = GPR[RS];
2773 }
2774
2775
2776 011100,5.RS,5.RT,5.RD,00000,000010:SPECIAL2:32::MUL
2777 "mul r<RD>, r<RS>, r<RT>"
2778 *mips32:
2779 *mips32r2:
2780 *mips64:
2781 *mips64r2:
2782 *vr5500:
2783 {
2784   signed64 prod;
2785   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2786     Unpredictable ();
2787   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2788   prod = (((signed64)(signed32) GPR[RS])
2789           * ((signed64)(signed32) GPR[RT]));
2790   GPR[RD] = EXTEND32 (VL4_8 (prod));
2791   TRACE_ALU_RESULT (GPR[RD]);
2792 }
2793
2794
2795
2796 :function:::void:do_mult:int rs, int rt, int rd
2797 {
2798   signed64 prod;
2799   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2800   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
2801     Unpredictable ();
2802   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2803   prod = (((signed64)(signed32) GPR[rs])
2804           * ((signed64)(signed32) GPR[rt]));
2805   LO = EXTEND32 (VL4_8 (prod));
2806   HI = EXTEND32 (VH4_8 (prod));
2807   ACX = 0;  /* SmartMIPS */
2808   if (rd != 0)
2809     GPR[rd] = LO;
2810   TRACE_ALU_RESULT2 (HI, LO);
2811 }
2812
2813 000000,5.RS,5.RT,0000000000,011000:SPECIAL:32::MULT
2814 "mult r<RS>, r<RT>"
2815 *mipsI:
2816 *mipsII:
2817 *mipsIII:
2818 *mipsIV:
2819 *mipsV:
2820 *mips32:
2821 *mips64:
2822 *vr4100:
2823 {
2824   do_mult (SD_, RS, RT, 0);
2825 }
2826
2827
2828 000000,5.RS,5.RT,000,2.AC,00000,011000:SPECIAL:32::MULT
2829 "mult r<RS>, r<RT>":AC == 0
2830 "mult ac<AC>, r<RS>, r<RT>"
2831 *mips32r2:
2832 *mips64r2:
2833 *dsp2:
2834 {
2835   signed64 prod;
2836   if (AC == 0)
2837     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2838   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2839     Unpredictable ();
2840   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2841   prod = ((signed64)(signed32) GPR[RS])
2842           * ((signed64)(signed32) GPR[RT]);
2843   DSPLO(AC) = EXTEND32 (VL4_8 (prod));
2844   DSPHI(AC) = EXTEND32 (VH4_8 (prod));
2845   if (AC == 0)
2846     {
2847       ACX = 0;  /* SmartMIPS */
2848       TRACE_ALU_RESULT2 (HI, LO);
2849     }
2850 }
2851
2852
2853 000000,5.RS,5.RT,5.RD,00000,011000:SPECIAL:32::MULT
2854 "mult r<RS>, r<RT>":RD == 0
2855 "mult r<RD>, r<RS>, r<RT>"
2856 *vr5000:
2857 *r3900:
2858 {
2859   do_mult (SD_, RS, RT, RD);
2860 }
2861
2862
2863 :function:::void:do_multu:int rs, int rt, int rd
2864 {
2865   unsigned64 prod;
2866   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2867   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
2868     Unpredictable ();
2869   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2870   prod = (((unsigned64)(unsigned32) GPR[rs])
2871           * ((unsigned64)(unsigned32) GPR[rt]));
2872   LO = EXTEND32 (VL4_8 (prod));
2873   HI = EXTEND32 (VH4_8 (prod));
2874   if (rd != 0)
2875     GPR[rd] = LO;
2876   TRACE_ALU_RESULT2 (HI, LO);
2877 }
2878
2879 000000,5.RS,5.RT,0000000000,011001:SPECIAL:32::MULTU
2880 "multu r<RS>, r<RT>"
2881 *mipsI:
2882 *mipsII:
2883 *mipsIII:
2884 *mipsIV:
2885 *mipsV:
2886 *mips32:
2887 *mips64:
2888 *vr4100:
2889 {
2890   do_multu (SD_, RS, RT, 0);
2891 }
2892
2893
2894 000000,5.RS,5.RT,000,2.AC,00000,011001:SPECIAL:32::MULTU
2895 "multu r<RS>, r<RT>":AC == 0
2896 "multu r<RS>, r<RT>"
2897 *mips32r2:
2898 *mips64r2:
2899 *dsp2:
2900 {
2901   unsigned64 prod;
2902   if (AC == 0)
2903     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2904   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
2905     Unpredictable ();
2906   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
2907   prod = ((unsigned64)(unsigned32) GPR[RS])
2908           * ((unsigned64)(unsigned32) GPR[RT]);
2909   DSPLO(AC) = EXTEND32 (VL4_8 (prod));
2910   DSPHI(AC) = EXTEND32 (VH4_8 (prod));
2911   if (AC == 0)
2912     TRACE_ALU_RESULT2 (HI, LO);
2913 }
2914
2915
2916 000000,5.RS,5.RT,5.RD,00000,011001:SPECIAL:32::MULTU
2917 "multu r<RS>, r<RT>":RD == 0
2918 "multu r<RD>, r<RS>, r<RT>"
2919 *vr5000:
2920 *r3900:
2921 {
2922   do_multu (SD_, RS, RT, RD);
2923 }
2924
2925
2926 :function:::void:do_nor:int rs, int rt, int rd
2927 {
2928   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2929   GPR[rd] = ~ (GPR[rs] | GPR[rt]);
2930   TRACE_ALU_RESULT (GPR[rd]);
2931 }
2932
2933 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2934 "nor r<RD>, r<RS>, r<RT>"
2935 *mipsI:
2936 *mipsII:
2937 *mipsIII:
2938 *mipsIV:
2939 *mipsV:
2940 *mips32:
2941 *mips32r2:
2942 *mips64:
2943 *mips64r2:
2944 *vr4100:
2945 *vr5000:
2946 *r3900:
2947 {
2948   do_nor (SD_, RS, RT, RD);
2949 }
2950
2951
2952 :function:::void:do_or:int rs, int rt, int rd
2953 {
2954   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2955   GPR[rd] = (GPR[rs] | GPR[rt]);
2956   TRACE_ALU_RESULT (GPR[rd]);
2957 }
2958
2959 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2960 "or r<RD>, r<RS>, r<RT>"
2961 *mipsI:
2962 *mipsII:
2963 *mipsIII:
2964 *mipsIV:
2965 *mipsV:
2966 *mips32:
2967 *mips32r2:
2968 *mips64:
2969 *mips64r2:
2970 *vr4100:
2971 *vr5000:
2972 *r3900:
2973 {
2974   do_or (SD_, RS, RT, RD);
2975 }
2976
2977
2978
2979 :function:::void:do_ori:int rs, int rt, unsigned immediate
2980 {
2981   TRACE_ALU_INPUT2 (GPR[rs], immediate);
2982   GPR[rt] = (GPR[rs] | immediate);
2983   TRACE_ALU_RESULT (GPR[rt]);
2984 }
2985
2986 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2987 "ori r<RT>, r<RS>, %#lx<IMMEDIATE>"
2988 *mipsI:
2989 *mipsII:
2990 *mipsIII:
2991 *mipsIV:
2992 *mipsV:
2993 *mips32:
2994 *mips32r2:
2995 *mips64:
2996 *mips64r2:
2997 *vr4100:
2998 *vr5000:
2999 *r3900:
3000 {
3001   do_ori (SD_, RS, RT, IMMEDIATE);
3002 }
3003
3004
3005 110011,5.BASE,5.HINT,16.OFFSET:NORMAL:32::PREF
3006 "pref <HINT>, <OFFSET>(r<BASE>)"
3007 *mipsIV:
3008 *mipsV:
3009 *mips32:
3010 *mips32r2:
3011 *mips64:
3012 *mips64r2:
3013 *vr5000:
3014 {
3015   address_word base = GPR[BASE];
3016   address_word offset = EXTEND16 (OFFSET);
3017   {
3018     address_word vaddr = loadstore_ea (SD_, base, offset);
3019     address_word paddr;
3020     int uncached;
3021     {
3022       if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
3023         Prefetch(uncached,paddr,vaddr,isDATA,HINT);
3024     }
3025   }
3026 }
3027
3028
3029 :function:::unsigned64:do_ror:unsigned32 x,unsigned32 y
3030 {
3031   unsigned64 result;
3032
3033   y &= 31;
3034   TRACE_ALU_INPUT2 (x, y);
3035   result = EXTEND32 (ROTR32 (x, y));
3036   TRACE_ALU_RESULT (result);
3037   return result;
3038 }
3039
3040 000000,00001,5.RT,5.RD,5.SHIFT,000010::32::ROR
3041 "ror r<RD>, r<RT>, <SHIFT>"
3042 *mips32r2:
3043 *mips64r2:
3044 *smartmips:
3045 *vr5400:
3046 *vr5500:
3047 {
3048   GPR[RD] = do_ror (SD_, GPR[RT], SHIFT);
3049 }
3050
3051 000000,5.RS,5.RT,5.RD,00001,000110::32::RORV
3052 "rorv r<RD>, r<RT>, r<RS>"
3053 *mips32r2:
3054 *mips64r2:
3055 *smartmips:
3056 *vr5400:
3057 *vr5500:
3058 {
3059   GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]);
3060 }
3061
3062
3063 :function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word
3064 {
3065   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3066   address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
3067   address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
3068   unsigned int byte;
3069   address_word paddr;
3070   int uncached;
3071   unsigned64 memval;
3072   address_word vaddr;
3073
3074   vaddr = loadstore_ea (SD_, base, offset);
3075   if ((vaddr & access) != 0)
3076     {
3077       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal);
3078     }
3079   AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3080   paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
3081   byte = ((vaddr & mask) ^ bigendiancpu);
3082   memval = (word << (8 * byte));
3083   StoreMemory (uncached, access, memval, 0, paddr, vaddr, isREAL);
3084 }
3085
3086 :function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt
3087 {
3088   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3089   address_word reverseendian = (ReverseEndian ? -1 : 0);
3090   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3091   unsigned int byte;
3092   unsigned int word;
3093   address_word paddr;
3094   int uncached;
3095   unsigned64 memval;
3096   address_word vaddr;
3097   int nr_lhs_bits;
3098   int nr_rhs_bits;
3099
3100   vaddr = loadstore_ea (SD_, base, offset);
3101   AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3102   paddr = (paddr ^ (reverseendian & mask));
3103   if (BigEndianMem == 0)
3104     paddr = paddr & ~access;
3105
3106   /* compute where within the word/mem we are */
3107   byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
3108   word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
3109   nr_lhs_bits = 8 * byte + 8;
3110   nr_rhs_bits = 8 * access - 8 * byte;
3111   /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
3112   /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
3113            (long) ((unsigned64) vaddr >> 32), (long) vaddr,
3114            (long) ((unsigned64) paddr >> 32), (long) paddr,
3115            word, byte, nr_lhs_bits, nr_rhs_bits); */
3116
3117   if (word == 0)
3118     {
3119       memval = (rt >> nr_rhs_bits);
3120     }
3121   else
3122     {
3123       memval = (rt << nr_lhs_bits);
3124     }
3125   /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n",
3126            (long) ((unsigned64) rt >> 32), (long) rt,
3127            (long) ((unsigned64) memval >> 32), (long) memval); */
3128   StoreMemory (uncached, byte, memval, 0, paddr, vaddr, isREAL);
3129 }
3130
3131 :function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt
3132 {
3133   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3134   address_word reverseendian = (ReverseEndian ? -1 : 0);
3135   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3136   unsigned int byte;
3137   address_word paddr;
3138   int uncached;
3139   unsigned64 memval;
3140   address_word vaddr;
3141
3142   vaddr = loadstore_ea (SD_, base, offset);
3143   AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3144   paddr = (paddr ^ (reverseendian & mask));
3145   if (BigEndianMem != 0)
3146     paddr &= ~access;
3147   byte = ((vaddr & mask) ^ (bigendiancpu & mask));
3148   memval = (rt << (byte * 8));
3149   StoreMemory (uncached, access - (access & byte), memval, 0, paddr, vaddr, isREAL);
3150 }
3151
3152
3153 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
3154 "sb r<RT>, <OFFSET>(r<BASE>)"
3155 *mipsI:
3156 *mipsII:
3157 *mipsIII:
3158 *mipsIV:
3159 *mipsV:
3160 *mips32:
3161 *mips32r2:
3162 *mips64:
3163 *mips64r2:
3164 *vr4100:
3165 *vr5000:
3166 *r3900:
3167 {
3168   do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3169 }
3170
3171
3172 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
3173 "sc r<RT>, <OFFSET>(r<BASE>)"
3174 *mipsII:
3175 *mipsIII:
3176 *mipsIV:
3177 *mipsV:
3178 *mips32:
3179 *mips32r2:
3180 *mips64:
3181 *mips64r2:
3182 *vr4100:
3183 *vr5000:
3184 {
3185   unsigned32 instruction = instruction_0;
3186   address_word base = GPR[BASE];
3187   address_word offset = EXTEND16 (OFFSET);
3188   {
3189     address_word vaddr = loadstore_ea (SD_, base, offset);
3190     address_word paddr;
3191     int uncached;
3192     if ((vaddr & 3) != 0)
3193       {
3194         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, sim_core_unaligned_signal);
3195       }
3196     else
3197       {
3198         if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3199           {
3200             unsigned64 memval = 0;
3201             unsigned64 memval1 = 0;
3202             unsigned64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3203             address_word reverseendian = (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
3204             address_word bigendiancpu = (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
3205             unsigned int byte;
3206             paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
3207             byte = ((vaddr & mask) ^ bigendiancpu);
3208             memval = ((unsigned64) GPR[RT] << (8 * byte));
3209             if (LLBIT)
3210               {
3211                 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
3212               }
3213             GPR[RT] = LLBIT;
3214           }
3215       }
3216   }
3217 }
3218
3219
3220 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
3221 "scd r<RT>, <OFFSET>(r<BASE>)"
3222 *mipsIII:
3223 *mipsIV:
3224 *mipsV:
3225 *mips64:
3226 *mips64r2:
3227 *vr4100:
3228 *vr5000:
3229 {
3230   address_word base = GPR[BASE];
3231   address_word offset = EXTEND16 (OFFSET);
3232   check_u64 (SD_, instruction_0);
3233   {
3234     address_word vaddr = loadstore_ea (SD_, base, offset);
3235     address_word paddr;
3236     int uncached;
3237     if ((vaddr & 7) != 0)
3238       {
3239         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, write_transfer, sim_core_unaligned_signal);
3240       }
3241     else
3242       {
3243         if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3244           {
3245             unsigned64 memval = 0;
3246             unsigned64 memval1 = 0;
3247             memval = GPR[RT];
3248             if (LLBIT)
3249               {
3250                 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
3251               }
3252             GPR[RT] = LLBIT;
3253           }
3254       }
3255   }
3256 }
3257
3258
3259 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
3260 "sd r<RT>, <OFFSET>(r<BASE>)"
3261 *mipsIII:
3262 *mipsIV:
3263 *mipsV:
3264 *mips64:
3265 *mips64r2:
3266 *vr4100:
3267 *vr5000:
3268 {
3269   check_u64 (SD_, instruction_0);
3270   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3271 }
3272
3273
3274 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
3275 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3276 *mipsII:
3277 *mipsIII:
3278 *mipsIV:
3279 *mipsV:
3280 *mips32:
3281 *mips32r2:
3282 *mips64:
3283 *mips64r2:
3284 *vr4100:
3285 *vr5000:
3286 {
3287   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (ZZ, RT));
3288 }
3289
3290
3291 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
3292 "sdl r<RT>, <OFFSET>(r<BASE>)"
3293 *mipsIII:
3294 *mipsIV:
3295 *mipsV:
3296 *mips64:
3297 *mips64r2:
3298 *vr4100:
3299 *vr5000:
3300 {
3301   check_u64 (SD_, instruction_0);
3302   do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3303 }
3304
3305
3306 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
3307 "sdr r<RT>, <OFFSET>(r<BASE>)"
3308 *mipsIII:
3309 *mipsIV:
3310 *mipsV:
3311 *mips64:
3312 *mips64r2:
3313 *vr4100:
3314 *vr5000:
3315 {
3316   check_u64 (SD_, instruction_0);
3317   do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3318 }
3319
3320
3321
3322 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
3323 "sh r<RT>, <OFFSET>(r<BASE>)"
3324 *mipsI:
3325 *mipsII:
3326 *mipsIII:
3327 *mipsIV:
3328 *mipsV:
3329 *mips32:
3330 *mips32r2:
3331 *mips64:
3332 *mips64r2:
3333 *vr4100:
3334 *vr5000:
3335 *r3900:
3336 {
3337   do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3338 }
3339
3340
3341 :function:::void:do_sll:int rt, int rd, int shift
3342 {
3343   unsigned32 temp = (GPR[rt] << shift);
3344   TRACE_ALU_INPUT2 (GPR[rt], shift);
3345   GPR[rd] = EXTEND32 (temp);
3346   TRACE_ALU_RESULT (GPR[rd]);
3347 }
3348
3349 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLa
3350 "nop":RD == 0 && RT == 0 && SHIFT == 0
3351 "sll r<RD>, r<RT>, <SHIFT>"
3352 *mipsI:
3353 *mipsII:
3354 *mipsIII:
3355 *mipsIV:
3356 *mipsV:
3357 *vr4100:
3358 *vr5000:
3359 *r3900:
3360 {
3361   /* Skip shift for NOP, so that there won't be lots of extraneous
3362      trace output.  */
3363   if (RD != 0 || RT != 0 || SHIFT != 0)
3364     do_sll (SD_, RT, RD, SHIFT);
3365 }
3366
3367 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLb
3368 "nop":RD == 0 && RT == 0 && SHIFT == 0
3369 "ssnop":RD == 0 && RT == 0 && SHIFT == 1
3370 "sll r<RD>, r<RT>, <SHIFT>"
3371 *mips32:
3372 *mips32r2:
3373 *mips64:
3374 *mips64r2:
3375 {
3376   /* Skip shift for NOP and SSNOP, so that there won't be lots of
3377      extraneous trace output.  */
3378   if (RD != 0 || RT != 0 || (SHIFT != 0 && SHIFT != 1))
3379     do_sll (SD_, RT, RD, SHIFT);
3380 }
3381
3382
3383 :function:::void:do_sllv:int rs, int rt, int rd
3384 {
3385   int s = MASKED (GPR[rs], 4, 0);
3386   unsigned32 temp = (GPR[rt] << s);
3387   TRACE_ALU_INPUT2 (GPR[rt], s);
3388   GPR[rd] = EXTEND32 (temp);
3389   TRACE_ALU_RESULT (GPR[rd]);
3390 }
3391
3392 000000,5.RS,5.RT,5.RD,00000,000100:SPECIAL:32::SLLV
3393 "sllv r<RD>, r<RT>, r<RS>"
3394 *mipsI:
3395 *mipsII:
3396 *mipsIII:
3397 *mipsIV:
3398 *mipsV:
3399 *mips32:
3400 *mips32r2:
3401 *mips64:
3402 *mips64r2:
3403 *vr4100:
3404 *vr5000:
3405 *r3900:
3406 {
3407   do_sllv (SD_, RS, RT, RD);
3408 }
3409
3410
3411 :function:::void:do_slt:int rs, int rt, int rd
3412 {
3413   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3414   GPR[rd] = ((signed_word) GPR[rs] < (signed_word) GPR[rt]);
3415   TRACE_ALU_RESULT (GPR[rd]);
3416 }
3417
3418 000000,5.RS,5.RT,5.RD,00000,101010:SPECIAL:32::SLT
3419 "slt r<RD>, r<RS>, r<RT>"
3420 *mipsI:
3421 *mipsII:
3422 *mipsIII:
3423 *mipsIV:
3424 *mipsV:
3425 *mips32:
3426 *mips32r2:
3427 *mips64:
3428 *mips64r2:
3429 *vr4100:
3430 *vr5000:
3431 *r3900:
3432 {
3433   do_slt (SD_, RS, RT, RD);
3434 }
3435
3436
3437 :function:::void:do_slti:int rs, int rt, unsigned16 immediate
3438 {
3439   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
3440   GPR[rt] = ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate));
3441   TRACE_ALU_RESULT (GPR[rt]);
3442 }
3443
3444 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
3445 "slti r<RT>, r<RS>, <IMMEDIATE>"
3446 *mipsI:
3447 *mipsII:
3448 *mipsIII:
3449 *mipsIV:
3450 *mipsV:
3451 *mips32:
3452 *mips32r2:
3453 *mips64:
3454 *mips64r2:
3455 *vr4100:
3456 *vr5000:
3457 *r3900:
3458 {
3459   do_slti (SD_, RS, RT, IMMEDIATE);
3460 }
3461
3462
3463 :function:::void:do_sltiu:int rs, int rt, unsigned16 immediate
3464 {
3465   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
3466   GPR[rt] = ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate));
3467   TRACE_ALU_RESULT (GPR[rt]);
3468 }
3469
3470 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
3471 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
3472 *mipsI:
3473 *mipsII:
3474 *mipsIII:
3475 *mipsIV:
3476 *mipsV:
3477 *mips32:
3478 *mips32r2:
3479 *mips64:
3480 *mips64r2:
3481 *vr4100:
3482 *vr5000:
3483 *r3900:
3484 {
3485   do_sltiu (SD_, RS, RT, IMMEDIATE);
3486 }
3487
3488
3489
3490 :function:::void:do_sltu:int rs, int rt, int rd
3491 {
3492   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3493   GPR[rd] = ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]);
3494   TRACE_ALU_RESULT (GPR[rd]);
3495 }
3496
3497 000000,5.RS,5.RT,5.RD,00000,101011:SPECIAL:32::SLTU
3498 "sltu r<RD>, r<RS>, r<RT>"
3499 *mipsI:
3500 *mipsII:
3501 *mipsIII:
3502 *mipsIV:
3503 *mipsV:
3504 *mips32:
3505 *mips32r2:
3506 *mips64:
3507 *mips64r2:
3508 *vr4100:
3509 *vr5000:
3510 *r3900:
3511 {
3512   do_sltu (SD_, RS, RT, RD);
3513 }
3514
3515
3516 :function:::void:do_sra:int rt, int rd, int shift
3517 {
3518   signed32 temp = (signed32) GPR[rt] >> shift;
3519   if (NotWordValue (GPR[rt]))
3520     Unpredictable ();
3521   TRACE_ALU_INPUT2 (GPR[rt], shift);
3522   GPR[rd] = EXTEND32 (temp);
3523   TRACE_ALU_RESULT (GPR[rd]);
3524 }
3525
3526 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
3527 "sra r<RD>, r<RT>, <SHIFT>"
3528 *mipsI:
3529 *mipsII:
3530 *mipsIII:
3531 *mipsIV:
3532 *mipsV:
3533 *mips32:
3534 *mips32r2:
3535 *mips64:
3536 *mips64r2:
3537 *vr4100:
3538 *vr5000:
3539 *r3900:
3540 {
3541   do_sra (SD_, RT, RD, SHIFT);
3542 }
3543
3544
3545
3546 :function:::void:do_srav:int rs, int rt, int rd
3547 {
3548   int s = MASKED (GPR[rs], 4, 0);
3549   signed32 temp = (signed32) GPR[rt] >> s;
3550   if (NotWordValue (GPR[rt]))
3551     Unpredictable ();
3552   TRACE_ALU_INPUT2 (GPR[rt], s);
3553   GPR[rd] = EXTEND32 (temp);
3554   TRACE_ALU_RESULT (GPR[rd]);
3555 }
3556
3557 000000,5.RS,5.RT,5.RD,00000,000111:SPECIAL:32::SRAV
3558 "srav r<RD>, r<RT>, r<RS>"
3559 *mipsI:
3560 *mipsII:
3561 *mipsIII:
3562 *mipsIV:
3563 *mipsV:
3564 *mips32:
3565 *mips32r2:
3566 *mips64:
3567 *mips64r2:
3568 *vr4100:
3569 *vr5000:
3570 *r3900:
3571 {
3572   do_srav (SD_, RS, RT, RD);
3573 }
3574
3575
3576
3577 :function:::void:do_srl:int rt, int rd, int shift
3578 {
3579   unsigned32 temp = (unsigned32) GPR[rt] >> shift;
3580   if (NotWordValue (GPR[rt]))
3581     Unpredictable ();
3582   TRACE_ALU_INPUT2 (GPR[rt], shift);
3583   GPR[rd] = EXTEND32 (temp);
3584   TRACE_ALU_RESULT (GPR[rd]);
3585 }
3586
3587 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
3588 "srl r<RD>, r<RT>, <SHIFT>"
3589 *mipsI:
3590 *mipsII:
3591 *mipsIII:
3592 *mipsIV:
3593 *mipsV:
3594 *mips32:
3595 *mips32r2:
3596 *mips64:
3597 *mips64r2:
3598 *vr4100:
3599 *vr5000:
3600 *r3900:
3601 {
3602   do_srl (SD_, RT, RD, SHIFT);
3603 }
3604
3605
3606 :function:::void:do_srlv:int rs, int rt, int rd
3607 {
3608   int s = MASKED (GPR[rs], 4, 0);
3609   unsigned32 temp = (unsigned32) GPR[rt] >> s;
3610   if (NotWordValue (GPR[rt]))
3611     Unpredictable ();
3612   TRACE_ALU_INPUT2 (GPR[rt], s);
3613   GPR[rd] = EXTEND32 (temp);
3614   TRACE_ALU_RESULT (GPR[rd]);
3615 }
3616
3617 000000,5.RS,5.RT,5.RD,00000,000110:SPECIAL:32::SRLV
3618 "srlv r<RD>, r<RT>, r<RS>"
3619 *mipsI:
3620 *mipsII:
3621 *mipsIII:
3622 *mipsIV:
3623 *mipsV:
3624 *mips32:
3625 *mips32r2:
3626 *mips64:
3627 *mips64r2:
3628 *vr4100:
3629 *vr5000:
3630 *r3900:
3631 {
3632   do_srlv (SD_, RS, RT, RD);
3633 }
3634
3635
3636 000000,5.RS,5.RT,5.RD,00000,100010:SPECIAL:32::SUB
3637 "sub r<RD>, r<RS>, r<RT>"
3638 *mipsI:
3639 *mipsII:
3640 *mipsIII:
3641 *mipsIV:
3642 *mipsV:
3643 *mips32:
3644 *mips32r2:
3645 *mips64:
3646 *mips64r2:
3647 *vr4100:
3648 *vr5000:
3649 *r3900:
3650 {
3651   if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT]))
3652     Unpredictable ();
3653   TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
3654   {
3655     ALU32_BEGIN (GPR[RS]);
3656     ALU32_SUB (GPR[RT]);
3657     ALU32_END (GPR[RD]);   /* This checks for overflow.  */
3658   }
3659   TRACE_ALU_RESULT (GPR[RD]);
3660 }
3661
3662
3663 :function:::void:do_subu:int rs, int rt, int rd
3664 {
3665   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
3666     Unpredictable ();
3667   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3668   GPR[rd] = EXTEND32 (GPR[rs] - GPR[rt]);
3669   TRACE_ALU_RESULT (GPR[rd]);
3670 }
3671
3672 000000,5.RS,5.RT,5.RD,00000,100011:SPECIAL:32::SUBU
3673 "subu r<RD>, r<RS>, r<RT>"
3674 *mipsI:
3675 *mipsII:
3676 *mipsIII:
3677 *mipsIV:
3678 *mipsV:
3679 *mips32:
3680 *mips32r2:
3681 *mips64:
3682 *mips64r2:
3683 *vr4100:
3684 *vr5000:
3685 *r3900:
3686 {
3687   do_subu (SD_, RS, RT, RD);
3688 }
3689
3690
3691 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
3692 "sw r<RT>, <OFFSET>(r<BASE>)"
3693 *mipsI:
3694 *mipsII:
3695 *mipsIII:
3696 *mipsIV:
3697 *mipsV:
3698 *mips32:
3699 *mips32r2:
3700 *mips64:
3701 *mips64r2:
3702 *vr4100:
3703 *r3900:
3704 *vr5000:
3705 {
3706   do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3707 }
3708
3709
3710 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
3711 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3712 *mipsI:
3713 *mipsII:
3714 *mipsIII:
3715 *mipsIV:
3716 *mipsV:
3717 *mips32:
3718 *mips32r2:
3719 *mips64:
3720 *mips64r2:
3721 *vr4100:
3722 *vr5000:
3723 *r3900:
3724 {
3725   do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), COP_SW (ZZ, RT));
3726 }
3727
3728
3729 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
3730 "swl r<RT>, <OFFSET>(r<BASE>)"
3731 *mipsI:
3732 *mipsII:
3733 *mipsIII:
3734 *mipsIV:
3735 *mipsV:
3736 *mips32:
3737 *mips32r2:
3738 *mips64:
3739 *mips64r2:
3740 *vr4100:
3741 *vr5000:
3742 *r3900:
3743 {
3744   do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3745 }
3746
3747
3748 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3749 "swr r<RT>, <OFFSET>(r<BASE>)"
3750 *mipsI:
3751 *mipsII:
3752 *mipsIII:
3753 *mipsIV:
3754 *mipsV:
3755 *mips32:
3756 *mips32r2:
3757 *mips64:
3758 *mips64r2:
3759 *vr4100:
3760 *vr5000:
3761 *r3900:
3762 {
3763   do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3764 }
3765
3766
3767 000000,000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3768 "sync":STYPE == 0
3769 "sync <STYPE>"
3770 *mipsII:
3771 *mipsIII:
3772 *mipsIV:
3773 *mipsV:
3774 *mips32:
3775 *mips32r2:
3776 *mips64:
3777 *mips64r2:
3778 *vr4100:
3779 *vr5000:
3780 *r3900:
3781 {
3782   SyncOperation (STYPE);
3783 }
3784
3785
3786 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3787 "syscall %#lx<CODE>"
3788 *mipsI:
3789 *mipsII:
3790 *mipsIII:
3791 *mipsIV:
3792 *mipsV:
3793 *mips32:
3794 *mips32r2:
3795 *mips64:
3796 *mips64r2:
3797 *vr4100:
3798 *vr5000:
3799 *r3900:
3800 {
3801   SignalException (SystemCall, instruction_0);
3802 }
3803
3804
3805 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3806 "teq r<RS>, r<RT>"
3807 *mipsII:
3808 *mipsIII:
3809 *mipsIV:
3810 *mipsV:
3811 *mips32:
3812 *mips32r2:
3813 *mips64:
3814 *mips64r2:
3815 *vr4100:
3816 *vr5000:
3817 {
3818   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
3819     SignalException (Trap, instruction_0);
3820 }
3821
3822
3823 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3824 "teqi r<RS>, <IMMEDIATE>"
3825 *mipsII:
3826 *mipsIII:
3827 *mipsIV:
3828 *mipsV:
3829 *mips32:
3830 *mips32r2:
3831 *mips64:
3832 *mips64r2:
3833 *vr4100:
3834 *vr5000:
3835 {
3836   if ((signed_word) GPR[RS] == (signed_word) EXTEND16 (IMMEDIATE))
3837     SignalException (Trap, instruction_0);
3838 }
3839
3840
3841 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3842 "tge r<RS>, r<RT>"
3843 *mipsII:
3844 *mipsIII:
3845 *mipsIV:
3846 *mipsV:
3847 *mips32:
3848 *mips32r2:
3849 *mips64:
3850 *mips64r2:
3851 *vr4100:
3852 *vr5000:
3853 {
3854   if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
3855     SignalException (Trap, instruction_0);
3856 }
3857
3858
3859 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3860 "tgei r<RS>, <IMMEDIATE>"
3861 *mipsII:
3862 *mipsIII:
3863 *mipsIV:
3864 *mipsV:
3865 *mips32:
3866 *mips32r2:
3867 *mips64:
3868 *mips64r2:
3869 *vr4100:
3870 *vr5000:
3871 {
3872   if ((signed_word) GPR[RS] >= (signed_word) EXTEND16 (IMMEDIATE))
3873     SignalException (Trap, instruction_0);
3874 }
3875
3876
3877 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3878 "tgeiu r<RS>, <IMMEDIATE>"
3879 *mipsII:
3880 *mipsIII:
3881 *mipsIV:
3882 *mipsV:
3883 *mips32:
3884 *mips32r2:
3885 *mips64:
3886 *mips64r2:
3887 *vr4100:
3888 *vr5000:
3889 {
3890   if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3891     SignalException (Trap, instruction_0);
3892 }
3893
3894
3895 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3896 "tgeu r<RS>, r<RT>"
3897 *mipsII:
3898 *mipsIII:
3899 *mipsIV:
3900 *mipsV:
3901 *mips32:
3902 *mips32r2:
3903 *mips64:
3904 *mips64r2:
3905 *vr4100:
3906 *vr5000:
3907 {
3908   if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3909     SignalException (Trap, instruction_0);
3910 }
3911
3912
3913 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3914 "tlt r<RS>, r<RT>"
3915 *mipsII:
3916 *mipsIII:
3917 *mipsIV:
3918 *mipsV:
3919 *mips32:
3920 *mips32r2:
3921 *mips64:
3922 *mips64r2:
3923 *vr4100:
3924 *vr5000:
3925 {
3926   if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
3927     SignalException (Trap, instruction_0);
3928 }
3929
3930
3931 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3932 "tlti r<RS>, <IMMEDIATE>"
3933 *mipsII:
3934 *mipsIII:
3935 *mipsIV:
3936 *mipsV:
3937 *mips32:
3938 *mips32r2:
3939 *mips64:
3940 *mips64r2:
3941 *vr4100:
3942 *vr5000:
3943 {
3944   if ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE))
3945     SignalException (Trap, instruction_0);
3946 }
3947
3948
3949 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3950 "tltiu r<RS>, <IMMEDIATE>"
3951 *mipsII:
3952 *mipsIII:
3953 *mipsIV:
3954 *mipsV:
3955 *mips32:
3956 *mips32r2:
3957 *mips64:
3958 *mips64r2:
3959 *vr4100:
3960 *vr5000:
3961 {
3962   if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3963     SignalException (Trap, instruction_0);
3964 }
3965
3966
3967 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3968 "tltu r<RS>, r<RT>"
3969 *mipsII:
3970 *mipsIII:
3971 *mipsIV:
3972 *mipsV:
3973 *mips32:
3974 *mips32r2:
3975 *mips64:
3976 *mips64r2:
3977 *vr4100:
3978 *vr5000:
3979 {
3980   if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3981     SignalException (Trap, instruction_0);
3982 }
3983
3984
3985 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3986 "tne r<RS>, r<RT>"
3987 *mipsII:
3988 *mipsIII:
3989 *mipsIV:
3990 *mipsV:
3991 *mips32:
3992 *mips32r2:
3993 *mips64:
3994 *mips64r2:
3995 *vr4100:
3996 *vr5000:
3997 {
3998   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
3999     SignalException (Trap, instruction_0);
4000 }
4001
4002
4003 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
4004 "tnei r<RS>, <IMMEDIATE>"
4005 *mipsII:
4006 *mipsIII:
4007 *mipsIV:
4008 *mipsV:
4009 *mips32:
4010 *mips32r2:
4011 *mips64:
4012 *mips64r2:
4013 *vr4100:
4014 *vr5000:
4015 {
4016   if ((signed_word) GPR[RS] != (signed_word) EXTEND16 (IMMEDIATE))
4017     SignalException (Trap, instruction_0);
4018 }
4019
4020
4021 :function:::void:do_xor:int rs, int rt, int rd
4022 {
4023   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4024   GPR[rd] = GPR[rs] ^ GPR[rt];
4025   TRACE_ALU_RESULT (GPR[rd]);
4026 }
4027
4028 000000,5.RS,5.RT,5.RD,00000,100110:SPECIAL:32::XOR
4029 "xor r<RD>, r<RS>, r<RT>"
4030 *mipsI:
4031 *mipsII:
4032 *mipsIII:
4033 *mipsIV:
4034 *mipsV:
4035 *mips32:
4036 *mips32r2:
4037 *mips64:
4038 *mips64r2:
4039 *vr4100:
4040 *vr5000:
4041 *r3900:
4042 {
4043   do_xor (SD_, RS, RT, RD);
4044 }
4045
4046
4047 :function:::void:do_xori:int rs, int rt, unsigned16 immediate
4048 {
4049   TRACE_ALU_INPUT2 (GPR[rs], immediate);
4050   GPR[rt] = GPR[rs] ^ immediate;
4051   TRACE_ALU_RESULT (GPR[rt]);
4052 }
4053
4054 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
4055 "xori r<RT>, r<RS>, %#lx<IMMEDIATE>"
4056 *mipsI:
4057 *mipsII:
4058 *mipsIII:
4059 *mipsIV:
4060 *mipsV:
4061 *mips32:
4062 *mips32r2:
4063 *mips64:
4064 *mips64r2:
4065 *vr4100:
4066 *vr5000:
4067 *r3900:
4068 {
4069   do_xori (SD_, RS, RT, IMMEDIATE);
4070 }
4071
4072 \f
4073 //
4074 // MIPS Architecture:
4075 //
4076 //        FPU Instruction Set (COP1 & COP1X)
4077 //
4078
4079
4080 :%s::::FMT:int fmt
4081 {
4082   switch (fmt)
4083     {
4084     case fmt_single: return "s";
4085     case fmt_double: return "d";
4086     case fmt_word: return "w";
4087     case fmt_long: return "l";
4088     case fmt_ps: return "ps";
4089     default: return "?";
4090     }
4091 }
4092
4093 :%s::::TF:int tf
4094 {
4095   if (tf)
4096     return "t";
4097   else
4098     return "f";
4099 }
4100
4101 :%s::::ND:int nd
4102 {
4103   if (nd)
4104     return "l";
4105   else
4106     return "";
4107 }
4108
4109 :%s::::COND:int cond
4110 {
4111   switch (cond)
4112     {
4113     case 00: return "f";
4114     case 01: return "un";
4115     case 02: return "eq";
4116     case 03: return "ueq";
4117     case 04: return "olt";
4118     case 05: return "ult";
4119     case 06: return "ole";
4120     case 07: return "ule";
4121     case 010: return "sf";
4122     case 011: return "ngle";
4123     case 012: return "seq";
4124     case 013: return "ngl";
4125     case 014: return "lt";
4126     case 015: return "nge";
4127     case 016: return "le";
4128     case 017: return "ngt";
4129     default: return "?";
4130     }
4131 }
4132
4133
4134 // Helpers:
4135 //
4136 // Check that the given FPU format is usable, and signal a
4137 // ReservedInstruction exception if not.
4138 //
4139
4140 // check_fmt_p checks that the format is single, double, or paired single.
4141 :function:::void:check_fmt_p:int fmt, instruction_word insn
4142 *mipsI:
4143 *mipsII:
4144 *mipsIII:
4145 *mipsIV:
4146 *mips32:
4147 *vr4100:
4148 *vr5000:
4149 *r3900:
4150 {
4151   /* None of these ISAs support Paired Single, so just fall back to
4152      the single/double check.  */
4153   if ((fmt != fmt_single) && (fmt != fmt_double))
4154     SignalException (ReservedInstruction, insn);
4155 }
4156
4157 :function:::void:check_fmt_p:int fmt, instruction_word insn
4158 *mips32r2:
4159 {
4160   if ((fmt != fmt_single) && (fmt != fmt_double) && (fmt != fmt_ps))
4161     SignalException (ReservedInstruction, insn);
4162 }
4163
4164 :function:::void:check_fmt_p:int fmt, instruction_word insn
4165 *mipsV:
4166 *mips64:
4167 *mips64r2:
4168 {
4169   if ((fmt != fmt_single) && (fmt != fmt_double)
4170       && (fmt != fmt_ps || (UserMode && (SR & (status_UX|status_PX)) == 0)))
4171     SignalException (ReservedInstruction, insn);
4172 }
4173
4174
4175 // Helper:
4176 //
4177 // Check that the FPU is currently usable, and signal a CoProcessorUnusable
4178 // exception if not.
4179 //
4180
4181 :function:::void:check_fpu:
4182 *mipsI:
4183 *mipsII:
4184 *mipsIII:
4185 *mipsIV:
4186 *mipsV:
4187 *mips32:
4188 *mips32r2:
4189 *mips64:
4190 *mips64r2:
4191 *vr4100:
4192 *vr5000:
4193 *r3900:
4194 {
4195   if (! COP_Usable (1))
4196     SignalExceptionCoProcessorUnusable (1);
4197 }
4198
4199
4200 // Helper:
4201 //
4202 // Load a double word FP value using 2 32-bit memory cycles a la MIPS II
4203 // or MIPS32.  do_load cannot be used instead because it returns an
4204 // unsigned_word, which is limited to the size of the machine's registers.
4205 //
4206
4207 :function:::unsigned64:do_load_double:address_word base, address_word offset
4208 *mipsII:
4209 *mips32:
4210 *mips32r2:
4211 {
4212   int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
4213   address_word vaddr;
4214   address_word paddr;
4215   int uncached;
4216   unsigned64 memval;
4217   unsigned64 v;
4218
4219   vaddr = loadstore_ea (SD_, base, offset);
4220   if ((vaddr & AccessLength_DOUBLEWORD) != 0)
4221     {
4222       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map,
4223                        AccessLength_DOUBLEWORD + 1, vaddr, read_transfer,
4224                        sim_core_unaligned_signal);
4225     }
4226   AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET,
4227                       isREAL);
4228   LoadMemory (&memval, NULL, uncached, AccessLength_WORD, paddr, vaddr,
4229               isDATA, isREAL);
4230   v = (unsigned64)memval;
4231   LoadMemory (&memval, NULL, uncached, AccessLength_WORD, paddr + 4, vaddr + 4,
4232               isDATA, isREAL);
4233   return (bigendian ? ((v << 32) | memval) : (v | (memval << 32)));
4234 }
4235
4236
4237 // Helper:
4238 //
4239 // Store a double word FP value using 2 32-bit memory cycles a la MIPS II
4240 // or MIPS32.  do_load cannot be used instead because it returns an
4241 // unsigned_word, which is limited to the size of the machine's registers.
4242 //
4243
4244 :function:::void:do_store_double:address_word base, address_word offset, unsigned64 v
4245 *mipsII:
4246 *mips32:
4247 *mips32r2:
4248 {
4249   int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
4250   address_word vaddr;
4251   address_word paddr;
4252   int uncached;
4253   unsigned64 memval;
4254
4255   vaddr = loadstore_ea (SD_, base, offset);
4256   if ((vaddr & AccessLength_DOUBLEWORD) != 0)
4257     {
4258       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map,
4259                        AccessLength_DOUBLEWORD + 1, vaddr, write_transfer,
4260                        sim_core_unaligned_signal);
4261     }
4262   AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET,
4263                       isREAL);
4264   memval = (bigendian ? (v >> 32) : (v & 0xFFFFFFFF));
4265   StoreMemory (uncached, AccessLength_WORD, memval, 0, paddr, vaddr,
4266                isREAL);
4267   memval = (bigendian ? (v & 0xFFFFFFFF) : (v >> 32));
4268   StoreMemory (uncached, AccessLength_WORD, memval, 0, paddr + 4, vaddr + 4,
4269                isREAL);
4270 }
4271
4272
4273 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
4274 "abs.%s<FMT> f<FD>, f<FS>"
4275 *mipsI:
4276 *mipsII:
4277 *mipsIII:
4278 *mipsIV:
4279 *mipsV:
4280 *mips32:
4281 *mips32r2:
4282 *mips64:
4283 *mips64r2:
4284 *vr4100:
4285 *vr5000:
4286 *r3900:
4287 {
4288   int fmt = FMT;
4289   check_fpu (SD_);
4290   check_fmt_p (SD_, fmt, instruction_0);
4291   StoreFPR (FD, fmt, AbsoluteValue (ValueFPR (FS, fmt), fmt));
4292 }
4293
4294
4295
4296 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
4297 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
4298 *mipsI:
4299 *mipsII:
4300 *mipsIII:
4301 *mipsIV:
4302 *mipsV:
4303 *mips32:
4304 *mips32r2:
4305 *mips64:
4306 *mips64r2:
4307 *vr4100:
4308 *vr5000:
4309 *r3900:
4310 {
4311   int fmt = FMT;
4312   check_fpu (SD_);
4313   check_fmt_p (SD_, fmt, instruction_0);
4314   StoreFPR (FD, fmt, Add (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
4315 }
4316
4317
4318 010011,5.RS,5.FT,5.FS,5.FD,011,110:COP1X:32,f::ALNV.PS
4319 "alnv.ps f<FD>, f<FS>, f<FT>, r<RS>"
4320 *mipsV:
4321 *mips32r2:
4322 *mips64:
4323 *mips64r2:
4324 {
4325   unsigned64 fs;
4326   unsigned64 ft;
4327   unsigned64 fd;
4328   check_fpu (SD_);
4329   check_u64 (SD_, instruction_0);
4330   fs = ValueFPR (FS, fmt_ps);
4331   if ((GPR[RS] & 0x3) != 0)
4332     Unpredictable ();
4333   if ((GPR[RS] & 0x4) == 0)
4334     fd = fs;
4335   else
4336     {
4337       ft = ValueFPR (FT, fmt_ps);
4338       if (BigEndianCPU)
4339         fd = PackPS (PSLower (fs), PSUpper (ft));
4340       else
4341         fd = PackPS (PSLower (ft), PSUpper (fs));
4342     }
4343   StoreFPR (FD, fmt_ps, fd);
4344 }
4345
4346
4347 // BC1F
4348 // BC1FL
4349 // BC1T
4350 // BC1TL
4351
4352 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1a
4353 "bc1%s<TF>%s<ND> <OFFSET>"
4354 *mipsI:
4355 *mipsII:
4356 *mipsIII:
4357 {
4358   check_fpu (SD_);
4359   TRACE_BRANCH_INPUT (PREVCOC1());
4360   if (PREVCOC1() == TF)
4361     {
4362       address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
4363       TRACE_BRANCH_RESULT (dest);
4364       DELAY_SLOT (dest);
4365     }
4366   else if (ND)
4367     {
4368       TRACE_BRANCH_RESULT (0);
4369       NULLIFY_NEXT_INSTRUCTION ();
4370     }
4371   else
4372     {
4373       TRACE_BRANCH_RESULT (NIA);
4374     }
4375 }
4376
4377 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1b
4378 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
4379 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
4380 *mipsIV:
4381 *mipsV:
4382 *mips32:
4383 *mips32r2:
4384 *mips64:
4385 *mips64r2:
4386 #*vr4100:
4387 *vr5000:
4388 *r3900:
4389 {
4390   check_fpu (SD_);
4391   if (GETFCC(CC) == TF)
4392     {
4393       address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
4394       DELAY_SLOT (dest);
4395     }
4396   else if (ND)
4397     {
4398       NULLIFY_NEXT_INSTRUCTION ();
4399     }
4400 }
4401
4402
4403 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,3.0,00,11,4.COND:COP1:32,f::C.cond.fmta
4404 "c.%s<COND>.%s<FMT> f<FS>, f<FT>"
4405 *mipsI:
4406 *mipsII:
4407 *mipsIII:
4408 {
4409   int fmt = FMT;
4410   check_fpu (SD_);
4411   Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, 0);
4412   TRACE_ALU_RESULT (ValueFCR (31));
4413 }
4414
4415 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32,f::C.cond.fmtb
4416 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
4417 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
4418 *mipsIV:
4419 *mipsV:
4420 *mips32:
4421 *mips32r2:
4422 *mips64:
4423 *mips64r2:
4424 *vr4100:
4425 *vr5000:
4426 *r3900:
4427 {
4428   int fmt = FMT;
4429   check_fpu (SD_);
4430   check_fmt_p (SD_, fmt, instruction_0);
4431   Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, CC);
4432   TRACE_ALU_RESULT (ValueFCR (31));
4433 }
4434
4435
4436 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001010:COP1:32,f::CEIL.L.fmt
4437 "ceil.l.%s<FMT> f<FD>, f<FS>"
4438 *mipsIII:
4439 *mipsIV:
4440 *mipsV:
4441 *mips32r2:
4442 *mips64:
4443 *mips64r2:
4444 *vr4100:
4445 *vr5000:
4446 *r3900:
4447 {
4448   int fmt = FMT;
4449   check_fpu (SD_);
4450   StoreFPR (FD, fmt_long, Convert (FP_RM_TOPINF, ValueFPR (FS, fmt), fmt,
4451             fmt_long));
4452 }
4453
4454
4455 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001110:COP1:32,f::CEIL.W
4456 "ceil.w.%s<FMT> f<FD>, f<FS>"
4457 *mipsII:
4458 *mipsIII:
4459 *mipsIV:
4460 *mipsV:
4461 *mips32:
4462 *mips32r2:
4463 *mips64:
4464 *mips64r2:
4465 *vr4100:
4466 *vr5000:
4467 *r3900:
4468 {
4469   int fmt = FMT;
4470   check_fpu (SD_);
4471   StoreFPR (FD, fmt_word, Convert (FP_RM_TOPINF, ValueFPR (FS, fmt), fmt,
4472             fmt_word));
4473 }
4474
4475
4476 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1a
4477 "cfc1 r<RT>, f<FS>"
4478 *mipsI:
4479 *mipsII:
4480 *mipsIII:
4481 {
4482   check_fpu (SD_);
4483   if (FS == 0)
4484     PENDING_FILL (RT, EXTEND32 (FCR0));
4485   else if (FS == 31)
4486     PENDING_FILL (RT, EXTEND32 (FCR31));
4487   /* else NOP */
4488 }
4489
4490 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1b
4491 "cfc1 r<RT>, f<FS>"
4492 *mipsIV:
4493 *vr4100:
4494 *vr5000:
4495 *r3900:
4496 {
4497   check_fpu (SD_);
4498   if (FS == 0 || FS == 31)
4499     {
4500       unsigned_word  fcr = ValueFCR (FS);
4501       TRACE_ALU_INPUT1 (fcr);
4502       GPR[RT] = fcr;
4503     }
4504   /* else NOP */
4505   TRACE_ALU_RESULT (GPR[RT]);
4506 }
4507
4508 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1c
4509 "cfc1 r<RT>, f<FS>"
4510 *mipsV:
4511 *mips32:
4512 *mips32r2:
4513 *mips64:
4514 *mips64r2:
4515 {
4516   check_fpu (SD_);
4517   if (FS == 0 || FS == 25 || FS == 26 || FS == 28 || FS == 31)
4518     {
4519       unsigned_word  fcr = ValueFCR (FS);
4520       TRACE_ALU_INPUT1 (fcr);
4521       GPR[RT] = fcr;
4522     }
4523   /* else NOP */
4524   TRACE_ALU_RESULT (GPR[RT]);
4525 }
4526
4527 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1a
4528 "ctc1 r<RT>, f<FS>"
4529 *mipsI:
4530 *mipsII:
4531 *mipsIII:
4532 {
4533   check_fpu (SD_);
4534   if (FS == 31)
4535     PENDING_FILL (FCRCS_REGNUM, VL4_8 (GPR[RT]));
4536   /* else NOP */
4537 }
4538
4539 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1b
4540 "ctc1 r<RT>, f<FS>"
4541 *mipsIV:
4542 *vr4100:
4543 *vr5000:
4544 *r3900:
4545 {
4546   check_fpu (SD_);
4547   TRACE_ALU_INPUT1 (GPR[RT]);
4548   if (FS == 31)
4549     StoreFCR (FS, GPR[RT]);
4550   /* else NOP */
4551 }
4552
4553 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1c
4554 "ctc1 r<RT>, f<FS>"
4555 *mipsV:
4556 *mips32:
4557 *mips32r2:
4558 *mips64:
4559 *mips64r2:
4560 {
4561   check_fpu (SD_);
4562   TRACE_ALU_INPUT1 (GPR[RT]);
4563   if (FS == 25 || FS == 26 || FS == 28 || FS == 31)
4564       StoreFCR (FS, GPR[RT]);
4565   /* else NOP */
4566 }
4567
4568
4569 //
4570 // FIXME: Does not correctly differentiate between mips*
4571 //
4572 010001,10,3.FMT!1!2!3!6!7,00000,5.FS,5.FD,100001:COP1:32,f::CVT.D.fmt
4573 "cvt.d.%s<FMT> f<FD>, f<FS>"
4574 *mipsI:
4575 *mipsII:
4576 *mipsIII:
4577 *mipsIV:
4578 *mipsV:
4579 *mips32:
4580 *mips32r2:
4581 *mips64:
4582 *mips64r2:
4583 *vr4100:
4584 *vr5000:
4585 *r3900:
4586 {
4587   int fmt = FMT;
4588   check_fpu (SD_);
4589   if ((fmt == fmt_double) | 0)
4590     SignalException (ReservedInstruction, instruction_0);
4591   StoreFPR (FD, fmt_double, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4592             fmt_double));
4593 }
4594
4595
4596 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100101:COP1:32,f::CVT.L.fmt
4597 "cvt.l.%s<FMT> f<FD>, f<FS>"
4598 *mipsIII:
4599 *mipsIV:
4600 *mipsV:
4601 *mips32r2:
4602 *mips64:
4603 *mips64r2:
4604 *vr4100:
4605 *vr5000:
4606 *r3900:
4607 {
4608   int fmt = FMT;
4609   check_fpu (SD_);
4610   if ((fmt == fmt_long) | ((fmt == fmt_long) || (fmt == fmt_word)))
4611     SignalException (ReservedInstruction, instruction_0);
4612   StoreFPR (FD, fmt_long, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4613             fmt_long));
4614 }
4615
4616
4617 010001,10,000,5.FT,5.FS,5.FD,100110:COP1:32,f::CVT.PS.S
4618 "cvt.ps.s f<FD>, f<FS>, f<FT>"
4619 *mipsV:
4620 *mips32r2:
4621 *mips64:
4622 *mips64r2:
4623 {
4624   check_fpu (SD_);
4625   check_u64 (SD_, instruction_0);
4626   StoreFPR (FD, fmt_ps, PackPS (ValueFPR (FS, fmt_single),
4627                                 ValueFPR (FT, fmt_single)));
4628 }
4629
4630
4631 //
4632 // FIXME: Does not correctly differentiate between mips*
4633 //
4634 010001,10,3.FMT!0!2!3!6!7,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.fmt
4635 "cvt.s.%s<FMT> f<FD>, f<FS>"
4636 *mipsI:
4637 *mipsII:
4638 *mipsIII:
4639 *mipsIV:
4640 *mipsV:
4641 *mips32:
4642 *mips32r2:
4643 *mips64:
4644 *mips64r2:
4645 *vr4100:
4646 *vr5000:
4647 *r3900:
4648 {
4649   int fmt = FMT;
4650   check_fpu (SD_);
4651   if ((fmt == fmt_single) | 0)
4652     SignalException (ReservedInstruction, instruction_0);
4653   StoreFPR (FD, fmt_single, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4654             fmt_single));
4655 }
4656
4657
4658 010001,10,110,00000,5.FS,5.FD,101000:COP1:32,f::CVT.S.PL
4659 "cvt.s.pl f<FD>, f<FS>"
4660 *mipsV:
4661 *mips32r2:
4662 *mips64:
4663 *mips64r2:
4664 {
4665   check_fpu (SD_);
4666   check_u64 (SD_, instruction_0);
4667   StoreFPR (FD, fmt_single, PSLower (ValueFPR (FS, fmt_ps)));
4668 }
4669
4670
4671 010001,10,110,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.PU
4672 "cvt.s.pu f<FD>, f<FS>"
4673 *mipsV:
4674 *mips32r2:
4675 *mips64:
4676 *mips64r2:
4677 {
4678   check_fpu (SD_);
4679   check_u64 (SD_, instruction_0);
4680   StoreFPR (FD, fmt_single, PSUpper (ValueFPR (FS, fmt_ps)));
4681 }
4682
4683
4684 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100100:COP1:32,f::CVT.W.fmt
4685 "cvt.w.%s<FMT> f<FD>, f<FS>"
4686 *mipsI:
4687 *mipsII:
4688 *mipsIII:
4689 *mipsIV:
4690 *mipsV:
4691 *mips32:
4692 *mips32r2:
4693 *mips64:
4694 *mips64r2:
4695 *vr4100:
4696 *vr5000:
4697 *r3900:
4698 {
4699   int fmt = FMT;
4700   check_fpu (SD_);
4701   if ((fmt == fmt_word) | ((fmt == fmt_long) || (fmt == fmt_word)))
4702     SignalException (ReservedInstruction, instruction_0);
4703   StoreFPR (FD, fmt_word, Convert (GETRM (), ValueFPR (FS, fmt), fmt,
4704             fmt_word));
4705 }
4706
4707
4708 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,5.FD,000011:COP1:32,f::DIV.fmt
4709 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
4710 *mipsI:
4711 *mipsII:
4712 *mipsIII:
4713 *mipsIV:
4714 *mipsV:
4715 *mips32:
4716 *mips32r2:
4717 *mips64:
4718 *mips64r2:
4719 *vr4100:
4720 *vr5000:
4721 *r3900:
4722 {
4723   int fmt = FMT;
4724   check_fpu (SD_);
4725   StoreFPR (FD, fmt, Divide (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
4726 }
4727
4728
4729 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1a
4730 "dmfc1 r<RT>, f<FS>"
4731 *mipsIII:
4732 {
4733   unsigned64 v;
4734   check_fpu (SD_);
4735   check_u64 (SD_, instruction_0);
4736   if (SizeFGR () == 64)
4737     v = FGR[FS];
4738   else if ((FS & 0x1) == 0)
4739     v = SET64HI (FGR[FS+1]) | FGR[FS];
4740   else
4741     v = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4742   PENDING_FILL (RT, v);
4743   TRACE_ALU_RESULT (v);
4744 }
4745
4746 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1b
4747 "dmfc1 r<RT>, f<FS>"
4748 *mipsIV:
4749 *mipsV:
4750 *mips64:
4751 *mips64r2:
4752 *vr4100:
4753 *vr5000:
4754 *r3900:
4755 {
4756   check_fpu (SD_);
4757   check_u64 (SD_, instruction_0);
4758   if (SizeFGR () == 64)
4759     GPR[RT] = FGR[FS];
4760   else if ((FS & 0x1) == 0)
4761     GPR[RT] = SET64HI (FGR[FS+1]) | FGR[FS];
4762   else
4763     GPR[RT] = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4764   TRACE_ALU_RESULT (GPR[RT]);
4765 }
4766
4767
4768 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1a
4769 "dmtc1 r<RT>, f<FS>"
4770 *mipsIII:
4771 {
4772   unsigned64 v;
4773   check_fpu (SD_);
4774   check_u64 (SD_, instruction_0);
4775   if (SizeFGR () == 64)
4776     PENDING_FILL ((FS + FGR_BASE), GPR[RT]);
4777   else if ((FS & 0x1) == 0)
4778     {
4779       PENDING_FILL (((FS + 1) + FGR_BASE), VH4_8 (GPR[RT]));
4780       PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
4781     }
4782   else
4783     Unpredictable ();
4784   TRACE_FP_RESULT (GPR[RT]);
4785 }
4786
4787 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1b
4788 "dmtc1 r<RT>, f<FS>"
4789 *mipsIV:
4790 *mipsV:
4791 *mips64:
4792 *mips64r2:
4793 *vr4100:
4794 *vr5000:
4795 *r3900:
4796 {
4797   check_fpu (SD_);
4798   check_u64 (SD_, instruction_0);
4799   if (SizeFGR () == 64)
4800     StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4801   else if ((FS & 0x1) == 0)
4802     StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4803   else
4804     Unpredictable ();
4805 }
4806
4807
4808 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001011:COP1:32,f::FLOOR.L.fmt
4809 "floor.l.%s<FMT> f<FD>, f<FS>"
4810 *mipsIII:
4811 *mipsIV:
4812 *mipsV:
4813 *mips32r2:
4814 *mips64:
4815 *mips64r2:
4816 *vr4100:
4817 *vr5000:
4818 *r3900:
4819 {
4820   int fmt = FMT;
4821   check_fpu (SD_);
4822   StoreFPR (FD, fmt_long, Convert (FP_RM_TOMINF, ValueFPR (FS, fmt), fmt,
4823             fmt_long));
4824 }
4825
4826
4827 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001111:COP1:32,f::FLOOR.W.fmt
4828 "floor.w.%s<FMT> f<FD>, f<FS>"
4829 *mipsII:
4830 *mipsIII:
4831 *mipsIV:
4832 *mipsV:
4833 *mips32:
4834 *mips32r2:
4835 *mips64:
4836 *mips64r2:
4837 *vr4100:
4838 *vr5000:
4839 *r3900:
4840 {
4841   int fmt = FMT;
4842   check_fpu (SD_);
4843   StoreFPR (FD, fmt_word, Convert (FP_RM_TOMINF, ValueFPR (FS, fmt), fmt,
4844             fmt_word));
4845 }
4846
4847
4848 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1a
4849 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4850 *mipsII:
4851 *mips32:
4852 *mips32r2:
4853 {
4854   check_fpu (SD_);
4855   COP_LD (1, FT, do_load_double (SD_, GPR[BASE], EXTEND16 (OFFSET)));
4856 }
4857
4858
4859 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1b
4860 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4861 *mipsIII:
4862 *mipsIV:
4863 *mipsV:
4864 *mips64:
4865 *mips64r2:
4866 *vr4100:
4867 *vr5000:
4868 *r3900:
4869 {
4870   check_fpu (SD_);
4871   COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
4872 }
4873
4874
4875 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:32,f::LDXC1
4876 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4877 *mips32r2:
4878 {
4879   check_fpu (SD_);
4880   COP_LD (1, FD, do_load_double (SD_, GPR[BASE], GPR[INDEX]));
4881 }
4882
4883
4884 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64,f::LDXC1
4885 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4886 *mipsIV:
4887 *mipsV:
4888 *mips64:
4889 *mips64r2:
4890 *vr5000:
4891 {
4892   check_fpu (SD_);
4893   check_u64 (SD_, instruction_0);
4894   COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX]));
4895 }
4896
4897
4898 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:32,f::LUXC1
4899 "luxc1 f<FD>, r<INDEX>(r<BASE>)"
4900 *mips32r2:
4901 {
4902   address_word base = GPR[BASE];
4903   address_word index = GPR[INDEX];
4904   address_word vaddr = base + index;
4905   check_fpu (SD_);
4906   if (SizeFGR () != 64)
4907     Unpredictable ();
4908   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
4909   if ((vaddr & 0x7) != 0)
4910     index -= (vaddr & 0x7);
4911   COP_LD (1, FD, do_load_double (SD_, base, index));
4912 }
4913
4914
4915 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:64,f::LUXC1
4916 "luxc1 f<FD>, r<INDEX>(r<BASE>)"
4917 *mipsV:
4918 *mips64:
4919 *mips64r2:
4920 {
4921   address_word base = GPR[BASE];
4922   address_word index = GPR[INDEX];
4923   address_word vaddr = base + index;
4924   check_fpu (SD_);
4925   check_u64 (SD_, instruction_0);
4926   if (SizeFGR () != 64)
4927     Unpredictable ();
4928   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
4929   if ((vaddr & 0x7) != 0)
4930     index -= (vaddr & 0x7);
4931   COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, base, index));
4932 }
4933
4934
4935 110001,5.BASE,5.FT,16.OFFSET:COP1:32,f::LWC1
4936 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
4937 *mipsI:
4938 *mipsII:
4939 *mipsIII:
4940 *mipsIV:
4941 *mipsV:
4942 *mips32:
4943 *mips32r2:
4944 *mips64:
4945 *mips64r2:
4946 *vr4100:
4947 *vr5000:
4948 *r3900:
4949 {
4950   check_fpu (SD_);
4951   COP_LW (1, FT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
4952 }
4953
4954
4955 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32,f::LWXC1
4956 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4957 *mipsIV:
4958 *mipsV:
4959 *mips32r2:
4960 *mips64:
4961 *mips64r2:
4962 *vr5000:
4963 {
4964   check_fpu (SD_);
4965   check_u64 (SD_, instruction_0);
4966   COP_LW (1, FD, do_load (SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]));
4967 }
4968
4969
4970
4971 010011,5.FR,5.FT,5.FS,5.FD,100,3.FMT!2!3!4!5!7:COP1X:32,f::MADD.fmt
4972 "madd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
4973 *mipsIV:
4974 *mipsV:
4975 *mips32r2:
4976 *mips64:
4977 *mips64r2:
4978 *vr5000:
4979 {
4980   int fmt = FMT;
4981   check_fpu (SD_);
4982   check_u64 (SD_, instruction_0);
4983   check_fmt_p (SD_, fmt, instruction_0); 
4984   StoreFPR (FD, fmt, MultiplyAdd (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
4985                                   ValueFPR (FR, fmt), fmt));
4986 }
4987
4988
4989 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1a
4990 "mfc1 r<RT>, f<FS>"
4991 *mipsI:
4992 *mipsII:
4993 *mipsIII:
4994 {
4995   unsigned64 v;
4996   check_fpu (SD_);
4997   v = EXTEND32 (FGR[FS]);
4998   PENDING_FILL (RT, v);
4999   TRACE_ALU_RESULT (v);
5000 }
5001   
5002 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1b
5003 "mfc1 r<RT>, f<FS>"
5004 *mipsIV:
5005 *mipsV:
5006 *mips32:
5007 *mips32r2:
5008 *mips64:
5009 *mips64r2:
5010 *vr4100:
5011 *vr5000:
5012 *r3900:
5013
5014   check_fpu (SD_);
5015   GPR[RT] = EXTEND32 (FGR[FS]);
5016   TRACE_ALU_RESULT (GPR[RT]);
5017 }
5018
5019
5020 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000110:COP1:32,f::MOV.fmt
5021 "mov.%s<FMT> f<FD>, f<FS>"
5022 *mipsI:
5023 *mipsII:
5024 *mipsIII:
5025 *mipsIV:
5026 *mipsV:
5027 *mips32:
5028 *mips32r2:
5029 *mips64:
5030 *mips64r2:
5031 *vr4100:
5032 *vr5000:
5033 *r3900:
5034 {
5035   int fmt = FMT;
5036   check_fpu (SD_);
5037   check_fmt_p (SD_, fmt, instruction_0);
5038   StoreFPR (FD, fmt, ValueFPR (FS, fmt));
5039 }
5040
5041
5042 // MOVF
5043 // MOVT
5044 000000,5.RS,3.CC,0,1.TF,5.RD,00000,000001:SPECIAL:32,f::MOVtf
5045 "mov%s<TF> r<RD>, r<RS>, <CC>"
5046 *mipsIV:
5047 *mipsV:
5048 *mips32:
5049 *mips32r2:
5050 *mips64:
5051 *mips64r2:
5052 *vr5000:
5053 {
5054   check_fpu (SD_);
5055   if (GETFCC(CC) == TF)
5056     GPR[RD] = GPR[RS];
5057 }
5058
5059
5060 // MOVF.fmt
5061 // MOVT.fmt
5062 010001,10,3.FMT!2!3!4!5!7,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32,f::MOVtf.fmt
5063 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
5064 *mipsIV:
5065 *mipsV:
5066 *mips32:
5067 *mips32r2:
5068 *mips64:
5069 *mips64r2:
5070 *vr5000:
5071 {
5072   int fmt = FMT;
5073   check_fpu (SD_);
5074   if (fmt != fmt_ps)
5075     {
5076       if (GETFCC(CC) == TF)
5077         StoreFPR (FD, fmt, ValueFPR (FS, fmt));
5078       else
5079         StoreFPR (FD, fmt, ValueFPR (FD, fmt));   /* set fmt */
5080     }
5081   else
5082     {
5083       unsigned64 fd;
5084       fd = PackPS (PSUpper (ValueFPR ((GETFCC (CC+1) == TF) ? FS : FD,
5085                                       fmt_ps)),
5086                    PSLower (ValueFPR ((GETFCC (CC+0) == TF) ? FS : FD,
5087                                       fmt_ps)));
5088       StoreFPR (FD, fmt_ps, fd);
5089     }
5090 }
5091
5092
5093 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010011:COP1:32,f::MOVN.fmt
5094 "movn.%s<FMT> f<FD>, f<FS>, r<RT>"
5095 *mipsIV:
5096 *mipsV:
5097 *mips32:
5098 *mips32r2:
5099 *mips64:
5100 *mips64r2:
5101 *vr5000:
5102 {
5103   check_fpu (SD_);
5104   if (GPR[RT] != 0)
5105     StoreFPR (FD, FMT, ValueFPR (FS, FMT));
5106   else
5107     StoreFPR (FD, FMT, ValueFPR (FD, FMT));
5108 }
5109
5110
5111 // MOVT see MOVtf
5112
5113
5114 // MOVT.fmt see MOVtf.fmt
5115
5116
5117
5118 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010010:COP1:32,f::MOVZ.fmt
5119 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
5120 *mipsIV:
5121 *mipsV:
5122 *mips32:
5123 *mips32r2:
5124 *mips64:
5125 *mips64r2:
5126 *vr5000:
5127 {
5128   check_fpu (SD_);
5129   if (GPR[RT] == 0)
5130     StoreFPR (FD, FMT, ValueFPR (FS, FMT));
5131   else
5132     StoreFPR (FD, FMT, ValueFPR (FD, FMT));
5133 }
5134
5135
5136 010011,5.FR,5.FT,5.FS,5.FD,101,3.FMT!2!3!4!5!7:COP1X:32,f::MSUB.fmt
5137 "msub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5138 *mipsIV:
5139 *mipsV:
5140 *mips32r2:
5141 *mips64:
5142 *mips64r2:
5143 *vr5000:
5144 {
5145   int fmt = FMT;
5146   check_fpu (SD_);
5147   check_u64 (SD_, instruction_0);
5148   check_fmt_p (SD_, fmt, instruction_0);
5149   StoreFPR (FD, fmt, MultiplySub (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
5150                                   ValueFPR (FR, fmt), fmt));
5151 }
5152
5153
5154 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1a
5155 "mtc1 r<RT>, f<FS>"
5156 *mipsI:
5157 *mipsII:
5158 *mipsIII:
5159
5160   check_fpu (SD_);
5161   if (SizeFGR () == 64)
5162     PENDING_FILL ((FS + FGR_BASE), (SET64HI (0xDEADC0DE) | VL4_8 (GPR[RT])));
5163   else
5164     PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
5165   TRACE_FP_RESULT (GPR[RT]);
5166
5167
5168 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1b
5169 "mtc1 r<RT>, f<FS>"
5170 *mipsIV:
5171 *mipsV:
5172 *mips32:
5173 *mips32r2:
5174 *mips64:
5175 *mips64r2:
5176 *vr4100:
5177 *vr5000:
5178 *r3900:
5179 {
5180   check_fpu (SD_); 
5181   StoreFPR (FS, fmt_uninterpreted_32, VL4_8 (GPR[RT]));
5182 }
5183
5184
5185 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000010:COP1:32,f::MUL.fmt
5186 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
5187 *mipsI:
5188 *mipsII:
5189 *mipsIII:
5190 *mipsIV:
5191 *mipsV:
5192 *mips32:
5193 *mips32r2:
5194 *mips64:
5195 *mips64r2:
5196 *vr4100:
5197 *vr5000:
5198 *r3900:
5199 {
5200   int fmt = FMT;
5201   check_fpu (SD_);
5202   check_fmt_p (SD_, fmt, instruction_0);
5203   StoreFPR (FD, fmt, Multiply (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
5204 }
5205
5206
5207 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000111:COP1:32,f::NEG.fmt
5208 "neg.%s<FMT> f<FD>, f<FS>"
5209 *mipsI:
5210 *mipsII:
5211 *mipsIII:
5212 *mipsIV:
5213 *mipsV:
5214 *mips32:
5215 *mips32r2:
5216 *mips64:
5217 *mips64r2:
5218 *vr4100:
5219 *vr5000:
5220 *r3900:
5221 {
5222   int fmt = FMT;
5223   check_fpu (SD_);
5224   check_fmt_p (SD_, fmt, instruction_0);
5225   StoreFPR (FD, fmt, Negate (ValueFPR (FS, fmt), fmt));
5226 }
5227
5228
5229 010011,5.FR,5.FT,5.FS,5.FD,110,3.FMT!2!3!4!5!7:COP1X:32,f::NMADD.fmt
5230 "nmadd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5231 *mipsIV:
5232 *mipsV:
5233 *mips32r2:
5234 *mips64:
5235 *mips64r2:
5236 *vr5000:
5237 {
5238   int fmt = FMT;
5239   check_fpu (SD_);
5240   check_u64 (SD_, instruction_0);
5241   check_fmt_p (SD_, fmt, instruction_0);
5242   StoreFPR (FD, fmt, NegMultiplyAdd (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
5243                                      ValueFPR (FR, fmt), fmt));
5244 }
5245
5246
5247 010011,5.FR,5.FT,5.FS,5.FD,111,3.FMT!2!3!4!5!7:COP1X:32,f::NMSUB.fmt
5248 "nmsub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5249 *mipsIV:
5250 *mipsV:
5251 *mips32r2:
5252 *mips64:
5253 *mips64r2:
5254 *vr5000:
5255 {
5256   int fmt = FMT;
5257   check_fpu (SD_);
5258   check_u64 (SD_, instruction_0);
5259   check_fmt_p (SD_, fmt, instruction_0);
5260   StoreFPR (FD, fmt, NegMultiplySub (ValueFPR (FS, fmt), ValueFPR (FT, fmt),
5261                                      ValueFPR (FR, fmt), fmt));
5262 }
5263
5264
5265 010001,10,110,5.FT,5.FS,5.FD,101100:COP1:32,f::PLL.PS
5266 "pll.ps f<FD>, f<FS>, f<FT>"
5267 *mipsV:
5268 *mips32r2:
5269 *mips64:
5270 *mips64r2:
5271 {
5272   check_fpu (SD_);
5273   check_u64 (SD_, instruction_0);
5274   StoreFPR (FD, fmt_ps, PackPS (PSLower (ValueFPR (FS, fmt_ps)),
5275                                 PSLower (ValueFPR (FT, fmt_ps))));
5276 }
5277
5278
5279 010001,10,110,5.FT,5.FS,5.FD,101101:COP1:32,f::PLU.PS
5280 "plu.ps f<FD>, f<FS>, f<FT>"
5281 *mipsV:
5282 *mips32r2:
5283 *mips64:
5284 *mips64r2:
5285 {
5286   check_fpu (SD_);
5287   check_u64 (SD_, instruction_0);
5288   StoreFPR (FD, fmt_ps, PackPS (PSLower (ValueFPR (FS, fmt_ps)),
5289                                 PSUpper (ValueFPR (FT, fmt_ps))));
5290 }
5291
5292
5293 010011,5.BASE,5.INDEX,5.HINT,00000,001111:COP1X:32::PREFX
5294 "prefx <HINT>, r<INDEX>(r<BASE>)"
5295 *mipsIV:
5296 *mipsV:
5297 *mips32r2:
5298 *mips64:
5299 *mips64r2:
5300 *vr5000:
5301 {
5302   address_word base = GPR[BASE];
5303   address_word index = GPR[INDEX];
5304   {
5305     address_word vaddr = loadstore_ea (SD_, base, index);
5306     address_word paddr;
5307     int uncached;
5308     if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5309       Prefetch(uncached,paddr,vaddr,isDATA,HINT);
5310   }
5311 }
5312
5313
5314 010001,10,110,5.FT,5.FS,5.FD,101110:COP1:32,f::PUL.PS
5315 "pul.ps f<FD>, f<FS>, f<FT>"
5316 *mipsV:
5317 *mips32r2:
5318 *mips64:
5319 *mips64r2:
5320 {
5321   check_fpu (SD_);
5322   check_u64 (SD_, instruction_0);
5323   StoreFPR (FD, fmt_ps, PackPS (PSUpper (ValueFPR (FS, fmt_ps)),
5324                                 PSLower (ValueFPR (FT, fmt_ps))));
5325 }
5326
5327
5328 010001,10,110,5.FT,5.FS,5.FD,101111:COP1:32,f::PUU.PS
5329 "puu.ps f<FD>, f<FS>, f<FT>"
5330 *mipsV:
5331 *mips32r2:
5332 *mips64:
5333 *mips64r2:
5334 {
5335   check_fpu (SD_);
5336   check_u64 (SD_, instruction_0);
5337   StoreFPR (FD, fmt_ps, PackPS (PSUpper (ValueFPR (FS, fmt_ps)),
5338                                 PSUpper (ValueFPR (FT, fmt_ps))));
5339 }
5340
5341
5342 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010101:COP1:32,f::RECIP.fmt
5343 "recip.%s<FMT> f<FD>, f<FS>"
5344 *mipsIV:
5345 *mipsV:
5346 *mips32r2:
5347 *mips64:
5348 *mips64r2:
5349 *vr5000:
5350 {
5351   int fmt = FMT;
5352   check_fpu (SD_);
5353   StoreFPR (FD, fmt, Recip (ValueFPR (FS, fmt), fmt));
5354 }
5355
5356
5357 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001000:COP1:32,f::ROUND.L.fmt
5358 "round.l.%s<FMT> f<FD>, f<FS>"
5359 *mipsIII:
5360 *mipsIV:
5361 *mipsV:
5362 *mips32r2:
5363 *mips64:
5364 *mips64r2:
5365 *vr4100:
5366 *vr5000:
5367 *r3900:
5368 {
5369   int fmt = FMT;
5370   check_fpu (SD_);
5371   StoreFPR (FD, fmt_long, Convert (FP_RM_NEAREST, ValueFPR (FS, fmt), fmt,
5372             fmt_long));
5373 }
5374
5375
5376 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001100:COP1:32,f::ROUND.W.fmt
5377 "round.w.%s<FMT> f<FD>, f<FS>"
5378 *mipsII:
5379 *mipsIII:
5380 *mipsIV:
5381 *mipsV:
5382 *mips32:
5383 *mips32r2:
5384 *mips64:
5385 *mips64r2:
5386 *vr4100:
5387 *vr5000:
5388 *r3900:
5389 {
5390   int fmt = FMT;
5391   check_fpu (SD_);
5392   StoreFPR (FD, fmt_word, Convert (FP_RM_NEAREST, ValueFPR (FS, fmt), fmt,
5393             fmt_word));
5394 }
5395
5396
5397 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010110:COP1:32,f::RSQRT.fmt
5398 "rsqrt.%s<FMT> f<FD>, f<FS>"
5399 *mipsIV:
5400 *mipsV:
5401 *mips32r2:
5402 *mips64:
5403 *mips64r2:
5404 *vr5000:
5405 {
5406   int fmt = FMT;
5407   check_fpu (SD_);
5408   StoreFPR (FD, fmt, RSquareRoot (ValueFPR (FS, fmt), fmt));
5409 }
5410
5411
5412 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1a
5413 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5414 *mipsII:
5415 *mips32:
5416 *mips32r2:
5417 {
5418   check_fpu (SD_);
5419   do_store_double (SD_, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
5420 }
5421
5422
5423 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1b
5424 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5425 *mipsIII:
5426 *mipsIV:
5427 *mipsV:
5428 *mips64:
5429 *mips64r2:
5430 *vr4100:
5431 *vr5000:
5432 *r3900:
5433 {
5434   check_fpu (SD_);
5435   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
5436 }
5437
5438
5439 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:32,f::SDXC1
5440 "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
5441 *mips32r2
5442 {
5443   check_fpu (SD_);
5444   do_store_double (SD_, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
5445 }
5446
5447
5448 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:64,f::SDXC1
5449 "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
5450 *mipsIV:
5451 *mipsV:
5452 *mips64:
5453 *mips64r2:
5454 *vr5000:
5455 {
5456   check_fpu (SD_);
5457   check_u64 (SD_, instruction_0);
5458   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
5459 }
5460
5461
5462 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:32,f::SUXC1
5463 "suxc1 f<FS>, r<INDEX>(r<BASE>)"
5464 *mips32r2:
5465 {
5466   address_word base = GPR[BASE];
5467   address_word index = GPR[INDEX];
5468   address_word vaddr = base + index;
5469   check_fpu (SD_);
5470   if (SizeFGR () != 64)
5471     Unpredictable ();
5472   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
5473   if ((vaddr & 0x7) != 0)
5474     index -= (vaddr & 0x7);
5475   do_store_double (SD_, base, index, COP_SD (1, FS));
5476 }
5477
5478
5479 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:64,f::SUXC1
5480 "suxc1 f<FS>, r<INDEX>(r<BASE>)"
5481 *mipsV:
5482 *mips64:
5483 *mips64r2:
5484 {
5485   address_word base = GPR[BASE];
5486   address_word index = GPR[INDEX];
5487   address_word vaddr = base + index;
5488   check_fpu (SD_);
5489   check_u64 (SD_, instruction_0);
5490   if (SizeFGR () != 64)
5491     Unpredictable ();
5492   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
5493   if ((vaddr & 0x7) != 0)
5494     index -= (vaddr & 0x7);
5495   do_store (SD_, AccessLength_DOUBLEWORD, base, index, COP_SD (1, FS));
5496 }
5497
5498
5499 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,000100:COP1:32,f::SQRT.fmt
5500 "sqrt.%s<FMT> f<FD>, f<FS>"
5501 *mipsII:
5502 *mipsIII:
5503 *mipsIV:
5504 *mipsV:
5505 *mips32:
5506 *mips32r2:
5507 *mips64:
5508 *mips64r2:
5509 *vr4100:
5510 *vr5000:
5511 *r3900:
5512 {
5513   int fmt = FMT;
5514   check_fpu (SD_);
5515   StoreFPR (FD, fmt,  (SquareRoot (ValueFPR (FS, fmt), fmt)));
5516 }
5517
5518
5519 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000001:COP1:32,f::SUB.fmt
5520 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
5521 *mipsI:
5522 *mipsII:
5523 *mipsIII:
5524 *mipsIV:
5525 *mipsV:
5526 *mips32:
5527 *mips32r2:
5528 *mips64:
5529 *mips64r2:
5530 *vr4100:
5531 *vr5000:
5532 *r3900:
5533 {
5534   int fmt = FMT;
5535   check_fpu (SD_);
5536   check_fmt_p (SD_, fmt, instruction_0);
5537   StoreFPR (FD, fmt, Sub (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt));
5538 }
5539
5540
5541
5542 111001,5.BASE,5.FT,16.OFFSET:COP1:32,f::SWC1
5543 "swc1 f<FT>, <OFFSET>(r<BASE>)"
5544 *mipsI:
5545 *mipsII:
5546 *mipsIII:
5547 *mipsIV:
5548 *mipsV:
5549 *mips32:
5550 *mips32r2:
5551 *mips64:
5552 *mips64r2:
5553 *vr4100:
5554 *vr5000:
5555 *r3900:
5556 {
5557   address_word base = GPR[BASE];
5558   address_word offset = EXTEND16 (OFFSET);
5559   check_fpu (SD_);
5560   {
5561     address_word vaddr = loadstore_ea (SD_, base, offset);
5562     address_word paddr;
5563     int uncached;
5564     if ((vaddr & 3) != 0)
5565       {
5566         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, AccessLength_WORD+1, vaddr, write_transfer, sim_core_unaligned_signal);
5567       }
5568     else
5569       {
5570         if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5571           {
5572             uword64 memval = 0;
5573             uword64 memval1 = 0;
5574             uword64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
5575             address_word reverseendian = (ReverseEndian ?(mask ^ AccessLength_WORD): 0);
5576             address_word bigendiancpu = (BigEndianCPU ?(mask ^ AccessLength_WORD): 0);
5577             unsigned int byte;
5578             paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
5579             byte = ((vaddr & mask) ^ bigendiancpu);
5580             memval = (((uword64)COP_SW(((instruction_0 >> 26) & 0x3),FT)) << (8 * byte));
5581             StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5582           }
5583       }
5584   }
5585 }
5586
5587
5588 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32,f::SWXC1
5589 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
5590 *mipsIV:
5591 *mipsV:
5592 *mips32r2:
5593 *mips64:
5594 *mips64r2:
5595 *vr5000:
5596 {
5597
5598   address_word base = GPR[BASE];
5599   address_word index = GPR[INDEX];
5600   check_fpu (SD_);
5601   check_u64 (SD_, instruction_0);
5602   {
5603    address_word vaddr = loadstore_ea (SD_, base, index);
5604    address_word paddr;
5605    int uncached;
5606    if ((vaddr & 3) != 0)
5607      {
5608        SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, sim_core_unaligned_signal);
5609      }
5610    else
5611    {
5612     if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5613     {
5614      unsigned64 memval = 0;
5615      unsigned64 memval1 = 0;
5616      unsigned64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
5617      address_word reverseendian = (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
5618      address_word bigendiancpu = (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
5619      unsigned int byte;
5620      paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
5621      byte = ((vaddr & mask) ^ bigendiancpu);
5622      memval = (((unsigned64)COP_SW(1,FS)) << (8 * byte));
5623       {
5624        StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5625       }
5626     }
5627    }
5628   }
5629 }
5630
5631
5632 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001001:COP1:32,f::TRUNC.L.fmt
5633 "trunc.l.%s<FMT> f<FD>, f<FS>"
5634 *mipsIII:
5635 *mipsIV:
5636 *mipsV:
5637 *mips32r2:
5638 *mips64:
5639 *mips64r2:
5640 *vr4100:
5641 *vr5000:
5642 *r3900:
5643 {
5644   int fmt = FMT;
5645   check_fpu (SD_);
5646   StoreFPR (FD, fmt_long, Convert (FP_RM_TOZERO, ValueFPR (FS, fmt), fmt,
5647             fmt_long));
5648 }
5649
5650
5651 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001101:COP1:32,f::TRUNC.W
5652 "trunc.w.%s<FMT> f<FD>, f<FS>"
5653 *mipsII:
5654 *mipsIII:
5655 *mipsIV:
5656 *mipsV:
5657 *mips32:
5658 *mips32r2:
5659 *mips64:
5660 *mips64r2:
5661 *vr4100:
5662 *vr5000:
5663 *r3900:
5664 {
5665   int fmt = FMT;
5666   check_fpu (SD_);
5667   StoreFPR (FD, fmt_word, Convert (FP_RM_TOZERO, ValueFPR (FS, fmt), fmt,
5668             fmt_word));
5669 }
5670
5671 \f
5672 //
5673 // MIPS Architecture:
5674 //
5675 //        System Control Instruction Set (COP0)
5676 //
5677
5678
5679 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5680 "bc0f <OFFSET>"
5681 *mipsI:
5682 *mipsII:
5683 *mipsIII:
5684 *mipsIV:
5685 *mipsV:
5686 *mips32:
5687 *mips32r2:
5688 *mips64:
5689 *mips64r2:
5690 *vr4100:
5691 *vr5000:
5692
5693 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5694 "bc0f <OFFSET>"
5695 // stub needed for eCos as tx39 hardware bug workaround
5696 *r3900:
5697 {
5698   /* do nothing */
5699 }
5700
5701
5702 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
5703 "bc0fl <OFFSET>"
5704 *mipsI:
5705 *mipsII:
5706 *mipsIII:
5707 *mipsIV:
5708 *mipsV:
5709 *mips32:
5710 *mips32r2:
5711 *mips64:
5712 *mips64r2:
5713 *vr4100:
5714 *vr5000:
5715
5716
5717 010000,01000,00001,16.OFFSET:COP0:32::BC0T
5718 "bc0t <OFFSET>"
5719 *mipsI:
5720 *mipsII:
5721 *mipsIII:
5722 *mipsIV:
5723 *mipsV:
5724 *mips32:
5725 *mips32r2:
5726 *mips64:
5727 *mips64r2:
5728 *vr4100:
5729
5730
5731 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
5732 "bc0tl <OFFSET>"
5733 *mipsI:
5734 *mipsII:
5735 *mipsIII:
5736 *mipsIV:
5737 *mipsV:
5738 *mips32:
5739 *mips32r2:
5740 *mips64:
5741 *mips64r2:
5742 *vr4100:
5743 *vr5000:
5744
5745
5746 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
5747 "cache <OP>, <OFFSET>(r<BASE>)"
5748 *mipsIII:
5749 *mipsIV:
5750 *mipsV:
5751 *mips32:
5752 *mips32r2:
5753 *mips64:
5754 *mips64r2:
5755 *vr4100:
5756 *vr5000:
5757 *r3900:
5758 {
5759   address_word base = GPR[BASE];
5760   address_word offset = EXTEND16 (OFFSET);
5761   {
5762     address_word vaddr = loadstore_ea (SD_, base, offset);
5763     address_word paddr;
5764     int uncached;
5765     if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5766       CacheOp(OP,vaddr,paddr,instruction_0);
5767   }
5768 }
5769
5770
5771 010000,00001,5.RT,5.RD,00000000000:COP0:64::DMFC0
5772 "dmfc0 r<RT>, r<RD>"
5773 *mipsIII:
5774 *mipsIV:
5775 *mipsV:
5776 *mips64:
5777 *mips64r2:
5778 {
5779   check_u64 (SD_, instruction_0);
5780   DecodeCoproc (instruction_0);
5781 }
5782
5783
5784 010000,00101,5.RT,5.RD,00000000000:COP0:64::DMTC0
5785 "dmtc0 r<RT>, r<RD>"
5786 *mipsIII:
5787 *mipsIV:
5788 *mipsV:
5789 *mips64:
5790 *mips64r2:
5791 {
5792   check_u64 (SD_, instruction_0);
5793   DecodeCoproc (instruction_0);
5794 }
5795
5796
5797 010000,1,0000000000000000000,011000:COP0:32::ERET
5798 "eret"
5799 *mipsIII:
5800 *mipsIV:
5801 *mipsV:
5802 *mips32:
5803 *mips32r2:
5804 *mips64:
5805 *mips64r2:
5806 *vr4100:
5807 *vr5000:
5808 {
5809   if (SR & status_ERL)
5810     {
5811       /* Oops, not yet available */
5812       sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported");
5813       NIA = EPC;
5814       SR &= ~status_ERL;
5815     }
5816   else
5817     {
5818       NIA = EPC;
5819       SR &= ~status_EXL;
5820     }
5821 }
5822
5823
5824 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
5825 "mfc0 r<RT>, r<RD> # <REGX>"
5826 *mipsI:
5827 *mipsII:
5828 *mipsIII:
5829 *mipsIV:
5830 *mipsV:
5831 *mips32:
5832 *mips32r2:
5833 *mips64:
5834 *mips64r2:
5835 *vr4100:
5836 *vr5000:
5837 *r3900:
5838 {
5839   TRACE_ALU_INPUT0 ();
5840   DecodeCoproc (instruction_0);
5841   TRACE_ALU_RESULT (GPR[RT]);
5842 }
5843
5844 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
5845 "mtc0 r<RT>, r<RD> # <REGX>"
5846 *mipsI:
5847 *mipsII:
5848 *mipsIII:
5849 *mipsIV:
5850 *mipsV:
5851 *mips32:
5852 *mips32r2:
5853 *mips64:
5854 *mips64r2:
5855 *vr4100:
5856 *vr5000:
5857 *r3900:
5858 {
5859   DecodeCoproc (instruction_0);
5860 }
5861
5862
5863 010000,1,0000000000000000000,010000:COP0:32::RFE
5864 "rfe"
5865 *mipsI:
5866 *mipsII:
5867 *mipsIII:
5868 *mipsIV:
5869 *mipsV:
5870 *vr4100:
5871 *vr5000:
5872 *r3900:
5873 {
5874   DecodeCoproc (instruction_0);
5875 }
5876
5877
5878 0100,ZZ!0!1!3,5.COP_FUN0!8,5.COP_FUN1,16.COP_FUN2:NORMAL:32::COPz
5879 "cop<ZZ> <COP_FUN0><COP_FUN1><COP_FUN2>"
5880 *mipsI:
5881 *mipsII:
5882 *mipsIII:
5883 *mipsIV:
5884 *mipsV:
5885 *mips32:
5886 *mips32r2:
5887 *mips64:
5888 *mips64r2:
5889 *vr4100:
5890 *r3900:
5891 {
5892   DecodeCoproc (instruction_0);
5893 }
5894
5895
5896
5897 010000,1,0000000000000000000,001000:COP0:32::TLBP
5898 "tlbp"
5899 *mipsI:
5900 *mipsII:
5901 *mipsIII:
5902 *mipsIV:
5903 *mipsV:
5904 *mips32:
5905 *mips32r2:
5906 *mips64:
5907 *mips64r2:
5908 *vr4100:
5909 *vr5000:
5910
5911
5912 010000,1,0000000000000000000,000001:COP0:32::TLBR
5913 "tlbr"
5914 *mipsI:
5915 *mipsII:
5916 *mipsIII:
5917 *mipsIV:
5918 *mipsV:
5919 *mips32:
5920 *mips32r2:
5921 *mips64:
5922 *mips64r2:
5923 *vr4100:
5924 *vr5000:
5925
5926
5927 010000,1,0000000000000000000,000010:COP0:32::TLBWI
5928 "tlbwi"
5929 *mipsI:
5930 *mipsII:
5931 *mipsIII:
5932 *mipsIV:
5933 *mipsV:
5934 *mips32:
5935 *mips32r2:
5936 *mips64:
5937 *mips64r2:
5938 *vr4100:
5939 *vr5000:
5940
5941
5942 010000,1,0000000000000000000,000110:COP0:32::TLBWR
5943 "tlbwr"
5944 *mipsI:
5945 *mipsII:
5946 *mipsIII:
5947 *mipsIV:
5948 *mipsV:
5949 *mips32:
5950 *mips32r2:
5951 *mips64:
5952 *mips64r2:
5953 *vr4100:
5954 *vr5000:
5955
5956
5957 :include:::mips3264r2.igen
5958 :include:::m16.igen
5959 :include:::m16e.igen
5960 :include:::mdmx.igen
5961 :include:::mips3d.igen
5962 :include:::sb1.igen
5963 :include:::tx.igen
5964 :include:::vr.igen
5965 :include:::dsp.igen
5966 :include:::dsp2.igen
5967 :include:::smartmips.igen
5968