Implement 32 bit MIPS16 instructions listed in m16.igen.
[deliverable/binutils-gdb.git] / sim / mips / m16.igen
CommitLineData
c0a4c3ba
AC
1// -*- C -*-
2//
16bd5d6e
AC
3//
4// MIPS Architecture:
5//
6// CPU Instruction Set (mips16)
7//
8
9// The instructions in this section are ordered according
10// to http://www.sgi.com/MIPS/arch/MIPS16/mips16.pdf.
11
12
c0a4c3ba
AC
13// The MIPS16 codes registers in a special way, map from one to the other.
14// :<type>:<flags>:<models>:<typedef>:<name>:<field>:<expression>
15:compute:::int:TRX:RX:((RX < 2) ? (16 + RX) \: RX)
16:compute:::int:TRY:RY:((RY < 2) ? (16 + RY) \: RY)
17:compute:::int:TRZ:RZ:((RZ < 2) ? (16 + RZ) \: RZ)
18:compute:::int:SHIFT:SHAMT:((SHAMT == 0) ? 8 \: SHAMT)
19
20
21// FIXME:
22//
23// Only the `LB' instruction is implemented. It should be used as a guideline
24// when implementing other instructions.
25//
26// How to handle delayslots (for jumps) and extended lwpc instructions
27// has not been resolved.
28
29
30011101,26.INSTR_INDEX:NORMAL:32::JALX
31*r3900:
32// start-sanitize-tx19
33*tx19:
34// end-sanitize-tx19
35/// {
36/// }
16bd5d6e
AC
37
38
39// Load and Store Instructions
40
41
c0a4c3ba 4210000,3.RX,3.RY,5.IMMED:RRI:16::LB
16bd5d6e 43*mips16:
c0a4c3ba
AC
44// start-sanitize-tx19
45*tx19:
46// end-sanitize-tx19
16bd5d6e 47{
c0a4c3ba 48 GPR[TRY] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[TRX], IMMED));
16bd5d6e
AC
49}
50
51
c0a4c3ba 5210100,3.RX,3.RY,5.IMMED:RRI:16::LBU
16bd5d6e 53*mips16:
c0a4c3ba
AC
54// start-sanitize-tx19
55*tx19:
56// end-sanitize-tx19
16bd5d6e 57{
c0a4c3ba 58 GPR[TRY] = do_load (SD_, AccessLength_BYTE, GPR[TRX], IMMED);
16bd5d6e
AC
59}
60
61
c0a4c3ba 6210001,3.RX,3.RY,5.IMMED:RRI:16::LH
16bd5d6e 63*mips16:
c0a4c3ba
AC
64// start-sanitize-tx19
65*tx19:
66// end-sanitize-tx19
16bd5d6e 67{
c0a4c3ba 68 GPR[TRY] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[TRX], IMMED << 1));
16bd5d6e
AC
69}
70
71
c0a4c3ba 7210101,3.RX,3.RY,5.IMMED:RRI:16::LHU
16bd5d6e 73*mips16:
c0a4c3ba
AC
74// start-sanitize-tx19
75*tx19:
76// end-sanitize-tx19
16bd5d6e 77{
c0a4c3ba
AC
78 GPR[TRY] = do_load (SD_, AccessLength_HALFWORD, GPR[TRX], IMMED << 1);
79}
80
81
8210011,3.RX,3.RY,5.IMMED:RRI:16::LW
83*mips16:
84// start-sanitize-tx19
85*tx19:
86// end-sanitize-tx19
87{
88 GPR[TRY] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[TRX], IMMED << 2));
89}
90
91
9210110,3.RX,8.IMMED:RI:16::LWPC
93*mips16:
94// start-sanitize-tx19
95*tx19:
96// end-sanitize-tx19
97{
98 GPR[TRX] = EXTEND32 (do_load (SD_, AccessLength_WORD,
99 basepc (SD_) & ~3, IMMED << 2));
100}
101
102
10310010,3.RX,8.IMMED:RI:16::LWSP
104*mips16:
105// start-sanitize-tx19
106*tx19:
107// end-sanitize-tx19
108{
109 GPR[TRX] = EXTEND32 (do_load (SD_, AccessLength_WORD, SP, IMMED << 2));
110}
111
112
11310111,3.RX,3.RY,5.IMMED:RRI:16::LWU
114*mips16:
115// start-sanitize-tx19
116*tx19:
117// end-sanitize-tx19
118{
119 GPR[TRY] = do_load (SD_, AccessLength_WORD, GPR[TRX], IMMED << 2);
120}
121
122
12300111,3.RX,3.RY,5.IMMED:RRI:16,64::LD
124*mips16:
125// start-sanitize-tx19
126*tx19:
127// end-sanitize-tx19
128{
129 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, GPR[TRX], IMMED << 3);
130}
131
132
13311111,100,3.RY,5.IMMED:RI64:16::LDPC
134*mips16:
135// start-sanitize-tx19
136*tx19:
137// end-sanitize-tx19
138{
139 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD,
140 basepc (SD_) & ~7, IMMED << 3);
141}
142
143
14411111,000,3.RY,5.IMMED:RI64:16::LDSP
145*mips16:
146// start-sanitize-tx19
147*tx19:
148// end-sanitize-tx19
149{
150 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, SP, IMMED << 3);
151}
152
153
15411000,3.RX,3.RY,5.IMMED:RRI:16::SB
155*mips16:
156// start-sanitize-tx19
157*tx19:
158// end-sanitize-tx19
159{
160 do_store (SD_, AccessLength_BYTE, GPR[TRX], IMMED, GPR[TRY]);
161}
162
163
16411001,3.RX,3.RY,5.IMMED:RRI:16::SH
165*mips16:
166// start-sanitize-tx19
167*tx19:
168// end-sanitize-tx19
169{
170 do_store (SD_, AccessLength_HALFWORD, GPR[TRX], IMMED << 1, GPR[TRY]);
171}
172
173
17411011,3.RX,3.RY,5.IMMED:RRI:16::SW
175*mips16:
176// start-sanitize-tx19
177*tx19:
178// end-sanitize-tx19
179{
180 do_store (SD_, AccessLength_WORD, GPR[TRX], IMMED << 2, GPR[TRY]);
181}
182
183
18411010,3.RX,8.IMMED:RI:16::SWSP
185*mips16:
186// start-sanitize-tx19
187*tx19:
188// end-sanitize-tx19
189{
190 do_store (SD_, AccessLength_WORD, SP, IMMED << 2, GPR[TRX]);
191}
192
193
19401100,010,8.IMMED:I8:16::SWRASP
195*mips16:
196// start-sanitize-tx19
197*tx19:
198// end-sanitize-tx19
199{
200 do_store (SD_, AccessLength_WORD, SP, IMMED << 2, RA);
201}
202
203
20401111,3.RX,3.RY,5.IMMED:RRI:16::SD
205*mips16:
206// start-sanitize-tx19
207*tx19:
208// end-sanitize-tx19
209{
210 do_store (SD_, AccessLength_DOUBLEWORD, GPR[TRX], IMMED << 3, GPR[TRY]);
211}
212
213
21411111,001,3.RY,5.IMMED:RI64:16::SDSP
215*mips16:
216// start-sanitize-tx19
217*tx19:
218// end-sanitize-tx19
219{
220 do_store (SD_, AccessLength_DOUBLEWORD, SP, IMMED << 3, GPR[TRY]);
221}
222
223
22411111,010,8.IMMED:I64:16::SDRASP
225*mips16:
226// start-sanitize-tx19
227*tx19:
228// end-sanitize-tx19
229{
230 do_store (SD_, AccessLength_DOUBLEWORD, SP, IMMED << 3, RA);
16bd5d6e
AC
231}
232
233
234// ALU Immediate Instructions
235
236
c0a4c3ba 23701101,3.RX,8.IMMED::RI:16::LI
16bd5d6e 238*mips16:
c0a4c3ba
AC
239// start-sanitize-tx19
240*tx19:
241// end-sanitize-tx19
16bd5d6e 242{
c0a4c3ba 243 do_ori (SD_, 0, TRX, IMMED);
16bd5d6e
AC
244}
245
246
c0a4c3ba 24701000,3.RX,3.RY,0,4.IMMED:RRI_A:16::ADDIU
16bd5d6e 248*mips16:
c0a4c3ba
AC
249// start-sanitize-tx19
250*tx19:
251// end-sanitize-tx19
16bd5d6e 252{
c0a4c3ba 253 do_addiu (SD_, TRX, TRY, EXTEND4 (IMMED));
16bd5d6e
AC
254}
255
256
c0a4c3ba 25701001,3.RX,8.IMMED:RI:16::ADDIU8
16bd5d6e 258*mips16:
c0a4c3ba
AC
259// start-sanitize-tx19
260*tx19:
261// end-sanitize-tx19
16bd5d6e 262{
c0a4c3ba 263 do_addiu (SD_, TRX, TRX, EXTEND8 (IMMED));
16bd5d6e
AC
264}
265
266
c0a4c3ba 26701100,011,8.IMMED:I8:16::ADJSP
16bd5d6e 268*mips16:
c0a4c3ba
AC
269// start-sanitize-tx19
270*tx19:
271// end-sanitize-tx19
16bd5d6e 272{
c0a4c3ba 273 do_addiu (SD_, SPIDX, SPIDX, EXTEND8 (IMMED) << 3);
16bd5d6e
AC
274}
275
276
c0a4c3ba 27700001,3.RX,8.IMMED:RI:16::ADDIUPC
16bd5d6e 278*mips16:
c0a4c3ba
AC
279// start-sanitize-tx19
280*tx19:
281// end-sanitize-tx19
16bd5d6e 282{
c0a4c3ba
AC
283 unsigned32 temp = (basepc (SD_) & ~3) + (EXTEND8 (IMMED) << 2);
284 GPR[TRX] = EXTEND32 (temp);
16bd5d6e
AC
285}
286
287
c0a4c3ba 28800000,3.RX,8.IMMED:RI:16::ADDIUSP
16bd5d6e 289*mips16:
c0a4c3ba
AC
290// start-sanitize-tx19
291*tx19:
292// end-sanitize-tx19
16bd5d6e 293{
c0a4c3ba 294 do_addiu (SD_, SPIDX, TRX, EXTEND8 (IMMED) << 2);
16bd5d6e
AC
295}
296
297
c0a4c3ba 29801000,3.RX,3.RY,1,4.IMMED:RRI_A:16,64::DADDIU
16bd5d6e 299*mips16:
c0a4c3ba
AC
300// start-sanitize-tx19
301*tx19:
302// end-sanitize-tx19
16bd5d6e 303{
c0a4c3ba 304 do_daddiu (SD_, TRX, TRY, EXTEND4 (IMMED));
16bd5d6e
AC
305}
306
307
c0a4c3ba 30811111,101,3.RY,5.IMMED:RI64:16,64::DADDIU5
16bd5d6e 309*mips16:
c0a4c3ba
AC
310// start-sanitize-tx19
311*tx19:
312// end-sanitize-tx19
16bd5d6e 313{
c0a4c3ba 314 do_daddiu (SD_, TRY, TRY, EXTEND5 (IMMED));
16bd5d6e
AC
315}
316
317
c0a4c3ba 31811111,011,8.IMMED:I64:16,64::DADJSP
16bd5d6e 319*mips16:
c0a4c3ba
AC
320// start-sanitize-tx19
321*tx19:
322// end-sanitize-tx19
16bd5d6e 323{
c0a4c3ba 324 do_daddiu (SD_, SPIDX, SPIDX, EXTEND8 (IMMED) << 3);
16bd5d6e
AC
325}
326
327
c0a4c3ba 32811111,110,3.RY,5.IMMED:RI64:16,64::DADDIUPC
16bd5d6e 329*mips16:
c0a4c3ba
AC
330// start-sanitize-tx19
331*tx19:
332// end-sanitize-tx19
16bd5d6e 333{
c0a4c3ba 334 GPR[TRY] = (basepc (SD_) & ~3) + (EXTEND5 (IMMED) << 2);
16bd5d6e
AC
335}
336
337
c0a4c3ba 33811111,111,3.RY,5.IMMED:RI64:16,64::DADDIUSP
16bd5d6e 339*mips16:
c0a4c3ba
AC
340// start-sanitize-tx19
341*tx19:
342// end-sanitize-tx19
16bd5d6e 343{
c0a4c3ba 344 do_daddiu (SD_, SPIDX, TRY, EXTEND5 (IMMED) << 2);
16bd5d6e
AC
345}
346
347
c0a4c3ba 34801010,3.RX,8.IMMED:RI:16::SLTI
16bd5d6e 349*mips16:
c0a4c3ba
AC
350// start-sanitize-tx19
351*tx19:
352// end-sanitize-tx19
16bd5d6e 353{
c0a4c3ba 354 do_slti (SD_, TRX, T8IDX, IMMED);
16bd5d6e
AC
355}
356
357
c0a4c3ba 35801011,3.RX,8.IMMED:RI:16::SLTIU
16bd5d6e 359*mips16:
c0a4c3ba
AC
360// start-sanitize-tx19
361*tx19:
362// end-sanitize-tx19
16bd5d6e 363{
c0a4c3ba 364 do_sltiu (SD_, TRX, T8IDX, IMMED);
16bd5d6e
AC
365}
366
367
c0a4c3ba 36811101,3.RX,3.RY,01010:RR:16::CMP
16bd5d6e 369*mips16:
c0a4c3ba
AC
370// start-sanitize-tx19
371*tx19:
372// end-sanitize-tx19
16bd5d6e 373{
c0a4c3ba
AC
374 do_xor (SD_, TRX, TRY, T8IDX);
375}
376
377
37801110,3.RX,8.IMMED:RI:16::CMPI
379*mips16:
380// start-sanitize-tx19
381*tx19:
382// end-sanitize-tx19
383{
384 do_xori (SD_, TRX, T8IDX, IMMED);
16bd5d6e
AC
385}
386
387
388// Two/Three Operand, Register-Type
389
390
c0a4c3ba
AC
39111100,3.RX,3.RY,3.RZ,01:RRR:16::ADDU
392*mips16:
393// start-sanitize-tx19
394*tx19:
395// end-sanitize-tx19
396{
397 do_addu (SD_, TRX, TRY, TRZ);
16bd5d6e
AC
398}
399
400
c0a4c3ba 40111100,3.RX,3.RY,3.RZ,11:RRR:16::SUBU
16bd5d6e 402*mips16:
c0a4c3ba
AC
403// start-sanitize-tx19
404*tx19:
405// end-sanitize-tx19
16bd5d6e 406{
c0a4c3ba 407 do_subu (SD_, TRX, TRY, TRZ);
16bd5d6e
AC
408}
409
410
c0a4c3ba 41111100,3.RX,3.RY,3.RZ,00:RRR:16,64::DADDU
16bd5d6e 412*mips16:
c0a4c3ba
AC
413// start-sanitize-tx19
414*tx19:
415// end-sanitize-tx19
16bd5d6e 416{
c0a4c3ba
AC
417 do_daddu (SD_, TRX, TRY, TRZ);
418}
419
420
42111100,3.RX,3.RY,3.RZ,10:RRR:16,64::DSUBU
422*mips16:
423// start-sanitize-tx19
424*tx19:
425// end-sanitize-tx19
426{
427 do_dsubu (SD_, TRX, TRY, TRZ);
428}
429
430
43111101,3.RX,3.RY,00010:RR:16::SLT
432*mips16:
433// start-sanitize-tx19
434*tx19:
435// end-sanitize-tx19
436{
437 do_slt (SD_, TRX, TRY, T8IDX);
438}
439
440
44111101,3.RX,3.RY,00011:RR:16::SLTU
442*mips16:
443// start-sanitize-tx19
444*tx19:
445// end-sanitize-tx19
446{
447 do_sltu (SD_, TRX, TRY, T8IDX);
448}
449
450
45111101,3.RX,3.RY,01011:RR:16::NEG
452*mips16:
453// start-sanitize-tx19
454*tx19:
455// end-sanitize-tx19
456{
457 do_subu (SD_, 0, TRY, TRX);
458}
459
460
46111101,3.RX,3.RY,01100:RR:16::AND
462*mips16:
463// start-sanitize-tx19
464*tx19:
465// end-sanitize-tx19
466{
467 do_and (SD_, TRX, TRY, TRX);
468}
469
470
47111101,3.RX,3.RY,01101:RR:16::OR
472*mips16:
473// start-sanitize-tx19
474*tx19:
475// end-sanitize-tx19
476{
477 do_or (SD_, TRX, TRY, TRX);
478}
479
480
48111101,3.RX,3.RY,01110:RR:16::XOR
482*mips16:
483// start-sanitize-tx19
484*tx19:
485// end-sanitize-tx19
486{
487 do_xor (SD_, TRX, TRY, TRX);
488}
489
490
49111101,3.RX,3.RY,01111:RR:16::NOT
492*mips16:
493// start-sanitize-tx19
494*tx19:
495// end-sanitize-tx19
496{
497 do_nor (SD_, 0, TRY, TRX);
498}
499
500
50101100,111,3.RY,5.R32:I8_MOVR32:16::MOVR32
502*mips16:
503// start-sanitize-tx19
504*tx19:
505// end-sanitize-tx19
506{
507 do_or (SD_, R32, 0, TRY);
508}
509
510
51101100,101,3.R32L,2.R32H,3.RZ:I8_MOV32R:16::MOV32R
512*mips16:
513// start-sanitize-tx19
514*tx19:
515// end-sanitize-tx19
516{
517 do_or (SD_, TRZ, 0, (R32H << 3) | R32L);
518}
519
520
52100110,3.RX,3.RY,3.SHAMT,00:ISHIFT:16::SLL
522*mips16:
523// start-sanitize-tx19
524*tx19:
525// end-sanitize-tx19
526{
527 do_sll (SD_, TRY, TRX, SHIFT);
528}
529
530
53100110,3.RX,3.RY,3.SHAMT,10:ISHIFT:16::SRL
532*mips16:
533// start-sanitize-tx19
534*tx19:
535// end-sanitize-tx19
536{
537 do_srl (SD_, TRY, TRX, SHIFT);
538}
539
540
54100110,3.RX,3.RY,3.SHAMT,11:ISHIFT:16::SRA
542*mips16:
543// start-sanitize-tx19
544*tx19:
545// end-sanitize-tx19
546{
547 do_sra (SD_, TRY, TRX, SHIFT);
548}
549
550
55111101,3.RX,3.RY,00100:RR:16::SLLV
552*mips16:
553// start-sanitize-tx19
554*tx19:
555// end-sanitize-tx19
556{
557 do_sllv (SD_, TRX, TRY, TRY);
558}
559
560
56111101,3.RX,3.RY,00110:RR:16::SRLV
562*mips16:
563// start-sanitize-tx19
564*tx19:
565// end-sanitize-tx19
566{
567 do_srlv (SD_, TRX, TRY, TRY);
568}
569
570
57111101,3.RX,3.RY,00111:RR:16::SRAV
572*mips16:
573// start-sanitize-tx19
574*tx19:
575// end-sanitize-tx19
576{
577 do_srav (SD_, TRX, TRY, TRY);
578}
579
580
58100110,3.RX,3.RY,3.SHAMT,01:ISHIFT:16,64::DSLL
582*mips16:
583// start-sanitize-tx19
584*tx19:
585// end-sanitize-tx19
586{
587 do_dsll (SD_, 0, TRY, TRX, SHIFT);
16bd5d6e
AC
588}
589
590
c0a4c3ba 59111101,3.SHAMT,3.RY,01000:RR:16,64::DSRL
16bd5d6e 592*mips16:
c0a4c3ba
AC
593// start-sanitize-tx19
594*tx19:
595// end-sanitize-tx19
16bd5d6e 596{
c0a4c3ba 597 do_dsrl (SD_, 0, TRY, TRY, SHIFT);
16bd5d6e
AC
598}
599
600
c0a4c3ba 60111101,3.SHAMT,3.RY,10011:RR:16,64::DSRA
16bd5d6e 602*mips16:
c0a4c3ba
AC
603// start-sanitize-tx19
604*tx19:
605// end-sanitize-tx19
16bd5d6e 606{
c0a4c3ba
AC
607 do_dsra (SD_, 0, TRY, TRY, SHIFT);
608}
609
610
61111101,3.RX,3.RY,10100:RR:16,64::DSLLV
612*mips16:
613// start-sanitize-tx19
614*tx19:
615// end-sanitize-tx19
616{
617 do_dsllv (SD_, TRX, TRY, TRY);
618}
619
620
62111101,3.RX,3.RY,10110:RR:16,64::DSRLV
622*mips16:
623// start-sanitize-tx19
624*tx19:
625// end-sanitize-tx19
626{
627 do_dsrlv (SD_, TRX, TRY, TRY);
628}
629
630
63111101,3.RX,3.RY,10111:RR:16,64::DSRAV
632*mips16:
633// start-sanitize-tx19
634*tx19:
635// end-sanitize-tx19
636{
637 do_dsrav (SD_, TRX, TRY, TRY);
16bd5d6e
AC
638}
639
640
641// Multiply /Divide Instructions
642
643
c0a4c3ba 64411101,3.RX,3.RY,11000:RR:16::MULT
16bd5d6e 645*mips16:
c0a4c3ba
AC
646// start-sanitize-tx19
647*tx19:
648// end-sanitize-tx19
16bd5d6e 649{
c0a4c3ba 650 do_mult (SD_, TRX, TRY, 0);
16bd5d6e
AC
651}
652
653
c0a4c3ba 65411101,3.RX,3.RY,11001:RR:16::MULTU
16bd5d6e 655*mips16:
c0a4c3ba
AC
656// start-sanitize-tx19
657*tx19:
658// end-sanitize-tx19
16bd5d6e 659{
c0a4c3ba 660 do_multu (SD_, TRX, TRY, 0);
16bd5d6e
AC
661}
662
663
c0a4c3ba 66411101,3.RX,3.RY,11010:RR:16::DIV
16bd5d6e 665*mips16:
c0a4c3ba
AC
666// start-sanitize-tx19
667*tx19:
668// end-sanitize-tx19
16bd5d6e 669{
c0a4c3ba 670 do_div (SD_, TRX, TRY);
16bd5d6e
AC
671}
672
673
c0a4c3ba 67411101,3.RX,3.RY,11011:RR:16::DIVU
16bd5d6e 675*mips16:
c0a4c3ba
AC
676// start-sanitize-tx19
677*tx19:
678// end-sanitize-tx19
16bd5d6e 679{
c0a4c3ba 680 do_divu (SD_, TRX, TRY);
16bd5d6e
AC
681}
682
683
c0a4c3ba 68411101,3.RX,000,10000:RR:16::MFHI
16bd5d6e 685*mips16:
c0a4c3ba
AC
686// start-sanitize-tx19
687*tx19:
688// end-sanitize-tx19
16bd5d6e 689{
c0a4c3ba 690 do_mfhi (SD_, TRX);
16bd5d6e
AC
691}
692
693
c0a4c3ba 69411101,3.RX,000,10010:RR:16::MFLO
16bd5d6e 695*mips16:
c0a4c3ba
AC
696// start-sanitize-tx19
697*tx19:
698// end-sanitize-tx19
16bd5d6e 699{
c0a4c3ba 700 do_mflo (SD_, TRX);
16bd5d6e
AC
701}
702
703
c0a4c3ba 70411101,3.RX,3.RY,11100:RR:16,64::DMULT
16bd5d6e 705*mips16:
c0a4c3ba
AC
706// start-sanitize-tx19
707*tx19:
708// end-sanitize-tx19
16bd5d6e 709{
c0a4c3ba 710 do_dmult (SD_, TRX, TRY);
16bd5d6e
AC
711}
712
713
c0a4c3ba 71411101,3.RX,3.RY,11101:RR:16,64::DMULTU
16bd5d6e 715*mips16:
c0a4c3ba
AC
716// start-sanitize-tx19
717*tx19:
718// end-sanitize-tx19
16bd5d6e 719{
c0a4c3ba 720 do_dmultu (SD_, TRX, TRY);
16bd5d6e
AC
721}
722
723
c0a4c3ba 72411101,3.RX,3.RY,11110:RR:16,64::DDIV
16bd5d6e 725*mips16:
c0a4c3ba
AC
726// start-sanitize-tx19
727*tx19:
728// end-sanitize-tx19
16bd5d6e 729{
c0a4c3ba 730 do_ddiv (SD_, TRX, TRY);
16bd5d6e
AC
731}
732
733
c0a4c3ba 73411101,3.RX,3.RY,11111:RR:16,64::DDIVU
16bd5d6e 735*mips16:
c0a4c3ba
AC
736// start-sanitize-tx19
737*tx19:
738// end-sanitize-tx19
16bd5d6e 739{
c0a4c3ba 740 do_ddivu (SD_, TRX, TRY);
16bd5d6e
AC
741}
742
743
744// Jump and Branch Instructions
745
746
c0a4c3ba
AC
747
748// Issue instruction in delay slot of branch
749:function:::address_word:delayslot16:address_word target
750{
751 instruction_word delay_insn;
752 sim_events_slip (SD, 1);
753 DSPC = CIA; /* save current PC somewhere */
754 CIA = CIA + 2; /* NOTE: mips16 */
755 STATE |= simDELAYSLOT;
756 delay_insn = IMEM16 (CIA); /* NOTE: mips16 */
757 idecode_issue (CPU_, delay_insn, (CIA));
758 STATE &= ~simDELAYSLOT;
759 return target;
760}
761
762// compute basepc dependant on us being in a delay slot
763:function:::address_word:basepc:
764{
765 if (STATE & simDELAYSLOT)
16bd5d6e 766 {
c0a4c3ba 767 return DSPC; /* return saved address of preceeding jmp */
16bd5d6e
AC
768 }
769 else
770 {
c0a4c3ba 771 return CIA;
16bd5d6e 772 }
16bd5d6e
AC
773}
774
775
c0a4c3ba
AC
776// JAL
77700011,0,5.IMM_20_16,5.IMM_25_21 + 16.IMMED_15_0:I:16::JAL
16bd5d6e 778*mips16:
c0a4c3ba
AC
779// start-sanitize-tx19
780*tx19:
781// end-sanitize-tx19
16bd5d6e 782{
c0a4c3ba
AC
783 NIA = delayslot16 (SD_,
784 (LSMASKED (NIA, 31, 26)
785 | LSINSERTED (IMM_25_21, 25, 21)
786 | LSINSERTED (IMM_20_16, 20, 16)
787 | LSINSERTED (IMMED_15_0, 15, 0)));
16bd5d6e
AC
788}
789
790
c0a4c3ba
AC
791// JALX
79200011,1,5.IMM_20_16,5.IMM_25_21 + 16.IMMED_15_0:I:16::JALX
16bd5d6e 793*mips16:
c0a4c3ba
AC
794// start-sanitize-tx19
795*tx19:
796// end-sanitize-tx19
16bd5d6e 797{
c0a4c3ba
AC
798 NIA = delayslot16 (SD_,
799 (LSMASKED (NIA, 31, 26)
800 | LSINSERTED (IMM_25_21, 25, 21)
801 | LSINSERTED (IMM_20_16, 20, 16)
802 | LSINSERTED (IMMED_15_0, 15, 0)));
803 NIA = NIA ^ 1;
16bd5d6e
AC
804}
805
806
c0a4c3ba 80711101,3.RX,000,00000:RR:16::JR
16bd5d6e 808*mips16:
c0a4c3ba
AC
809// start-sanitize-tx19
810*tx19:
811// end-sanitize-tx19
16bd5d6e 812{
c0a4c3ba 813 NIA = delayslot16 (SD_, GPR[TRX]);
16bd5d6e
AC
814}
815
816
c0a4c3ba 81711101,000,001,00000:RR:16::JRRA
16bd5d6e 818*mips16:
c0a4c3ba
AC
819// start-sanitize-tx19
820*tx19:
821// end-sanitize-tx19
16bd5d6e 822{
c0a4c3ba 823 NIA = delayslot16 (SD_, RA);
16bd5d6e
AC
824}
825
826
c0a4c3ba
AC
82711101,3.RX,010,00000:RR:16::JALR
828*mips16:
829// start-sanitize-tx19
830*tx19:
831// end-sanitize-tx19
832{
833 RA = NIA + 2;
834 NIA = delayslot16 (SD_, GPR[TRX]);
835}
16bd5d6e
AC
836
837
c0a4c3ba
AC
83800100,3.RX,8.IMMED:RI:16::BEQZ
839*mips16:
840// start-sanitize-tx19
841*tx19:
842// end-sanitize-tx19
843{
844 if (GPR[RX] == 0)
845 NIA = (NIA + (EXTEND8 (IMMED) << 2));
846}
847
848
84900101,3.RX,8.IMMED:RI:16::BNEZ
850*mips16:
851// start-sanitize-tx19
852*tx19:
853// end-sanitize-tx19
854{
855 if (GPR[RX] != 0)
856 NIA = (NIA + (EXTEND8 (IMMED) << 2));
857}
858
859
86001100,000,8.IMMED:I8:16::BTEQZ
861*mips16:
862// start-sanitize-tx19
863*tx19:
864// end-sanitize-tx19
865{
866 if (T8 == 0)
867 NIA = (NIA + (EXTEND8 (IMMED) << 2));
868}
869
870
87101100,001,8.IMMED:I8:16::BTNEZ
16bd5d6e 872*mips16:
c0a4c3ba
AC
873// start-sanitize-tx19
874*tx19:
875// end-sanitize-tx19
16bd5d6e 876{
c0a4c3ba
AC
877 if (T8 != 0)
878 NIA = (NIA + (EXTEND8 (IMMED) << 2));
16bd5d6e
AC
879}
880
881
c0a4c3ba 88200010,11.IMMED:I:16::B
16bd5d6e 883*mips16:
c0a4c3ba
AC
884// start-sanitize-tx19
885*tx19:
886// end-sanitize-tx19
16bd5d6e 887{
c0a4c3ba 888 NIA = (NIA + (EXTEND8 (IMMED) << 2));
16bd5d6e
AC
889}
890
c0a4c3ba
AC
891
892// Special Instructions
893
894
895// See the front of the mips16 doc
896// -> FIXME need this for most instructions
897// 11110,eeeeeeeeeee:I:16::EXTEND
898// *mips16:
899// // start-sanitize-tx19
900// *tx19:
901// // end-sanitize-tx19
902
903
904// 11101,3.RX,3.RY,00101:RR:16::BREAK
905// *mips16:
906// // start-sanitize-tx19
907// *tx19:
908// // end-sanitize-tx19
This page took 0.10343 seconds and 4 git commands to generate.