xref: /openbmc/qemu/disas/nanomips.c (revision 159fb790)
1 /*
2  *  Source file for nanoMIPS disassembler component of QEMU
3  *
4  *  Copyright (C) 2018  Wave Computing, Inc.
5  *  Copyright (C) 2018  Matthew Fortune <matthew.fortune@mips.com>
6  *  Copyright (C) 2018  Aleksandar Markovic <amarkovic@wavecomp.com>
7  *
8  *  This program is free software: you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation, either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
20  *
21  */
22 
23 /*
24  *  Documentation used while implementing this component:
25  *
26  *  [1] "MIPS® Architecture Base: nanoMIPS32(tm) Instruction Set Technical
27  *      Reference Manual", Revision 01.01, April 27, 2018
28  */
29 
30 #include "qemu/osdep.h"
31 #include "disas/dis-asm.h"
32 
33 typedef int64_t int64;
34 typedef uint64_t uint64;
35 typedef uint32_t uint32;
36 typedef uint16_t uint16;
37 typedef uint64_t img_address;
38 
39 typedef struct Dis_info {
40   img_address m_pc;
41   fprintf_function fprintf_func;
42   FILE *stream;
43   sigjmp_buf buf;
44 } Dis_info;
45 
46 #define IMGASSERTONCE(test)
47 
48 
49 static char * G_GNUC_PRINTF(1, 2) img_format(const char *format, ...)
50 {
51     char *buffer;
52     va_list args;
53     va_start(args, format);
54     buffer = g_strdup_vprintf(format, args);
55     va_end(args);
56     return buffer;
57 }
58 
59 
60 static char *to_string(img_address a)
61 {
62     return g_strdup_printf("0x%" PRIx64, a);
63 }
64 
65 
66 static uint64 extract_bits(uint64 data, uint32 bit_offset, uint32 bit_size)
67 {
68     return (data << (64 - (bit_size + bit_offset))) >> (64 - bit_size);
69 }
70 
71 
72 static int64 sign_extend(int64 data, int msb)
73 {
74     uint64 shift = 63 - msb;
75     return (data << shift) >> shift;
76 }
77 
78 
79 static uint64 renumber_registers(uint64 index, uint64 *register_list,
80                                size_t register_list_size, Dis_info *info)
81 {
82     if (index < register_list_size) {
83         return register_list[index];
84     }
85 
86     info->fprintf_func(info->stream, "Invalid register mapping index %" PRIu64
87                        ", size of list = %zu", index, register_list_size);
88     siglongjmp(info->buf, 1);
89 }
90 
91 
92 /*
93  * decode_gpr_gpr4() - decoder for 'gpr4' gpr encoding type
94  *
95  *   Map a 4-bit code to the 5-bit register space according to this pattern:
96  *
97  *                              1                   0
98  *                    5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
99  *                    | | | | | | | | | | | | | | | |
100  *                    | | | | | | | | | | | | | | | |
101  *                    | | | | | | | | | | | └---------------┐
102  *                    | | | | | | | | | | └---------------┐ |
103  *                    | | | | | | | | | └---------------┐ | |
104  *                    | | | | | | | | └---------------┐ | | |
105  *                    | | | | | | | |         | | | | | | | |
106  *                    | | | | | | | |         | | | | | | | |
107  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
108  *      3                   2                   1                   0
109  *
110  *   Used in handling following instructions:
111  *
112  *     - ADDU[4X4]
113  *     - LW[4X4]
114  *     - MOVEP[REV]
115  *     - MUL[4X4]
116  *     - SW[4X4]
117  */
118 static uint64 decode_gpr_gpr4(uint64 d, Dis_info *info)
119 {
120     static uint64 register_list[] = {  8,  9, 10, 11,  4,  5,  6,  7,
121                                       16, 17, 18, 19, 20, 21, 22, 23 };
122     return renumber_registers(d, register_list,
123                sizeof(register_list) / sizeof(register_list[0]), info);
124 }
125 
126 
127 /*
128  * decode_gpr_gpr4_zero() - decoder for 'gpr4.zero' gpr encoding type
129  *
130  *   Map a 4-bit code to the 5-bit register space according to this pattern:
131  *
132  *                              1                   0
133  *                    5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
134  *                    | | | | | | | | | | | | | | | |
135  *                    | | | | | | | | | | | | └---------------------┐
136  *                    | | | | | | | | | | | └---------------┐       |
137  *                    | | | | | | | | | | └---------------┐ |       |
138  *                    | | | | | | | | | └---------------┐ | |       |
139  *                    | | | | | | | | └---------------┐ | | |       |
140  *                    | | | | | | | |           | | | | | | |       |
141  *                    | | | | | | | |           | | | | | | |       |
142  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
143  *      3                   2                   1                   0
144  *
145  *   This pattern is the same one used for 'gpr4' gpr encoding type, except for
146  * the input value 3, that is mapped to the output value 0 instead of 11.
147  *
148  *   Used in handling following instructions:
149  *
150  *     - MOVE.BALC
151  *     - MOVEP
152  *     - SW[4X4]
153  */
154 static uint64 decode_gpr_gpr4_zero(uint64 d, Dis_info *info)
155 {
156     static uint64 register_list[] = {  8,  9, 10,  0,  4,  5,  6,  7,
157                                       16, 17, 18, 19, 20, 21, 22, 23 };
158     return renumber_registers(d, register_list,
159                sizeof(register_list) / sizeof(register_list[0]), info);
160 }
161 
162 
163 /*
164  * decode_gpr_gpr3() - decoder for 'gpr3' gpr encoding type
165  *
166  *   Map a 3-bit code to the 5-bit register space according to this pattern:
167  *
168  *                            7 6 5 4 3 2 1 0
169  *                            | | | | | | | |
170  *                            | | | | | | | |
171  *                            | | | └-----------------------┐
172  *                            | | └-----------------------┐ |
173  *                            | └-----------------------┐ | |
174  *                            └-----------------------┐ | | |
175  *                                    | | | |         | | | |
176  *                            ┌-------┘ | | |         | | | |
177  *                            | ┌-------┘ | |         | | | |
178  *                            | | ┌-------┘ |         | | | |
179  *                            | | | ┌-------┘         | | | |
180  *                            | | | |                 | | | |
181  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
182  *      3                   2                   1                   0
183  *
184  *   Used in handling following instructions:
185  *
186  *     - ADDIU[R1.SP]
187  *     - ADDIU[R2]
188  *     - ADDU[16]
189  *     - AND[16]
190  *     - ANDI[16]
191  *     - BEQC[16]
192  *     - BEQZC[16]
193  *     - BNEC[16]
194  *     - BNEZC[16]
195  *     - LB[16]
196  *     - LBU[16]
197  *     - LH[16]
198  *     - LHU[16]
199  *     - LI[16]
200  *     - LW[16]
201  *     - LW[GP16]
202  *     - LWXS[16]
203  *     - NOT[16]
204  *     - OR[16]
205  *     - SB[16]
206  *     - SH[16]
207  *     - SLL[16]
208  *     - SRL[16]
209  *     - SUBU[16]
210  *     - SW[16]
211  *     - XOR[16]
212  */
213 static uint64 decode_gpr_gpr3(uint64 d, Dis_info *info)
214 {
215     static uint64 register_list[] = { 16, 17, 18, 19,  4,  5,  6,  7 };
216     return renumber_registers(d, register_list,
217                sizeof(register_list) / sizeof(register_list[0]), info);
218 }
219 
220 
221 /*
222  * decode_gpr_gpr3_src_store() - decoder for 'gpr3.src.store' gpr encoding
223  *     type
224  *
225  *   Map a 3-bit code to the 5-bit register space according to this pattern:
226  *
227  *                            7 6 5 4 3 2 1 0
228  *                            | | | | | | | |
229  *                            | | | | | | | └-----------------------┐
230  *                            | | | └-----------------------┐       |
231  *                            | | └-----------------------┐ |       |
232  *                            | └-----------------------┐ | |       |
233  *                            └-----------------------┐ | | |       |
234  *                                    | | |           | | | |       |
235  *                            ┌-------┘ | |           | | | |       |
236  *                            | ┌-------┘ |           | | | |       |
237  *                            | | ┌-------┘           | | | |       |
238  *                            | | |                   | | | |       |
239  *                            | | |                   | | | |       |
240  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
241  *      3                   2                   1                   0
242  *
243  *   This pattern is the same one used for 'gpr3' gpr encoding type, except for
244  * the input value 0, that is mapped to the output value 0 instead of 16.
245  *
246  *   Used in handling following instructions:
247  *
248  *     - SB[16]
249  *     - SH[16]
250  *     - SW[16]
251  *     - SW[GP16]
252  */
253 static uint64 decode_gpr_gpr3_src_store(uint64 d, Dis_info *info)
254 {
255     static uint64 register_list[] = {  0, 17, 18, 19,  4,  5,  6,  7 };
256     return renumber_registers(d, register_list,
257                sizeof(register_list) / sizeof(register_list[0]), info);
258 }
259 
260 
261 /*
262  * decode_gpr_gpr2_reg1() - decoder for 'gpr2.reg1' gpr encoding type
263  *
264  *   Map a 2-bit code to the 5-bit register space according to this pattern:
265  *
266  *                                3 2 1 0
267  *                                | | | |
268  *                                | | | |
269  *                                | | | └-------------------┐
270  *                                | | └-------------------┐ |
271  *                                | └-------------------┐ | |
272  *                                └-------------------┐ | | |
273  *                                                    | | | |
274  *                                                    | | | |
275  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
276  *      3                   2                   1                   0
277  *
278  *   Used in handling following instructions:
279  *
280  *     - MOVEP
281  *     - MOVEP[REV]
282  */
283 static uint64 decode_gpr_gpr2_reg1(uint64 d, Dis_info *info)
284 {
285     static uint64 register_list[] = {  4,  5,  6,  7 };
286     return renumber_registers(d, register_list,
287                sizeof(register_list) / sizeof(register_list[0]), info);
288 }
289 
290 
291 /*
292  * decode_gpr_gpr2_reg2() - decoder for 'gpr2.reg2' gpr encoding type
293  *
294  *   Map a 2-bit code to the 5-bit register space according to this pattern:
295  *
296  *                                3 2 1 0
297  *                                | | | |
298  *                                | | | |
299  *                                | | | └-----------------┐
300  *                                | | └-----------------┐ |
301  *                                | └-----------------┐ | |
302  *                                └-----------------┐ | | |
303  *                                                  | | | |
304  *                                                  | | | |
305  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
306  *      3                   2                   1                   0
307  *
308  *   Used in handling following instructions:
309  *
310  *     - MOVEP
311  *     - MOVEP[REV]
312  */
313 static uint64 decode_gpr_gpr2_reg2(uint64 d, Dis_info *info)
314 {
315     static uint64 register_list[] = {  5,  6,  7,  8 };
316     return renumber_registers(d, register_list,
317                sizeof(register_list) / sizeof(register_list[0]), info);
318 }
319 
320 
321 /*
322  * decode_gpr_gpr1() - decoder for 'gpr1' gpr encoding type
323  *
324  *   Map a 1-bit code to the 5-bit register space according to this pattern:
325  *
326  *                                  1 0
327  *                                  | |
328  *                                  | |
329  *                                  | └---------------------┐
330  *                                  └---------------------┐ |
331  *                                                        | |
332  *                                                        | |
333  *                                                        | |
334  *                                                        | |
335  *    1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
336  *      3                   2                   1                   0
337  *
338  *   Used in handling following instruction:
339  *
340  *     - MOVE.BALC
341  */
342 static uint64 decode_gpr_gpr1(uint64 d, Dis_info *info)
343 {
344     static uint64 register_list[] = {  4,  5 };
345     return renumber_registers(d, register_list,
346                sizeof(register_list) / sizeof(register_list[0]), info);
347 }
348 
349 
350 static int64 neg_copy(uint64 d)
351 {
352     return 0ll - d;
353 }
354 
355 
356 static uint64 encode_count3_from_count(uint64 d)
357 {
358     IMGASSERTONCE(d < 8);
359     return d == 0ull ? 8ull : d;
360 }
361 
362 
363 static uint64 encode_shift3_from_shift(uint64 d)
364 {
365     IMGASSERTONCE(d < 8);
366     return d == 0ull ? 8ull : d;
367 }
368 
369 
370 /* special value for load literal */
371 static int64 encode_eu_from_s_li16(uint64 d)
372 {
373     IMGASSERTONCE(d < 128);
374     return d == 127 ? -1 : (int64)d;
375 }
376 
377 
378 static uint64 encode_msbd_from_size(uint64 d)
379 {
380     IMGASSERTONCE(d < 32);
381     return d + 1;
382 }
383 
384 
385 static uint64 encode_eu_from_u_andi16(uint64 d)
386 {
387     IMGASSERTONCE(d < 16);
388     if (d == 12) {
389         return 0x00ffull;
390     }
391     if (d == 13) {
392         return 0xffffull;
393     }
394     return d;
395 }
396 
397 
398 /* save16 / restore16   ???? */
399 static uint64 encode_rt1_from_rt(uint64 d)
400 {
401     return d ? 31 : 30;
402 }
403 
404 
405 static const char *GPR(uint64 reg, Dis_info *info)
406 {
407     static const char *gpr_reg[32] = {
408         "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
409         "a4",   "a5",   "a6",   "a7",   "r12",  "r13",  "r14",  "r15",
410         "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
411         "r24",  "r25",  "k0",   "k1",   "gp",   "sp",   "fp",   "ra"
412     };
413 
414     if (reg < 32) {
415         return gpr_reg[reg];
416     }
417 
418     info->fprintf_func(info->stream, "Invalid GPR register index %" PRIu64,
419                        reg);
420     siglongjmp(info->buf, 1);
421 }
422 
423 
424 static char *save_restore_list(uint64 rt, uint64 count, uint64 gp,
425                                Dis_info *info)
426 {
427     char *reg_list[34];
428     reg_list[0] = (char *)"";
429 
430     assert(count <= 32);
431     for (uint64 counter = 0; counter != count; counter++) {
432         bool use_gp = gp && (counter == count - 1);
433         uint64 this_rt = use_gp ? 28 : ((rt & 0x10) | (rt + counter)) & 0x1f;
434         /* glib usage below requires casting away const */
435         reg_list[counter + 1] = (char *)GPR(this_rt, info);
436     }
437     reg_list[count + 1] = NULL;
438 
439     return g_strjoinv(",", reg_list);
440 }
441 
442 
443 static const char *FPR(uint64 reg, Dis_info *info)
444 {
445     static const char *fpr_reg[32] = {
446         "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
447         "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
448         "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
449         "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
450     };
451 
452     if (reg < 32) {
453         return fpr_reg[reg];
454     }
455 
456     info->fprintf_func(info->stream, "Invalid FPR register index %" PRIu64,
457                        reg);
458     siglongjmp(info->buf, 1);
459 }
460 
461 
462 static const char *AC(uint64 reg, Dis_info *info)
463 {
464     static const char *ac_reg[4] = {
465         "ac0",  "ac1",  "ac2",  "ac3"
466     };
467 
468     if (reg < 4) {
469         return ac_reg[reg];
470     }
471 
472     info->fprintf_func(info->stream, "Invalid AC register index %" PRIu64,
473                        reg);
474     siglongjmp(info->buf, 1);
475 }
476 
477 
478 static char *ADDRESS(uint64 value, int instruction_size, Dis_info *info)
479 {
480     /* token for string replace */
481     img_address address = info->m_pc + value + instruction_size;
482     /* symbol replacement */
483     return to_string(address);
484 }
485 
486 
487 static uint64 extract_op_code_value(const uint16 *data, int size)
488 {
489     switch (size) {
490     case 16:
491         return data[0];
492     case 32:
493         return ((uint64)data[0] << 16) | data[1];
494     case 48:
495         return ((uint64)data[0] << 32) | ((uint64)data[1] << 16) | data[2];
496     default:
497         return data[0];
498     }
499 }
500 
501 
502 static uint64 extract_code_18_to_0(uint64 instruction)
503 {
504     uint64 value = 0;
505     value |= extract_bits(instruction, 0, 19);
506     return value;
507 }
508 
509 
510 static uint64 extract_shift3_2_1_0(uint64 instruction)
511 {
512     uint64 value = 0;
513     value |= extract_bits(instruction, 0, 3);
514     return value;
515 }
516 
517 
518 static uint64 extract_u_11_10_9_8_7_6_5_4_3__s3(uint64 instruction)
519 {
520     uint64 value = 0;
521     value |= extract_bits(instruction, 3, 9) << 3;
522     return value;
523 }
524 
525 
526 static uint64 extract_count_3_2_1_0(uint64 instruction)
527 {
528     uint64 value = 0;
529     value |= extract_bits(instruction, 0, 4);
530     return value;
531 }
532 
533 
534 static uint64 extract_rtz3_9_8_7(uint64 instruction)
535 {
536     uint64 value = 0;
537     value |= extract_bits(instruction, 7, 3);
538     return value;
539 }
540 
541 
542 static uint64 extract_u_17_to_1__s1(uint64 instruction)
543 {
544     uint64 value = 0;
545     value |= extract_bits(instruction, 1, 17) << 1;
546     return value;
547 }
548 
549 
550 static int64 extract_s__se9_20_19_18_17_16_15_14_13_12_11(uint64 instruction)
551 {
552     int64 value = 0;
553     value |= extract_bits(instruction, 11, 10);
554     value = sign_extend(value, 9);
555     return value;
556 }
557 
558 
559 static int64 extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(uint64 instruction)
560 {
561     int64 value = 0;
562     value |= extract_bits(instruction, 0, 1) << 11;
563     value |= extract_bits(instruction, 1, 10) << 1;
564     value = sign_extend(value, 11);
565     return value;
566 }
567 
568 
569 static uint64 extract_u_10(uint64 instruction)
570 {
571     uint64 value = 0;
572     value |= extract_bits(instruction, 10, 1);
573     return value;
574 }
575 
576 
577 static uint64 extract_rtz4_27_26_25_23_22_21(uint64 instruction)
578 {
579     uint64 value = 0;
580     value |= extract_bits(instruction, 21, 3);
581     value |= extract_bits(instruction, 25, 1) << 3;
582     return value;
583 }
584 
585 
586 static uint64 extract_sa_15_14_13_12_11(uint64 instruction)
587 {
588     uint64 value = 0;
589     value |= extract_bits(instruction, 11, 5);
590     return value;
591 }
592 
593 
594 static uint64 extract_shift_4_3_2_1_0(uint64 instruction)
595 {
596     uint64 value = 0;
597     value |= extract_bits(instruction, 0, 5);
598     return value;
599 }
600 
601 
602 static uint64 extract_shiftx_10_9_8_7__s1(uint64 instruction)
603 {
604     uint64 value = 0;
605     value |= extract_bits(instruction, 7, 4) << 1;
606     return value;
607 }
608 
609 
610 static uint64 extract_hint_25_24_23_22_21(uint64 instruction)
611 {
612     uint64 value = 0;
613     value |= extract_bits(instruction, 21, 5);
614     return value;
615 }
616 
617 
618 static uint64 extract_count3_14_13_12(uint64 instruction)
619 {
620     uint64 value = 0;
621     value |= extract_bits(instruction, 12, 3);
622     return value;
623 }
624 
625 
626 static int64 extract_s__se31_0_11_to_2_20_to_12_s12(uint64 instruction)
627 {
628     int64 value = 0;
629     value |= extract_bits(instruction, 0, 1) << 31;
630     value |= extract_bits(instruction, 2, 10) << 21;
631     value |= extract_bits(instruction, 12, 9) << 12;
632     value = sign_extend(value, 31);
633     return value;
634 }
635 
636 
637 static int64 extract_s__se7_0_6_5_4_3_2_1_s1(uint64 instruction)
638 {
639     int64 value = 0;
640     value |= extract_bits(instruction, 0, 1) << 7;
641     value |= extract_bits(instruction, 1, 6) << 1;
642     value = sign_extend(value, 7);
643     return value;
644 }
645 
646 
647 static uint64 extract_u2_10_9(uint64 instruction)
648 {
649     uint64 value = 0;
650     value |= extract_bits(instruction, 9, 2);
651     return value;
652 }
653 
654 
655 static uint64 extract_code_25_24_23_22_21_20_19_18_17_16(uint64 instruction)
656 {
657     uint64 value = 0;
658     value |= extract_bits(instruction, 16, 10);
659     return value;
660 }
661 
662 
663 static uint64 extract_rs_20_19_18_17_16(uint64 instruction)
664 {
665     uint64 value = 0;
666     value |= extract_bits(instruction, 16, 5);
667     return value;
668 }
669 
670 
671 static uint64 extract_u_2_1__s1(uint64 instruction)
672 {
673     uint64 value = 0;
674     value |= extract_bits(instruction, 1, 2) << 1;
675     return value;
676 }
677 
678 
679 static uint64 extract_stripe_6(uint64 instruction)
680 {
681     uint64 value = 0;
682     value |= extract_bits(instruction, 6, 1);
683     return value;
684 }
685 
686 
687 static uint64 extract_ac_15_14(uint64 instruction)
688 {
689     uint64 value = 0;
690     value |= extract_bits(instruction, 14, 2);
691     return value;
692 }
693 
694 
695 static uint64 extract_shift_20_19_18_17_16(uint64 instruction)
696 {
697     uint64 value = 0;
698     value |= extract_bits(instruction, 16, 5);
699     return value;
700 }
701 
702 
703 static uint64 extract_rdl_25_24(uint64 instruction)
704 {
705     uint64 value = 0;
706     value |= extract_bits(instruction, 24, 1);
707     return value;
708 }
709 
710 
711 static int64 extract_s__se10_0_9_8_7_6_5_4_3_2_1_s1(uint64 instruction)
712 {
713     int64 value = 0;
714     value |= extract_bits(instruction, 0, 1) << 10;
715     value |= extract_bits(instruction, 1, 9) << 1;
716     value = sign_extend(value, 10);
717     return value;
718 }
719 
720 
721 static uint64 extract_eu_6_5_4_3_2_1_0(uint64 instruction)
722 {
723     uint64 value = 0;
724     value |= extract_bits(instruction, 0, 7);
725     return value;
726 }
727 
728 
729 static uint64 extract_shift_5_4_3_2_1_0(uint64 instruction)
730 {
731     uint64 value = 0;
732     value |= extract_bits(instruction, 0, 6);
733     return value;
734 }
735 
736 
737 static uint64 extract_count_19_18_17_16(uint64 instruction)
738 {
739     uint64 value = 0;
740     value |= extract_bits(instruction, 16, 4);
741     return value;
742 }
743 
744 
745 static uint64 extract_code_2_1_0(uint64 instruction)
746 {
747     uint64 value = 0;
748     value |= extract_bits(instruction, 0, 3);
749     return value;
750 }
751 
752 
753 static uint64 extract_u_11_10_9_8_7_6_5_4_3_2_1_0(uint64 instruction)
754 {
755     uint64 value = 0;
756     value |= extract_bits(instruction, 0, 12);
757     return value;
758 }
759 
760 
761 static uint64 extract_rs_4_3_2_1_0(uint64 instruction)
762 {
763     uint64 value = 0;
764     value |= extract_bits(instruction, 0, 5);
765     return value;
766 }
767 
768 
769 static uint64 extract_u_20_to_3__s3(uint64 instruction)
770 {
771     uint64 value = 0;
772     value |= extract_bits(instruction, 3, 18) << 3;
773     return value;
774 }
775 
776 
777 static uint64 extract_u_3_2_1_0__s2(uint64 instruction)
778 {
779     uint64 value = 0;
780     value |= extract_bits(instruction, 0, 4) << 2;
781     return value;
782 }
783 
784 
785 static uint64 extract_cofun_25_24_23(uint64 instruction)
786 {
787     uint64 value = 0;
788     value |= extract_bits(instruction, 3, 23);
789     return value;
790 }
791 
792 
793 static uint64 extract_u_2_1_0__s2(uint64 instruction)
794 {
795     uint64 value = 0;
796     value |= extract_bits(instruction, 0, 3) << 2;
797     return value;
798 }
799 
800 
801 static uint64 extract_rd3_3_2_1(uint64 instruction)
802 {
803     uint64 value = 0;
804     value |= extract_bits(instruction, 1, 3);
805     return value;
806 }
807 
808 
809 static uint64 extract_sa_15_14_13_12(uint64 instruction)
810 {
811     uint64 value = 0;
812     value |= extract_bits(instruction, 12, 4);
813     return value;
814 }
815 
816 
817 static uint64 extract_rt_25_24_23_22_21(uint64 instruction)
818 {
819     uint64 value = 0;
820     value |= extract_bits(instruction, 21, 5);
821     return value;
822 }
823 
824 
825 static uint64 extract_ru_7_6_5_4_3(uint64 instruction)
826 {
827     uint64 value = 0;
828     value |= extract_bits(instruction, 3, 5);
829     return value;
830 }
831 
832 
833 static uint64 extract_u_17_to_0(uint64 instruction)
834 {
835     uint64 value = 0;
836     value |= extract_bits(instruction, 0, 18);
837     return value;
838 }
839 
840 
841 static uint64 extract_rsz4_4_2_1_0(uint64 instruction)
842 {
843     uint64 value = 0;
844     value |= extract_bits(instruction, 0, 3);
845     value |= extract_bits(instruction, 4, 1) << 3;
846     return value;
847 }
848 
849 
850 static int64 extract_s__se21_0_20_to_1_s1(uint64 instruction)
851 {
852     int64 value = 0;
853     value |= extract_bits(instruction, 0, 1) << 21;
854     value |= extract_bits(instruction, 1, 20) << 1;
855     value = sign_extend(value, 21);
856     return value;
857 }
858 
859 
860 static uint64 extract_op_25_to_3(uint64 instruction)
861 {
862     uint64 value = 0;
863     value |= extract_bits(instruction, 3, 23);
864     return value;
865 }
866 
867 
868 static uint64 extract_rs4_4_2_1_0(uint64 instruction)
869 {
870     uint64 value = 0;
871     value |= extract_bits(instruction, 0, 3);
872     value |= extract_bits(instruction, 4, 1) << 3;
873     return value;
874 }
875 
876 
877 static uint64 extract_bit_23_22_21(uint64 instruction)
878 {
879     uint64 value = 0;
880     value |= extract_bits(instruction, 21, 3);
881     return value;
882 }
883 
884 
885 static uint64 extract_rt_41_40_39_38_37(uint64 instruction)
886 {
887     uint64 value = 0;
888     value |= extract_bits(instruction, 37, 5);
889     return value;
890 }
891 
892 
893 static int64 extract_shift__se5_21_20_19_18_17_16(uint64 instruction)
894 {
895     int64 value = 0;
896     value |= extract_bits(instruction, 16, 6);
897     value = sign_extend(value, 5);
898     return value;
899 }
900 
901 
902 static uint64 extract_rd2_3_8(uint64 instruction)
903 {
904     uint64 value = 0;
905     value |= extract_bits(instruction, 3, 1) << 1;
906     value |= extract_bits(instruction, 8, 1);
907     return value;
908 }
909 
910 
911 static uint64 extract_code_17_to_0(uint64 instruction)
912 {
913     uint64 value = 0;
914     value |= extract_bits(instruction, 0, 18);
915     return value;
916 }
917 
918 
919 static uint64 extract_size_20_19_18_17_16(uint64 instruction)
920 {
921     uint64 value = 0;
922     value |= extract_bits(instruction, 16, 5);
923     return value;
924 }
925 
926 
927 static int64 extract_s__se8_15_7_6_5_4_3_2_s2(uint64 instruction)
928 {
929     int64 value = 0;
930     value |= extract_bits(instruction, 2, 6) << 2;
931     value |= extract_bits(instruction, 15, 1) << 8;
932     value = sign_extend(value, 8);
933     return value;
934 }
935 
936 
937 static uint64 extract_u_15_to_0(uint64 instruction)
938 {
939     uint64 value = 0;
940     value |= extract_bits(instruction, 0, 16);
941     return value;
942 }
943 
944 
945 static uint64 extract_fs_20_19_18_17_16(uint64 instruction)
946 {
947     uint64 value = 0;
948     value |= extract_bits(instruction, 16, 5);
949     return value;
950 }
951 
952 
953 static int64 extract_s__se8_15_7_6_5_4_3_2_1_0(uint64 instruction)
954 {
955     int64 value = 0;
956     value |= extract_bits(instruction, 0, 8);
957     value |= extract_bits(instruction, 15, 1) << 8;
958     value = sign_extend(value, 8);
959     return value;
960 }
961 
962 
963 static uint64 extract_stype_20_19_18_17_16(uint64 instruction)
964 {
965     uint64 value = 0;
966     value |= extract_bits(instruction, 16, 5);
967     return value;
968 }
969 
970 
971 static uint64 extract_rtl_11(uint64 instruction)
972 {
973     uint64 value = 0;
974     value |= extract_bits(instruction, 9, 1);
975     return value;
976 }
977 
978 
979 static uint64 extract_hs_20_19_18_17_16(uint64 instruction)
980 {
981     uint64 value = 0;
982     value |= extract_bits(instruction, 16, 5);
983     return value;
984 }
985 
986 
987 static uint64 extract_sel_13_12_11(uint64 instruction)
988 {
989     uint64 value = 0;
990     value |= extract_bits(instruction, 11, 3);
991     return value;
992 }
993 
994 
995 static uint64 extract_lsb_4_3_2_1_0(uint64 instruction)
996 {
997     uint64 value = 0;
998     value |= extract_bits(instruction, 0, 5);
999     return value;
1000 }
1001 
1002 
1003 static uint64 extract_gp_2(uint64 instruction)
1004 {
1005     uint64 value = 0;
1006     value |= extract_bits(instruction, 2, 1);
1007     return value;
1008 }
1009 
1010 
1011 static uint64 extract_rt3_9_8_7(uint64 instruction)
1012 {
1013     uint64 value = 0;
1014     value |= extract_bits(instruction, 7, 3);
1015     return value;
1016 }
1017 
1018 
1019 static uint64 extract_ft_25_24_23_22_21(uint64 instruction)
1020 {
1021     uint64 value = 0;
1022     value |= extract_bits(instruction, 21, 5);
1023     return value;
1024 }
1025 
1026 
1027 static uint64 extract_u_17_16_15_14_13_12_11(uint64 instruction)
1028 {
1029     uint64 value = 0;
1030     value |= extract_bits(instruction, 11, 7);
1031     return value;
1032 }
1033 
1034 
1035 static uint64 extract_cs_20_19_18_17_16(uint64 instruction)
1036 {
1037     uint64 value = 0;
1038     value |= extract_bits(instruction, 16, 5);
1039     return value;
1040 }
1041 
1042 
1043 static uint64 extract_rt4_9_7_6_5(uint64 instruction)
1044 {
1045     uint64 value = 0;
1046     value |= extract_bits(instruction, 5, 3);
1047     value |= extract_bits(instruction, 9, 1) << 3;
1048     return value;
1049 }
1050 
1051 
1052 static uint64 extract_msbt_10_9_8_7_6(uint64 instruction)
1053 {
1054     uint64 value = 0;
1055     value |= extract_bits(instruction, 6, 5);
1056     return value;
1057 }
1058 
1059 
1060 static uint64 extract_u_5_4_3_2_1_0__s2(uint64 instruction)
1061 {
1062     uint64 value = 0;
1063     value |= extract_bits(instruction, 0, 6) << 2;
1064     return value;
1065 }
1066 
1067 
1068 static uint64 extract_sa_15_14_13(uint64 instruction)
1069 {
1070     uint64 value = 0;
1071     value |= extract_bits(instruction, 13, 3);
1072     return value;
1073 }
1074 
1075 
1076 static int64 extract_s__se14_0_13_to_1_s1(uint64 instruction)
1077 {
1078     int64 value = 0;
1079     value |= extract_bits(instruction, 0, 1) << 14;
1080     value |= extract_bits(instruction, 1, 13) << 1;
1081     value = sign_extend(value, 14);
1082     return value;
1083 }
1084 
1085 
1086 static uint64 extract_rs3_6_5_4(uint64 instruction)
1087 {
1088     uint64 value = 0;
1089     value |= extract_bits(instruction, 4, 3);
1090     return value;
1091 }
1092 
1093 
1094 static uint64 extract_u_31_to_0__s32(uint64 instruction)
1095 {
1096     uint64 value = 0;
1097     value |= extract_bits(instruction, 0, 32) << 32;
1098     return value;
1099 }
1100 
1101 
1102 static uint64 extract_shift_10_9_8_7_6(uint64 instruction)
1103 {
1104     uint64 value = 0;
1105     value |= extract_bits(instruction, 6, 5);
1106     return value;
1107 }
1108 
1109 
1110 static uint64 extract_cs_25_24_23_22_21(uint64 instruction)
1111 {
1112     uint64 value = 0;
1113     value |= extract_bits(instruction, 21, 5);
1114     return value;
1115 }
1116 
1117 
1118 static uint64 extract_shiftx_11_10_9_8_7_6(uint64 instruction)
1119 {
1120     uint64 value = 0;
1121     value |= extract_bits(instruction, 6, 6);
1122     return value;
1123 }
1124 
1125 
1126 static uint64 extract_rt_9_8_7_6_5(uint64 instruction)
1127 {
1128     uint64 value = 0;
1129     value |= extract_bits(instruction, 5, 5);
1130     return value;
1131 }
1132 
1133 
1134 static uint64 extract_op_25_24_23_22_21(uint64 instruction)
1135 {
1136     uint64 value = 0;
1137     value |= extract_bits(instruction, 21, 5);
1138     return value;
1139 }
1140 
1141 
1142 static uint64 extract_u_6_5_4_3_2_1_0__s2(uint64 instruction)
1143 {
1144     uint64 value = 0;
1145     value |= extract_bits(instruction, 0, 7) << 2;
1146     return value;
1147 }
1148 
1149 
1150 static uint64 extract_bit_16_15_14_13_12_11(uint64 instruction)
1151 {
1152     uint64 value = 0;
1153     value |= extract_bits(instruction, 11, 6);
1154     return value;
1155 }
1156 
1157 
1158 static uint64 extract_mask_20_19_18_17_16_15_14(uint64 instruction)
1159 {
1160     uint64 value = 0;
1161     value |= extract_bits(instruction, 14, 7);
1162     return value;
1163 }
1164 
1165 
1166 static uint64 extract_eu_3_2_1_0(uint64 instruction)
1167 {
1168     uint64 value = 0;
1169     value |= extract_bits(instruction, 0, 4);
1170     return value;
1171 }
1172 
1173 
1174 static uint64 extract_u_7_6_5_4__s4(uint64 instruction)
1175 {
1176     uint64 value = 0;
1177     value |= extract_bits(instruction, 4, 4) << 4;
1178     return value;
1179 }
1180 
1181 
1182 static int64 extract_s__se8_15_7_6_5_4_3_s3(uint64 instruction)
1183 {
1184     int64 value = 0;
1185     value |= extract_bits(instruction, 3, 5) << 3;
1186     value |= extract_bits(instruction, 15, 1) << 8;
1187     value = sign_extend(value, 8);
1188     return value;
1189 }
1190 
1191 
1192 static uint64 extract_ft_15_14_13_12_11(uint64 instruction)
1193 {
1194     uint64 value = 0;
1195     value |= extract_bits(instruction, 11, 5);
1196     return value;
1197 }
1198 
1199 
1200 static int64 extract_s__se31_15_to_0_31_to_16(uint64 instruction)
1201 {
1202     int64 value = 0;
1203     value |= extract_bits(instruction, 0, 16) << 16;
1204     value |= extract_bits(instruction, 16, 16);
1205     value = sign_extend(value, 31);
1206     return value;
1207 }
1208 
1209 
1210 static uint64 extract_u_20_19_18_17_16_15_14_13(uint64 instruction)
1211 {
1212     uint64 value = 0;
1213     value |= extract_bits(instruction, 13, 8);
1214     return value;
1215 }
1216 
1217 
1218 static uint64 extract_u_17_to_2__s2(uint64 instruction)
1219 {
1220     uint64 value = 0;
1221     value |= extract_bits(instruction, 2, 16) << 2;
1222     return value;
1223 }
1224 
1225 
1226 static uint64 extract_rd_15_14_13_12_11(uint64 instruction)
1227 {
1228     uint64 value = 0;
1229     value |= extract_bits(instruction, 11, 5);
1230     return value;
1231 }
1232 
1233 
1234 static uint64 extract_c0s_20_19_18_17_16(uint64 instruction)
1235 {
1236     uint64 value = 0;
1237     value |= extract_bits(instruction, 16, 5);
1238     return value;
1239 }
1240 
1241 
1242 static uint64 extract_code_1_0(uint64 instruction)
1243 {
1244     uint64 value = 0;
1245     value |= extract_bits(instruction, 0, 2);
1246     return value;
1247 }
1248 
1249 
1250 static int64 extract_s__se25_0_24_to_1_s1(uint64 instruction)
1251 {
1252     int64 value = 0;
1253     value |= extract_bits(instruction, 0, 1) << 25;
1254     value |= extract_bits(instruction, 1, 24) << 1;
1255     value = sign_extend(value, 25);
1256     return value;
1257 }
1258 
1259 
1260 static uint64 extract_u_1_0(uint64 instruction)
1261 {
1262     uint64 value = 0;
1263     value |= extract_bits(instruction, 0, 2);
1264     return value;
1265 }
1266 
1267 
1268 static uint64 extract_u_3_8__s2(uint64 instruction)
1269 {
1270     uint64 value = 0;
1271     value |= extract_bits(instruction, 3, 1) << 3;
1272     value |= extract_bits(instruction, 8, 1) << 2;
1273     return value;
1274 }
1275 
1276 
1277 static uint64 extract_fd_15_14_13_12_11(uint64 instruction)
1278 {
1279     uint64 value = 0;
1280     value |= extract_bits(instruction, 11, 5);
1281     return value;
1282 }
1283 
1284 
1285 static uint64 extract_u_4_3_2_1_0__s2(uint64 instruction)
1286 {
1287     uint64 value = 0;
1288     value |= extract_bits(instruction, 0, 5) << 2;
1289     return value;
1290 }
1291 
1292 
1293 static uint64 extract_rtz4_9_7_6_5(uint64 instruction)
1294 {
1295     uint64 value = 0;
1296     value |= extract_bits(instruction, 5, 3);
1297     value |= extract_bits(instruction, 9, 1) << 3;
1298     return value;
1299 }
1300 
1301 
1302 static uint64 extract_sel_15_14_13_12_11(uint64 instruction)
1303 {
1304     uint64 value = 0;
1305     value |= extract_bits(instruction, 11, 5);
1306     return value;
1307 }
1308 
1309 
1310 static uint64 extract_ct_25_24_23_22_21(uint64 instruction)
1311 {
1312     uint64 value = 0;
1313     value |= extract_bits(instruction, 21, 5);
1314     return value;
1315 }
1316 
1317 
1318 static uint64 extract_u_20_to_2__s2(uint64 instruction)
1319 {
1320     uint64 value = 0;
1321     value |= extract_bits(instruction, 2, 19) << 2;
1322     return value;
1323 }
1324 
1325 
1326 static int64 extract_s__se3_4_2_1_0(uint64 instruction)
1327 {
1328     int64 value = 0;
1329     value |= extract_bits(instruction, 0, 3);
1330     value |= extract_bits(instruction, 4, 1) << 3;
1331     value = sign_extend(value, 3);
1332     return value;
1333 }
1334 
1335 
1336 static uint64 extract_u_3_2_1_0__s1(uint64 instruction)
1337 {
1338     uint64 value = 0;
1339     value |= extract_bits(instruction, 0, 4) << 1;
1340     return value;
1341 }
1342 
1343 
1344 
1345 static bool ADDIU_32__cond(uint64 instruction)
1346 {
1347     uint64 rt = extract_rt_25_24_23_22_21(instruction);
1348     return rt != 0;
1349 }
1350 
1351 
1352 static bool ADDIU_RS5__cond(uint64 instruction)
1353 {
1354     uint64 rt = extract_rt_9_8_7_6_5(instruction);
1355     return rt != 0;
1356 }
1357 
1358 
1359 static bool BALRSC_cond(uint64 instruction)
1360 {
1361     uint64 rt = extract_rt_25_24_23_22_21(instruction);
1362     return rt != 0;
1363 }
1364 
1365 
1366 static bool BEQC_16__cond(uint64 instruction)
1367 {
1368     uint64 rs3 = extract_rs3_6_5_4(instruction);
1369     uint64 rt3 = extract_rt3_9_8_7(instruction);
1370     uint64 u = extract_u_3_2_1_0__s1(instruction);
1371     return rs3 < rt3 && u != 0;
1372 }
1373 
1374 
1375 static bool BNEC_16__cond(uint64 instruction)
1376 {
1377     uint64 rs3 = extract_rs3_6_5_4(instruction);
1378     uint64 rt3 = extract_rt3_9_8_7(instruction);
1379     uint64 u = extract_u_3_2_1_0__s1(instruction);
1380     return rs3 >= rt3 && u != 0;
1381 }
1382 
1383 
1384 static bool MOVE_cond(uint64 instruction)
1385 {
1386     uint64 rt = extract_rt_9_8_7_6_5(instruction);
1387     return rt != 0;
1388 }
1389 
1390 
1391 static bool P16_BR1_cond(uint64 instruction)
1392 {
1393     uint64 u = extract_u_3_2_1_0__s1(instruction);
1394     return u != 0;
1395 }
1396 
1397 
1398 static bool PREF_S9__cond(uint64 instruction)
1399 {
1400     uint64 hint = extract_hint_25_24_23_22_21(instruction);
1401     return hint != 31;
1402 }
1403 
1404 
1405 static bool PREFE_cond(uint64 instruction)
1406 {
1407     uint64 hint = extract_hint_25_24_23_22_21(instruction);
1408     return hint != 31;
1409 }
1410 
1411 
1412 static bool SLTU_cond(uint64 instruction)
1413 {
1414     uint64 rd = extract_rd_15_14_13_12_11(instruction);
1415     return rd != 0;
1416 }
1417 
1418 
1419 
1420 /*
1421  * ABS.D fd, fs - Floating Point Absolute Value
1422  *
1423  *   3         2         1
1424  *  10987654321098765432109876543210
1425  *  010001     00000          000101
1426  *    fmt -----
1427  *               fs -----
1428  *                    fd -----
1429  */
1430 static char *ABS_D(uint64 instruction, Dis_info *info)
1431 {
1432     uint64 fd_value = extract_ft_25_24_23_22_21(instruction);
1433     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
1434 
1435     const char *fs = FPR(fs_value, info);
1436     const char *fd = FPR(fd_value, info);
1437 
1438     return img_format("ABS.D %s, %s", fd, fs);
1439 }
1440 
1441 
1442 /*
1443  * ABS.S fd, fs - Floating Point Absolute Value
1444  *
1445  *   3         2         1
1446  *  10987654321098765432109876543210
1447  *  010001     00000          000101
1448  *    fmt -----
1449  *               fd -----
1450  *                    fs -----
1451  */
1452 static char *ABS_S(uint64 instruction, Dis_info *info)
1453 {
1454     uint64 fd_value = extract_ft_25_24_23_22_21(instruction);
1455     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
1456 
1457     const char *fs = FPR(fs_value, info);
1458     const char *fd = FPR(fd_value, info);
1459 
1460     return img_format("ABS.S %s, %s", fd, fs);
1461 }
1462 
1463 
1464 /*
1465  * [DSP] ABSQ_S.PH rt, rs - Find absolute value of two fractional halfwords
1466  *         with 16-bit saturation
1467  *
1468  *   3         2         1
1469  *  10987654321098765432109876543210
1470  *  001000          0001000100111111
1471  *     rt -----
1472  *          rs -----
1473  */
1474 static char *ABSQ_S_PH(uint64 instruction, Dis_info *info)
1475 {
1476     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1477     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1478 
1479     const char *rt = GPR(rt_value, info);
1480     const char *rs = GPR(rs_value, info);
1481 
1482     return img_format("ABSQ_S.PH %s, %s", rt, rs);
1483 }
1484 
1485 
1486 /*
1487  * [DSP] ABSQ_S.QB rt, rs - Find absolute value of four fractional byte values
1488  *         with 8-bit saturation
1489  *
1490  *   3         2         1
1491  *  10987654321098765432109876543210
1492  *  001000          0000000100111111
1493  *     rt -----
1494  *          rs -----
1495  */
1496 static char *ABSQ_S_QB(uint64 instruction, Dis_info *info)
1497 {
1498     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1499     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1500 
1501     const char *rt = GPR(rt_value, info);
1502     const char *rs = GPR(rs_value, info);
1503 
1504     return img_format("ABSQ_S.QB %s, %s", rt, rs);
1505 }
1506 
1507 
1508 /*
1509  * [DSP] ABSQ_S.W rt, rs - Find absolute value of fractional word with 32-bit
1510  *         saturation
1511  *
1512  *   3         2         1
1513  *  10987654321098765432109876543210
1514  *  001000          0010000100111111
1515  *     rt -----
1516  *          rs -----
1517  */
1518 static char *ABSQ_S_W(uint64 instruction, Dis_info *info)
1519 {
1520     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1521     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1522 
1523     const char *rt = GPR(rt_value, info);
1524     const char *rs = GPR(rs_value, info);
1525 
1526     return img_format("ABSQ_S.W %s, %s", rt, rs);
1527 }
1528 
1529 
1530 /*
1531  *
1532  *
1533  *   3         2         1
1534  *  10987654321098765432109876543210
1535  *  001000          0010000100111111
1536  *     rt -----
1537  *          rs -----
1538  */
1539 static char *ACLR(uint64 instruction, Dis_info *info)
1540 {
1541     uint64 bit_value = extract_bit_23_22_21(instruction);
1542     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1543     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
1544 
1545     const char *rs = GPR(rs_value, info);
1546 
1547     return img_format("ACLR 0x%" PRIx64 ", %" PRId64 "(%s)",
1548                       bit_value, s_value, rs);
1549 }
1550 
1551 
1552 /*
1553  *
1554  *
1555  *   3         2         1
1556  *  10987654321098765432109876543210
1557  *  001000          0010000100111111
1558  *     rt -----
1559  *          rs -----
1560  */
1561 static char *ADD(uint64 instruction, Dis_info *info)
1562 {
1563     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1564     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1565     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1566 
1567     const char *rd = GPR(rd_value, info);
1568     const char *rs = GPR(rs_value, info);
1569     const char *rt = GPR(rt_value, info);
1570 
1571     return img_format("ADD %s, %s, %s", rd, rs, rt);
1572 }
1573 
1574 
1575 /*
1576  * ADD.D fd, fs, ft - Floating Point Add
1577  *
1578  *   3         2         1
1579  *  10987654321098765432109876543210
1580  *  010001                    000101
1581  *    fmt -----
1582  *          ft -----
1583  *               fs -----
1584  *                    fd -----
1585  */
1586 static char *ADD_D(uint64 instruction, Dis_info *info)
1587 {
1588     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
1589     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
1590     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
1591 
1592     const char *ft = FPR(ft_value, info);
1593     const char *fs = FPR(fs_value, info);
1594     const char *fd = FPR(fd_value, info);
1595 
1596     return img_format("ADD.D %s, %s, %s", fd, fs, ft);
1597 }
1598 
1599 
1600 /*
1601  * ADD.S fd, fs, ft - Floating Point Add
1602  *
1603  *   3         2         1
1604  *  10987654321098765432109876543210
1605  *  010001                    000101
1606  *    fmt -----
1607  *          ft -----
1608  *               fs -----
1609  *                    fd -----
1610  */
1611 static char *ADD_S(uint64 instruction, Dis_info *info)
1612 {
1613     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
1614     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
1615     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
1616 
1617     const char *ft = FPR(ft_value, info);
1618     const char *fs = FPR(fs_value, info);
1619     const char *fd = FPR(fd_value, info);
1620 
1621     return img_format("ADD.S %s, %s, %s", fd, fs, ft);
1622 }
1623 
1624 
1625 /*
1626  *
1627  *
1628  *   3         2         1
1629  *  10987654321098765432109876543210
1630  *  001000          0010000100111111
1631  *     rt -----
1632  *          rs -----
1633  */
1634 static char *ADDIU_32_(uint64 instruction, Dis_info *info)
1635 {
1636     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1637     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1638     uint64 u_value = extract_u_15_to_0(instruction);
1639 
1640     const char *rt = GPR(rt_value, info);
1641     const char *rs = GPR(rs_value, info);
1642 
1643     return img_format("ADDIU %s, %s, 0x%" PRIx64, rt, rs, u_value);
1644 }
1645 
1646 
1647 /*
1648  *
1649  *
1650  *   3         2         1
1651  *  10987654321098765432109876543210
1652  *  001000          0010000100111111
1653  *     rt -----
1654  *          rs -----
1655  */
1656 static char *ADDIU_48_(uint64 instruction, Dis_info *info)
1657 {
1658     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
1659     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
1660 
1661     const char *rt = GPR(rt_value, info);
1662 
1663     return img_format("ADDIU %s, %" PRId64, rt, s_value);
1664 }
1665 
1666 
1667 /*
1668  *
1669  *
1670  *   3         2         1
1671  *  10987654321098765432109876543210
1672  *  001000          0010000100111111
1673  *     rt -----
1674  *          rs -----
1675  */
1676 static char *ADDIU_GP48_(uint64 instruction, Dis_info *info)
1677 {
1678     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
1679     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
1680 
1681     const char *rt = GPR(rt_value, info);
1682 
1683     return img_format("ADDIU %s, $%d, %" PRId64, rt, 28, s_value);
1684 }
1685 
1686 
1687 /*
1688  *
1689  *
1690  *   3         2         1
1691  *  10987654321098765432109876543210
1692  *  001000          0010000100111111
1693  *     rt -----
1694  *          rs -----
1695  */
1696 static char *ADDIU_GP_B_(uint64 instruction, Dis_info *info)
1697 {
1698     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1699     uint64 u_value = extract_u_17_to_0(instruction);
1700 
1701     const char *rt = GPR(rt_value, info);
1702 
1703     return img_format("ADDIU %s, $%d, 0x%" PRIx64, rt, 28, u_value);
1704 }
1705 
1706 
1707 /*
1708  *
1709  *
1710  *   3         2         1
1711  *  10987654321098765432109876543210
1712  *  001000          0010000100111111
1713  *     rt -----
1714  *          rs -----
1715  */
1716 static char *ADDIU_GP_W_(uint64 instruction, Dis_info *info)
1717 {
1718     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1719     uint64 u_value = extract_u_20_to_2__s2(instruction);
1720 
1721     const char *rt = GPR(rt_value, info);
1722 
1723     return img_format("ADDIU %s, $%d, 0x%" PRIx64, rt, 28, u_value);
1724 }
1725 
1726 
1727 /*
1728  *
1729  *
1730  *   3         2         1
1731  *  10987654321098765432109876543210
1732  *  001000          0010000100111111
1733  *     rt -----
1734  *          rs -----
1735  */
1736 static char *ADDIU_NEG_(uint64 instruction, Dis_info *info)
1737 {
1738     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1739     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1740     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
1741 
1742     const char *rt = GPR(rt_value, info);
1743     const char *rs = GPR(rs_value, info);
1744     int64 u = neg_copy(u_value);
1745 
1746     return img_format("ADDIU %s, %s, %" PRId64, rt, rs, u);
1747 }
1748 
1749 
1750 /*
1751  *
1752  *
1753  *   3         2         1
1754  *  10987654321098765432109876543210
1755  *  001000          0010000100111111
1756  *     rt -----
1757  *          rs -----
1758  */
1759 static char *ADDIU_R1_SP_(uint64 instruction, Dis_info *info)
1760 {
1761     uint64 u_value = extract_u_5_4_3_2_1_0__s2(instruction);
1762     uint64 rt3_value = extract_rt3_9_8_7(instruction);
1763 
1764     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
1765 
1766     return img_format("ADDIU %s, $%d, 0x%" PRIx64, rt3, 29, u_value);
1767 }
1768 
1769 
1770 /*
1771  *
1772  *
1773  *   3         2         1
1774  *  10987654321098765432109876543210
1775  *  001000          0010000100111111
1776  *     rt -----
1777  *          rs -----
1778  */
1779 static char *ADDIU_R2_(uint64 instruction, Dis_info *info)
1780 {
1781     uint64 rt3_value = extract_rt3_9_8_7(instruction);
1782     uint64 rs3_value = extract_rs3_6_5_4(instruction);
1783     uint64 u_value = extract_u_2_1_0__s2(instruction);
1784 
1785     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
1786     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
1787 
1788     return img_format("ADDIU %s, %s, 0x%" PRIx64, rt3, rs3, u_value);
1789 }
1790 
1791 
1792 /*
1793  * ADDIU[RS5] rt, s5 - Add Signed Word and Set Carry Bit
1794  *
1795  *  5432109876543210
1796  *  100100      1
1797  *     rt -----
1798  *           s - ---
1799  */
1800 static char *ADDIU_RS5_(uint64 instruction, Dis_info *info)
1801 {
1802     uint64 rt_value = extract_rt_9_8_7_6_5(instruction);
1803     int64 s_value = extract_s__se3_4_2_1_0(instruction);
1804 
1805     const char *rt = GPR(rt_value, info);
1806 
1807     return img_format("ADDIU %s, %" PRId64, rt, s_value);
1808 }
1809 
1810 
1811 /*
1812  *
1813  *
1814  *   3         2         1
1815  *  10987654321098765432109876543210
1816  *  001000               x1110000101
1817  *     rt -----
1818  *          rs -----
1819  *               rd -----
1820  */
1821 static char *ADDIUPC_32_(uint64 instruction, Dis_info *info)
1822 {
1823     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1824     int64 s_value = extract_s__se21_0_20_to_1_s1(instruction);
1825 
1826     const char *rt = GPR(rt_value, info);
1827     g_autofree char *s = ADDRESS(s_value, 4, info);
1828 
1829     return img_format("ADDIUPC %s, %s", rt, s);
1830 }
1831 
1832 
1833 /*
1834  *
1835  *
1836  *   3         2         1
1837  *  10987654321098765432109876543210
1838  *  001000               x1110000101
1839  *     rt -----
1840  *          rs -----
1841  *               rd -----
1842  */
1843 static char *ADDIUPC_48_(uint64 instruction, Dis_info *info)
1844 {
1845     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
1846     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
1847 
1848     const char *rt = GPR(rt_value, info);
1849     g_autofree char *s = ADDRESS(s_value, 6, info);
1850 
1851     return img_format("ADDIUPC %s, %s", rt, s);
1852 }
1853 
1854 
1855 /*
1856  * [DSP] ADDQ.PH rd, rt, rs - Add fractional halfword vectors
1857  *
1858  *   3         2         1
1859  *  10987654321098765432109876543210
1860  *  001000               00000001101
1861  *     rt -----
1862  *          rs -----
1863  *               rd -----
1864  */
1865 static char *ADDQ_PH(uint64 instruction, Dis_info *info)
1866 {
1867     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1868     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1869     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1870 
1871     const char *rd = GPR(rd_value, info);
1872     const char *rs = GPR(rs_value, info);
1873     const char *rt = GPR(rt_value, info);
1874 
1875     return img_format("ADDQ.PH %s, %s, %s", rd, rs, rt);
1876 }
1877 
1878 
1879 /*
1880  * [DSP] ADDQ_S.PH rd, rt, rs - Add fractional halfword vectors with 16-bit
1881  *         saturation
1882  *
1883  *   3         2         1
1884  *  10987654321098765432109876543210
1885  *  001000               10000001101
1886  *     rt -----
1887  *          rs -----
1888  *               rd -----
1889  */
1890 static char *ADDQ_S_PH(uint64 instruction, Dis_info *info)
1891 {
1892     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1893     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1894     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1895 
1896     const char *rd = GPR(rd_value, info);
1897     const char *rs = GPR(rs_value, info);
1898     const char *rt = GPR(rt_value, info);
1899 
1900     return img_format("ADDQ_S.PH %s, %s, %s", rd, rs, rt);
1901 }
1902 
1903 
1904 /*
1905  * [DSP] ADDQ_S.W rd, rt, rs - Add fractional words with 32-bit saturation
1906  *
1907  *   3         2         1
1908  *  10987654321098765432109876543210
1909  *  001000               x1100000101
1910  *     rt -----
1911  *          rs -----
1912  *               rd -----
1913  */
1914 static char *ADDQ_S_W(uint64 instruction, Dis_info *info)
1915 {
1916     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1917     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1918     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1919 
1920     const char *rd = GPR(rd_value, info);
1921     const char *rs = GPR(rs_value, info);
1922     const char *rt = GPR(rt_value, info);
1923 
1924     return img_format("ADDQ_S.W %s, %s, %s", rd, rs, rt);
1925 }
1926 
1927 
1928 /*
1929  * [DSP] ADDQH.PH rd, rt, rs - Add fractional halfword vectors and shift
1930  *         right to halve results
1931  *
1932  *   3         2         1
1933  *  10987654321098765432109876543210
1934  *  001000               00001001101
1935  *     rt -----
1936  *          rs -----
1937  *               rd -----
1938  */
1939 static char *ADDQH_PH(uint64 instruction, Dis_info *info)
1940 {
1941     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1942     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1943     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1944 
1945     const char *rd = GPR(rd_value, info);
1946     const char *rs = GPR(rs_value, info);
1947     const char *rt = GPR(rt_value, info);
1948 
1949     return img_format("ADDQH.PH %s, %s, %s", rd, rs, rt);
1950 }
1951 
1952 
1953 /*
1954  * [DSP] ADDQH_R.PH rd, rt, rs - Add fractional halfword vectors and shift
1955  *         right to halve results with rounding
1956  *
1957  *   3         2         1
1958  *  10987654321098765432109876543210
1959  *  001000               10001001101
1960  *     rt -----
1961  *          rs -----
1962  *               rd -----
1963  */
1964 static char *ADDQH_R_PH(uint64 instruction, Dis_info *info)
1965 {
1966     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1967     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1968     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1969 
1970     const char *rd = GPR(rd_value, info);
1971     const char *rs = GPR(rs_value, info);
1972     const char *rt = GPR(rt_value, info);
1973 
1974     return img_format("ADDQH_R.PH %s, %s, %s", rd, rs, rt);
1975 }
1976 
1977 
1978 /*
1979  * [DSP] ADDQH_R.W rd, rt, rs - Add fractional words and shift right to halve
1980  *         results with rounding
1981  *
1982  *   3         2         1
1983  *  10987654321098765432109876543210
1984  *  001000               00010001101
1985  *     rt -----
1986  *          rs -----
1987  *               rd -----
1988  */
1989 static char *ADDQH_R_W(uint64 instruction, Dis_info *info)
1990 {
1991     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
1992     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
1993     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
1994 
1995     const char *rd = GPR(rd_value, info);
1996     const char *rs = GPR(rs_value, info);
1997     const char *rt = GPR(rt_value, info);
1998 
1999     return img_format("ADDQH_R.W %s, %s, %s", rd, rs, rt);
2000 }
2001 
2002 
2003 /*
2004  * [DSP] ADDQH.W rd, rt, rs - Add fractional words and shift right to halve
2005  *         results
2006  *
2007  *   3         2         1
2008  *  10987654321098765432109876543210
2009  *  001000               10010001101
2010  *     rt -----
2011  *          rs -----
2012  *               rd -----
2013  */
2014 static char *ADDQH_W(uint64 instruction, Dis_info *info)
2015 {
2016     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2017     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2018     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2019 
2020     const char *rd = GPR(rd_value, info);
2021     const char *rs = GPR(rs_value, info);
2022     const char *rt = GPR(rt_value, info);
2023 
2024     return img_format("ADDQH.W %s, %s, %s", rd, rs, rt);
2025 }
2026 
2027 
2028 /*
2029  * [DSP] ADDSC rd, rt, rs - Add two signed words and set carry bit
2030  *
2031  *   3         2         1
2032  *  10987654321098765432109876543210
2033  *  001000               x1110000101
2034  *     rt -----
2035  *          rs -----
2036  *               rd -----
2037  */
2038 static char *ADDSC(uint64 instruction, Dis_info *info)
2039 {
2040     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2041     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2042     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2043 
2044     const char *rd = GPR(rd_value, info);
2045     const char *rs = GPR(rs_value, info);
2046     const char *rt = GPR(rt_value, info);
2047 
2048     return img_format("ADDSC %s, %s, %s", rd, rs, rt);
2049 }
2050 
2051 
2052 /*
2053  * ADDU[16] rd3, rs3, rt3 -
2054  *
2055  *  5432109876543210
2056  *  101100         0
2057  *    rt3 ---
2058  *       rs3 ---
2059  *          rd3 ---
2060  */
2061 static char *ADDU_16_(uint64 instruction, Dis_info *info)
2062 {
2063     uint64 rt3_value = extract_rt3_9_8_7(instruction);
2064     uint64 rs3_value = extract_rs3_6_5_4(instruction);
2065     uint64 rd3_value = extract_rd3_3_2_1(instruction);
2066 
2067     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
2068     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
2069     const char *rd3 = GPR(decode_gpr_gpr3(rd3_value, info), info);
2070 
2071     return img_format("ADDU %s, %s, %s", rd3, rs3, rt3);
2072 }
2073 
2074 
2075 /*
2076  *
2077  *
2078  *   3         2         1
2079  *  10987654321098765432109876543210
2080  *  001000               x1110000101
2081  *     rt -----
2082  *          rs -----
2083  *               rd -----
2084  */
2085 static char *ADDU_32_(uint64 instruction, Dis_info *info)
2086 {
2087     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2088     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2089     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2090 
2091     const char *rd = GPR(rd_value, info);
2092     const char *rs = GPR(rs_value, info);
2093     const char *rt = GPR(rt_value, info);
2094 
2095     return img_format("ADDU %s, %s, %s", rd, rs, rt);
2096 }
2097 
2098 
2099 /*
2100  *
2101  *
2102  *   3         2         1
2103  *  10987654321098765432109876543210
2104  *  001000               x1110000101
2105  *     rt -----
2106  *          rs -----
2107  *               rd -----
2108  */
2109 static char *ADDU_4X4_(uint64 instruction, Dis_info *info)
2110 {
2111     uint64 rt4_value = extract_rt4_9_7_6_5(instruction);
2112     uint64 rs4_value = extract_rs4_4_2_1_0(instruction);
2113 
2114     const char *rs4 = GPR(decode_gpr_gpr4(rs4_value, info), info);
2115     const char *rt4 = GPR(decode_gpr_gpr4(rt4_value, info), info);
2116 
2117     return img_format("ADDU %s, %s", rs4, rt4);
2118 }
2119 
2120 
2121 /*
2122  * [DSP] ADDU.PH rd, rt, rs - Add two pairs of unsigned halfwords
2123  *
2124  *   3         2         1
2125  *  10987654321098765432109876543210
2126  *  001000               00100001101
2127  *     rt -----
2128  *          rs -----
2129  *               rd -----
2130  */
2131 static char *ADDU_PH(uint64 instruction, Dis_info *info)
2132 {
2133     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2134     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2135     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2136 
2137     const char *rd = GPR(rd_value, info);
2138     const char *rs = GPR(rs_value, info);
2139     const char *rt = GPR(rt_value, info);
2140 
2141     return img_format("ADDU.PH %s, %s, %s", rd, rs, rt);
2142 }
2143 
2144 
2145 /*
2146  * ADDU.QB rd, rt, rs - Unsigned Add Quad Byte Vectors
2147  *
2148  *   3         2         1
2149  *  10987654321098765432109876543210
2150  *  001000               00011001101
2151  *     rt -----
2152  *          rs -----
2153  *               rd -----
2154  */
2155 static char *ADDU_QB(uint64 instruction, Dis_info *info)
2156 {
2157     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2158     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2159     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2160 
2161     const char *rd = GPR(rd_value, info);
2162     const char *rs = GPR(rs_value, info);
2163     const char *rt = GPR(rt_value, info);
2164 
2165     return img_format("ADDU.QB %s, %s, %s", rd, rs, rt);
2166 }
2167 
2168 
2169 /*
2170  * [DSP] ADDU_S.PH rd, rt, rs - Add two pairs of unsigned halfwords with 16-bit
2171  *         saturation
2172  *
2173  *   3         2         1
2174  *  10987654321098765432109876543210
2175  *  001000               10100001101
2176  *     rt -----
2177  *          rs -----
2178  *               rd -----
2179  */
2180 static char *ADDU_S_PH(uint64 instruction, Dis_info *info)
2181 {
2182     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2183     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2184     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2185 
2186     const char *rd = GPR(rd_value, info);
2187     const char *rs = GPR(rs_value, info);
2188     const char *rt = GPR(rt_value, info);
2189 
2190     return img_format("ADDU_S.PH %s, %s, %s", rd, rs, rt);
2191 }
2192 
2193 
2194 /*
2195  * ADDU_S.QB rd, rt, rs - Unsigned Add Quad Byte Vectors
2196  *
2197  *   3         2         1
2198  *  10987654321098765432109876543210
2199  *  001000               10011001101
2200  *     rt -----
2201  *          rs -----
2202  *               rd -----
2203  */
2204 static char *ADDU_S_QB(uint64 instruction, Dis_info *info)
2205 {
2206     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2207     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2208     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2209 
2210     const char *rd = GPR(rd_value, info);
2211     const char *rs = GPR(rs_value, info);
2212     const char *rt = GPR(rt_value, info);
2213 
2214     return img_format("ADDU_S.QB %s, %s, %s", rd, rs, rt);
2215 }
2216 
2217 
2218 /*
2219  * ADDUH.QB rd, rt, rs - Unsigned Add Vector Quad-Bytes And Right Shift
2220  *                       to Halve Results
2221  *
2222  *   3         2         1
2223  *  10987654321098765432109876543210
2224  *  001000               00101001101
2225  *     rt -----
2226  *          rs -----
2227  *               rd -----
2228  */
2229 static char *ADDUH_QB(uint64 instruction, Dis_info *info)
2230 {
2231     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2232     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2233     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2234 
2235     const char *rd = GPR(rd_value, info);
2236     const char *rs = GPR(rs_value, info);
2237     const char *rt = GPR(rt_value, info);
2238 
2239     return img_format("ADDUH.QB %s, %s, %s", rd, rs, rt);
2240 }
2241 
2242 
2243 /*
2244  * ADDUH_R.QB rd, rt, rs - Unsigned Add Vector Quad-Bytes And Right Shift
2245  *                         to Halve Results
2246  *
2247  *   3         2         1
2248  *  10987654321098765432109876543210
2249  *  001000               10101001101
2250  *     rt -----
2251  *          rs -----
2252  *               rd -----
2253  */
2254 static char *ADDUH_R_QB(uint64 instruction, Dis_info *info)
2255 {
2256     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2257     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2258     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2259 
2260     const char *rd = GPR(rd_value, info);
2261     const char *rs = GPR(rs_value, info);
2262     const char *rt = GPR(rt_value, info);
2263 
2264     return img_format("ADDUH_R.QB %s, %s, %s", rd, rs, rt);
2265 }
2266 
2267 /*
2268  * ADDWC rd, rt, rs - Add Word with Carry Bit
2269  *
2270  *   3         2         1
2271  *  10987654321098765432109876543210
2272  *  001000               x1111000101
2273  *     rt -----
2274  *          rs -----
2275  *               rd -----
2276  */
2277 static char *ADDWC(uint64 instruction, Dis_info *info)
2278 {
2279     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2280     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2281     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2282 
2283     const char *rd = GPR(rd_value, info);
2284     const char *rs = GPR(rs_value, info);
2285     const char *rt = GPR(rt_value, info);
2286 
2287     return img_format("ADDWC %s, %s, %s", rd, rs, rt);
2288 }
2289 
2290 
2291 /*
2292  *
2293  *
2294  *   3         2         1
2295  *  10987654321098765432109876543210
2296  *  001000               x1110000101
2297  *     rt -----
2298  *          rs -----
2299  *               rd -----
2300  */
2301 static char *ALUIPC(uint64 instruction, Dis_info *info)
2302 {
2303     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2304     int64 s_value = extract_s__se31_0_11_to_2_20_to_12_s12(instruction);
2305 
2306     const char *rt = GPR(rt_value, info);
2307     g_autofree char *s = ADDRESS(s_value, 4, info);
2308 
2309     return img_format("ALUIPC %s, %%pcrel_hi(%s)", rt, s);
2310 }
2311 
2312 
2313 /*
2314  * AND[16] rt3, rs3 -
2315  *
2316  *  5432109876543210
2317  *  101100
2318  *    rt3 ---
2319  *       rs3 ---
2320  *           eu ----
2321  */
2322 static char *AND_16_(uint64 instruction, Dis_info *info)
2323 {
2324     uint64 rt3_value = extract_rt3_9_8_7(instruction);
2325     uint64 rs3_value = extract_rs3_6_5_4(instruction);
2326 
2327     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
2328     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
2329 
2330     return img_format("AND %s, %s", rs3, rt3);
2331 }
2332 
2333 
2334 /*
2335  *
2336  *
2337  *   3         2         1
2338  *  10987654321098765432109876543210
2339  *  001000               x1110000101
2340  *     rt -----
2341  *          rs -----
2342  *               rd -----
2343  */
2344 static char *AND_32_(uint64 instruction, Dis_info *info)
2345 {
2346     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2347     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2348     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
2349 
2350     const char *rd = GPR(rd_value, info);
2351     const char *rs = GPR(rs_value, info);
2352     const char *rt = GPR(rt_value, info);
2353 
2354     return img_format("AND %s, %s, %s", rd, rs, rt);
2355 }
2356 
2357 
2358 /*
2359  * ANDI rt, rs, u -
2360  *
2361  *  5432109876543210
2362  *  101100
2363  *    rt3 ---
2364  *       rs3 ---
2365  *           eu ----
2366  */
2367 static char *ANDI_16_(uint64 instruction, Dis_info *info)
2368 {
2369     uint64 rt3_value = extract_rt3_9_8_7(instruction);
2370     uint64 rs3_value = extract_rs3_6_5_4(instruction);
2371     uint64 eu_value = extract_eu_3_2_1_0(instruction);
2372 
2373     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
2374     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
2375     uint64 eu = encode_eu_from_u_andi16(eu_value);
2376 
2377     return img_format("ANDI %s, %s, 0x%" PRIx64, rt3, rs3, eu);
2378 }
2379 
2380 
2381 /*
2382  *
2383  *
2384  *   3         2         1
2385  *  10987654321098765432109876543210
2386  *  001000               x1110000101
2387  *     rt -----
2388  *          rs -----
2389  *               rd -----
2390  */
2391 static char *ANDI_32_(uint64 instruction, Dis_info *info)
2392 {
2393     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2394     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2395     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
2396 
2397     const char *rt = GPR(rt_value, info);
2398     const char *rs = GPR(rs_value, info);
2399 
2400     return img_format("ANDI %s, %s, 0x%" PRIx64, rt, rs, u_value);
2401 }
2402 
2403 
2404 /*
2405  *
2406  *
2407  *   3         2         1
2408  *  10987654321098765432109876543210
2409  *  001000               x1110000101
2410  *     rt -----
2411  *          rs -----
2412  *               rd -----
2413  */
2414 static char *APPEND(uint64 instruction, Dis_info *info)
2415 {
2416     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2417     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2418     uint64 sa_value = extract_sa_15_14_13_12_11(instruction);
2419 
2420     const char *rt = GPR(rt_value, info);
2421     const char *rs = GPR(rs_value, info);
2422 
2423     return img_format("APPEND %s, %s, 0x%" PRIx64, rt, rs, sa_value);
2424 }
2425 
2426 
2427 /*
2428  *
2429  *
2430  *   3         2         1
2431  *  10987654321098765432109876543210
2432  *  001000               x1110000101
2433  *     rt -----
2434  *          rs -----
2435  *               rd -----
2436  */
2437 static char *ASET(uint64 instruction, Dis_info *info)
2438 {
2439     uint64 bit_value = extract_bit_23_22_21(instruction);
2440     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2441     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
2442 
2443     const char *rs = GPR(rs_value, info);
2444 
2445     return img_format("ASET 0x%" PRIx64 ", %" PRId64 "(%s)",
2446                       bit_value, s_value, rs);
2447 }
2448 
2449 
2450 /*
2451  *
2452  *
2453  *   3         2         1
2454  *  10987654321098765432109876543210
2455  *  001000               x1110000101
2456  *     rt -----
2457  *          rs -----
2458  *               rd -----
2459  */
2460 static char *BALC_16_(uint64 instruction, Dis_info *info)
2461 {
2462     int64 s_value = extract_s__se10_0_9_8_7_6_5_4_3_2_1_s1(instruction);
2463 
2464     g_autofree char *s = ADDRESS(s_value, 2, info);
2465 
2466     return img_format("BALC %s", s);
2467 }
2468 
2469 
2470 /*
2471  *
2472  *
2473  *   3         2         1
2474  *  10987654321098765432109876543210
2475  *  001000               x1110000101
2476  *     rt -----
2477  *          rs -----
2478  *               rd -----
2479  */
2480 static char *BALC_32_(uint64 instruction, Dis_info *info)
2481 {
2482     int64 s_value = extract_s__se25_0_24_to_1_s1(instruction);
2483 
2484     g_autofree char *s = ADDRESS(s_value, 4, info);
2485 
2486     return img_format("BALC %s", s);
2487 }
2488 
2489 
2490 /*
2491  *
2492  *
2493  *   3         2         1
2494  *  10987654321098765432109876543210
2495  *  001000               x1110000101
2496  *     rt -----
2497  *          rs -----
2498  *               rd -----
2499  */
2500 static char *BALRSC(uint64 instruction, Dis_info *info)
2501 {
2502     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2503     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2504 
2505     const char *rt = GPR(rt_value, info);
2506     const char *rs = GPR(rs_value, info);
2507 
2508     return img_format("BALRSC %s, %s", rt, rs);
2509 }
2510 
2511 
2512 /*
2513  *
2514  *
2515  *   3         2         1
2516  *  10987654321098765432109876543210
2517  *  001000               x1110000101
2518  *     rt -----
2519  *          rs -----
2520  *               rd -----
2521  */
2522 static char *BBEQZC(uint64 instruction, Dis_info *info)
2523 {
2524     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2525     uint64 bit_value = extract_bit_16_15_14_13_12_11(instruction);
2526     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2527 
2528     const char *rt = GPR(rt_value, info);
2529     g_autofree char *s = ADDRESS(s_value, 4, info);
2530 
2531     return img_format("BBEQZC %s, 0x%" PRIx64 ", %s", rt, bit_value, s);
2532 }
2533 
2534 
2535 /*
2536  *
2537  *
2538  *   3         2         1
2539  *  10987654321098765432109876543210
2540  *  001000               x1110000101
2541  *     rt -----
2542  *          rs -----
2543  *               rd -----
2544  */
2545 static char *BBNEZC(uint64 instruction, Dis_info *info)
2546 {
2547     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2548     uint64 bit_value = extract_bit_16_15_14_13_12_11(instruction);
2549     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2550 
2551     const char *rt = GPR(rt_value, info);
2552     g_autofree char *s = ADDRESS(s_value, 4, info);
2553 
2554     return img_format("BBNEZC %s, 0x%" PRIx64 ", %s", rt, bit_value, s);
2555 }
2556 
2557 
2558 /*
2559  *
2560  *
2561  *   3         2         1
2562  *  10987654321098765432109876543210
2563  *  001000               x1110000101
2564  *     rt -----
2565  *          rs -----
2566  *               rd -----
2567  */
2568 static char *BC_16_(uint64 instruction, Dis_info *info)
2569 {
2570     int64 s_value = extract_s__se10_0_9_8_7_6_5_4_3_2_1_s1(instruction);
2571 
2572     g_autofree char *s = ADDRESS(s_value, 2, info);
2573 
2574     return img_format("BC %s", s);
2575 }
2576 
2577 
2578 /*
2579  *
2580  *
2581  *   3         2         1
2582  *  10987654321098765432109876543210
2583  *  001000               x1110000101
2584  *     rt -----
2585  *          rs -----
2586  *               rd -----
2587  */
2588 static char *BC_32_(uint64 instruction, Dis_info *info)
2589 {
2590     int64 s_value = extract_s__se25_0_24_to_1_s1(instruction);
2591 
2592     g_autofree char *s = ADDRESS(s_value, 4, info);
2593 
2594     return img_format("BC %s", s);
2595 }
2596 
2597 
2598 /*
2599  *
2600  *
2601  *   3         2         1
2602  *  10987654321098765432109876543210
2603  *  001000               x1110000101
2604  *     rt -----
2605  *          rs -----
2606  *               rd -----
2607  */
2608 static char *BC1EQZC(uint64 instruction, Dis_info *info)
2609 {
2610     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
2611     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2612 
2613     const char *ft = FPR(ft_value, info);
2614     g_autofree char *s = ADDRESS(s_value, 4, info);
2615 
2616     return img_format("BC1EQZC %s, %s", ft, s);
2617 }
2618 
2619 
2620 /*
2621  *
2622  *
2623  *   3         2         1
2624  *  10987654321098765432109876543210
2625  *  001000               x1110000101
2626  *     rt -----
2627  *          rs -----
2628  *               rd -----
2629  */
2630 static char *BC1NEZC(uint64 instruction, Dis_info *info)
2631 {
2632     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
2633     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2634 
2635     const char *ft = FPR(ft_value, info);
2636     g_autofree char *s = ADDRESS(s_value, 4, info);
2637 
2638     return img_format("BC1NEZC %s, %s", ft, s);
2639 }
2640 
2641 
2642 /*
2643  *
2644  *
2645  *   3         2         1
2646  *  10987654321098765432109876543210
2647  *  001000               x1110000101
2648  *     rt -----
2649  *          rs -----
2650  *               rd -----
2651  */
2652 static char *BC2EQZC(uint64 instruction, Dis_info *info)
2653 {
2654     uint64 ct_value = extract_ct_25_24_23_22_21(instruction);
2655     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2656 
2657     g_autofree char *s = ADDRESS(s_value, 4, info);
2658 
2659     return img_format("BC2EQZC CP%" PRIu64 ", %s", ct_value, s);
2660 }
2661 
2662 
2663 /*
2664  *
2665  *
2666  *   3         2         1
2667  *  10987654321098765432109876543210
2668  *  001000               x1110000101
2669  *     rt -----
2670  *          rs -----
2671  *               rd -----
2672  */
2673 static char *BC2NEZC(uint64 instruction, Dis_info *info)
2674 {
2675     uint64 ct_value = extract_ct_25_24_23_22_21(instruction);
2676     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2677 
2678     g_autofree char *s = ADDRESS(s_value, 4, info);
2679 
2680     return img_format("BC2NEZC CP%" PRIu64 ", %s", ct_value, s);
2681 }
2682 
2683 
2684 /*
2685  *
2686  *
2687  *   3         2         1
2688  *  10987654321098765432109876543210
2689  *  001000               x1110000101
2690  *     rt -----
2691  *          rs -----
2692  *               rd -----
2693  */
2694 static char *BEQC_16_(uint64 instruction, Dis_info *info)
2695 {
2696     uint64 rt3_value = extract_rt3_9_8_7(instruction);
2697     uint64 rs3_value = extract_rs3_6_5_4(instruction);
2698     uint64 u_value = extract_u_3_2_1_0__s1(instruction);
2699 
2700     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
2701     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
2702     g_autofree char *u = ADDRESS(u_value, 2, info);
2703 
2704     return img_format("BEQC %s, %s, %s", rs3, rt3, u);
2705 }
2706 
2707 
2708 /*
2709  *
2710  *
2711  *   3         2         1
2712  *  10987654321098765432109876543210
2713  *  001000               x1110000101
2714  *     rt -----
2715  *          rs -----
2716  *               rd -----
2717  */
2718 static char *BEQC_32_(uint64 instruction, Dis_info *info)
2719 {
2720     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2721     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2722     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2723 
2724     const char *rs = GPR(rs_value, info);
2725     const char *rt = GPR(rt_value, info);
2726     g_autofree char *s = ADDRESS(s_value, 4, info);
2727 
2728     return img_format("BEQC %s, %s, %s", rs, rt, s);
2729 }
2730 
2731 
2732 /*
2733  *
2734  *
2735  *   3         2         1
2736  *  10987654321098765432109876543210
2737  *  001000               x1110000101
2738  *     rt -----
2739  *          rs -----
2740  *               rd -----
2741  */
2742 static char *BEQIC(uint64 instruction, Dis_info *info)
2743 {
2744     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2745     uint64 u_value = extract_u_17_16_15_14_13_12_11(instruction);
2746     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2747 
2748     const char *rt = GPR(rt_value, info);
2749     g_autofree char *s = ADDRESS(s_value, 4, info);
2750 
2751     return img_format("BEQIC %s, 0x%" PRIx64 ", %s", rt, u_value, s);
2752 }
2753 
2754 
2755 /*
2756  *
2757  *
2758  *   3         2         1
2759  *  10987654321098765432109876543210
2760  *  001000               x1110000101
2761  *     rt -----
2762  *          rs -----
2763  *               rd -----
2764  */
2765 static char *BEQZC_16_(uint64 instruction, Dis_info *info)
2766 {
2767     uint64 rt3_value = extract_rt3_9_8_7(instruction);
2768     int64 s_value = extract_s__se7_0_6_5_4_3_2_1_s1(instruction);
2769 
2770     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
2771     g_autofree char *s = ADDRESS(s_value, 2, info);
2772 
2773     return img_format("BEQZC %s, %s", rt3, s);
2774 }
2775 
2776 
2777 /*
2778  *
2779  *
2780  *   3         2         1
2781  *  10987654321098765432109876543210
2782  *  001000               x1110000101
2783  *     rt -----
2784  *          rs -----
2785  *               rd -----
2786  */
2787 static char *BGEC(uint64 instruction, Dis_info *info)
2788 {
2789     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2790     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2791     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2792 
2793     const char *rs = GPR(rs_value, info);
2794     const char *rt = GPR(rt_value, info);
2795     g_autofree char *s = ADDRESS(s_value, 4, info);
2796 
2797     return img_format("BGEC %s, %s, %s", rs, rt, s);
2798 }
2799 
2800 
2801 /*
2802  *
2803  *
2804  *   3         2         1
2805  *  10987654321098765432109876543210
2806  *  001000               x1110000101
2807  *     rt -----
2808  *          rs -----
2809  *               rd -----
2810  */
2811 static char *BGEIC(uint64 instruction, Dis_info *info)
2812 {
2813     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2814     uint64 u_value = extract_u_17_16_15_14_13_12_11(instruction);
2815     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2816 
2817     const char *rt = GPR(rt_value, info);
2818     g_autofree char *s = ADDRESS(s_value, 4, info);
2819 
2820     return img_format("BGEIC %s, 0x%" PRIx64 ", %s", rt, u_value, s);
2821 }
2822 
2823 
2824 /*
2825  *
2826  *
2827  *   3         2         1
2828  *  10987654321098765432109876543210
2829  *  001000               x1110000101
2830  *     rt -----
2831  *          rs -----
2832  *               rd -----
2833  */
2834 static char *BGEIUC(uint64 instruction, Dis_info *info)
2835 {
2836     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2837     uint64 u_value = extract_u_17_16_15_14_13_12_11(instruction);
2838     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2839 
2840     const char *rt = GPR(rt_value, info);
2841     g_autofree char *s = ADDRESS(s_value, 4, info);
2842 
2843     return img_format("BGEIUC %s, 0x%" PRIx64 ", %s", rt, u_value, s);
2844 }
2845 
2846 
2847 /*
2848  *
2849  *
2850  *   3         2         1
2851  *  10987654321098765432109876543210
2852  *  001000               x1110000101
2853  *     rt -----
2854  *          rs -----
2855  *               rd -----
2856  */
2857 static char *BGEUC(uint64 instruction, Dis_info *info)
2858 {
2859     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2860     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2861     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2862 
2863     const char *rs = GPR(rs_value, info);
2864     const char *rt = GPR(rt_value, info);
2865     g_autofree char *s = ADDRESS(s_value, 4, info);
2866 
2867     return img_format("BGEUC %s, %s, %s", rs, rt, s);
2868 }
2869 
2870 
2871 /*
2872  *
2873  *
2874  *   3         2         1
2875  *  10987654321098765432109876543210
2876  *  001000               x1110000101
2877  *     rt -----
2878  *          rs -----
2879  *               rd -----
2880  */
2881 static char *BLTC(uint64 instruction, Dis_info *info)
2882 {
2883     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2884     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2885     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2886 
2887     const char *rs = GPR(rs_value, info);
2888     const char *rt = GPR(rt_value, info);
2889     g_autofree char *s = ADDRESS(s_value, 4, info);
2890 
2891     return img_format("BLTC %s, %s, %s", rs, rt, s);
2892 }
2893 
2894 
2895 /*
2896  *
2897  *
2898  *   3         2         1
2899  *  10987654321098765432109876543210
2900  *  001000               x1110000101
2901  *     rt -----
2902  *          rs -----
2903  *               rd -----
2904  */
2905 static char *BLTIC(uint64 instruction, Dis_info *info)
2906 {
2907     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2908     uint64 u_value = extract_u_17_16_15_14_13_12_11(instruction);
2909     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2910 
2911     const char *rt = GPR(rt_value, info);
2912     g_autofree char *s = ADDRESS(s_value, 4, info);
2913 
2914     return img_format("BLTIC %s, 0x%" PRIx64 ", %s", rt, u_value, s);
2915 }
2916 
2917 
2918 /*
2919  *
2920  *
2921  *   3         2         1
2922  *  10987654321098765432109876543210
2923  *  001000               x1110000101
2924  *     rt -----
2925  *          rs -----
2926  *               rd -----
2927  */
2928 static char *BLTIUC(uint64 instruction, Dis_info *info)
2929 {
2930     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2931     uint64 u_value = extract_u_17_16_15_14_13_12_11(instruction);
2932     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
2933 
2934     const char *rt = GPR(rt_value, info);
2935     g_autofree char *s = ADDRESS(s_value, 4, info);
2936 
2937     return img_format("BLTIUC %s, 0x%" PRIx64 ", %s", rt, u_value, s);
2938 }
2939 
2940 
2941 /*
2942  *
2943  *
2944  *   3         2         1
2945  *  10987654321098765432109876543210
2946  *  001000               x1110000101
2947  *     rt -----
2948  *          rs -----
2949  *               rd -----
2950  */
2951 static char *BLTUC(uint64 instruction, Dis_info *info)
2952 {
2953     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
2954     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
2955     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
2956 
2957     const char *rs = GPR(rs_value, info);
2958     const char *rt = GPR(rt_value, info);
2959     g_autofree char *s = ADDRESS(s_value, 4, info);
2960 
2961     return img_format("BLTUC %s, %s, %s", rs, rt, s);
2962 }
2963 
2964 
2965 /*
2966  *
2967  *
2968  *   3         2         1
2969  *  10987654321098765432109876543210
2970  *  001000               x1110000101
2971  *     rt -----
2972  *          rs -----
2973  *               rd -----
2974  */
2975 static char *BNEC_16_(uint64 instruction, Dis_info *info)
2976 {
2977     uint64 rt3_value = extract_rt3_9_8_7(instruction);
2978     uint64 rs3_value = extract_rs3_6_5_4(instruction);
2979     uint64 u_value = extract_u_3_2_1_0__s1(instruction);
2980 
2981     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
2982     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
2983     g_autofree char *u = ADDRESS(u_value, 2, info);
2984 
2985     return img_format("BNEC %s, %s, %s", rs3, rt3, u);
2986 }
2987 
2988 
2989 /*
2990  *
2991  *
2992  *   3         2         1
2993  *  10987654321098765432109876543210
2994  *  001000               x1110000101
2995  *     rt -----
2996  *          rs -----
2997  *               rd -----
2998  */
2999 static char *BNEC_32_(uint64 instruction, Dis_info *info)
3000 {
3001     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3002     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3003     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
3004 
3005     const char *rs = GPR(rs_value, info);
3006     const char *rt = GPR(rt_value, info);
3007     g_autofree char *s = ADDRESS(s_value, 4, info);
3008 
3009     return img_format("BNEC %s, %s, %s", rs, rt, s);
3010 }
3011 
3012 
3013 /*
3014  *
3015  *
3016  *   3         2         1
3017  *  10987654321098765432109876543210
3018  *  001000               x1110000101
3019  *     rt -----
3020  *          rs -----
3021  *               rd -----
3022  */
3023 static char *BNEIC(uint64 instruction, Dis_info *info)
3024 {
3025     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3026     uint64 u_value = extract_u_17_16_15_14_13_12_11(instruction);
3027     int64 s_value = extract_s__se11_0_10_9_8_7_6_5_4_3_2_1_0_s1(instruction);
3028 
3029     const char *rt = GPR(rt_value, info);
3030     g_autofree char *s = ADDRESS(s_value, 4, info);
3031 
3032     return img_format("BNEIC %s, 0x%" PRIx64 ", %s", rt, u_value, s);
3033 }
3034 
3035 
3036 /*
3037  *
3038  *
3039  *   3         2         1
3040  *  10987654321098765432109876543210
3041  *  001000               x1110000101
3042  *     rt -----
3043  *          rs -----
3044  *               rd -----
3045  */
3046 static char *BNEZC_16_(uint64 instruction, Dis_info *info)
3047 {
3048     uint64 rt3_value = extract_rt3_9_8_7(instruction);
3049     int64 s_value = extract_s__se7_0_6_5_4_3_2_1_s1(instruction);
3050 
3051     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
3052     g_autofree char *s = ADDRESS(s_value, 2, info);
3053 
3054     return img_format("BNEZC %s, %s", rt3, s);
3055 }
3056 
3057 
3058 /*
3059  * [DSP] BPOSGE32C offset - Branch on greater than or equal to value 32 in
3060  *   DSPControl Pos field
3061  *
3062  *   3         2         1
3063  *  10987654321098765432109876543210
3064  *  100010xxxxx0010001
3065  *            s[13:1] -------------
3066  *                           s[14] -
3067  */
3068 static char *BPOSGE32C(uint64 instruction, Dis_info *info)
3069 {
3070     int64 s_value = extract_s__se14_0_13_to_1_s1(instruction);
3071 
3072     g_autofree char *s = ADDRESS(s_value, 4, info);
3073 
3074     return img_format("BPOSGE32C %s", s);
3075 }
3076 
3077 
3078 /*
3079  *
3080  *
3081  *   3         2         1
3082  *  10987654321098765432109876543210
3083  *  001000               x1110000101
3084  *     rt -----
3085  *          rs -----
3086  *               rd -----
3087  */
3088 static char *BREAK_16_(uint64 instruction, Dis_info *info)
3089 {
3090     uint64 code_value = extract_code_2_1_0(instruction);
3091 
3092 
3093     return img_format("BREAK 0x%" PRIx64, code_value);
3094 }
3095 
3096 
3097 /*
3098  * BREAK code - Break. Cause a Breakpoint exception
3099  *
3100  *   3         2         1
3101  *  10987654321098765432109876543210
3102  *  001000               x1110000101
3103  *     rt -----
3104  *          rs -----
3105  *               rd -----
3106  */
3107 static char *BREAK_32_(uint64 instruction, Dis_info *info)
3108 {
3109     uint64 code_value = extract_code_18_to_0(instruction);
3110 
3111 
3112     return img_format("BREAK 0x%" PRIx64, code_value);
3113 }
3114 
3115 
3116 /*
3117  *
3118  *
3119  *   3         2         1
3120  *  10987654321098765432109876543210
3121  *  001000               x1110000101
3122  *     rt -----
3123  *          rs -----
3124  *               rd -----
3125  */
3126 static char *BRSC(uint64 instruction, Dis_info *info)
3127 {
3128     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3129 
3130     const char *rs = GPR(rs_value, info);
3131 
3132     return img_format("BRSC %s", rs);
3133 }
3134 
3135 
3136 /*
3137  *
3138  *
3139  *   3         2         1
3140  *  10987654321098765432109876543210
3141  *  001000               x1110000101
3142  *     rt -----
3143  *          rs -----
3144  *               rd -----
3145  */
3146 static char *CACHE(uint64 instruction, Dis_info *info)
3147 {
3148     uint64 op_value = extract_op_25_24_23_22_21(instruction);
3149     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3150     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
3151 
3152     const char *rs = GPR(rs_value, info);
3153 
3154     return img_format("CACHE 0x%" PRIx64 ", %" PRId64 "(%s)",
3155                       op_value, s_value, rs);
3156 }
3157 
3158 
3159 /*
3160  *
3161  *
3162  *   3         2         1
3163  *  10987654321098765432109876543210
3164  *  001000               x1110000101
3165  *     rt -----
3166  *          rs -----
3167  *               rd -----
3168  */
3169 static char *CACHEE(uint64 instruction, Dis_info *info)
3170 {
3171     uint64 op_value = extract_op_25_24_23_22_21(instruction);
3172     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3173     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
3174 
3175     const char *rs = GPR(rs_value, info);
3176 
3177     return img_format("CACHEE 0x%" PRIx64 ", %" PRId64 "(%s)",
3178                       op_value, s_value, rs);
3179 }
3180 
3181 
3182 /*
3183  *
3184  *
3185  *   3         2         1
3186  *  10987654321098765432109876543210
3187  *  001000               x1110000101
3188  *     rt -----
3189  *          rs -----
3190  *               rd -----
3191  */
3192 static char *CEIL_L_D(uint64 instruction, Dis_info *info)
3193 {
3194     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3195     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3196 
3197     const char *ft = FPR(ft_value, info);
3198     const char *fs = FPR(fs_value, info);
3199 
3200     return img_format("CEIL.L.D %s, %s", ft, fs);
3201 }
3202 
3203 
3204 /*
3205  *
3206  *
3207  *   3         2         1
3208  *  10987654321098765432109876543210
3209  *  001000               x1110000101
3210  *     rt -----
3211  *          rs -----
3212  *               rd -----
3213  */
3214 static char *CEIL_L_S(uint64 instruction, Dis_info *info)
3215 {
3216     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3217     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3218 
3219     const char *ft = FPR(ft_value, info);
3220     const char *fs = FPR(fs_value, info);
3221 
3222     return img_format("CEIL.L.S %s, %s", ft, fs);
3223 }
3224 
3225 
3226 /*
3227  *
3228  *
3229  *   3         2         1
3230  *  10987654321098765432109876543210
3231  *  001000               x1110000101
3232  *     rt -----
3233  *          rs -----
3234  *               rd -----
3235  */
3236 static char *CEIL_W_D(uint64 instruction, Dis_info *info)
3237 {
3238     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3239     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3240 
3241     const char *ft = FPR(ft_value, info);
3242     const char *fs = FPR(fs_value, info);
3243 
3244     return img_format("CEIL.W.D %s, %s", ft, fs);
3245 }
3246 
3247 
3248 /*
3249  *
3250  *
3251  *   3         2         1
3252  *  10987654321098765432109876543210
3253  *  001000               x1110000101
3254  *     rt -----
3255  *          rs -----
3256  *               rd -----
3257  */
3258 static char *CEIL_W_S(uint64 instruction, Dis_info *info)
3259 {
3260     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3261     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3262 
3263     const char *ft = FPR(ft_value, info);
3264     const char *fs = FPR(fs_value, info);
3265 
3266     return img_format("CEIL.W.S %s, %s", ft, fs);
3267 }
3268 
3269 
3270 /*
3271  *
3272  *
3273  *   3         2         1
3274  *  10987654321098765432109876543210
3275  *  001000               x1110000101
3276  *     rt -----
3277  *          rs -----
3278  *               rd -----
3279  */
3280 static char *CFC1(uint64 instruction, Dis_info *info)
3281 {
3282     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3283     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
3284 
3285     const char *rt = GPR(rt_value, info);
3286 
3287     return img_format("CFC1 %s, CP%" PRIu64, rt, cs_value);
3288 }
3289 
3290 
3291 /*
3292  *
3293  *
3294  *   3         2         1
3295  *  10987654321098765432109876543210
3296  *  001000               x1110000101
3297  *     rt -----
3298  *          rs -----
3299  *               rd -----
3300  */
3301 static char *CFC2(uint64 instruction, Dis_info *info)
3302 {
3303     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3304     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
3305 
3306     const char *rt = GPR(rt_value, info);
3307 
3308     return img_format("CFC2 %s, CP%" PRIu64, rt, cs_value);
3309 }
3310 
3311 
3312 /*
3313  *
3314  *
3315  *   3         2         1
3316  *  10987654321098765432109876543210
3317  *  001000               x1110000101
3318  *     rt -----
3319  *          rs -----
3320  *               rd -----
3321  */
3322 static char *CLASS_D(uint64 instruction, Dis_info *info)
3323 {
3324     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3325     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3326 
3327     const char *ft = FPR(ft_value, info);
3328     const char *fs = FPR(fs_value, info);
3329 
3330     return img_format("CLASS.D %s, %s", ft, fs);
3331 }
3332 
3333 
3334 /*
3335  *
3336  *
3337  *   3         2         1
3338  *  10987654321098765432109876543210
3339  *  001000               x1110000101
3340  *     rt -----
3341  *          rs -----
3342  *               rd -----
3343  */
3344 static char *CLASS_S(uint64 instruction, Dis_info *info)
3345 {
3346     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3347     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3348 
3349     const char *ft = FPR(ft_value, info);
3350     const char *fs = FPR(fs_value, info);
3351 
3352     return img_format("CLASS.S %s, %s", ft, fs);
3353 }
3354 
3355 
3356 /*
3357  *
3358  *
3359  *   3         2         1
3360  *  10987654321098765432109876543210
3361  *  001000               x1110000101
3362  *     rt -----
3363  *          rs -----
3364  *               rd -----
3365  */
3366 static char *CLO(uint64 instruction, Dis_info *info)
3367 {
3368     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3369     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3370 
3371     const char *rt = GPR(rt_value, info);
3372     const char *rs = GPR(rs_value, info);
3373 
3374     return img_format("CLO %s, %s", rt, rs);
3375 }
3376 
3377 
3378 /*
3379  *
3380  *
3381  *   3         2         1
3382  *  10987654321098765432109876543210
3383  *  001000               x1110000101
3384  *     rt -----
3385  *          rs -----
3386  *               rd -----
3387  */
3388 static char *CLZ(uint64 instruction, Dis_info *info)
3389 {
3390     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3391     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3392 
3393     const char *rt = GPR(rt_value, info);
3394     const char *rs = GPR(rs_value, info);
3395 
3396     return img_format("CLZ %s, %s", rt, rs);
3397 }
3398 
3399 
3400 /*
3401  *
3402  *
3403  *   3         2         1
3404  *  10987654321098765432109876543210
3405  *  001000               x1110000101
3406  *     rt -----
3407  *          rs -----
3408  *               rd -----
3409  */
3410 static char *CMP_AF_D(uint64 instruction, Dis_info *info)
3411 {
3412     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3413     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3414     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3415 
3416     const char *fd = FPR(fd_value, info);
3417     const char *fs = FPR(fs_value, info);
3418     const char *ft = FPR(ft_value, info);
3419 
3420     return img_format("CMP.AF.D %s, %s, %s", fd, fs, ft);
3421 }
3422 
3423 
3424 /*
3425  *
3426  *
3427  *   3         2         1
3428  *  10987654321098765432109876543210
3429  *  001000               x1110000101
3430  *     rt -----
3431  *          rs -----
3432  *               rd -----
3433  */
3434 static char *CMP_AF_S(uint64 instruction, Dis_info *info)
3435 {
3436     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3437     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3438     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3439 
3440     const char *fd = FPR(fd_value, info);
3441     const char *fs = FPR(fs_value, info);
3442     const char *ft = FPR(ft_value, info);
3443 
3444     return img_format("CMP.AF.S %s, %s, %s", fd, fs, ft);
3445 }
3446 
3447 
3448 /*
3449  *
3450  *
3451  *   3         2         1
3452  *  10987654321098765432109876543210
3453  *  001000               x1110000101
3454  *     rt -----
3455  *          rs -----
3456  *               rd -----
3457  */
3458 static char *CMP_EQ_D(uint64 instruction, Dis_info *info)
3459 {
3460     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3461     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3462     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3463 
3464     const char *fd = FPR(fd_value, info);
3465     const char *fs = FPR(fs_value, info);
3466     const char *ft = FPR(ft_value, info);
3467 
3468     return img_format("CMP.EQ.D %s, %s, %s", fd, fs, ft);
3469 }
3470 
3471 
3472 /*
3473  * [DSP] CMP.EQ.PH rs, rt - Compare vectors of signed integer halfword values
3474  *
3475  *   3         2         1
3476  *  10987654321098765432109876543210
3477  *  001000          xxxxxx0000000101
3478  *     rt -----
3479  *          rs -----
3480  */
3481 static char *CMP_EQ_PH(uint64 instruction, Dis_info *info)
3482 {
3483     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3484     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3485 
3486     const char *rs = GPR(rs_value, info);
3487     const char *rt = GPR(rt_value, info);
3488 
3489     return img_format("CMP.EQ.PH %s, %s", rs, rt);
3490 }
3491 
3492 
3493 /*
3494  *
3495  *
3496  *   3         2         1
3497  *  10987654321098765432109876543210
3498  *  001000               x1110000101
3499  *     rt -----
3500  *          rs -----
3501  *               rd -----
3502  */
3503 static char *CMP_EQ_S(uint64 instruction, Dis_info *info)
3504 {
3505     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3506     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3507     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3508 
3509     const char *fd = FPR(fd_value, info);
3510     const char *fs = FPR(fs_value, info);
3511     const char *ft = FPR(ft_value, info);
3512 
3513     return img_format("CMP.EQ.S %s, %s, %s", fd, fs, ft);
3514 }
3515 
3516 
3517 /*
3518  *
3519  *
3520  *   3         2         1
3521  *  10987654321098765432109876543210
3522  *  001000               x1110000101
3523  *     rt -----
3524  *          rs -----
3525  *               rd -----
3526  */
3527 static char *CMP_LE_D(uint64 instruction, Dis_info *info)
3528 {
3529     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3530     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3531     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3532 
3533     const char *fd = FPR(fd_value, info);
3534     const char *fs = FPR(fs_value, info);
3535     const char *ft = FPR(ft_value, info);
3536 
3537     return img_format("CMP.LE.D %s, %s, %s", fd, fs, ft);
3538 }
3539 
3540 
3541 /*
3542  * [DSP] CMP.LE.PH rs, rt - Compare vectors of signed integer halfword values
3543  *
3544  *   3         2         1
3545  *  10987654321098765432109876543210
3546  *  001000          xxxxxx0010000101
3547  *     rt -----
3548  *          rs -----
3549  */
3550 static char *CMP_LE_PH(uint64 instruction, Dis_info *info)
3551 {
3552     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3553     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3554 
3555     const char *rs = GPR(rs_value, info);
3556     const char *rt = GPR(rt_value, info);
3557 
3558     return img_format("CMP.LE.PH %s, %s", rs, rt);
3559 }
3560 
3561 
3562 /*
3563  *
3564  *
3565  *   3         2         1
3566  *  10987654321098765432109876543210
3567  *  001000               x1110000101
3568  *     rt -----
3569  *          rs -----
3570  *               rd -----
3571  */
3572 static char *CMP_LE_S(uint64 instruction, Dis_info *info)
3573 {
3574     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3575     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3576     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3577 
3578     const char *fd = FPR(fd_value, info);
3579     const char *fs = FPR(fs_value, info);
3580     const char *ft = FPR(ft_value, info);
3581 
3582     return img_format("CMP.LE.S %s, %s, %s", fd, fs, ft);
3583 }
3584 
3585 
3586 /*
3587  *
3588  *
3589  *   3         2         1
3590  *  10987654321098765432109876543210
3591  *  001000               x1110000101
3592  *     rt -----
3593  *          rs -----
3594  *               rd -----
3595  */
3596 static char *CMP_LT_D(uint64 instruction, Dis_info *info)
3597 {
3598     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3599     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3600     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3601 
3602     const char *fd = FPR(fd_value, info);
3603     const char *fs = FPR(fs_value, info);
3604     const char *ft = FPR(ft_value, info);
3605 
3606     return img_format("CMP.LT.D %s, %s, %s", fd, fs, ft);
3607 }
3608 
3609 
3610 /*
3611  * [DSP] CMP.LT.PH rs, rt - Compare vectors of signed integer halfword values
3612  *
3613  *   3         2         1
3614  *  10987654321098765432109876543210
3615  *  001000          xxxxxx0001000101
3616  *     rt -----
3617  *          rs -----
3618  */
3619 static char *CMP_LT_PH(uint64 instruction, Dis_info *info)
3620 {
3621     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
3622     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
3623 
3624     const char *rs = GPR(rs_value, info);
3625     const char *rt = GPR(rt_value, info);
3626 
3627     return img_format("CMP.LT.PH %s, %s", rs, rt);
3628 }
3629 
3630 
3631 /*
3632  *
3633  *
3634  *   3         2         1
3635  *  10987654321098765432109876543210
3636  *  001000               x1110000101
3637  *     rt -----
3638  *          rs -----
3639  *               rd -----
3640  */
3641 static char *CMP_LT_S(uint64 instruction, Dis_info *info)
3642 {
3643     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3644     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3645     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3646 
3647     const char *fd = FPR(fd_value, info);
3648     const char *fs = FPR(fs_value, info);
3649     const char *ft = FPR(ft_value, info);
3650 
3651     return img_format("CMP.LT.S %s, %s, %s", fd, fs, ft);
3652 }
3653 
3654 
3655 /*
3656  *
3657  *
3658  *   3         2         1
3659  *  10987654321098765432109876543210
3660  *  001000               x1110000101
3661  *     rt -----
3662  *          rs -----
3663  *               rd -----
3664  */
3665 static char *CMP_NE_D(uint64 instruction, Dis_info *info)
3666 {
3667     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3668     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3669     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3670 
3671     const char *fd = FPR(fd_value, info);
3672     const char *fs = FPR(fs_value, info);
3673     const char *ft = FPR(ft_value, info);
3674 
3675     return img_format("CMP.NE.D %s, %s, %s", fd, fs, ft);
3676 }
3677 
3678 
3679 /*
3680  *
3681  *
3682  *   3         2         1
3683  *  10987654321098765432109876543210
3684  *  001000               x1110000101
3685  *     rt -----
3686  *          rs -----
3687  *               rd -----
3688  */
3689 static char *CMP_NE_S(uint64 instruction, Dis_info *info)
3690 {
3691     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3692     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3693     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3694 
3695     const char *fd = FPR(fd_value, info);
3696     const char *fs = FPR(fs_value, info);
3697     const char *ft = FPR(ft_value, info);
3698 
3699     return img_format("CMP.NE.S %s, %s, %s", fd, fs, ft);
3700 }
3701 
3702 
3703 /*
3704  *
3705  *
3706  *   3         2         1
3707  *  10987654321098765432109876543210
3708  *  001000               x1110000101
3709  *     rt -----
3710  *          rs -----
3711  *               rd -----
3712  */
3713 static char *CMP_OR_D(uint64 instruction, Dis_info *info)
3714 {
3715     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3716     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3717     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3718 
3719     const char *fd = FPR(fd_value, info);
3720     const char *fs = FPR(fs_value, info);
3721     const char *ft = FPR(ft_value, info);
3722 
3723     return img_format("CMP.OR.D %s, %s, %s", fd, fs, ft);
3724 }
3725 
3726 
3727 /*
3728  *
3729  *
3730  *   3         2         1
3731  *  10987654321098765432109876543210
3732  *  001000               x1110000101
3733  *     rt -----
3734  *          rs -----
3735  *               rd -----
3736  */
3737 static char *CMP_OR_S(uint64 instruction, Dis_info *info)
3738 {
3739     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3740     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3741     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3742 
3743     const char *fd = FPR(fd_value, info);
3744     const char *fs = FPR(fs_value, info);
3745     const char *ft = FPR(ft_value, info);
3746 
3747     return img_format("CMP.OR.S %s, %s, %s", fd, fs, ft);
3748 }
3749 
3750 
3751 /*
3752  *
3753  *
3754  *   3         2         1
3755  *  10987654321098765432109876543210
3756  *  001000               x1110000101
3757  *     rt -----
3758  *          rs -----
3759  *               rd -----
3760  */
3761 static char *CMP_SAF_D(uint64 instruction, Dis_info *info)
3762 {
3763     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3764     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3765     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3766 
3767     const char *fd = FPR(fd_value, info);
3768     const char *fs = FPR(fs_value, info);
3769     const char *ft = FPR(ft_value, info);
3770 
3771     return img_format("CMP.SAF.D %s, %s, %s", fd, fs, ft);
3772 }
3773 
3774 
3775 /*
3776  *
3777  *
3778  *   3         2         1
3779  *  10987654321098765432109876543210
3780  *  001000               x1110000101
3781  *     rt -----
3782  *          rs -----
3783  *               rd -----
3784  */
3785 static char *CMP_SAF_S(uint64 instruction, Dis_info *info)
3786 {
3787     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3788     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3789     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3790 
3791     const char *fd = FPR(fd_value, info);
3792     const char *fs = FPR(fs_value, info);
3793     const char *ft = FPR(ft_value, info);
3794 
3795     return img_format("CMP.SAF.S %s, %s, %s", fd, fs, ft);
3796 }
3797 
3798 
3799 /*
3800  *
3801  *
3802  *   3         2         1
3803  *  10987654321098765432109876543210
3804  *  001000               x1110000101
3805  *     rt -----
3806  *          rs -----
3807  *               rd -----
3808  */
3809 static char *CMP_SEQ_D(uint64 instruction, Dis_info *info)
3810 {
3811     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3812     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3813     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3814 
3815     const char *fd = FPR(fd_value, info);
3816     const char *fs = FPR(fs_value, info);
3817     const char *ft = FPR(ft_value, info);
3818 
3819     return img_format("CMP.SEQ.D %s, %s, %s", fd, fs, ft);
3820 }
3821 
3822 
3823 /*
3824  *
3825  *
3826  *   3         2         1
3827  *  10987654321098765432109876543210
3828  *  001000               x1110000101
3829  *     rt -----
3830  *          rs -----
3831  *               rd -----
3832  */
3833 static char *CMP_SEQ_S(uint64 instruction, Dis_info *info)
3834 {
3835     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3836     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3837     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3838 
3839     const char *fd = FPR(fd_value, info);
3840     const char *fs = FPR(fs_value, info);
3841     const char *ft = FPR(ft_value, info);
3842 
3843     return img_format("CMP.SEQ.S %s, %s, %s", fd, fs, ft);
3844 }
3845 
3846 
3847 /*
3848  *
3849  *
3850  *   3         2         1
3851  *  10987654321098765432109876543210
3852  *  001000               x1110000101
3853  *     rt -----
3854  *          rs -----
3855  *               rd -----
3856  */
3857 static char *CMP_SLE_D(uint64 instruction, Dis_info *info)
3858 {
3859     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3860     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3861     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3862 
3863     const char *fd = FPR(fd_value, info);
3864     const char *fs = FPR(fs_value, info);
3865     const char *ft = FPR(ft_value, info);
3866 
3867     return img_format("CMP.SLE.D %s, %s, %s", fd, fs, ft);
3868 }
3869 
3870 
3871 /*
3872  *
3873  *
3874  *   3         2         1
3875  *  10987654321098765432109876543210
3876  *  001000               x1110000101
3877  *     rt -----
3878  *          rs -----
3879  *               rd -----
3880  */
3881 static char *CMP_SLE_S(uint64 instruction, Dis_info *info)
3882 {
3883     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3884     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3885     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3886 
3887     const char *fd = FPR(fd_value, info);
3888     const char *fs = FPR(fs_value, info);
3889     const char *ft = FPR(ft_value, info);
3890 
3891     return img_format("CMP.SLE.S %s, %s, %s", fd, fs, ft);
3892 }
3893 
3894 
3895 /*
3896  *
3897  *
3898  *   3         2         1
3899  *  10987654321098765432109876543210
3900  *  001000               x1110000101
3901  *     rt -----
3902  *          rs -----
3903  *               rd -----
3904  */
3905 static char *CMP_SLT_D(uint64 instruction, Dis_info *info)
3906 {
3907     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3908     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3909     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3910 
3911     const char *fd = FPR(fd_value, info);
3912     const char *fs = FPR(fs_value, info);
3913     const char *ft = FPR(ft_value, info);
3914 
3915     return img_format("CMP.SLT.D %s, %s, %s", fd, fs, ft);
3916 }
3917 
3918 
3919 /*
3920  *
3921  *
3922  *   3         2         1
3923  *  10987654321098765432109876543210
3924  *  001000               x1110000101
3925  *     rt -----
3926  *          rs -----
3927  *               rd -----
3928  */
3929 static char *CMP_SLT_S(uint64 instruction, Dis_info *info)
3930 {
3931     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3932     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3933     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3934 
3935     const char *fd = FPR(fd_value, info);
3936     const char *fs = FPR(fs_value, info);
3937     const char *ft = FPR(ft_value, info);
3938 
3939     return img_format("CMP.SLT.S %s, %s, %s", fd, fs, ft);
3940 }
3941 
3942 
3943 /*
3944  *
3945  *
3946  *   3         2         1
3947  *  10987654321098765432109876543210
3948  *  001000               x1110000101
3949  *     rt -----
3950  *          rs -----
3951  *               rd -----
3952  */
3953 static char *CMP_SNE_D(uint64 instruction, Dis_info *info)
3954 {
3955     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3956     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3957     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3958 
3959     const char *fd = FPR(fd_value, info);
3960     const char *fs = FPR(fs_value, info);
3961     const char *ft = FPR(ft_value, info);
3962 
3963     return img_format("CMP.SNE.D %s, %s, %s", fd, fs, ft);
3964 }
3965 
3966 
3967 /*
3968  *
3969  *
3970  *   3         2         1
3971  *  10987654321098765432109876543210
3972  *  001000               x1110000101
3973  *     rt -----
3974  *          rs -----
3975  *               rd -----
3976  */
3977 static char *CMP_SNE_S(uint64 instruction, Dis_info *info)
3978 {
3979     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
3980     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
3981     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
3982 
3983     const char *fd = FPR(fd_value, info);
3984     const char *fs = FPR(fs_value, info);
3985     const char *ft = FPR(ft_value, info);
3986 
3987     return img_format("CMP.SNE.S %s, %s, %s", fd, fs, ft);
3988 }
3989 
3990 
3991 /*
3992  *
3993  *
3994  *   3         2         1
3995  *  10987654321098765432109876543210
3996  *  001000               x1110000101
3997  *     rt -----
3998  *          rs -----
3999  *               rd -----
4000  */
4001 static char *CMP_SOR_D(uint64 instruction, Dis_info *info)
4002 {
4003     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4004     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4005     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4006 
4007     const char *fd = FPR(fd_value, info);
4008     const char *fs = FPR(fs_value, info);
4009     const char *ft = FPR(ft_value, info);
4010 
4011     return img_format("CMP.SOR.D %s, %s, %s", fd, fs, ft);
4012 }
4013 
4014 
4015 /*
4016  *
4017  *
4018  *   3         2         1
4019  *  10987654321098765432109876543210
4020  *  001000               x1110000101
4021  *     rt -----
4022  *          rs -----
4023  *               rd -----
4024  */
4025 static char *CMP_SOR_S(uint64 instruction, Dis_info *info)
4026 {
4027     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4028     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4029     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4030 
4031     const char *fd = FPR(fd_value, info);
4032     const char *fs = FPR(fs_value, info);
4033     const char *ft = FPR(ft_value, info);
4034 
4035     return img_format("CMP.SOR.S %s, %s, %s", fd, fs, ft);
4036 }
4037 
4038 
4039 /*
4040  *
4041  *
4042  *   3         2         1
4043  *  10987654321098765432109876543210
4044  *  001000               x1110000101
4045  *     rt -----
4046  *          rs -----
4047  *               rd -----
4048  */
4049 static char *CMP_SUEQ_D(uint64 instruction, Dis_info *info)
4050 {
4051     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4052     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4053     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4054 
4055     const char *fd = FPR(fd_value, info);
4056     const char *fs = FPR(fs_value, info);
4057     const char *ft = FPR(ft_value, info);
4058 
4059     return img_format("CMP.SUEQ.D %s, %s, %s", fd, fs, ft);
4060 }
4061 
4062 
4063 /*
4064  *
4065  *
4066  *   3         2         1
4067  *  10987654321098765432109876543210
4068  *  001000               x1110000101
4069  *     rt -----
4070  *          rs -----
4071  *               rd -----
4072  */
4073 static char *CMP_SUEQ_S(uint64 instruction, Dis_info *info)
4074 {
4075     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4076     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4077     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4078 
4079     const char *fd = FPR(fd_value, info);
4080     const char *fs = FPR(fs_value, info);
4081     const char *ft = FPR(ft_value, info);
4082 
4083     return img_format("CMP.SUEQ.S %s, %s, %s", fd, fs, ft);
4084 }
4085 
4086 
4087 /*
4088  *
4089  *
4090  *   3         2         1
4091  *  10987654321098765432109876543210
4092  *  001000               x1110000101
4093  *     rt -----
4094  *          rs -----
4095  *               rd -----
4096  */
4097 static char *CMP_SULE_D(uint64 instruction, Dis_info *info)
4098 {
4099     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4100     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4101     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4102 
4103     const char *fd = FPR(fd_value, info);
4104     const char *fs = FPR(fs_value, info);
4105     const char *ft = FPR(ft_value, info);
4106 
4107     return img_format("CMP.SULE.D %s, %s, %s", fd, fs, ft);
4108 }
4109 
4110 
4111 /*
4112  *
4113  *
4114  *   3         2         1
4115  *  10987654321098765432109876543210
4116  *  001000               x1110000101
4117  *     rt -----
4118  *          rs -----
4119  *               rd -----
4120  */
4121 static char *CMP_SULE_S(uint64 instruction, Dis_info *info)
4122 {
4123     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4124     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4125     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4126 
4127     const char *fd = FPR(fd_value, info);
4128     const char *fs = FPR(fs_value, info);
4129     const char *ft = FPR(ft_value, info);
4130 
4131     return img_format("CMP.SULE.S %s, %s, %s", fd, fs, ft);
4132 }
4133 
4134 
4135 /*
4136  *
4137  *
4138  *   3         2         1
4139  *  10987654321098765432109876543210
4140  *  001000               x1110000101
4141  *     rt -----
4142  *          rs -----
4143  *               rd -----
4144  */
4145 static char *CMP_SULT_D(uint64 instruction, Dis_info *info)
4146 {
4147     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4148     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4149     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4150 
4151     const char *fd = FPR(fd_value, info);
4152     const char *fs = FPR(fs_value, info);
4153     const char *ft = FPR(ft_value, info);
4154 
4155     return img_format("CMP.SULT.D %s, %s, %s", fd, fs, ft);
4156 }
4157 
4158 
4159 /*
4160  *
4161  *
4162  *   3         2         1
4163  *  10987654321098765432109876543210
4164  *  001000               x1110000101
4165  *     rt -----
4166  *          rs -----
4167  *               rd -----
4168  */
4169 static char *CMP_SULT_S(uint64 instruction, Dis_info *info)
4170 {
4171     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4172     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4173     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4174 
4175     const char *fd = FPR(fd_value, info);
4176     const char *fs = FPR(fs_value, info);
4177     const char *ft = FPR(ft_value, info);
4178 
4179     return img_format("CMP.SULT.S %s, %s, %s", fd, fs, ft);
4180 }
4181 
4182 
4183 /*
4184  *
4185  *
4186  *   3         2         1
4187  *  10987654321098765432109876543210
4188  *  001000               x1110000101
4189  *     rt -----
4190  *          rs -----
4191  *               rd -----
4192  */
4193 static char *CMP_SUN_D(uint64 instruction, Dis_info *info)
4194 {
4195     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4196     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4197     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4198 
4199     const char *fd = FPR(fd_value, info);
4200     const char *fs = FPR(fs_value, info);
4201     const char *ft = FPR(ft_value, info);
4202 
4203     return img_format("CMP.SUN.D %s, %s, %s", fd, fs, ft);
4204 }
4205 
4206 
4207 /*
4208  *
4209  *
4210  *   3         2         1
4211  *  10987654321098765432109876543210
4212  *  001000               x1110000101
4213  *     rt -----
4214  *          rs -----
4215  *               rd -----
4216  */
4217 static char *CMP_SUNE_D(uint64 instruction, Dis_info *info)
4218 {
4219     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4220     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4221     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4222 
4223     const char *fd = FPR(fd_value, info);
4224     const char *fs = FPR(fs_value, info);
4225     const char *ft = FPR(ft_value, info);
4226 
4227     return img_format("CMP.SUNE.D %s, %s, %s", fd, fs, ft);
4228 }
4229 
4230 
4231 /*
4232  *
4233  *
4234  *   3         2         1
4235  *  10987654321098765432109876543210
4236  *  001000               x1110000101
4237  *     rt -----
4238  *          rs -----
4239  *               rd -----
4240  */
4241 static char *CMP_SUNE_S(uint64 instruction, Dis_info *info)
4242 {
4243     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4244     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4245     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4246 
4247     const char *fd = FPR(fd_value, info);
4248     const char *fs = FPR(fs_value, info);
4249     const char *ft = FPR(ft_value, info);
4250 
4251     return img_format("CMP.SUNE.S %s, %s, %s", fd, fs, ft);
4252 }
4253 
4254 
4255 /*
4256  *
4257  *
4258  *   3         2         1
4259  *  10987654321098765432109876543210
4260  *  001000               x1110000101
4261  *     rt -----
4262  *          rs -----
4263  *               rd -----
4264  */
4265 static char *CMP_SUN_S(uint64 instruction, Dis_info *info)
4266 {
4267     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4268     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4269     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4270 
4271     const char *fd = FPR(fd_value, info);
4272     const char *fs = FPR(fs_value, info);
4273     const char *ft = FPR(ft_value, info);
4274 
4275     return img_format("CMP.SUN.S %s, %s, %s", fd, fs, ft);
4276 }
4277 
4278 
4279 /*
4280  *
4281  *
4282  *   3         2         1
4283  *  10987654321098765432109876543210
4284  *  001000               x1110000101
4285  *     rt -----
4286  *          rs -----
4287  *               rd -----
4288  */
4289 static char *CMP_UEQ_D(uint64 instruction, Dis_info *info)
4290 {
4291     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4292     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4293     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4294 
4295     const char *fd = FPR(fd_value, info);
4296     const char *fs = FPR(fs_value, info);
4297     const char *ft = FPR(ft_value, info);
4298 
4299     return img_format("CMP.UEQ.D %s, %s, %s", fd, fs, ft);
4300 }
4301 
4302 
4303 /*
4304  *
4305  *
4306  *   3         2         1
4307  *  10987654321098765432109876543210
4308  *  001000               x1110000101
4309  *     rt -----
4310  *          rs -----
4311  *               rd -----
4312  */
4313 static char *CMP_UEQ_S(uint64 instruction, Dis_info *info)
4314 {
4315     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4316     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4317     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4318 
4319     const char *fd = FPR(fd_value, info);
4320     const char *fs = FPR(fs_value, info);
4321     const char *ft = FPR(ft_value, info);
4322 
4323     return img_format("CMP.UEQ.S %s, %s, %s", fd, fs, ft);
4324 }
4325 
4326 
4327 /*
4328  *
4329  *
4330  *   3         2         1
4331  *  10987654321098765432109876543210
4332  *  001000               x1110000101
4333  *     rt -----
4334  *          rs -----
4335  *               rd -----
4336  */
4337 static char *CMP_ULE_D(uint64 instruction, Dis_info *info)
4338 {
4339     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4340     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4341     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4342 
4343     const char *fd = FPR(fd_value, info);
4344     const char *fs = FPR(fs_value, info);
4345     const char *ft = FPR(ft_value, info);
4346 
4347     return img_format("CMP.ULE.D %s, %s, %s", fd, fs, ft);
4348 }
4349 
4350 
4351 /*
4352  *
4353  *
4354  *   3         2         1
4355  *  10987654321098765432109876543210
4356  *  001000               x1110000101
4357  *     rt -----
4358  *          rs -----
4359  *               rd -----
4360  */
4361 static char *CMP_ULE_S(uint64 instruction, Dis_info *info)
4362 {
4363     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4364     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4365     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4366 
4367     const char *fd = FPR(fd_value, info);
4368     const char *fs = FPR(fs_value, info);
4369     const char *ft = FPR(ft_value, info);
4370 
4371     return img_format("CMP.ULE.S %s, %s, %s", fd, fs, ft);
4372 }
4373 
4374 
4375 /*
4376  *
4377  *
4378  *   3         2         1
4379  *  10987654321098765432109876543210
4380  *  001000               x1110000101
4381  *     rt -----
4382  *          rs -----
4383  *               rd -----
4384  */
4385 static char *CMP_ULT_D(uint64 instruction, Dis_info *info)
4386 {
4387     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4388     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4389     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4390 
4391     const char *fd = FPR(fd_value, info);
4392     const char *fs = FPR(fs_value, info);
4393     const char *ft = FPR(ft_value, info);
4394 
4395     return img_format("CMP.ULT.D %s, %s, %s", fd, fs, ft);
4396 }
4397 
4398 
4399 /*
4400  *
4401  *
4402  *   3         2         1
4403  *  10987654321098765432109876543210
4404  *  001000               x1110000101
4405  *     rt -----
4406  *          rs -----
4407  *               rd -----
4408  */
4409 static char *CMP_ULT_S(uint64 instruction, Dis_info *info)
4410 {
4411     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4412     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4413     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4414 
4415     const char *fd = FPR(fd_value, info);
4416     const char *fs = FPR(fs_value, info);
4417     const char *ft = FPR(ft_value, info);
4418 
4419     return img_format("CMP.ULT.S %s, %s, %s", fd, fs, ft);
4420 }
4421 
4422 
4423 /*
4424  *
4425  *
4426  *   3         2         1
4427  *  10987654321098765432109876543210
4428  *  001000               x1110000101
4429  *     rt -----
4430  *          rs -----
4431  *               rd -----
4432  */
4433 static char *CMP_UN_D(uint64 instruction, Dis_info *info)
4434 {
4435     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4436     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4437     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4438 
4439     const char *fd = FPR(fd_value, info);
4440     const char *fs = FPR(fs_value, info);
4441     const char *ft = FPR(ft_value, info);
4442 
4443     return img_format("CMP.UN.D %s, %s, %s", fd, fs, ft);
4444 }
4445 
4446 
4447 /*
4448  *
4449  *
4450  *   3         2         1
4451  *  10987654321098765432109876543210
4452  *  001000               x1110000101
4453  *     rt -----
4454  *          rs -----
4455  *               rd -----
4456  */
4457 static char *CMP_UNE_D(uint64 instruction, Dis_info *info)
4458 {
4459     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4460     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4461     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4462 
4463     const char *fd = FPR(fd_value, info);
4464     const char *fs = FPR(fs_value, info);
4465     const char *ft = FPR(ft_value, info);
4466 
4467     return img_format("CMP.UNE.D %s, %s, %s", fd, fs, ft);
4468 }
4469 
4470 
4471 /*
4472  *
4473  *
4474  *   3         2         1
4475  *  10987654321098765432109876543210
4476  *  001000               x1110000101
4477  *     rt -----
4478  *          rs -----
4479  *               rd -----
4480  */
4481 static char *CMP_UNE_S(uint64 instruction, Dis_info *info)
4482 {
4483     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4484     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4485     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4486 
4487     const char *fd = FPR(fd_value, info);
4488     const char *fs = FPR(fs_value, info);
4489     const char *ft = FPR(ft_value, info);
4490 
4491     return img_format("CMP.UNE.S %s, %s, %s", fd, fs, ft);
4492 }
4493 
4494 
4495 /*
4496  *
4497  *
4498  *   3         2         1
4499  *  10987654321098765432109876543210
4500  *  001000               x1110000101
4501  *     rt -----
4502  *          rs -----
4503  *               rd -----
4504  */
4505 static char *CMP_UN_S(uint64 instruction, Dis_info *info)
4506 {
4507     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4508     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4509     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
4510 
4511     const char *fd = FPR(fd_value, info);
4512     const char *fs = FPR(fs_value, info);
4513     const char *ft = FPR(ft_value, info);
4514 
4515     return img_format("CMP.UN.S %s, %s, %s", fd, fs, ft);
4516 }
4517 
4518 
4519 /*
4520  * [DSP] CMPGDU.EQ.QB rd, rs, rt - Compare unsigned vector of
4521  *   four bytes and write result to GPR and DSPControl
4522  *
4523  *   3         2         1
4524  *  10987654321098765432109876543210
4525  *  001000               x0110000101
4526  *     rt -----
4527  *          rs -----
4528  *               rd -----
4529  */
4530 static char *CMPGDU_EQ_QB(uint64 instruction, Dis_info *info)
4531 {
4532     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4533     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4534     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
4535 
4536     const char *rd = GPR(rd_value, info);
4537     const char *rs = GPR(rs_value, info);
4538     const char *rt = GPR(rt_value, info);
4539 
4540     return img_format("CMPGDU.EQ.QB %s, %s, %s", rd, rs, rt);
4541 }
4542 
4543 
4544 /*
4545  * [DSP] CMPGDU.LE.QB rd, rs, rt - Compare unsigned vector of
4546  *   four bytes and write result to GPR and DSPControl
4547  *
4548  *   3         2         1
4549  *  10987654321098765432109876543210
4550  *  001000               x1000000101
4551  *     rt -----
4552  *          rs -----
4553  *               rd -----
4554  */
4555 static char *CMPGDU_LE_QB(uint64 instruction, Dis_info *info)
4556 {
4557     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4558     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4559     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
4560 
4561     const char *rd = GPR(rd_value, info);
4562     const char *rs = GPR(rs_value, info);
4563     const char *rt = GPR(rt_value, info);
4564 
4565     return img_format("CMPGDU.LE.QB %s, %s, %s", rd, rs, rt);
4566 }
4567 
4568 
4569 /*
4570  * [DSP] CMPGDU.EQ.QB rd, rs, rt - Compare unsigned vector of
4571  *   four bytes and write result to GPR and DSPControl
4572  *
4573  *   3         2         1
4574  *  10987654321098765432109876543210
4575  *  001000               x0111000101
4576  *     rt -----
4577  *          rs -----
4578  *               rd -----
4579  */
4580 static char *CMPGDU_LT_QB(uint64 instruction, Dis_info *info)
4581 {
4582     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4583     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4584     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
4585 
4586     const char *rd = GPR(rd_value, info);
4587     const char *rs = GPR(rs_value, info);
4588     const char *rt = GPR(rt_value, info);
4589 
4590     return img_format("CMPGDU.LT.QB %s, %s, %s", rd, rs, rt);
4591 }
4592 
4593 
4594 /*
4595  * [DSP] CMPGU.EQ.QB rd, rs, rt - Compare vectors of unsigned
4596  *   byte values and write result to a GPR
4597  *
4598  *   3         2         1
4599  *  10987654321098765432109876543210
4600  *  001000               x0011000101
4601  *     rt -----
4602  *          rs -----
4603  *               rd -----
4604  */
4605 static char *CMPGU_EQ_QB(uint64 instruction, Dis_info *info)
4606 {
4607     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4608     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4609     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
4610 
4611     const char *rd = GPR(rd_value, info);
4612     const char *rs = GPR(rs_value, info);
4613     const char *rt = GPR(rt_value, info);
4614 
4615     return img_format("CMPGU.EQ.QB %s, %s, %s", rd, rs, rt);
4616 }
4617 
4618 
4619 /*
4620  * [DSP] CMPGU.LE.QB rd, rs, rt - Compare vectors of unsigned
4621  *   byte values and write result to a GPR
4622  *
4623  *   3         2         1
4624  *  10987654321098765432109876543210
4625  *  001000               x0101000101
4626  *     rt -----
4627  *          rs -----
4628  *               rd -----
4629  */
4630 static char *CMPGU_LE_QB(uint64 instruction, Dis_info *info)
4631 {
4632     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4633     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4634     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
4635 
4636     const char *rd = GPR(rd_value, info);
4637     const char *rs = GPR(rs_value, info);
4638     const char *rt = GPR(rt_value, info);
4639 
4640     return img_format("CMPGU.LE.QB %s, %s, %s", rd, rs, rt);
4641 }
4642 
4643 
4644 /*
4645  * [DSP] CMPGU.LT.QB rd, rs, rt - Compare vectors of unsigned
4646  *   byte values and write result to a GPR
4647  *
4648  *   3         2         1
4649  *  10987654321098765432109876543210
4650  *  001000               x0100000101
4651  *     rt -----
4652  *          rs -----
4653  *               rd -----
4654  */
4655 static char *CMPGU_LT_QB(uint64 instruction, Dis_info *info)
4656 {
4657     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4658     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4659     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
4660 
4661     const char *rd = GPR(rd_value, info);
4662     const char *rs = GPR(rs_value, info);
4663     const char *rt = GPR(rt_value, info);
4664 
4665     return img_format("CMPGU.LT.QB %s, %s, %s", rd, rs, rt);
4666 }
4667 
4668 
4669 /*
4670  * [DSP] CMPU.EQ.QB rd, rs, rt - Compare vectors of unsigned
4671  *   byte values
4672  *
4673  *   3         2         1
4674  *  10987654321098765432109876543210
4675  *  001000          xxxxxx1001000101
4676  *     rt -----
4677  *          rs -----
4678  */
4679 static char *CMPU_EQ_QB(uint64 instruction, Dis_info *info)
4680 {
4681     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4682     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4683 
4684     const char *rs = GPR(rs_value, info);
4685     const char *rt = GPR(rt_value, info);
4686 
4687     return img_format("CMPU.EQ.QB %s, %s", rs, rt);
4688 }
4689 
4690 
4691 /*
4692  * [DSP] CMPU.LE.QB rd, rs, rt - Compare vectors of unsigned
4693  *   byte values
4694  *
4695  *   3         2         1
4696  *  10987654321098765432109876543210
4697  *  001000          xxxxxx1011000101
4698  *     rt -----
4699  *          rs -----
4700  */
4701 static char *CMPU_LE_QB(uint64 instruction, Dis_info *info)
4702 {
4703     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4704     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4705 
4706     const char *rs = GPR(rs_value, info);
4707     const char *rt = GPR(rt_value, info);
4708 
4709     return img_format("CMPU.LE.QB %s, %s", rs, rt);
4710 }
4711 
4712 
4713 /*
4714  * [DSP] CMPU.LT.QB rd, rs, rt - Compare vectors of unsigned
4715  *   byte values
4716  *
4717  *   3         2         1
4718  *  10987654321098765432109876543210
4719  *  001000          xxxxxx1010000101
4720  *     rt -----
4721  *          rs -----
4722  */
4723 static char *CMPU_LT_QB(uint64 instruction, Dis_info *info)
4724 {
4725     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4726     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
4727 
4728     const char *rs = GPR(rs_value, info);
4729     const char *rt = GPR(rt_value, info);
4730 
4731     return img_format("CMPU.LT.QB %s, %s", rs, rt);
4732 }
4733 
4734 
4735 /*
4736  *
4737  *
4738  *   3         2         1
4739  *  10987654321098765432109876543210
4740  *  001000               x1110000101
4741  *     rt -----
4742  *          rs -----
4743  *               rd -----
4744  */
4745 static char *COP2_1(uint64 instruction, Dis_info *info)
4746 {
4747     uint64 cofun_value = extract_cofun_25_24_23(instruction);
4748 
4749 
4750     return img_format("COP2_1 0x%" PRIx64, cofun_value);
4751 }
4752 
4753 
4754 /*
4755  *
4756  *
4757  *   3         2         1
4758  *  10987654321098765432109876543210
4759  *  001000               x1110000101
4760  *     rt -----
4761  *          rs -----
4762  *               rd -----
4763  */
4764 static char *CTC1(uint64 instruction, Dis_info *info)
4765 {
4766     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4767     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
4768 
4769     const char *rt = GPR(rt_value, info);
4770 
4771     return img_format("CTC1 %s, CP%" PRIu64, rt, cs_value);
4772 }
4773 
4774 
4775 /*
4776  *
4777  *
4778  *   3         2         1
4779  *  10987654321098765432109876543210
4780  *  001000               x1110000101
4781  *     rt -----
4782  *          rs -----
4783  *               rd -----
4784  */
4785 static char *CTC2(uint64 instruction, Dis_info *info)
4786 {
4787     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
4788     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
4789 
4790     const char *rt = GPR(rt_value, info);
4791 
4792     return img_format("CTC2 %s, CP%" PRIu64, rt, cs_value);
4793 }
4794 
4795 
4796 /*
4797  *
4798  *
4799  *   3         2         1
4800  *  10987654321098765432109876543210
4801  *  001000               x1110000101
4802  *     rt -----
4803  *          rs -----
4804  *               rd -----
4805  */
4806 static char *CVT_D_L(uint64 instruction, Dis_info *info)
4807 {
4808     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4809     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4810 
4811     const char *ft = FPR(ft_value, info);
4812     const char *fs = FPR(fs_value, info);
4813 
4814     return img_format("CVT.D.L %s, %s", ft, fs);
4815 }
4816 
4817 
4818 /*
4819  *
4820  *
4821  *   3         2         1
4822  *  10987654321098765432109876543210
4823  *  001000               x1110000101
4824  *     rt -----
4825  *          rs -----
4826  *               rd -----
4827  */
4828 static char *CVT_D_S(uint64 instruction, Dis_info *info)
4829 {
4830     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4831     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4832 
4833     const char *ft = FPR(ft_value, info);
4834     const char *fs = FPR(fs_value, info);
4835 
4836     return img_format("CVT.D.S %s, %s", ft, fs);
4837 }
4838 
4839 
4840 /*
4841  *
4842  *
4843  *   3         2         1
4844  *  10987654321098765432109876543210
4845  *  001000               x1110000101
4846  *     rt -----
4847  *          rs -----
4848  *               rd -----
4849  */
4850 static char *CVT_D_W(uint64 instruction, Dis_info *info)
4851 {
4852     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4853     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4854 
4855     const char *ft = FPR(ft_value, info);
4856     const char *fs = FPR(fs_value, info);
4857 
4858     return img_format("CVT.D.W %s, %s", ft, fs);
4859 }
4860 
4861 
4862 /*
4863  *
4864  *
4865  *   3         2         1
4866  *  10987654321098765432109876543210
4867  *  001000               x1110000101
4868  *     rt -----
4869  *          rs -----
4870  *               rd -----
4871  */
4872 static char *CVT_L_D(uint64 instruction, Dis_info *info)
4873 {
4874     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4875     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4876 
4877     const char *ft = FPR(ft_value, info);
4878     const char *fs = FPR(fs_value, info);
4879 
4880     return img_format("CVT.L.D %s, %s", ft, fs);
4881 }
4882 
4883 
4884 /*
4885  *
4886  *
4887  *   3         2         1
4888  *  10987654321098765432109876543210
4889  *  001000               x1110000101
4890  *     rt -----
4891  *          rs -----
4892  *               rd -----
4893  */
4894 static char *CVT_L_S(uint64 instruction, Dis_info *info)
4895 {
4896     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4897     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4898 
4899     const char *ft = FPR(ft_value, info);
4900     const char *fs = FPR(fs_value, info);
4901 
4902     return img_format("CVT.L.S %s, %s", ft, fs);
4903 }
4904 
4905 
4906 /*
4907  *
4908  *
4909  *   3         2         1
4910  *  10987654321098765432109876543210
4911  *  001000               x1110000101
4912  *     rt -----
4913  *          rs -----
4914  *               rd -----
4915  */
4916 static char *CVT_S_D(uint64 instruction, Dis_info *info)
4917 {
4918     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4919     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4920 
4921     const char *ft = FPR(ft_value, info);
4922     const char *fs = FPR(fs_value, info);
4923 
4924     return img_format("CVT.S.D %s, %s", ft, fs);
4925 }
4926 
4927 
4928 /*
4929  *
4930  *
4931  *   3         2         1
4932  *  10987654321098765432109876543210
4933  *  001000               x1110000101
4934  *     rt -----
4935  *          rs -----
4936  *               rd -----
4937  */
4938 static char *CVT_S_L(uint64 instruction, Dis_info *info)
4939 {
4940     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4941     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4942 
4943     const char *ft = FPR(ft_value, info);
4944     const char *fs = FPR(fs_value, info);
4945 
4946     return img_format("CVT.S.L %s, %s", ft, fs);
4947 }
4948 
4949 
4950 /*
4951  *
4952  *
4953  *   3         2         1
4954  *  10987654321098765432109876543210
4955  *  001000               x1110000101
4956  *     rt -----
4957  *          rs -----
4958  *               rd -----
4959  */
4960 static char *CVT_S_PL(uint64 instruction, Dis_info *info)
4961 {
4962     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4963     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4964 
4965     const char *ft = FPR(ft_value, info);
4966     const char *fs = FPR(fs_value, info);
4967 
4968     return img_format("CVT.S.PL %s, %s", ft, fs);
4969 }
4970 
4971 
4972 /*
4973  *
4974  *
4975  *   3         2         1
4976  *  10987654321098765432109876543210
4977  *  001000               x1110000101
4978  *     rt -----
4979  *          rs -----
4980  *               rd -----
4981  */
4982 static char *CVT_S_PU(uint64 instruction, Dis_info *info)
4983 {
4984     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
4985     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
4986 
4987     const char *ft = FPR(ft_value, info);
4988     const char *fs = FPR(fs_value, info);
4989 
4990     return img_format("CVT.S.PU %s, %s", ft, fs);
4991 }
4992 
4993 
4994 /*
4995  *
4996  *
4997  *   3         2         1
4998  *  10987654321098765432109876543210
4999  *  001000               x1110000101
5000  *     rt -----
5001  *          rs -----
5002  *               rd -----
5003  */
5004 static char *CVT_S_W(uint64 instruction, Dis_info *info)
5005 {
5006     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
5007     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5008 
5009     const char *ft = FPR(ft_value, info);
5010     const char *fs = FPR(fs_value, info);
5011 
5012     return img_format("CVT.S.W %s, %s", ft, fs);
5013 }
5014 
5015 
5016 /*
5017  *
5018  *
5019  *   3         2         1
5020  *  10987654321098765432109876543210
5021  *  001000               x1110000101
5022  *     rt -----
5023  *          rs -----
5024  *               rd -----
5025  */
5026 static char *CVT_W_D(uint64 instruction, Dis_info *info)
5027 {
5028     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
5029     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5030 
5031     const char *ft = FPR(ft_value, info);
5032     const char *fs = FPR(fs_value, info);
5033 
5034     return img_format("CVT.W.D %s, %s", ft, fs);
5035 }
5036 
5037 
5038 /*
5039  *
5040  *
5041  *   3         2         1
5042  *  10987654321098765432109876543210
5043  *  001000               x1110000101
5044  *     rt -----
5045  *          rs -----
5046  *               rd -----
5047  */
5048 static char *CVT_W_S(uint64 instruction, Dis_info *info)
5049 {
5050     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
5051     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5052 
5053     const char *ft = FPR(ft_value, info);
5054     const char *fs = FPR(fs_value, info);
5055 
5056     return img_format("CVT.W.S %s, %s", ft, fs);
5057 }
5058 
5059 
5060 /*
5061  *
5062  *
5063  *   3         2         1
5064  *  10987654321098765432109876543210
5065  *  001000               x1110000101
5066  *     rt -----
5067  *          rs -----
5068  *               rd -----
5069  */
5070 static char *DADDIU_48_(uint64 instruction, Dis_info *info)
5071 {
5072     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
5073     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
5074 
5075     const char *rt = GPR(rt_value, info);
5076 
5077     return img_format("DADDIU %s, %" PRId64, rt, s_value);
5078 }
5079 
5080 
5081 /*
5082  *
5083  *
5084  *   3         2         1
5085  *  10987654321098765432109876543210
5086  *  001000               x1110000101
5087  *     rt -----
5088  *          rs -----
5089  *               rd -----
5090  */
5091 static char *DADDIU_NEG_(uint64 instruction, Dis_info *info)
5092 {
5093     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5094     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5095     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
5096 
5097     const char *rt = GPR(rt_value, info);
5098     const char *rs = GPR(rs_value, info);
5099     int64 u = neg_copy(u_value);
5100 
5101     return img_format("DADDIU %s, %s, %" PRId64, rt, rs, u);
5102 }
5103 
5104 
5105 /*
5106  *
5107  *
5108  *   3         2         1
5109  *  10987654321098765432109876543210
5110  *  001000               x1110000101
5111  *     rt -----
5112  *          rs -----
5113  *               rd -----
5114  */
5115 static char *DADDIU_U12_(uint64 instruction, Dis_info *info)
5116 {
5117     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5118     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5119     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
5120 
5121     const char *rt = GPR(rt_value, info);
5122     const char *rs = GPR(rs_value, info);
5123 
5124     return img_format("DADDIU %s, %s, 0x%" PRIx64, rt, rs, u_value);
5125 }
5126 
5127 
5128 /*
5129  *
5130  *
5131  *   3         2         1
5132  *  10987654321098765432109876543210
5133  *  001000               x1110000101
5134  *     rt -----
5135  *          rs -----
5136  *               rd -----
5137  */
5138 static char *DADD(uint64 instruction, Dis_info *info)
5139 {
5140     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5141     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5142     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5143 
5144     const char *rd = GPR(rd_value, info);
5145     const char *rs = GPR(rs_value, info);
5146     const char *rt = GPR(rt_value, info);
5147 
5148     return img_format("DADD %s, %s, %s", rd, rs, rt);
5149 }
5150 
5151 
5152 /*
5153  *
5154  *
5155  *   3         2         1
5156  *  10987654321098765432109876543210
5157  *  001000               x1110000101
5158  *     rt -----
5159  *          rs -----
5160  *               rd -----
5161  */
5162 static char *DADDU(uint64 instruction, Dis_info *info)
5163 {
5164     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5165     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5166     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5167 
5168     const char *rd = GPR(rd_value, info);
5169     const char *rs = GPR(rs_value, info);
5170     const char *rt = GPR(rt_value, info);
5171 
5172     return img_format("DADDU %s, %s, %s", rd, rs, rt);
5173 }
5174 
5175 
5176 /*
5177  *
5178  *
5179  *   3         2         1
5180  *  10987654321098765432109876543210
5181  *  001000               x1110000101
5182  *     rt -----
5183  *          rs -----
5184  *               rd -----
5185  */
5186 static char *DCLO(uint64 instruction, Dis_info *info)
5187 {
5188     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5189     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5190 
5191     const char *rt = GPR(rt_value, info);
5192     const char *rs = GPR(rs_value, info);
5193 
5194     return img_format("DCLO %s, %s", rt, rs);
5195 }
5196 
5197 
5198 /*
5199  *
5200  *
5201  *   3         2         1
5202  *  10987654321098765432109876543210
5203  *  001000               x1110000101
5204  *     rt -----
5205  *          rs -----
5206  *               rd -----
5207  */
5208 static char *DCLZ(uint64 instruction, Dis_info *info)
5209 {
5210     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5211     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5212 
5213     const char *rt = GPR(rt_value, info);
5214     const char *rs = GPR(rs_value, info);
5215 
5216     return img_format("DCLZ %s, %s", rt, rs);
5217 }
5218 
5219 
5220 /*
5221  *
5222  *
5223  *   3         2         1
5224  *  10987654321098765432109876543210
5225  *  001000               x1110000101
5226  *     rt -----
5227  *          rs -----
5228  *               rd -----
5229  */
5230 static char *DDIV(uint64 instruction, Dis_info *info)
5231 {
5232     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5233     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5234     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5235 
5236     const char *rd = GPR(rd_value, info);
5237     const char *rs = GPR(rs_value, info);
5238     const char *rt = GPR(rt_value, info);
5239 
5240     return img_format("DDIV %s, %s, %s", rd, rs, rt);
5241 }
5242 
5243 
5244 /*
5245  *
5246  *
5247  *   3         2         1
5248  *  10987654321098765432109876543210
5249  *  001000               x1110000101
5250  *     rt -----
5251  *          rs -----
5252  *               rd -----
5253  */
5254 static char *DDIVU(uint64 instruction, Dis_info *info)
5255 {
5256     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5257     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5258     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5259 
5260     const char *rd = GPR(rd_value, info);
5261     const char *rs = GPR(rs_value, info);
5262     const char *rt = GPR(rt_value, info);
5263 
5264     return img_format("DDIVU %s, %s, %s", rd, rs, rt);
5265 }
5266 
5267 
5268 /*
5269  *
5270  *
5271  *   3         2         1
5272  *  10987654321098765432109876543210
5273  *  001000               x1110000101
5274  *     rt -----
5275  *          rs -----
5276  *               rd -----
5277  */
5278 static char *DERET(uint64 instruction, Dis_info *info)
5279 {
5280     (void)instruction;
5281 
5282     return g_strdup("DERET ");
5283 }
5284 
5285 
5286 /*
5287  *
5288  *
5289  *   3         2         1
5290  *  10987654321098765432109876543210
5291  *  001000               x1110000101
5292  *     rt -----
5293  *          rs -----
5294  *               rd -----
5295  */
5296 static char *DEXTM(uint64 instruction, Dis_info *info)
5297 {
5298     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5299     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5300     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
5301     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
5302 
5303     const char *rt = GPR(rt_value, info);
5304     const char *rs = GPR(rs_value, info);
5305     uint64 msbd = encode_msbd_from_size(msbd_value);
5306 
5307     return img_format("DEXTM %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
5308                       rt, rs, lsb_value, msbd);
5309 }
5310 
5311 
5312 /*
5313  *
5314  *
5315  *   3         2         1
5316  *  10987654321098765432109876543210
5317  *  001000               x1110000101
5318  *     rt -----
5319  *          rs -----
5320  *               rd -----
5321  */
5322 static char *DEXT(uint64 instruction, Dis_info *info)
5323 {
5324     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5325     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5326     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
5327     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
5328 
5329     const char *rt = GPR(rt_value, info);
5330     const char *rs = GPR(rs_value, info);
5331     uint64 msbd = encode_msbd_from_size(msbd_value);
5332 
5333     return img_format("DEXT %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
5334                       rt, rs, lsb_value, msbd);
5335 }
5336 
5337 
5338 /*
5339  *
5340  *
5341  *   3         2         1
5342  *  10987654321098765432109876543210
5343  *  001000               x1110000101
5344  *     rt -----
5345  *          rs -----
5346  *               rd -----
5347  */
5348 static char *DEXTU(uint64 instruction, Dis_info *info)
5349 {
5350     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5351     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5352     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
5353     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
5354 
5355     const char *rt = GPR(rt_value, info);
5356     const char *rs = GPR(rs_value, info);
5357     uint64 msbd = encode_msbd_from_size(msbd_value);
5358 
5359     return img_format("DEXTU %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
5360                       rt, rs, lsb_value, msbd);
5361 }
5362 
5363 
5364 /*
5365  *
5366  *
5367  *   3         2         1
5368  *  10987654321098765432109876543210
5369  *  001000               x1110000101
5370  *     rt -----
5371  *          rs -----
5372  *               rd -----
5373  */
5374 static char *DINSM(uint64 instruction, Dis_info *info)
5375 {
5376     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5377     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5378     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
5379     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
5380 
5381     const char *rt = GPR(rt_value, info);
5382     const char *rs = GPR(rs_value, info);
5383     /* !!!!!!!!!! - no conversion function */
5384 
5385     return img_format("DINSM %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
5386                       rt, rs, lsb_value, msbd_value);
5387     /* hand edited */
5388 }
5389 
5390 
5391 /*
5392  *
5393  *
5394  *   3         2         1
5395  *  10987654321098765432109876543210
5396  *  001000               x1110000101
5397  *     rt -----
5398  *          rs -----
5399  *               rd -----
5400  */
5401 static char *DINS(uint64 instruction, Dis_info *info)
5402 {
5403     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5404     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5405     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
5406     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
5407 
5408     const char *rt = GPR(rt_value, info);
5409     const char *rs = GPR(rs_value, info);
5410     /* !!!!!!!!!! - no conversion function */
5411 
5412     return img_format("DINS %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
5413                       rt, rs, lsb_value, msbd_value);
5414     /* hand edited */
5415 }
5416 
5417 
5418 /*
5419  *
5420  *
5421  *   3         2         1
5422  *  10987654321098765432109876543210
5423  *  001000               x1110000101
5424  *     rt -----
5425  *          rs -----
5426  *               rd -----
5427  */
5428 static char *DINSU(uint64 instruction, Dis_info *info)
5429 {
5430     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5431     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5432     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
5433     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
5434 
5435     const char *rt = GPR(rt_value, info);
5436     const char *rs = GPR(rs_value, info);
5437     /* !!!!!!!!!! - no conversion function */
5438 
5439     return img_format("DINSU %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
5440                       rt, rs, lsb_value, msbd_value);
5441     /* hand edited */
5442 }
5443 
5444 
5445 /*
5446  *
5447  *
5448  *   3         2         1
5449  *  10987654321098765432109876543210
5450  *  001000               x1110000101
5451  *     rt -----
5452  *          rs -----
5453  *               rd -----
5454  */
5455 static char *DI(uint64 instruction, Dis_info *info)
5456 {
5457     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5458 
5459     const char *rt = GPR(rt_value, info);
5460 
5461     return img_format("DI %s", rt);
5462 }
5463 
5464 
5465 /*
5466  *
5467  *
5468  *   3         2         1
5469  *  10987654321098765432109876543210
5470  *  001000               x1110000101
5471  *     rt -----
5472  *          rs -----
5473  *               rd -----
5474  */
5475 static char *DIV(uint64 instruction, Dis_info *info)
5476 {
5477     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5478     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5479     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5480 
5481     const char *rd = GPR(rd_value, info);
5482     const char *rs = GPR(rs_value, info);
5483     const char *rt = GPR(rt_value, info);
5484 
5485     return img_format("DIV %s, %s, %s", rd, rs, rt);
5486 }
5487 
5488 
5489 /*
5490  *
5491  *
5492  *   3         2         1
5493  *  10987654321098765432109876543210
5494  *  001000               x1110000101
5495  *     rt -----
5496  *          rs -----
5497  *               rd -----
5498  */
5499 static char *DIV_D(uint64 instruction, Dis_info *info)
5500 {
5501     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
5502     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5503     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
5504 
5505     const char *fd = FPR(fd_value, info);
5506     const char *fs = FPR(fs_value, info);
5507     const char *ft = FPR(ft_value, info);
5508 
5509     return img_format("DIV.D %s, %s, %s", fd, fs, ft);
5510 }
5511 
5512 
5513 /*
5514  *
5515  *
5516  *   3         2         1
5517  *  10987654321098765432109876543210
5518  *  001000               x1110000101
5519  *     rt -----
5520  *          rs -----
5521  *               rd -----
5522  */
5523 static char *DIV_S(uint64 instruction, Dis_info *info)
5524 {
5525     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
5526     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5527     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
5528 
5529     const char *fd = FPR(fd_value, info);
5530     const char *fs = FPR(fs_value, info);
5531     const char *ft = FPR(ft_value, info);
5532 
5533     return img_format("DIV.S %s, %s, %s", fd, fs, ft);
5534 }
5535 
5536 
5537 /*
5538  *
5539  *
5540  *   3         2         1
5541  *  10987654321098765432109876543210
5542  *  001000               x1110000101
5543  *     rt -----
5544  *          rs -----
5545  *               rd -----
5546  */
5547 static char *DIVU(uint64 instruction, Dis_info *info)
5548 {
5549     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5550     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5551     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5552 
5553     const char *rd = GPR(rd_value, info);
5554     const char *rs = GPR(rs_value, info);
5555     const char *rt = GPR(rt_value, info);
5556 
5557     return img_format("DIVU %s, %s, %s", rd, rs, rt);
5558 }
5559 
5560 
5561 /*
5562  *
5563  *
5564  *   3         2         1
5565  *  10987654321098765432109876543210
5566  *  001000               x1110000101
5567  *     rt -----
5568  *          rs -----
5569  *               rd -----
5570  */
5571 static char *DLSA(uint64 instruction, Dis_info *info)
5572 {
5573     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5574     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5575     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5576     uint64 u2_value = extract_u2_10_9(instruction);
5577 
5578     const char *rd = GPR(rd_value, info);
5579     const char *rs = GPR(rs_value, info);
5580     const char *rt = GPR(rt_value, info);
5581 
5582     return img_format("DLSA %s, %s, %s, 0x%" PRIx64, rd, rs, rt, u2_value);
5583 }
5584 
5585 
5586 /*
5587  *
5588  *
5589  *   3         2         1
5590  *  10987654321098765432109876543210
5591  *  001000               x1110000101
5592  *     rt -----
5593  *          rs -----
5594  *               rd -----
5595  */
5596 static char *DLUI_48_(uint64 instruction, Dis_info *info)
5597 {
5598     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
5599     uint64 u_value = extract_u_31_to_0__s32(instruction);
5600 
5601     const char *rt = GPR(rt_value, info);
5602 
5603     return img_format("DLUI %s, 0x%" PRIx64, rt, u_value);
5604 }
5605 
5606 
5607 /*
5608  *
5609  *
5610  *   3         2         1
5611  *  10987654321098765432109876543210
5612  *  001000               x1110000101
5613  *     rt -----
5614  *          rs -----
5615  *               rd -----
5616  */
5617 static char *DMFC0(uint64 instruction, Dis_info *info)
5618 {
5619     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5620     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
5621     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
5622 
5623     const char *rt = GPR(rt_value, info);
5624 
5625     return img_format("DMFC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
5626                       rt, c0s_value, sel_value);
5627 }
5628 
5629 
5630 /*
5631  *
5632  *
5633  *   3         2         1
5634  *  10987654321098765432109876543210
5635  *  001000               x1110000101
5636  *     rt -----
5637  *          rs -----
5638  *               rd -----
5639  */
5640 static char *DMFC1(uint64 instruction, Dis_info *info)
5641 {
5642     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5643     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5644 
5645     const char *rt = GPR(rt_value, info);
5646     const char *fs = FPR(fs_value, info);
5647 
5648     return img_format("DMFC1 %s, %s", rt, fs);
5649 }
5650 
5651 
5652 /*
5653  *
5654  *
5655  *   3         2         1
5656  *  10987654321098765432109876543210
5657  *  001000               x1110000101
5658  *     rt -----
5659  *          rs -----
5660  *               rd -----
5661  */
5662 static char *DMFC2(uint64 instruction, Dis_info *info)
5663 {
5664     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5665     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
5666 
5667     const char *rt = GPR(rt_value, info);
5668 
5669     return img_format("DMFC2 %s, CP%" PRIu64, rt, cs_value);
5670 }
5671 
5672 
5673 /*
5674  *
5675  *
5676  *   3         2         1
5677  *  10987654321098765432109876543210
5678  *  001000               x1110000101
5679  *     rt -----
5680  *          rs -----
5681  *               rd -----
5682  */
5683 static char *DMFGC0(uint64 instruction, Dis_info *info)
5684 {
5685     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5686     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
5687     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
5688 
5689     const char *rt = GPR(rt_value, info);
5690 
5691     return img_format("DMFGC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
5692                       rt, c0s_value, sel_value);
5693 }
5694 
5695 
5696 /*
5697  *
5698  *
5699  *   3         2         1
5700  *  10987654321098765432109876543210
5701  *  001000               x1110000101
5702  *     rt -----
5703  *          rs -----
5704  *               rd -----
5705  */
5706 static char *DMOD(uint64 instruction, Dis_info *info)
5707 {
5708     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5709     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5710     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5711 
5712     const char *rd = GPR(rd_value, info);
5713     const char *rs = GPR(rs_value, info);
5714     const char *rt = GPR(rt_value, info);
5715 
5716     return img_format("DMOD %s, %s, %s", rd, rs, rt);
5717 }
5718 
5719 
5720 /*
5721  *
5722  *
5723  *   3         2         1
5724  *  10987654321098765432109876543210
5725  *  001000               x1110000101
5726  *     rt -----
5727  *          rs -----
5728  *               rd -----
5729  */
5730 static char *DMODU(uint64 instruction, Dis_info *info)
5731 {
5732     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5733     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5734     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5735 
5736     const char *rd = GPR(rd_value, info);
5737     const char *rs = GPR(rs_value, info);
5738     const char *rt = GPR(rt_value, info);
5739 
5740     return img_format("DMODU %s, %s, %s", rd, rs, rt);
5741 }
5742 
5743 
5744 /*
5745  *
5746  *
5747  *   3         2         1
5748  *  10987654321098765432109876543210
5749  *  001000               x1110000101
5750  *     rt -----
5751  *          rs -----
5752  *               rd -----
5753  */
5754 static char *DMTC0(uint64 instruction, Dis_info *info)
5755 {
5756     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5757     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
5758     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
5759 
5760     const char *rt = GPR(rt_value, info);
5761 
5762     return img_format("DMTC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
5763                       rt, c0s_value, sel_value);
5764 }
5765 
5766 
5767 /*
5768  *
5769  *
5770  *   3         2         1
5771  *  10987654321098765432109876543210
5772  *  001000               x1110000101
5773  *     rt -----
5774  *          rs -----
5775  *               rd -----
5776  */
5777 static char *DMTC1(uint64 instruction, Dis_info *info)
5778 {
5779     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5780     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
5781 
5782     const char *rt = GPR(rt_value, info);
5783     const char *fs = FPR(fs_value, info);
5784 
5785     return img_format("DMTC1 %s, %s", rt, fs);
5786 }
5787 
5788 
5789 /*
5790  *
5791  *
5792  *   3         2         1
5793  *  10987654321098765432109876543210
5794  *  001000               x1110000101
5795  *     rt -----
5796  *          rs -----
5797  *               rd -----
5798  */
5799 static char *DMTC2(uint64 instruction, Dis_info *info)
5800 {
5801     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5802     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
5803 
5804     const char *rt = GPR(rt_value, info);
5805 
5806     return img_format("DMTC2 %s, CP%" PRIu64, rt, cs_value);
5807 }
5808 
5809 
5810 /*
5811  *
5812  *
5813  *   3         2         1
5814  *  10987654321098765432109876543210
5815  *  001000               x1110000101
5816  *     rt -----
5817  *          rs -----
5818  *               rd -----
5819  */
5820 static char *DMTGC0(uint64 instruction, Dis_info *info)
5821 {
5822     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5823     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
5824     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
5825 
5826     const char *rt = GPR(rt_value, info);
5827 
5828     return img_format("DMTGC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
5829                       rt, c0s_value, sel_value);
5830 }
5831 
5832 
5833 /*
5834  *
5835  *
5836  *   3         2         1
5837  *  10987654321098765432109876543210
5838  *  001000               x1110000101
5839  *     rt -----
5840  *          rs -----
5841  *               rd -----
5842  */
5843 static char *DMT(uint64 instruction, Dis_info *info)
5844 {
5845     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5846 
5847     const char *rt = GPR(rt_value, info);
5848 
5849     return img_format("DMT %s", rt);
5850 }
5851 
5852 
5853 /*
5854  *
5855  *
5856  *   3         2         1
5857  *  10987654321098765432109876543210
5858  *  001000               x1110000101
5859  *     rt -----
5860  *          rs -----
5861  *               rd -----
5862  */
5863 static char *DMUH(uint64 instruction, Dis_info *info)
5864 {
5865     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5866     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5867     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5868 
5869     const char *rd = GPR(rd_value, info);
5870     const char *rs = GPR(rs_value, info);
5871     const char *rt = GPR(rt_value, info);
5872 
5873     return img_format("DMUH %s, %s, %s", rd, rs, rt);
5874 }
5875 
5876 
5877 /*
5878  *
5879  *
5880  *   3         2         1
5881  *  10987654321098765432109876543210
5882  *  001000               x1110000101
5883  *     rt -----
5884  *          rs -----
5885  *               rd -----
5886  */
5887 static char *DMUHU(uint64 instruction, Dis_info *info)
5888 {
5889     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5890     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5891     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5892 
5893     const char *rd = GPR(rd_value, info);
5894     const char *rs = GPR(rs_value, info);
5895     const char *rt = GPR(rt_value, info);
5896 
5897     return img_format("DMUHU %s, %s, %s", rd, rs, rt);
5898 }
5899 
5900 
5901 /*
5902  *
5903  *
5904  *   3         2         1
5905  *  10987654321098765432109876543210
5906  *  001000               x1110000101
5907  *     rt -----
5908  *          rs -----
5909  *               rd -----
5910  */
5911 static char *DMUL(uint64 instruction, Dis_info *info)
5912 {
5913     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5914     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5915     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5916 
5917     const char *rd = GPR(rd_value, info);
5918     const char *rs = GPR(rs_value, info);
5919     const char *rt = GPR(rt_value, info);
5920 
5921     return img_format("DMUL %s, %s, %s", rd, rs, rt);
5922 }
5923 
5924 
5925 /*
5926  *
5927  *
5928  *   3         2         1
5929  *  10987654321098765432109876543210
5930  *  001000               x1110000101
5931  *     rt -----
5932  *          rs -----
5933  *               rd -----
5934  */
5935 static char *DMULU(uint64 instruction, Dis_info *info)
5936 {
5937     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5938     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5939     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
5940 
5941     const char *rd = GPR(rd_value, info);
5942     const char *rs = GPR(rs_value, info);
5943     const char *rt = GPR(rt_value, info);
5944 
5945     return img_format("DMULU %s, %s, %s", rd, rs, rt);
5946 }
5947 
5948 
5949 /*
5950  * [DSP] DPA.W.PH ac, rs, rt - Dot product with accumulate on
5951  *   vector integer halfword elements
5952  *
5953  *   3         2         1
5954  *  10987654321098765432109876543210
5955  *  001000            00000010111111
5956  *     rt -----
5957  *          rs -----
5958  *               ac --
5959  */
5960 static char *DPA_W_PH(uint64 instruction, Dis_info *info)
5961 {
5962     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5963     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5964     uint64 ac_value = extract_ac_15_14(instruction);
5965 
5966     const char *ac = AC(ac_value, info);
5967     const char *rs = GPR(rs_value, info);
5968     const char *rt = GPR(rt_value, info);
5969 
5970     return img_format("DPA.W.PH %s, %s, %s", ac, rs, rt);
5971 }
5972 
5973 
5974 /*
5975  *
5976  *
5977  *   3         2         1
5978  *  10987654321098765432109876543210
5979  *  001000               x1110000101
5980  *     rt -----
5981  *          rs -----
5982  *               rd -----
5983  */
5984 static char *DPAQ_SA_L_W(uint64 instruction, Dis_info *info)
5985 {
5986     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
5987     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
5988     uint64 ac_value = extract_ac_15_14(instruction);
5989 
5990     const char *ac = AC(ac_value, info);
5991     const char *rs = GPR(rs_value, info);
5992     const char *rt = GPR(rt_value, info);
5993 
5994     return img_format("DPAQ_SA.L.W %s, %s, %s", ac, rs, rt);
5995 }
5996 
5997 
5998 /*
5999  *
6000  *
6001  *   3         2         1
6002  *  10987654321098765432109876543210
6003  *  001000               x1110000101
6004  *     rt -----
6005  *          rs -----
6006  *               rd -----
6007  */
6008 static char *DPAQ_S_W_PH(uint64 instruction, Dis_info *info)
6009 {
6010     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6011     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6012     uint64 ac_value = extract_ac_15_14(instruction);
6013 
6014     const char *ac = AC(ac_value, info);
6015     const char *rs = GPR(rs_value, info);
6016     const char *rt = GPR(rt_value, info);
6017 
6018     return img_format("DPAQ_S.W.PH %s, %s, %s", ac, rs, rt);
6019 }
6020 
6021 
6022 /*
6023  *
6024  *
6025  *   3         2         1
6026  *  10987654321098765432109876543210
6027  *  001000               x1110000101
6028  *     rt -----
6029  *          rs -----
6030  *               rd -----
6031  */
6032 static char *DPAQX_SA_W_PH(uint64 instruction, Dis_info *info)
6033 {
6034     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6035     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6036     uint64 ac_value = extract_ac_15_14(instruction);
6037 
6038     const char *ac = AC(ac_value, info);
6039     const char *rs = GPR(rs_value, info);
6040     const char *rt = GPR(rt_value, info);
6041 
6042     return img_format("DPAQX_SA.W.PH %s, %s, %s", ac, rs, rt);
6043 }
6044 
6045 
6046 /*
6047  *
6048  *
6049  *   3         2         1
6050  *  10987654321098765432109876543210
6051  *  001000               x1110000101
6052  *     rt -----
6053  *          rs -----
6054  *               rd -----
6055  */
6056 static char *DPAQX_S_W_PH(uint64 instruction, Dis_info *info)
6057 {
6058     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6059     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6060     uint64 ac_value = extract_ac_15_14(instruction);
6061 
6062     const char *ac = AC(ac_value, info);
6063     const char *rs = GPR(rs_value, info);
6064     const char *rt = GPR(rt_value, info);
6065 
6066     return img_format("DPAQX_S.W.PH %s, %s, %s", ac, rs, rt);
6067 }
6068 
6069 
6070 /*
6071  *
6072  *
6073  *   3         2         1
6074  *  10987654321098765432109876543210
6075  *  001000               x1110000101
6076  *     rt -----
6077  *          rs -----
6078  *               rd -----
6079  */
6080 static char *DPAU_H_QBL(uint64 instruction, Dis_info *info)
6081 {
6082     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6083     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6084     uint64 ac_value = extract_ac_15_14(instruction);
6085 
6086     const char *ac = AC(ac_value, info);
6087     const char *rs = GPR(rs_value, info);
6088     const char *rt = GPR(rt_value, info);
6089 
6090     return img_format("DPAU.H.QBL %s, %s, %s", ac, rs, rt);
6091 }
6092 
6093 
6094 /*
6095  *
6096  *
6097  *   3         2         1
6098  *  10987654321098765432109876543210
6099  *  001000               x1110000101
6100  *     rt -----
6101  *          rs -----
6102  *               rd -----
6103  */
6104 static char *DPAU_H_QBR(uint64 instruction, Dis_info *info)
6105 {
6106     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6107     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6108     uint64 ac_value = extract_ac_15_14(instruction);
6109 
6110     const char *ac = AC(ac_value, info);
6111     const char *rs = GPR(rs_value, info);
6112     const char *rt = GPR(rt_value, info);
6113 
6114     return img_format("DPAU.H.QBR %s, %s, %s", ac, rs, rt);
6115 }
6116 
6117 
6118 /*
6119  *
6120  *
6121  *   3         2         1
6122  *  10987654321098765432109876543210
6123  *  001000               x1110000101
6124  *     rt -----
6125  *          rs -----
6126  *               rd -----
6127  */
6128 static char *DPAX_W_PH(uint64 instruction, Dis_info *info)
6129 {
6130     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6131     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6132     uint64 ac_value = extract_ac_15_14(instruction);
6133 
6134     const char *ac = AC(ac_value, info);
6135     const char *rs = GPR(rs_value, info);
6136     const char *rt = GPR(rt_value, info);
6137 
6138     return img_format("DPAX.W.PH %s, %s, %s", ac, rs, rt);
6139 }
6140 
6141 
6142 /*
6143  *
6144  *
6145  *   3         2         1
6146  *  10987654321098765432109876543210
6147  *  001000               x1110000101
6148  *     rt -----
6149  *          rs -----
6150  *               rd -----
6151  */
6152 static char *DPS_W_PH(uint64 instruction, Dis_info *info)
6153 {
6154     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6155     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6156     uint64 ac_value = extract_ac_15_14(instruction);
6157 
6158     const char *ac = AC(ac_value, info);
6159     const char *rs = GPR(rs_value, info);
6160     const char *rt = GPR(rt_value, info);
6161 
6162     return img_format("DPS.W.PH %s, %s, %s", ac, rs, rt);
6163 }
6164 
6165 
6166 /*
6167  *
6168  *
6169  *   3         2         1
6170  *  10987654321098765432109876543210
6171  *  001000               x1110000101
6172  *     rt -----
6173  *          rs -----
6174  *               rd -----
6175  */
6176 static char *DPSQ_SA_L_W(uint64 instruction, Dis_info *info)
6177 {
6178     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6179     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6180     uint64 ac_value = extract_ac_15_14(instruction);
6181 
6182     const char *ac = AC(ac_value, info);
6183     const char *rs = GPR(rs_value, info);
6184     const char *rt = GPR(rt_value, info);
6185 
6186     return img_format("DPSQ_SA.L.W %s, %s, %s", ac, rs, rt);
6187 }
6188 
6189 
6190 /*
6191  *
6192  *
6193  *   3         2         1
6194  *  10987654321098765432109876543210
6195  *  001000               x1110000101
6196  *     rt -----
6197  *          rs -----
6198  *               rd -----
6199  */
6200 static char *DPSQ_S_W_PH(uint64 instruction, Dis_info *info)
6201 {
6202     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6203     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6204     uint64 ac_value = extract_ac_15_14(instruction);
6205 
6206     const char *ac = AC(ac_value, info);
6207     const char *rs = GPR(rs_value, info);
6208     const char *rt = GPR(rt_value, info);
6209 
6210     return img_format("DPSQ_S.W.PH %s, %s, %s", ac, rs, rt);
6211 }
6212 
6213 
6214 /*
6215  *
6216  *
6217  *   3         2         1
6218  *  10987654321098765432109876543210
6219  *  001000               x1110000101
6220  *     rt -----
6221  *          rs -----
6222  *               rd -----
6223  */
6224 static char *DPSQX_SA_W_PH(uint64 instruction, Dis_info *info)
6225 {
6226     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6227     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6228     uint64 ac_value = extract_ac_15_14(instruction);
6229 
6230     const char *ac = AC(ac_value, info);
6231     const char *rs = GPR(rs_value, info);
6232     const char *rt = GPR(rt_value, info);
6233 
6234     return img_format("DPSQX_SA.W.PH %s, %s, %s", ac, rs, rt);
6235 }
6236 
6237 
6238 /*
6239  *
6240  *
6241  *   3         2         1
6242  *  10987654321098765432109876543210
6243  *  001000               x1110000101
6244  *     rt -----
6245  *          rs -----
6246  *               rd -----
6247  */
6248 static char *DPSQX_S_W_PH(uint64 instruction, Dis_info *info)
6249 {
6250     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6251     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6252     uint64 ac_value = extract_ac_15_14(instruction);
6253 
6254     const char *ac = AC(ac_value, info);
6255     const char *rs = GPR(rs_value, info);
6256     const char *rt = GPR(rt_value, info);
6257 
6258     return img_format("DPSQX_S.W.PH %s, %s, %s", ac, rs, rt);
6259 }
6260 
6261 
6262 /*
6263  *
6264  *
6265  *   3         2         1
6266  *  10987654321098765432109876543210
6267  *  001000               x1110000101
6268  *     rt -----
6269  *          rs -----
6270  *               rd -----
6271  */
6272 static char *DPSU_H_QBL(uint64 instruction, Dis_info *info)
6273 {
6274     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6275     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6276     uint64 ac_value = extract_ac_15_14(instruction);
6277 
6278     const char *ac = AC(ac_value, info);
6279     const char *rs = GPR(rs_value, info);
6280     const char *rt = GPR(rt_value, info);
6281 
6282     return img_format("DPSU.H.QBL %s, %s, %s", ac, rs, rt);
6283 }
6284 
6285 
6286 /*
6287  *
6288  *
6289  *   3         2         1
6290  *  10987654321098765432109876543210
6291  *  001000               x1110000101
6292  *     rt -----
6293  *          rs -----
6294  *               rd -----
6295  */
6296 static char *DPSU_H_QBR(uint64 instruction, Dis_info *info)
6297 {
6298     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6299     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6300     uint64 ac_value = extract_ac_15_14(instruction);
6301 
6302     const char *ac = AC(ac_value, info);
6303     const char *rs = GPR(rs_value, info);
6304     const char *rt = GPR(rt_value, info);
6305 
6306     return img_format("DPSU.H.QBR %s, %s, %s", ac, rs, rt);
6307 }
6308 
6309 
6310 /*
6311  *
6312  *
6313  *   3         2         1
6314  *  10987654321098765432109876543210
6315  *  001000               x1110000101
6316  *     rt -----
6317  *          rs -----
6318  *               rd -----
6319  */
6320 static char *DPSX_W_PH(uint64 instruction, Dis_info *info)
6321 {
6322     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6323     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6324     uint64 ac_value = extract_ac_15_14(instruction);
6325 
6326     const char *ac = AC(ac_value, info);
6327     const char *rs = GPR(rs_value, info);
6328     const char *rt = GPR(rt_value, info);
6329 
6330     return img_format("DPSX.W.PH %s, %s, %s", ac, rs, rt);
6331 }
6332 
6333 
6334 /*
6335  * DROTR -
6336  *
6337  *   3         2         1
6338  *  10987654321098765432109876543210
6339  *  001000               x1110000101
6340  *     rt -----
6341  *          rs -----
6342  *               rd -----
6343  */
6344 static char *DROTR(uint64 instruction, Dis_info *info)
6345 {
6346     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6347     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6348     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6349 
6350     const char *rt = GPR(rt_value, info);
6351     const char *rs = GPR(rs_value, info);
6352 
6353     return img_format("DROTR %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6354 }
6355 
6356 
6357 /*
6358  * DROTR[32] -
6359  *
6360  *   3         2         1
6361  *  10987654321098765432109876543210
6362  *  10o000          1100xxx0110
6363  *     rt -----
6364  *          rs -----
6365  *                       shift -----
6366  */
6367 static char *DROTR32(uint64 instruction, Dis_info *info)
6368 {
6369     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6370     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6371     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6372 
6373     const char *rt = GPR(rt_value, info);
6374     const char *rs = GPR(rs_value, info);
6375 
6376     return img_format("DROTR32 %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6377 }
6378 
6379 
6380 /*
6381  *
6382  *
6383  *   3         2         1
6384  *  10987654321098765432109876543210
6385  *  001000               x1110000101
6386  *     rt -----
6387  *          rs -----
6388  *               rd -----
6389  */
6390 static char *DROTRV(uint64 instruction, Dis_info *info)
6391 {
6392     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6393     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6394     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6395 
6396     const char *rd = GPR(rd_value, info);
6397     const char *rs = GPR(rs_value, info);
6398     const char *rt = GPR(rt_value, info);
6399 
6400     return img_format("DROTRV %s, %s, %s", rd, rs, rt);
6401 }
6402 
6403 
6404 /*
6405  *
6406  *
6407  *   3         2         1
6408  *  10987654321098765432109876543210
6409  *  001000               x1110000101
6410  *     rt -----
6411  *          rs -----
6412  *               rd -----
6413  */
6414 static char *DROTX(uint64 instruction, Dis_info *info)
6415 {
6416     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6417     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6418     uint64 shiftx_value = extract_shiftx_11_10_9_8_7_6(instruction);
6419     uint64 shift_value = extract_shift_5_4_3_2_1_0(instruction);
6420 
6421     const char *rt = GPR(rt_value, info);
6422     const char *rs = GPR(rs_value, info);
6423 
6424     return img_format("DROTX %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
6425                       rt, rs, shift_value, shiftx_value);
6426 }
6427 
6428 
6429 /*
6430  * DSLL -
6431  *
6432  *   3         2         1
6433  *  10987654321098765432109876543210
6434  *  10o000          1100xxx0000
6435  *     rt -----
6436  *          rs -----
6437  *                       shift -----
6438  */
6439 static char *DSLL(uint64 instruction, Dis_info *info)
6440 {
6441     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6442     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6443     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6444 
6445     const char *rt = GPR(rt_value, info);
6446     const char *rs = GPR(rs_value, info);
6447 
6448     return img_format("DSLL %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6449 }
6450 
6451 
6452 /*
6453  * DSLL[32] -
6454  *
6455  *   3         2         1
6456  *  10987654321098765432109876543210
6457  *  10o000          1100xxx0000
6458  *     rt -----
6459  *          rs -----
6460  *                       shift -----
6461  */
6462 static char *DSLL32(uint64 instruction, Dis_info *info)
6463 {
6464     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6465     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6466     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6467 
6468     const char *rt = GPR(rt_value, info);
6469     const char *rs = GPR(rs_value, info);
6470 
6471     return img_format("DSLL32 %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6472 }
6473 
6474 
6475 /*
6476  *
6477  *
6478  *   3         2         1
6479  *  10987654321098765432109876543210
6480  *  001000               x1110000101
6481  *     rt -----
6482  *          rs -----
6483  *               rd -----
6484  */
6485 static char *DSLLV(uint64 instruction, Dis_info *info)
6486 {
6487     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6488     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6489     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6490 
6491     const char *rd = GPR(rd_value, info);
6492     const char *rs = GPR(rs_value, info);
6493     const char *rt = GPR(rt_value, info);
6494 
6495     return img_format("DSLLV %s, %s, %s", rd, rs, rt);
6496 }
6497 
6498 
6499 /*
6500  * DSRA -
6501  *
6502  *   3         2         1
6503  *  10987654321098765432109876543210
6504  *  10o000          1100xxx0100
6505  *     rt -----
6506  *          rs -----
6507  *                       shift -----
6508  */
6509 static char *DSRA(uint64 instruction, Dis_info *info)
6510 {
6511     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6512     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6513     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6514 
6515     const char *rt = GPR(rt_value, info);
6516     const char *rs = GPR(rs_value, info);
6517 
6518     return img_format("DSRA %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6519 }
6520 
6521 
6522 /*
6523  * DSRA[32] -
6524  *
6525  *   3         2         1
6526  *  10987654321098765432109876543210
6527  *  10o000          1100xxx0100
6528  *     rt -----
6529  *          rs -----
6530  *                       shift -----
6531  */
6532 static char *DSRA32(uint64 instruction, Dis_info *info)
6533 {
6534     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6535     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6536     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6537 
6538     const char *rt = GPR(rt_value, info);
6539     const char *rs = GPR(rs_value, info);
6540 
6541     return img_format("DSRA32 %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6542 }
6543 
6544 
6545 /*
6546  *
6547  *
6548  *   3         2         1
6549  *  10987654321098765432109876543210
6550  *  001000               x1110000101
6551  *     rt -----
6552  *          rs -----
6553  *               rd -----
6554  */
6555 static char *DSRAV(uint64 instruction, Dis_info *info)
6556 {
6557     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6558     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6559     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6560 
6561     const char *rd = GPR(rd_value, info);
6562     const char *rs = GPR(rs_value, info);
6563     const char *rt = GPR(rt_value, info);
6564 
6565     return img_format("DSRAV %s, %s, %s", rd, rs, rt);
6566 }
6567 
6568 
6569 /*
6570  * DSRL -
6571  *
6572  *   3         2         1
6573  *  10987654321098765432109876543210
6574  *  10o000          1100xxx0100
6575  *     rt -----
6576  *          rs -----
6577  *                       shift -----
6578  */
6579 static char *DSRL(uint64 instruction, Dis_info *info)
6580 {
6581     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6582     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6583     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6584 
6585     const char *rt = GPR(rt_value, info);
6586     const char *rs = GPR(rs_value, info);
6587 
6588     return img_format("DSRL %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6589 }
6590 
6591 
6592 /*
6593  * DSRL[32] -
6594  *
6595  *   3         2         1
6596  *  10987654321098765432109876543210
6597  *  10o000          1100xxx0010
6598  *     rt -----
6599  *          rs -----
6600  *                       shift -----
6601  */
6602 static char *DSRL32(uint64 instruction, Dis_info *info)
6603 {
6604     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6605     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6606     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
6607 
6608     const char *rt = GPR(rt_value, info);
6609     const char *rs = GPR(rs_value, info);
6610 
6611     return img_format("DSRL32 %s, %s, 0x%" PRIx64, rt, rs, shift_value);
6612 }
6613 
6614 
6615 /*
6616  *
6617  *
6618  *   3         2         1
6619  *  10987654321098765432109876543210
6620  *  001000               x1110000101
6621  *     rt -----
6622  *          rs -----
6623  *               rd -----
6624  */
6625 static char *DSRLV(uint64 instruction, Dis_info *info)
6626 {
6627     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6628     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6629     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6630 
6631     const char *rd = GPR(rd_value, info);
6632     const char *rs = GPR(rs_value, info);
6633     const char *rt = GPR(rt_value, info);
6634 
6635     return img_format("DSRLV %s, %s, %s", rd, rs, rt);
6636 }
6637 
6638 
6639 /*
6640  *
6641  *
6642  *   3         2         1
6643  *  10987654321098765432109876543210
6644  *  001000               x1110000101
6645  *     rt -----
6646  *          rs -----
6647  *               rd -----
6648  */
6649 static char *DSUB(uint64 instruction, Dis_info *info)
6650 {
6651     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6652     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6653     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6654 
6655     const char *rd = GPR(rd_value, info);
6656     const char *rs = GPR(rs_value, info);
6657     const char *rt = GPR(rt_value, info);
6658 
6659     return img_format("DSUB %s, %s, %s", rd, rs, rt);
6660 }
6661 
6662 
6663 /*
6664  *
6665  *
6666  *   3         2         1
6667  *  10987654321098765432109876543210
6668  *  001000               x1110000101
6669  *     rt -----
6670  *          rs -----
6671  *               rd -----
6672  */
6673 static char *DSUBU(uint64 instruction, Dis_info *info)
6674 {
6675     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6676     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6677     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6678 
6679     const char *rd = GPR(rd_value, info);
6680     const char *rs = GPR(rs_value, info);
6681     const char *rt = GPR(rt_value, info);
6682 
6683     return img_format("DSUBU %s, %s, %s", rd, rs, rt);
6684 }
6685 
6686 
6687 /*
6688  *
6689  *
6690  *   3         2         1
6691  *  10987654321098765432109876543210
6692  *  001000               x1110000101
6693  *     rt -----
6694  *          rs -----
6695  *               rd -----
6696  */
6697 static char *DVPE(uint64 instruction, Dis_info *info)
6698 {
6699     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6700 
6701     const char *rt = GPR(rt_value, info);
6702 
6703     return img_format("DVPE %s", rt);
6704 }
6705 
6706 
6707 /*
6708  *
6709  *
6710  *   3         2         1
6711  *  10987654321098765432109876543210
6712  *  001000               x1110000101
6713  *     rt -----
6714  *          rs -----
6715  *               rd -----
6716  */
6717 static char *DVP(uint64 instruction, Dis_info *info)
6718 {
6719     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6720 
6721     const char *rt = GPR(rt_value, info);
6722 
6723     return img_format("DVP %s", rt);
6724 }
6725 
6726 
6727 /*
6728  *
6729  *
6730  *   3         2         1
6731  *  10987654321098765432109876543210
6732  *  001000               x1110000101
6733  *     rt -----
6734  *          rs -----
6735  *               rd -----
6736  */
6737 static char *EHB(uint64 instruction, Dis_info *info)
6738 {
6739     (void)instruction;
6740 
6741     return g_strdup("EHB ");
6742 }
6743 
6744 
6745 /*
6746  *
6747  *
6748  *   3         2         1
6749  *  10987654321098765432109876543210
6750  *  001000               x1110000101
6751  *     rt -----
6752  *          rs -----
6753  *               rd -----
6754  */
6755 static char *EI(uint64 instruction, Dis_info *info)
6756 {
6757     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6758 
6759     const char *rt = GPR(rt_value, info);
6760 
6761     return img_format("EI %s", rt);
6762 }
6763 
6764 
6765 /*
6766  *
6767  *
6768  *   3         2         1
6769  *  10987654321098765432109876543210
6770  *  001000               x1110000101
6771  *     rt -----
6772  *          rs -----
6773  *               rd -----
6774  */
6775 static char *EMT(uint64 instruction, Dis_info *info)
6776 {
6777     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6778 
6779     const char *rt = GPR(rt_value, info);
6780 
6781     return img_format("EMT %s", rt);
6782 }
6783 
6784 
6785 /*
6786  *
6787  *
6788  *   3         2         1
6789  *  10987654321098765432109876543210
6790  *  001000               x1110000101
6791  *     rt -----
6792  *          rs -----
6793  *               rd -----
6794  */
6795 static char *ERET(uint64 instruction, Dis_info *info)
6796 {
6797     (void)instruction;
6798 
6799     return g_strdup("ERET ");
6800 }
6801 
6802 
6803 /*
6804  *
6805  *
6806  *   3         2         1
6807  *  10987654321098765432109876543210
6808  *  001000               x1110000101
6809  *     rt -----
6810  *          rs -----
6811  *               rd -----
6812  */
6813 static char *ERETNC(uint64 instruction, Dis_info *info)
6814 {
6815     (void)instruction;
6816 
6817     return g_strdup("ERETNC ");
6818 }
6819 
6820 
6821 /*
6822  *
6823  *
6824  *   3         2         1
6825  *  10987654321098765432109876543210
6826  *  001000               x1110000101
6827  *     rt -----
6828  *          rs -----
6829  *               rd -----
6830  */
6831 static char *EVP(uint64 instruction, Dis_info *info)
6832 {
6833     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6834 
6835     const char *rt = GPR(rt_value, info);
6836 
6837     return img_format("EVP %s", rt);
6838 }
6839 
6840 
6841 /*
6842  *
6843  *
6844  *   3         2         1
6845  *  10987654321098765432109876543210
6846  *  001000               x1110000101
6847  *     rt -----
6848  *          rs -----
6849  *               rd -----
6850  */
6851 static char *EVPE(uint64 instruction, Dis_info *info)
6852 {
6853     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6854 
6855     const char *rt = GPR(rt_value, info);
6856 
6857     return img_format("EVPE %s", rt);
6858 }
6859 
6860 
6861 /*
6862  *
6863  *
6864  *   3         2         1
6865  *  10987654321098765432109876543210
6866  *  001000               x1110000101
6867  *     rt -----
6868  *          rs -----
6869  *               rd -----
6870  */
6871 static char *EXT(uint64 instruction, Dis_info *info)
6872 {
6873     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6874     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6875     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
6876     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
6877 
6878     const char *rt = GPR(rt_value, info);
6879     const char *rs = GPR(rs_value, info);
6880     uint64 msbd = encode_msbd_from_size(msbd_value);
6881 
6882     return img_format("EXT %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
6883                       rt, rs, lsb_value, msbd);
6884 }
6885 
6886 
6887 /*
6888  *
6889  *
6890  *   3         2         1
6891  *  10987654321098765432109876543210
6892  *  001000               x1110000101
6893  *     rt -----
6894  *          rs -----
6895  *               rd -----
6896  */
6897 static char *EXTD(uint64 instruction, Dis_info *info)
6898 {
6899     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6900     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6901     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6902     uint64 shift_value = extract_shift_10_9_8_7_6(instruction);
6903 
6904     const char *rd = GPR(rd_value, info);
6905     const char *rs = GPR(rs_value, info);
6906     const char *rt = GPR(rt_value, info);
6907 
6908     return img_format("EXTD %s, %s, %s, 0x%" PRIx64, rd, rs, rt, shift_value);
6909 }
6910 
6911 
6912 /*
6913  *
6914  *
6915  *   3         2         1
6916  *  10987654321098765432109876543210
6917  *  001000               x1110000101
6918  *     rt -----
6919  *          rs -----
6920  *               rd -----
6921  */
6922 static char *EXTD32(uint64 instruction, Dis_info *info)
6923 {
6924     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6925     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6926     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
6927     uint64 shift_value = extract_shift_10_9_8_7_6(instruction);
6928 
6929     const char *rd = GPR(rd_value, info);
6930     const char *rs = GPR(rs_value, info);
6931     const char *rt = GPR(rt_value, info);
6932 
6933     return img_format("EXTD32 %s, %s, %s, 0x%" PRIx64, rd, rs, rt, shift_value);
6934 }
6935 
6936 
6937 /*
6938  *
6939  *
6940  *   3         2         1
6941  *  10987654321098765432109876543210
6942  *  001000               x1110000101
6943  *     rt -----
6944  *          rs -----
6945  *               rd -----
6946  */
6947 static char *EXTPDP(uint64 instruction, Dis_info *info)
6948 {
6949     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6950     uint64 size_value = extract_size_20_19_18_17_16(instruction);
6951     uint64 ac_value = extract_ac_15_14(instruction);
6952 
6953     const char *rt = GPR(rt_value, info);
6954     const char *ac = AC(ac_value, info);
6955 
6956     return img_format("EXTPDP %s, %s, 0x%" PRIx64, rt, ac, size_value);
6957 }
6958 
6959 
6960 /*
6961  *
6962  *
6963  *   3         2         1
6964  *  10987654321098765432109876543210
6965  *  001000               x1110000101
6966  *     rt -----
6967  *          rs -----
6968  *               rd -----
6969  */
6970 static char *EXTPDPV(uint64 instruction, Dis_info *info)
6971 {
6972     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6973     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
6974     uint64 ac_value = extract_ac_15_14(instruction);
6975 
6976     const char *rt = GPR(rt_value, info);
6977     const char *ac = AC(ac_value, info);
6978     const char *rs = GPR(rs_value, info);
6979 
6980     return img_format("EXTPDPV %s, %s, %s", rt, ac, rs);
6981 }
6982 
6983 
6984 /*
6985  *
6986  *
6987  *   3         2         1
6988  *  10987654321098765432109876543210
6989  *  001000               x1110000101
6990  *     rt -----
6991  *          rs -----
6992  *               rd -----
6993  */
6994 static char *EXTP(uint64 instruction, Dis_info *info)
6995 {
6996     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
6997     uint64 size_value = extract_size_20_19_18_17_16(instruction);
6998     uint64 ac_value = extract_ac_15_14(instruction);
6999 
7000     const char *rt = GPR(rt_value, info);
7001     const char *ac = AC(ac_value, info);
7002 
7003     return img_format("EXTP %s, %s, 0x%" PRIx64, rt, ac, size_value);
7004 }
7005 
7006 
7007 /*
7008  *
7009  *
7010  *   3         2         1
7011  *  10987654321098765432109876543210
7012  *  001000               x1110000101
7013  *     rt -----
7014  *          rs -----
7015  *               rd -----
7016  */
7017 static char *EXTPV(uint64 instruction, Dis_info *info)
7018 {
7019     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7020     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7021     uint64 ac_value = extract_ac_15_14(instruction);
7022 
7023     const char *rt = GPR(rt_value, info);
7024     const char *ac = AC(ac_value, info);
7025     const char *rs = GPR(rs_value, info);
7026 
7027     return img_format("EXTPV %s, %s, %s", rt, ac, rs);
7028 }
7029 
7030 
7031 /*
7032  * [DSP] EXTR_RS.W rt, ac, shift - Extract word value from accumulator to GPR
7033  *   with right shift
7034  *
7035  *   3         2         1
7036  *  10987654321098765432109876543210
7037  *  001000            10111001111111
7038  *     rt -----
7039  *       shift -----
7040  *               ac --
7041  */
7042 static char *EXTR_RS_W(uint64 instruction, Dis_info *info)
7043 {
7044     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7045     uint64 shift_value = extract_shift_20_19_18_17_16(instruction);
7046     uint64 ac_value = extract_ac_15_14(instruction);
7047 
7048     const char *rt = GPR(rt_value, info);
7049     const char *ac = AC(ac_value, info);
7050 
7051     return img_format("EXTR_RS.W %s, %s, 0x%" PRIx64, rt, ac, shift_value);
7052 }
7053 
7054 
7055 /*
7056  * [DSP] EXTR_R.W rt, ac, shift - Extract word value from accumulator to GPR
7057  *   with right shift
7058  *
7059  *   3         2         1
7060  *  10987654321098765432109876543210
7061  *  001000            01111001111111
7062  *     rt -----
7063  *       shift -----
7064  *               ac --
7065  */
7066 static char *EXTR_R_W(uint64 instruction, Dis_info *info)
7067 {
7068     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7069     uint64 shift_value = extract_shift_20_19_18_17_16(instruction);
7070     uint64 ac_value = extract_ac_15_14(instruction);
7071 
7072     const char *rt = GPR(rt_value, info);
7073     const char *ac = AC(ac_value, info);
7074 
7075     return img_format("EXTR_R.W %s, %s, 0x%" PRIx64, rt, ac, shift_value);
7076 }
7077 
7078 
7079 /*
7080  * [DSP] EXTR_S.H rt, ac, shift - Extract halfword value from accumulator
7081  *   to GPR with right shift and saturate
7082  *
7083  *   3         2         1
7084  *  10987654321098765432109876543210
7085  *  001000            11111001111111
7086  *     rt -----
7087  *       shift -----
7088  *               ac --
7089  */
7090 static char *EXTR_S_H(uint64 instruction, Dis_info *info)
7091 {
7092     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7093     uint64 shift_value = extract_shift_20_19_18_17_16(instruction);
7094     uint64 ac_value = extract_ac_15_14(instruction);
7095 
7096     const char *rt = GPR(rt_value, info);
7097     const char *ac = AC(ac_value, info);
7098 
7099     return img_format("EXTR_S.H %s, %s, 0x%" PRIx64, rt, ac, shift_value);
7100 }
7101 
7102 
7103 /*
7104  * [DSP] EXTR.W rt, ac, shift - Extract word value from accumulator to GPR
7105  *   with right shift
7106  *
7107  *   3         2         1
7108  *  10987654321098765432109876543210
7109  *  001000            00111001111111
7110  *     rt -----
7111  *       shift -----
7112  *               ac --
7113  */
7114 static char *EXTR_W(uint64 instruction, Dis_info *info)
7115 {
7116     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7117     uint64 shift_value = extract_shift_20_19_18_17_16(instruction);
7118     uint64 ac_value = extract_ac_15_14(instruction);
7119 
7120     const char *rt = GPR(rt_value, info);
7121     const char *ac = AC(ac_value, info);
7122 
7123     return img_format("EXTR.W %s, %s, 0x%" PRIx64, rt, ac, shift_value);
7124 }
7125 
7126 
7127 /*
7128  * [DSP] EXTRV_RS.W rt, ac, rs - Extract word value with variable
7129  *   right shift from accumulator to GPR
7130  *
7131  *   3         2         1
7132  *  10987654321098765432109876543210
7133  *  001000            10111010111111
7134  *     rt -----
7135  *          rs -----
7136  *               ac --
7137  */
7138 static char *EXTRV_RS_W(uint64 instruction, Dis_info *info)
7139 {
7140     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7141     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7142     uint64 ac_value = extract_ac_15_14(instruction);
7143 
7144     const char *rt = GPR(rt_value, info);
7145     const char *ac = AC(ac_value, info);
7146     const char *rs = GPR(rs_value, info);
7147 
7148     return img_format("EXTRV_RS.W %s, %s, %s", rt, ac, rs);
7149 }
7150 
7151 
7152 /*
7153  * [DSP] EXTRV_R.W rt, ac, rs - Extract word value with variable
7154  *   right shift from accumulator to GPR
7155  *
7156  *   3         2         1
7157  *  10987654321098765432109876543210
7158  *  001000            01111010111111
7159  *     rt -----
7160  *          rs -----
7161  *               ac --
7162  */
7163 static char *EXTRV_R_W(uint64 instruction, Dis_info *info)
7164 {
7165     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7166     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7167     uint64 ac_value = extract_ac_15_14(instruction);
7168 
7169     const char *rt = GPR(rt_value, info);
7170     const char *ac = AC(ac_value, info);
7171     const char *rs = GPR(rs_value, info);
7172 
7173     return img_format("EXTRV_R.W %s, %s, %s", rt, ac, rs);
7174 }
7175 
7176 
7177 /*
7178  * [DSP] EXTRV_S.H rt, ac, rs - Extract halfword value variable from
7179  *   accumulator to GPR with right shift and saturate
7180  *
7181  *   3         2         1
7182  *  10987654321098765432109876543210
7183  *  001000            11111010111111
7184  *     rt -----
7185  *          rs -----
7186  *               ac --
7187  */
7188 static char *EXTRV_S_H(uint64 instruction, Dis_info *info)
7189 {
7190     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7191     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7192     uint64 ac_value = extract_ac_15_14(instruction);
7193 
7194     const char *rt = GPR(rt_value, info);
7195     const char *ac = AC(ac_value, info);
7196     const char *rs = GPR(rs_value, info);
7197 
7198     return img_format("EXTRV_S.H %s, %s, %s", rt, ac, rs);
7199 }
7200 
7201 
7202 /*
7203  * [DSP] EXTRV.W rt, ac, rs - Extract word value with variable
7204  *   right shift from accumulator to GPR
7205  *
7206  *   3         2         1
7207  *  10987654321098765432109876543210
7208  *  001000            00111010111111
7209  *     rt -----
7210  *          rs -----
7211  *               ac --
7212  */
7213 static char *EXTRV_W(uint64 instruction, Dis_info *info)
7214 {
7215     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7216     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7217     uint64 ac_value = extract_ac_15_14(instruction);
7218 
7219     const char *rt = GPR(rt_value, info);
7220     const char *ac = AC(ac_value, info);
7221     const char *rs = GPR(rs_value, info);
7222 
7223     return img_format("EXTRV.W %s, %s, %s", rt, ac, rs);
7224 }
7225 
7226 
7227 /*
7228  * EXTW - Extract Word
7229  *
7230  *   3         2         1
7231  *  10987654321098765432109876543210
7232  *  001000                    011111
7233  *     rt -----
7234  *          rs -----
7235  *               rd -----
7236  *                 shift -----
7237  */
7238 static char *EXTW(uint64 instruction, Dis_info *info)
7239 {
7240     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7241     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7242     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
7243     uint64 shift_value = extract_shift_10_9_8_7_6(instruction);
7244 
7245     const char *rd = GPR(rd_value, info);
7246     const char *rs = GPR(rs_value, info);
7247     const char *rt = GPR(rt_value, info);
7248 
7249     return img_format("EXTW %s, %s, %s, 0x%" PRIx64, rd, rs, rt, shift_value);
7250 }
7251 
7252 
7253 /*
7254  *
7255  *
7256  *   3         2         1
7257  *  10987654321098765432109876543210
7258  *  001000               x1110000101
7259  *     rt -----
7260  *          rs -----
7261  *               rd -----
7262  */
7263 static char *FLOOR_L_D(uint64 instruction, Dis_info *info)
7264 {
7265     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7266     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
7267 
7268     const char *ft = FPR(ft_value, info);
7269     const char *fs = FPR(fs_value, info);
7270 
7271     return img_format("FLOOR.L.D %s, %s", ft, fs);
7272 }
7273 
7274 
7275 /*
7276  *
7277  *
7278  *   3         2         1
7279  *  10987654321098765432109876543210
7280  *  001000               x1110000101
7281  *     rt -----
7282  *          rs -----
7283  *               rd -----
7284  */
7285 static char *FLOOR_L_S(uint64 instruction, Dis_info *info)
7286 {
7287     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7288     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
7289 
7290     const char *ft = FPR(ft_value, info);
7291     const char *fs = FPR(fs_value, info);
7292 
7293     return img_format("FLOOR.L.S %s, %s", ft, fs);
7294 }
7295 
7296 
7297 /*
7298  *
7299  *
7300  *   3         2         1
7301  *  10987654321098765432109876543210
7302  *  001000               x1110000101
7303  *     rt -----
7304  *          rs -----
7305  *               rd -----
7306  */
7307 static char *FLOOR_W_D(uint64 instruction, Dis_info *info)
7308 {
7309     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7310     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
7311 
7312     const char *ft = FPR(ft_value, info);
7313     const char *fs = FPR(fs_value, info);
7314 
7315     return img_format("FLOOR.W.D %s, %s", ft, fs);
7316 }
7317 
7318 
7319 /*
7320  *
7321  *
7322  *   3         2         1
7323  *  10987654321098765432109876543210
7324  *  001000               x1110000101
7325  *     rt -----
7326  *          rs -----
7327  *               rd -----
7328  */
7329 static char *FLOOR_W_S(uint64 instruction, Dis_info *info)
7330 {
7331     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7332     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
7333 
7334     const char *ft = FPR(ft_value, info);
7335     const char *fs = FPR(fs_value, info);
7336 
7337     return img_format("FLOOR.W.S %s, %s", ft, fs);
7338 }
7339 
7340 
7341 /*
7342  *
7343  *
7344  *   3         2         1
7345  *  10987654321098765432109876543210
7346  *  001000               x1110000101
7347  *     rt -----
7348  *          rs -----
7349  *               rd -----
7350  */
7351 static char *FORK(uint64 instruction, Dis_info *info)
7352 {
7353     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7354     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7355     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
7356 
7357     const char *rd = GPR(rd_value, info);
7358     const char *rs = GPR(rs_value, info);
7359     const char *rt = GPR(rt_value, info);
7360 
7361     return img_format("FORK %s, %s, %s", rd, rs, rt);
7362 }
7363 
7364 
7365 /*
7366  *
7367  *
7368  *   3         2         1
7369  *  10987654321098765432109876543210
7370  *  001000               x1110000101
7371  *     rt -----
7372  *          rs -----
7373  *               rd -----
7374  */
7375 static char *HYPCALL(uint64 instruction, Dis_info *info)
7376 {
7377     uint64 code_value = extract_code_17_to_0(instruction);
7378 
7379 
7380     return img_format("HYPCALL 0x%" PRIx64, code_value);
7381 }
7382 
7383 
7384 /*
7385  *
7386  *
7387  *   3         2         1
7388  *  10987654321098765432109876543210
7389  *  001000               x1110000101
7390  *     rt -----
7391  *          rs -----
7392  *               rd -----
7393  */
7394 static char *HYPCALL_16_(uint64 instruction, Dis_info *info)
7395 {
7396     uint64 code_value = extract_code_1_0(instruction);
7397 
7398 
7399     return img_format("HYPCALL 0x%" PRIx64, code_value);
7400 }
7401 
7402 
7403 /*
7404  *
7405  *
7406  *   3         2         1
7407  *  10987654321098765432109876543210
7408  *  001000               x1110000101
7409  *     rt -----
7410  *          rs -----
7411  *               rd -----
7412  */
7413 static char *INS(uint64 instruction, Dis_info *info)
7414 {
7415     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7416     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7417     uint64 msbd_value = extract_msbt_10_9_8_7_6(instruction);
7418     uint64 lsb_value = extract_lsb_4_3_2_1_0(instruction);
7419 
7420     const char *rt = GPR(rt_value, info);
7421     const char *rs = GPR(rs_value, info);
7422     /* !!!!!!!!!! - no conversion function */
7423 
7424     return img_format("INS %s, %s, 0x%" PRIx64 ", 0x%" PRIx64,
7425                       rt, rs, lsb_value, msbd_value);
7426     /* hand edited */
7427 }
7428 
7429 
7430 /*
7431  * [DSP] INSV rt, rs - Insert bit field variable
7432  *
7433  *   3         2         1
7434  *  10987654321098765432109876543210
7435  *  001000          0100000100111111
7436  *     rt -----
7437  *          rs -----
7438  */
7439 static char *INSV(uint64 instruction, Dis_info *info)
7440 {
7441     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7442     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7443 
7444     const char *rt = GPR(rt_value, info);
7445     const char *rs = GPR(rs_value, info);
7446 
7447     return img_format("INSV %s, %s", rt, rs);
7448 }
7449 
7450 
7451 /*
7452  *
7453  *
7454  *   3         2         1
7455  *  10987654321098765432109876543210
7456  *  001000               x1110000101
7457  *     rt -----
7458  *          rs -----
7459  *               rd -----
7460  */
7461 static char *IRET(uint64 instruction, Dis_info *info)
7462 {
7463     (void)instruction;
7464 
7465     return g_strdup("IRET ");
7466 }
7467 
7468 
7469 /*
7470  *
7471  *
7472  *   3         2         1
7473  *  10987654321098765432109876543210
7474  *  001000               x1110000101
7475  *     rt -----
7476  *          rs -----
7477  *               rd -----
7478  */
7479 static char *JALRC_16_(uint64 instruction, Dis_info *info)
7480 {
7481     uint64 rt_value = extract_rt_9_8_7_6_5(instruction);
7482 
7483     const char *rt = GPR(rt_value, info);
7484 
7485     return img_format("JALRC $%d, %s", 31, rt);
7486 }
7487 
7488 
7489 /*
7490  *
7491  *
7492  *   3         2         1
7493  *  10987654321098765432109876543210
7494  *  001000               x1110000101
7495  *     rt -----
7496  *          rs -----
7497  *               rd -----
7498  */
7499 static char *JALRC_32_(uint64 instruction, Dis_info *info)
7500 {
7501     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7502     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7503 
7504     const char *rt = GPR(rt_value, info);
7505     const char *rs = GPR(rs_value, info);
7506 
7507     return img_format("JALRC %s, %s", rt, rs);
7508 }
7509 
7510 
7511 /*
7512  *
7513  *
7514  *   3         2         1
7515  *  10987654321098765432109876543210
7516  *  001000               x1110000101
7517  *     rt -----
7518  *          rs -----
7519  *               rd -----
7520  */
7521 static char *JALRC_HB(uint64 instruction, Dis_info *info)
7522 {
7523     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7524     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7525 
7526     const char *rt = GPR(rt_value, info);
7527     const char *rs = GPR(rs_value, info);
7528 
7529     return img_format("JALRC.HB %s, %s", rt, rs);
7530 }
7531 
7532 
7533 /*
7534  *
7535  *
7536  *   3         2         1
7537  *  10987654321098765432109876543210
7538  *  001000               x1110000101
7539  *     rt -----
7540  *          rs -----
7541  *               rd -----
7542  */
7543 static char *JRC(uint64 instruction, Dis_info *info)
7544 {
7545     uint64 rt_value = extract_rt_9_8_7_6_5(instruction);
7546 
7547     const char *rt = GPR(rt_value, info);
7548 
7549     return img_format("JRC %s", rt);
7550 }
7551 
7552 
7553 /*
7554  *
7555  *
7556  *   3         2         1
7557  *  10987654321098765432109876543210
7558  *  001000               x1110000101
7559  *     rt -----
7560  *          rs -----
7561  *               rd -----
7562  */
7563 static char *LB_16_(uint64 instruction, Dis_info *info)
7564 {
7565     uint64 rt3_value = extract_rt3_9_8_7(instruction);
7566     uint64 rs3_value = extract_rs3_6_5_4(instruction);
7567     uint64 u_value = extract_u_1_0(instruction);
7568 
7569     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
7570     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
7571 
7572     return img_format("LB %s, 0x%" PRIx64 "(%s)", rt3, u_value, rs3);
7573 }
7574 
7575 
7576 /*
7577  *
7578  *
7579  *   3         2         1
7580  *  10987654321098765432109876543210
7581  *  001000               x1110000101
7582  *     rt -----
7583  *          rs -----
7584  *               rd -----
7585  */
7586 static char *LB_GP_(uint64 instruction, Dis_info *info)
7587 {
7588     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7589     uint64 u_value = extract_u_17_to_0(instruction);
7590 
7591     const char *rt = GPR(rt_value, info);
7592 
7593     return img_format("LB %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
7594 }
7595 
7596 
7597 /*
7598  *
7599  *
7600  *   3         2         1
7601  *  10987654321098765432109876543210
7602  *  001000               x1110000101
7603  *     rt -----
7604  *          rs -----
7605  *               rd -----
7606  */
7607 static char *LB_S9_(uint64 instruction, Dis_info *info)
7608 {
7609     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7610     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7611     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
7612 
7613     const char *rt = GPR(rt_value, info);
7614     const char *rs = GPR(rs_value, info);
7615 
7616     return img_format("LB %s, %" PRId64 "(%s)", rt, s_value, rs);
7617 }
7618 
7619 
7620 /*
7621  *
7622  *
7623  *   3         2         1
7624  *  10987654321098765432109876543210
7625  *  001000               x1110000101
7626  *     rt -----
7627  *          rs -----
7628  *               rd -----
7629  */
7630 static char *LB_U12_(uint64 instruction, Dis_info *info)
7631 {
7632     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7633     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7634     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
7635 
7636     const char *rt = GPR(rt_value, info);
7637     const char *rs = GPR(rs_value, info);
7638 
7639     return img_format("LB %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
7640 }
7641 
7642 
7643 /*
7644  *
7645  *
7646  *   3         2         1
7647  *  10987654321098765432109876543210
7648  *  001000               x1110000101
7649  *     rt -----
7650  *          rs -----
7651  *               rd -----
7652  */
7653 static char *LBE(uint64 instruction, Dis_info *info)
7654 {
7655     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7656     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7657     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
7658 
7659     const char *rt = GPR(rt_value, info);
7660     const char *rs = GPR(rs_value, info);
7661 
7662     return img_format("LBE %s, %" PRId64 "(%s)", rt, s_value, rs);
7663 }
7664 
7665 
7666 /*
7667  *
7668  *
7669  *   3         2         1
7670  *  10987654321098765432109876543210
7671  *  001000               x1110000101
7672  *     rt -----
7673  *          rs -----
7674  *               rd -----
7675  */
7676 static char *LBU_16_(uint64 instruction, Dis_info *info)
7677 {
7678     uint64 rt3_value = extract_rt3_9_8_7(instruction);
7679     uint64 rs3_value = extract_rs3_6_5_4(instruction);
7680     uint64 u_value = extract_u_1_0(instruction);
7681 
7682     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
7683     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
7684 
7685     return img_format("LBU %s, 0x%" PRIx64 "(%s)", rt3, u_value, rs3);
7686 }
7687 
7688 
7689 /*
7690  *
7691  *
7692  *   3         2         1
7693  *  10987654321098765432109876543210
7694  *  001000               x1110000101
7695  *     rt -----
7696  *          rs -----
7697  *               rd -----
7698  */
7699 static char *LBU_GP_(uint64 instruction, Dis_info *info)
7700 {
7701     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7702     uint64 u_value = extract_u_17_to_0(instruction);
7703 
7704     const char *rt = GPR(rt_value, info);
7705 
7706     return img_format("LBU %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
7707 }
7708 
7709 
7710 /*
7711  *
7712  *
7713  *   3         2         1
7714  *  10987654321098765432109876543210
7715  *  001000               x1110000101
7716  *     rt -----
7717  *          rs -----
7718  *               rd -----
7719  */
7720 static char *LBU_S9_(uint64 instruction, Dis_info *info)
7721 {
7722     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7723     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7724     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
7725 
7726     const char *rt = GPR(rt_value, info);
7727     const char *rs = GPR(rs_value, info);
7728 
7729     return img_format("LBU %s, %" PRId64 "(%s)", rt, s_value, rs);
7730 }
7731 
7732 
7733 /*
7734  *
7735  *
7736  *   3         2         1
7737  *  10987654321098765432109876543210
7738  *  001000               x1110000101
7739  *     rt -----
7740  *          rs -----
7741  *               rd -----
7742  */
7743 static char *LBU_U12_(uint64 instruction, Dis_info *info)
7744 {
7745     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7746     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7747     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
7748 
7749     const char *rt = GPR(rt_value, info);
7750     const char *rs = GPR(rs_value, info);
7751 
7752     return img_format("LBU %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
7753 }
7754 
7755 
7756 /*
7757  *
7758  *
7759  *   3         2         1
7760  *  10987654321098765432109876543210
7761  *  001000               x1110000101
7762  *     rt -----
7763  *          rs -----
7764  *               rd -----
7765  */
7766 static char *LBUE(uint64 instruction, Dis_info *info)
7767 {
7768     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7769     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7770     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
7771 
7772     const char *rt = GPR(rt_value, info);
7773     const char *rs = GPR(rs_value, info);
7774 
7775     return img_format("LBUE %s, %" PRId64 "(%s)", rt, s_value, rs);
7776 }
7777 
7778 
7779 /*
7780  *
7781  *
7782  *   3         2         1
7783  *  10987654321098765432109876543210
7784  *  001000               x1110000101
7785  *     rt -----
7786  *          rs -----
7787  *               rd -----
7788  */
7789 static char *LBUX(uint64 instruction, Dis_info *info)
7790 {
7791     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7792     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7793     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
7794 
7795     const char *rd = GPR(rd_value, info);
7796     const char *rs = GPR(rs_value, info);
7797     const char *rt = GPR(rt_value, info);
7798 
7799     return img_format("LBUX %s, %s(%s)", rd, rs, rt);
7800 }
7801 
7802 
7803 /*
7804  *
7805  *
7806  *   3         2         1
7807  *  10987654321098765432109876543210
7808  *  001000               x1110000101
7809  *     rt -----
7810  *          rs -----
7811  *               rd -----
7812  */
7813 static char *LBX(uint64 instruction, Dis_info *info)
7814 {
7815     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7816     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7817     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
7818 
7819     const char *rd = GPR(rd_value, info);
7820     const char *rs = GPR(rs_value, info);
7821     const char *rt = GPR(rt_value, info);
7822 
7823     return img_format("LBX %s, %s(%s)", rd, rs, rt);
7824 }
7825 
7826 
7827 /*
7828  *
7829  *
7830  *   3         2         1
7831  *  10987654321098765432109876543210
7832  *  001000               x1110000101
7833  *     rt -----
7834  *          rs -----
7835  *               rd -----
7836  */
7837 static char *LD_GP_(uint64 instruction, Dis_info *info)
7838 {
7839     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7840     uint64 u_value = extract_u_20_to_3__s3(instruction);
7841 
7842     const char *rt = GPR(rt_value, info);
7843 
7844     return img_format("LD %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
7845 }
7846 
7847 
7848 /*
7849  *
7850  *
7851  *   3         2         1
7852  *  10987654321098765432109876543210
7853  *  001000               x1110000101
7854  *     rt -----
7855  *          rs -----
7856  *               rd -----
7857  */
7858 static char *LD_S9_(uint64 instruction, Dis_info *info)
7859 {
7860     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7861     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7862     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
7863 
7864     const char *rt = GPR(rt_value, info);
7865     const char *rs = GPR(rs_value, info);
7866 
7867     return img_format("LD %s, %" PRId64 "(%s)", rt, s_value, rs);
7868 }
7869 
7870 
7871 /*
7872  *
7873  *
7874  *   3         2         1
7875  *  10987654321098765432109876543210
7876  *  001000               x1110000101
7877  *     rt -----
7878  *          rs -----
7879  *               rd -----
7880  */
7881 static char *LD_U12_(uint64 instruction, Dis_info *info)
7882 {
7883     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7884     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7885     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
7886 
7887     const char *rt = GPR(rt_value, info);
7888     const char *rs = GPR(rs_value, info);
7889 
7890     return img_format("LD %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
7891 }
7892 
7893 
7894 /*
7895  *
7896  *
7897  *   3         2         1
7898  *  10987654321098765432109876543210
7899  *  001000               x1110000101
7900  *     rt -----
7901  *          rs -----
7902  *               rd -----
7903  */
7904 static char *LDC1_GP_(uint64 instruction, Dis_info *info)
7905 {
7906     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7907     uint64 u_value = extract_u_17_to_2__s2(instruction);
7908 
7909     const char *ft = FPR(ft_value, info);
7910 
7911     return img_format("LDC1 %s, 0x%" PRIx64 "($%d)", ft, u_value, 28);
7912 }
7913 
7914 
7915 /*
7916  *
7917  *
7918  *   3         2         1
7919  *  10987654321098765432109876543210
7920  *  001000               x1110000101
7921  *     rt -----
7922  *          rs -----
7923  *               rd -----
7924  */
7925 static char *LDC1_S9_(uint64 instruction, Dis_info *info)
7926 {
7927     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7928     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7929     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
7930 
7931     const char *ft = FPR(ft_value, info);
7932     const char *rs = GPR(rs_value, info);
7933 
7934     return img_format("LDC1 %s, %" PRId64 "(%s)", ft, s_value, rs);
7935 }
7936 
7937 
7938 /*
7939  *
7940  *
7941  *   3         2         1
7942  *  10987654321098765432109876543210
7943  *  001000               x1110000101
7944  *     rt -----
7945  *          rs -----
7946  *               rd -----
7947  */
7948 static char *LDC1_U12_(uint64 instruction, Dis_info *info)
7949 {
7950     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
7951     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7952     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
7953 
7954     const char *ft = FPR(ft_value, info);
7955     const char *rs = GPR(rs_value, info);
7956 
7957     return img_format("LDC1 %s, 0x%" PRIx64 "(%s)", ft, u_value, rs);
7958 }
7959 
7960 
7961 /*
7962  *
7963  *
7964  *   3         2         1
7965  *  10987654321098765432109876543210
7966  *  001000               x1110000101
7967  *     rt -----
7968  *          rs -----
7969  *               rd -----
7970  */
7971 static char *LDC1XS(uint64 instruction, Dis_info *info)
7972 {
7973     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7974     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7975     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
7976 
7977     const char *ft = FPR(ft_value, info);
7978     const char *rs = GPR(rs_value, info);
7979     const char *rt = GPR(rt_value, info);
7980 
7981     return img_format("LDC1XS %s, %s(%s)", ft, rs, rt);
7982 }
7983 
7984 
7985 /*
7986  *
7987  *
7988  *   3         2         1
7989  *  10987654321098765432109876543210
7990  *  001000               x1110000101
7991  *     rt -----
7992  *          rs -----
7993  *               rd -----
7994  */
7995 static char *LDC1X(uint64 instruction, Dis_info *info)
7996 {
7997     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
7998     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
7999     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
8000 
8001     const char *ft = FPR(ft_value, info);
8002     const char *rs = GPR(rs_value, info);
8003     const char *rt = GPR(rt_value, info);
8004 
8005     return img_format("LDC1X %s, %s(%s)", ft, rs, rt);
8006 }
8007 
8008 
8009 /*
8010  *
8011  *
8012  *   3         2         1
8013  *  10987654321098765432109876543210
8014  *  001000               x1110000101
8015  *     rt -----
8016  *          rs -----
8017  *               rd -----
8018  */
8019 static char *LDC2(uint64 instruction, Dis_info *info)
8020 {
8021     uint64 ct_value = extract_ct_25_24_23_22_21(instruction);
8022     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8023     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8024 
8025     const char *rs = GPR(rs_value, info);
8026 
8027     return img_format("LDC2 CP%" PRIu64 ", %" PRId64 "(%s)",
8028                       ct_value, s_value, rs);
8029 }
8030 
8031 
8032 /*
8033  *
8034  *
8035  *   3         2         1
8036  *  10987654321098765432109876543210
8037  *  001000               x1110000101
8038  *     rt -----
8039  *          rs -----
8040  *               rd -----
8041  */
8042 static char *LDM(uint64 instruction, Dis_info *info)
8043 {
8044     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8045     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8046     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8047     uint64 count3_value = extract_count3_14_13_12(instruction);
8048 
8049     const char *rt = GPR(rt_value, info);
8050     const char *rs = GPR(rs_value, info);
8051     uint64 count3 = encode_count3_from_count(count3_value);
8052 
8053     return img_format("LDM %s, %" PRId64 "(%s), 0x%" PRIx64,
8054                       rt, s_value, rs, count3);
8055 }
8056 
8057 
8058 /*
8059  *
8060  *
8061  *   3         2         1
8062  *  10987654321098765432109876543210
8063  *  001000               x1110000101
8064  *     rt -----
8065  *          rs -----
8066  *               rd -----
8067  */
8068 static char *LDPC_48_(uint64 instruction, Dis_info *info)
8069 {
8070     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
8071     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
8072 
8073     const char *rt = GPR(rt_value, info);
8074     g_autofree char *s = ADDRESS(s_value, 6, info);
8075 
8076     return img_format("LDPC %s, %s", rt, s);
8077 }
8078 
8079 
8080 /*
8081  *
8082  *
8083  *   3         2         1
8084  *  10987654321098765432109876543210
8085  *  001000               x1110000101
8086  *     rt -----
8087  *          rs -----
8088  *               rd -----
8089  */
8090 static char *LDX(uint64 instruction, Dis_info *info)
8091 {
8092     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8093     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8094     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8095 
8096     const char *rd = GPR(rd_value, info);
8097     const char *rs = GPR(rs_value, info);
8098     const char *rt = GPR(rt_value, info);
8099 
8100     return img_format("LDX %s, %s(%s)", rd, rs, rt);
8101 }
8102 
8103 
8104 /*
8105  *
8106  *
8107  *   3         2         1
8108  *  10987654321098765432109876543210
8109  *  001000               x1110000101
8110  *     rt -----
8111  *          rs -----
8112  *               rd -----
8113  */
8114 static char *LDXS(uint64 instruction, Dis_info *info)
8115 {
8116     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8117     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8118     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8119 
8120     const char *rd = GPR(rd_value, info);
8121     const char *rs = GPR(rs_value, info);
8122     const char *rt = GPR(rt_value, info);
8123 
8124     return img_format("LDXS %s, %s(%s)", rd, rs, rt);
8125 }
8126 
8127 
8128 /*
8129  *
8130  *
8131  *   3         2         1
8132  *  10987654321098765432109876543210
8133  *  001000               x1110000101
8134  *     rt -----
8135  *          rs -----
8136  *               rd -----
8137  */
8138 static char *LH_16_(uint64 instruction, Dis_info *info)
8139 {
8140     uint64 rt3_value = extract_rt3_9_8_7(instruction);
8141     uint64 rs3_value = extract_rs3_6_5_4(instruction);
8142     uint64 u_value = extract_u_2_1__s1(instruction);
8143 
8144     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
8145     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
8146 
8147     return img_format("LH %s, 0x%" PRIx64 "(%s)", rt3, u_value, rs3);
8148 }
8149 
8150 
8151 /*
8152  *
8153  *
8154  *   3         2         1
8155  *  10987654321098765432109876543210
8156  *  001000               x1110000101
8157  *     rt -----
8158  *          rs -----
8159  *               rd -----
8160  */
8161 static char *LH_GP_(uint64 instruction, Dis_info *info)
8162 {
8163     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8164     uint64 u_value = extract_u_17_to_1__s1(instruction);
8165 
8166     const char *rt = GPR(rt_value, info);
8167 
8168     return img_format("LH %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
8169 }
8170 
8171 
8172 /*
8173  *
8174  *
8175  *   3         2         1
8176  *  10987654321098765432109876543210
8177  *  001000               x1110000101
8178  *     rt -----
8179  *          rs -----
8180  *               rd -----
8181  */
8182 static char *LH_S9_(uint64 instruction, Dis_info *info)
8183 {
8184     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8185     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8186     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8187 
8188     const char *rt = GPR(rt_value, info);
8189     const char *rs = GPR(rs_value, info);
8190 
8191     return img_format("LH %s, %" PRId64 "(%s)", rt, s_value, rs);
8192 }
8193 
8194 
8195 /*
8196  *
8197  *
8198  *   3         2         1
8199  *  10987654321098765432109876543210
8200  *  001000               x1110000101
8201  *     rt -----
8202  *          rs -----
8203  *               rd -----
8204  */
8205 static char *LH_U12_(uint64 instruction, Dis_info *info)
8206 {
8207     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8208     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8209     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
8210 
8211     const char *rt = GPR(rt_value, info);
8212     const char *rs = GPR(rs_value, info);
8213 
8214     return img_format("LH %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
8215 }
8216 
8217 
8218 /*
8219  *
8220  *
8221  *   3         2         1
8222  *  10987654321098765432109876543210
8223  *  001000               x1110000101
8224  *     rt -----
8225  *          rs -----
8226  *               rd -----
8227  */
8228 static char *LHE(uint64 instruction, Dis_info *info)
8229 {
8230     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8231     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8232     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8233 
8234     const char *rt = GPR(rt_value, info);
8235     const char *rs = GPR(rs_value, info);
8236 
8237     return img_format("LHE %s, %" PRId64 "(%s)", rt, s_value, rs);
8238 }
8239 
8240 
8241 /*
8242  *
8243  *
8244  *   3         2         1
8245  *  10987654321098765432109876543210
8246  *  001000               x1110000101
8247  *     rt -----
8248  *          rs -----
8249  *               rd -----
8250  */
8251 static char *LHU_16_(uint64 instruction, Dis_info *info)
8252 {
8253     uint64 rt3_value = extract_rt3_9_8_7(instruction);
8254     uint64 rs3_value = extract_rs3_6_5_4(instruction);
8255     uint64 u_value = extract_u_2_1__s1(instruction);
8256 
8257     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
8258     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
8259 
8260     return img_format("LHU %s, 0x%" PRIx64 "(%s)", rt3, u_value, rs3);
8261 }
8262 
8263 
8264 /*
8265  *
8266  *
8267  *   3         2         1
8268  *  10987654321098765432109876543210
8269  *  001000               x1110000101
8270  *     rt -----
8271  *          rs -----
8272  *               rd -----
8273  */
8274 static char *LHU_GP_(uint64 instruction, Dis_info *info)
8275 {
8276     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8277     uint64 u_value = extract_u_17_to_1__s1(instruction);
8278 
8279     const char *rt = GPR(rt_value, info);
8280 
8281     return img_format("LHU %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
8282 }
8283 
8284 
8285 /*
8286  *
8287  *
8288  *   3         2         1
8289  *  10987654321098765432109876543210
8290  *  001000               x1110000101
8291  *     rt -----
8292  *          rs -----
8293  *               rd -----
8294  */
8295 static char *LHU_S9_(uint64 instruction, Dis_info *info)
8296 {
8297     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8298     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8299     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8300 
8301     const char *rt = GPR(rt_value, info);
8302     const char *rs = GPR(rs_value, info);
8303 
8304     return img_format("LHU %s, %" PRId64 "(%s)", rt, s_value, rs);
8305 }
8306 
8307 
8308 /*
8309  *
8310  *
8311  *   3         2         1
8312  *  10987654321098765432109876543210
8313  *  001000               x1110000101
8314  *     rt -----
8315  *          rs -----
8316  *               rd -----
8317  */
8318 static char *LHU_U12_(uint64 instruction, Dis_info *info)
8319 {
8320     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8321     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8322     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
8323 
8324     const char *rt = GPR(rt_value, info);
8325     const char *rs = GPR(rs_value, info);
8326 
8327     return img_format("LHU %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
8328 }
8329 
8330 
8331 /*
8332  *
8333  *
8334  *   3         2         1
8335  *  10987654321098765432109876543210
8336  *  001000               x1110000101
8337  *     rt -----
8338  *          rs -----
8339  *               rd -----
8340  */
8341 static char *LHUE(uint64 instruction, Dis_info *info)
8342 {
8343     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8344     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8345     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8346 
8347     const char *rt = GPR(rt_value, info);
8348     const char *rs = GPR(rs_value, info);
8349 
8350     return img_format("LHUE %s, %" PRId64 "(%s)", rt, s_value, rs);
8351 }
8352 
8353 
8354 /*
8355  *
8356  *
8357  *   3         2         1
8358  *  10987654321098765432109876543210
8359  *  001000               x1110000101
8360  *     rt -----
8361  *          rs -----
8362  *               rd -----
8363  */
8364 static char *LHUX(uint64 instruction, Dis_info *info)
8365 {
8366     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8367     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8368     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8369 
8370     const char *rd = GPR(rd_value, info);
8371     const char *rs = GPR(rs_value, info);
8372     const char *rt = GPR(rt_value, info);
8373 
8374     return img_format("LHUX %s, %s(%s)", rd, rs, rt);
8375 }
8376 
8377 
8378 /*
8379  *
8380  *
8381  *   3         2         1
8382  *  10987654321098765432109876543210
8383  *  001000               x1110000101
8384  *     rt -----
8385  *          rs -----
8386  *               rd -----
8387  */
8388 static char *LHUXS(uint64 instruction, Dis_info *info)
8389 {
8390     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8391     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8392     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8393 
8394     const char *rd = GPR(rd_value, info);
8395     const char *rs = GPR(rs_value, info);
8396     const char *rt = GPR(rt_value, info);
8397 
8398     return img_format("LHUXS %s, %s(%s)", rd, rs, rt);
8399 }
8400 
8401 
8402 /*
8403  *
8404  *
8405  *   3         2         1
8406  *  10987654321098765432109876543210
8407  *  001000               x1110000101
8408  *     rt -----
8409  *          rs -----
8410  *               rd -----
8411  */
8412 static char *LHXS(uint64 instruction, Dis_info *info)
8413 {
8414     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8415     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8416     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8417 
8418     const char *rd = GPR(rd_value, info);
8419     const char *rs = GPR(rs_value, info);
8420     const char *rt = GPR(rt_value, info);
8421 
8422     return img_format("LHXS %s, %s(%s)", rd, rs, rt);
8423 }
8424 
8425 
8426 /*
8427  *
8428  *
8429  *   3         2         1
8430  *  10987654321098765432109876543210
8431  *  001000               x1110000101
8432  *     rt -----
8433  *          rs -----
8434  *               rd -----
8435  */
8436 static char *LHX(uint64 instruction, Dis_info *info)
8437 {
8438     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8439     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8440     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8441 
8442     const char *rd = GPR(rd_value, info);
8443     const char *rs = GPR(rs_value, info);
8444     const char *rt = GPR(rt_value, info);
8445 
8446     return img_format("LHX %s, %s(%s)", rd, rs, rt);
8447 }
8448 
8449 
8450 /*
8451  *
8452  *
8453  *   3         2         1
8454  *  10987654321098765432109876543210
8455  *  001000               x1110000101
8456  *     rt -----
8457  *          rs -----
8458  *               rd -----
8459  */
8460 static char *LI_16_(uint64 instruction, Dis_info *info)
8461 {
8462     uint64 rt3_value = extract_rt3_9_8_7(instruction);
8463     uint64 eu_value = extract_eu_6_5_4_3_2_1_0(instruction);
8464 
8465     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
8466     int64 eu = encode_eu_from_s_li16(eu_value);
8467 
8468     return img_format("LI %s, %" PRId64, rt3, eu);
8469 }
8470 
8471 
8472 /*
8473  *
8474  *
8475  *   3         2         1
8476  *  10987654321098765432109876543210
8477  *  001000               x1110000101
8478  *     rt -----
8479  *          rs -----
8480  *               rd -----
8481  */
8482 static char *LI_48_(uint64 instruction, Dis_info *info)
8483 {
8484     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
8485     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
8486 
8487     const char *rt = GPR(rt_value, info);
8488 
8489     return img_format("LI %s, %" PRId64, rt, s_value);
8490 }
8491 
8492 
8493 /*
8494  *
8495  *
8496  *   3         2         1
8497  *  10987654321098765432109876543210
8498  *  001000               x1110000101
8499  *     rt -----
8500  *          rs -----
8501  *               rd -----
8502  */
8503 static char *LL(uint64 instruction, Dis_info *info)
8504 {
8505     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8506     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8507     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_s2(instruction);
8508 
8509     const char *rt = GPR(rt_value, info);
8510     const char *rs = GPR(rs_value, info);
8511 
8512     return img_format("LL %s, %" PRId64 "(%s)", rt, s_value, rs);
8513 }
8514 
8515 
8516 /*
8517  *
8518  *
8519  *   3         2         1
8520  *  10987654321098765432109876543210
8521  *  001000               x1110000101
8522  *     rt -----
8523  *          rs -----
8524  *               rd -----
8525  */
8526 static char *LLD(uint64 instruction, Dis_info *info)
8527 {
8528     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8529     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8530     int64 s_value = extract_s__se8_15_7_6_5_4_3_s3(instruction);
8531 
8532     const char *rt = GPR(rt_value, info);
8533     const char *rs = GPR(rs_value, info);
8534 
8535     return img_format("LLD %s, %" PRId64 "(%s)", rt, s_value, rs);
8536 }
8537 
8538 
8539 /*
8540  *
8541  *
8542  *   3         2         1
8543  *  10987654321098765432109876543210
8544  *  001000               x1110000101
8545  *     rt -----
8546  *          rs -----
8547  *               rd -----
8548  */
8549 static char *LLDP(uint64 instruction, Dis_info *info)
8550 {
8551     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8552     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8553     uint64 ru_value = extract_ru_7_6_5_4_3(instruction);
8554 
8555     const char *rt = GPR(rt_value, info);
8556     const char *ru = GPR(ru_value, info);
8557     const char *rs = GPR(rs_value, info);
8558 
8559     return img_format("LLDP %s, %s, (%s)", rt, ru, rs);
8560 }
8561 
8562 
8563 /*
8564  *
8565  *
8566  *   3         2         1
8567  *  10987654321098765432109876543210
8568  *  001000               x1110000101
8569  *     rt -----
8570  *          rs -----
8571  *               rd -----
8572  */
8573 static char *LLE(uint64 instruction, Dis_info *info)
8574 {
8575     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8576     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8577     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_s2(instruction);
8578 
8579     const char *rt = GPR(rt_value, info);
8580     const char *rs = GPR(rs_value, info);
8581 
8582     return img_format("LLE %s, %" PRId64 "(%s)", rt, s_value, rs);
8583 }
8584 
8585 
8586 /*
8587  *
8588  *
8589  *   3         2         1
8590  *  10987654321098765432109876543210
8591  *  001000               x1110000101
8592  *     rt -----
8593  *          rs -----
8594  *               rd -----
8595  */
8596 static char *LLWP(uint64 instruction, Dis_info *info)
8597 {
8598     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8599     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8600     uint64 ru_value = extract_ru_7_6_5_4_3(instruction);
8601 
8602     const char *rt = GPR(rt_value, info);
8603     const char *ru = GPR(ru_value, info);
8604     const char *rs = GPR(rs_value, info);
8605 
8606     return img_format("LLWP %s, %s, (%s)", rt, ru, rs);
8607 }
8608 
8609 
8610 /*
8611  *
8612  *
8613  *   3         2         1
8614  *  10987654321098765432109876543210
8615  *  001000               x1110000101
8616  *     rt -----
8617  *          rs -----
8618  *               rd -----
8619  */
8620 static char *LLWPE(uint64 instruction, Dis_info *info)
8621 {
8622     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8623     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8624     uint64 ru_value = extract_ru_7_6_5_4_3(instruction);
8625 
8626     const char *rt = GPR(rt_value, info);
8627     const char *ru = GPR(ru_value, info);
8628     const char *rs = GPR(rs_value, info);
8629 
8630     return img_format("LLWPE %s, %s, (%s)", rt, ru, rs);
8631 }
8632 
8633 
8634 /*
8635  *
8636  *
8637  *   3         2         1
8638  *  10987654321098765432109876543210
8639  *  001000               x1110000101
8640  *     rt -----
8641  *          rs -----
8642  *               rd -----
8643  */
8644 static char *LSA(uint64 instruction, Dis_info *info)
8645 {
8646     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8647     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8648     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
8649     uint64 u2_value = extract_u2_10_9(instruction);
8650 
8651     const char *rd = GPR(rd_value, info);
8652     const char *rs = GPR(rs_value, info);
8653     const char *rt = GPR(rt_value, info);
8654 
8655     return img_format("LSA %s, %s, %s, 0x%" PRIx64, rd, rs, rt, u2_value);
8656 }
8657 
8658 
8659 /*
8660  *
8661  *
8662  *   3         2         1
8663  *  10987654321098765432109876543210
8664  *  001000               x1110000101
8665  *     rt -----
8666  *          rs -----
8667  *               rd -----
8668  */
8669 static char *LUI(uint64 instruction, Dis_info *info)
8670 {
8671     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8672     int64 s_value = extract_s__se31_0_11_to_2_20_to_12_s12(instruction);
8673 
8674     const char *rt = GPR(rt_value, info);
8675 
8676     return img_format("LUI %s, %%hi(%" PRId64 ")", rt, s_value);
8677 }
8678 
8679 
8680 /*
8681  *
8682  *
8683  *   3         2         1
8684  *  10987654321098765432109876543210
8685  *  001000               x1110000101
8686  *     rt -----
8687  *          rs -----
8688  *               rd -----
8689  */
8690 static char *LW_16_(uint64 instruction, Dis_info *info)
8691 {
8692     uint64 rt3_value = extract_rt3_9_8_7(instruction);
8693     uint64 rs3_value = extract_rs3_6_5_4(instruction);
8694     uint64 u_value = extract_u_3_2_1_0__s2(instruction);
8695 
8696     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
8697     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
8698 
8699     return img_format("LW %s, 0x%" PRIx64 "(%s)", rt3, u_value, rs3);
8700 }
8701 
8702 
8703 /*
8704  *
8705  *
8706  *   3         2         1
8707  *  10987654321098765432109876543210
8708  *  001000               x1110000101
8709  *     rt -----
8710  *          rs -----
8711  *               rd -----
8712  */
8713 static char *LW_4X4_(uint64 instruction, Dis_info *info)
8714 {
8715     uint64 rt4_value = extract_rt4_9_7_6_5(instruction);
8716     uint64 rs4_value = extract_rs4_4_2_1_0(instruction);
8717     uint64 u_value = extract_u_3_8__s2(instruction);
8718 
8719     const char *rt4 = GPR(decode_gpr_gpr4(rt4_value, info), info);
8720     const char *rs4 = GPR(decode_gpr_gpr4(rs4_value, info), info);
8721 
8722     return img_format("LW %s, 0x%" PRIx64 "(%s)", rt4, u_value, rs4);
8723 }
8724 
8725 
8726 /*
8727  *
8728  *
8729  *   3         2         1
8730  *  10987654321098765432109876543210
8731  *  001000               x1110000101
8732  *     rt -----
8733  *          rs -----
8734  *               rd -----
8735  */
8736 static char *LW_GP_(uint64 instruction, Dis_info *info)
8737 {
8738     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8739     uint64 u_value = extract_u_20_to_2__s2(instruction);
8740 
8741     const char *rt = GPR(rt_value, info);
8742 
8743     return img_format("LW %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
8744 }
8745 
8746 
8747 /*
8748  *
8749  *
8750  *   3         2         1
8751  *  10987654321098765432109876543210
8752  *  001000               x1110000101
8753  *     rt -----
8754  *          rs -----
8755  *               rd -----
8756  */
8757 static char *LW_GP16_(uint64 instruction, Dis_info *info)
8758 {
8759     uint64 rt3_value = extract_rt3_9_8_7(instruction);
8760     uint64 u_value = extract_u_6_5_4_3_2_1_0__s2(instruction);
8761 
8762     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
8763 
8764     return img_format("LW %s, 0x%" PRIx64 "($%d)", rt3, u_value, 28);
8765 }
8766 
8767 
8768 /*
8769  *
8770  *
8771  *   3         2         1
8772  *  10987654321098765432109876543210
8773  *  001000               x1110000101
8774  *     rt -----
8775  *          rs -----
8776  *               rd -----
8777  */
8778 static char *LW_S9_(uint64 instruction, Dis_info *info)
8779 {
8780     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8781     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8782     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8783 
8784     const char *rt = GPR(rt_value, info);
8785     const char *rs = GPR(rs_value, info);
8786 
8787     return img_format("LW %s, %" PRId64 "(%s)", rt, s_value, rs);
8788 }
8789 
8790 
8791 /*
8792  *
8793  *
8794  *   3         2         1
8795  *  10987654321098765432109876543210
8796  *  001000               x1110000101
8797  *     rt -----
8798  *          rs -----
8799  *               rd -----
8800  */
8801 static char *LW_SP_(uint64 instruction, Dis_info *info)
8802 {
8803     uint64 rt_value = extract_rt_9_8_7_6_5(instruction);
8804     uint64 u_value = extract_u_4_3_2_1_0__s2(instruction);
8805 
8806     const char *rt = GPR(rt_value, info);
8807 
8808     return img_format("LW %s, 0x%" PRIx64 "($%d)", rt, u_value, 29);
8809 }
8810 
8811 
8812 /*
8813  *
8814  *
8815  *   3         2         1
8816  *  10987654321098765432109876543210
8817  *  001000               x1110000101
8818  *     rt -----
8819  *          rs -----
8820  *               rd -----
8821  */
8822 static char *LW_U12_(uint64 instruction, Dis_info *info)
8823 {
8824     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8825     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8826     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
8827 
8828     const char *rt = GPR(rt_value, info);
8829     const char *rs = GPR(rs_value, info);
8830 
8831     return img_format("LW %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
8832 }
8833 
8834 
8835 /*
8836  *
8837  *
8838  *   3         2         1
8839  *  10987654321098765432109876543210
8840  *  001000               x1110000101
8841  *     rt -----
8842  *          rs -----
8843  *               rd -----
8844  */
8845 static char *LWC1_GP_(uint64 instruction, Dis_info *info)
8846 {
8847     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
8848     uint64 u_value = extract_u_17_to_2__s2(instruction);
8849 
8850     const char *ft = FPR(ft_value, info);
8851 
8852     return img_format("LWC1 %s, 0x%" PRIx64 "($%d)", ft, u_value, 28);
8853 }
8854 
8855 
8856 /*
8857  *
8858  *
8859  *   3         2         1
8860  *  10987654321098765432109876543210
8861  *  001000               x1110000101
8862  *     rt -----
8863  *          rs -----
8864  *               rd -----
8865  */
8866 static char *LWC1_S9_(uint64 instruction, Dis_info *info)
8867 {
8868     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
8869     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8870     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8871 
8872     const char *ft = FPR(ft_value, info);
8873     const char *rs = GPR(rs_value, info);
8874 
8875     return img_format("LWC1 %s, %" PRId64 "(%s)", ft, s_value, rs);
8876 }
8877 
8878 
8879 /*
8880  *
8881  *
8882  *   3         2         1
8883  *  10987654321098765432109876543210
8884  *  001000               x1110000101
8885  *     rt -----
8886  *          rs -----
8887  *               rd -----
8888  */
8889 static char *LWC1_U12_(uint64 instruction, Dis_info *info)
8890 {
8891     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
8892     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8893     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
8894 
8895     const char *ft = FPR(ft_value, info);
8896     const char *rs = GPR(rs_value, info);
8897 
8898     return img_format("LWC1 %s, 0x%" PRIx64 "(%s)", ft, u_value, rs);
8899 }
8900 
8901 
8902 /*
8903  *
8904  *
8905  *   3         2         1
8906  *  10987654321098765432109876543210
8907  *  001000               x1110000101
8908  *     rt -----
8909  *          rs -----
8910  *               rd -----
8911  */
8912 static char *LWC1X(uint64 instruction, Dis_info *info)
8913 {
8914     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8915     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8916     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
8917 
8918     const char *ft = FPR(ft_value, info);
8919     const char *rs = GPR(rs_value, info);
8920     const char *rt = GPR(rt_value, info);
8921 
8922     return img_format("LWC1X %s, %s(%s)", ft, rs, rt);
8923 }
8924 
8925 
8926 /*
8927  *
8928  *
8929  *   3         2         1
8930  *  10987654321098765432109876543210
8931  *  001000               x1110000101
8932  *     rt -----
8933  *          rs -----
8934  *               rd -----
8935  */
8936 static char *LWC1XS(uint64 instruction, Dis_info *info)
8937 {
8938     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8939     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8940     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
8941 
8942     const char *ft = FPR(ft_value, info);
8943     const char *rs = GPR(rs_value, info);
8944     const char *rt = GPR(rt_value, info);
8945 
8946     return img_format("LWC1XS %s, %s(%s)", ft, rs, rt);
8947 }
8948 
8949 
8950 /*
8951  *
8952  *
8953  *   3         2         1
8954  *  10987654321098765432109876543210
8955  *  001000               x1110000101
8956  *     rt -----
8957  *          rs -----
8958  *               rd -----
8959  */
8960 static char *LWC2(uint64 instruction, Dis_info *info)
8961 {
8962     uint64 ct_value = extract_ct_25_24_23_22_21(instruction);
8963     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8964     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8965 
8966     const char *rs = GPR(rs_value, info);
8967 
8968     return img_format("LWC2 CP%" PRIu64 ", %" PRId64 "(%s)",
8969                       ct_value, s_value, rs);
8970 }
8971 
8972 
8973 /*
8974  *
8975  *
8976  *   3         2         1
8977  *  10987654321098765432109876543210
8978  *  001000               x1110000101
8979  *     rt -----
8980  *          rs -----
8981  *               rd -----
8982  */
8983 static char *LWE(uint64 instruction, Dis_info *info)
8984 {
8985     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
8986     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
8987     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
8988 
8989     const char *rt = GPR(rt_value, info);
8990     const char *rs = GPR(rs_value, info);
8991 
8992     return img_format("LWE %s, %" PRId64 "(%s)", rt, s_value, rs);
8993 }
8994 
8995 
8996 /*
8997  *
8998  *
8999  *   3         2         1
9000  *  10987654321098765432109876543210
9001  *  001000               x1110000101
9002  *     rt -----
9003  *          rs -----
9004  *               rd -----
9005  */
9006 static char *LWM(uint64 instruction, Dis_info *info)
9007 {
9008     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9009     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9010     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
9011     uint64 count3_value = extract_count3_14_13_12(instruction);
9012 
9013     const char *rt = GPR(rt_value, info);
9014     const char *rs = GPR(rs_value, info);
9015     uint64 count3 = encode_count3_from_count(count3_value);
9016 
9017     return img_format("LWM %s, %" PRId64 "(%s), 0x%" PRIx64,
9018                       rt, s_value, rs, count3);
9019 }
9020 
9021 
9022 /*
9023  *
9024  *
9025  *   3         2         1
9026  *  10987654321098765432109876543210
9027  *  001000               x1110000101
9028  *     rt -----
9029  *          rs -----
9030  *               rd -----
9031  */
9032 static char *LWPC_48_(uint64 instruction, Dis_info *info)
9033 {
9034     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
9035     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
9036 
9037     const char *rt = GPR(rt_value, info);
9038     g_autofree char *s = ADDRESS(s_value, 6, info);
9039 
9040     return img_format("LWPC %s, %s", rt, s);
9041 }
9042 
9043 
9044 /*
9045  *
9046  *
9047  *   3         2         1
9048  *  10987654321098765432109876543210
9049  *  001000               x1110000101
9050  *     rt -----
9051  *          rs -----
9052  *               rd -----
9053  */
9054 static char *LWU_GP_(uint64 instruction, Dis_info *info)
9055 {
9056     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9057     uint64 u_value = extract_u_17_to_2__s2(instruction);
9058 
9059     const char *rt = GPR(rt_value, info);
9060 
9061     return img_format("LWU %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
9062 }
9063 
9064 
9065 /*
9066  *
9067  *
9068  *   3         2         1
9069  *  10987654321098765432109876543210
9070  *  001000               x1110000101
9071  *     rt -----
9072  *          rs -----
9073  *               rd -----
9074  */
9075 static char *LWU_S9_(uint64 instruction, Dis_info *info)
9076 {
9077     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9078     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9079     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
9080 
9081     const char *rt = GPR(rt_value, info);
9082     const char *rs = GPR(rs_value, info);
9083 
9084     return img_format("LWU %s, %" PRId64 "(%s)", rt, s_value, rs);
9085 }
9086 
9087 
9088 /*
9089  *
9090  *
9091  *   3         2         1
9092  *  10987654321098765432109876543210
9093  *  001000               x1110000101
9094  *     rt -----
9095  *          rs -----
9096  *               rd -----
9097  */
9098 static char *LWU_U12_(uint64 instruction, Dis_info *info)
9099 {
9100     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9101     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9102     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
9103 
9104     const char *rt = GPR(rt_value, info);
9105     const char *rs = GPR(rs_value, info);
9106 
9107     return img_format("LWU %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
9108 }
9109 
9110 
9111 /*
9112  *
9113  *
9114  *   3         2         1
9115  *  10987654321098765432109876543210
9116  *  001000               x1110000101
9117  *     rt -----
9118  *          rs -----
9119  *               rd -----
9120  */
9121 static char *LWUX(uint64 instruction, Dis_info *info)
9122 {
9123     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9124     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9125     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9126 
9127     const char *rd = GPR(rd_value, info);
9128     const char *rs = GPR(rs_value, info);
9129     const char *rt = GPR(rt_value, info);
9130 
9131     return img_format("LWUX %s, %s(%s)", rd, rs, rt);
9132 }
9133 
9134 
9135 /*
9136  *
9137  *
9138  *   3         2         1
9139  *  10987654321098765432109876543210
9140  *  001000               x1110000101
9141  *     rt -----
9142  *          rs -----
9143  *               rd -----
9144  */
9145 static char *LWUXS(uint64 instruction, Dis_info *info)
9146 {
9147     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9148     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9149     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9150 
9151     const char *rd = GPR(rd_value, info);
9152     const char *rs = GPR(rs_value, info);
9153     const char *rt = GPR(rt_value, info);
9154 
9155     return img_format("LWUXS %s, %s(%s)", rd, rs, rt);
9156 }
9157 
9158 
9159 /*
9160  *
9161  *
9162  *   3         2         1
9163  *  10987654321098765432109876543210
9164  *  001000               x1110000101
9165  *     rt -----
9166  *          rs -----
9167  *               rd -----
9168  */
9169 static char *LWX(uint64 instruction, Dis_info *info)
9170 {
9171     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9172     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9173     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9174 
9175     const char *rd = GPR(rd_value, info);
9176     const char *rs = GPR(rs_value, info);
9177     const char *rt = GPR(rt_value, info);
9178 
9179     return img_format("LWX %s, %s(%s)", rd, rs, rt);
9180 }
9181 
9182 
9183 /*
9184  *
9185  *
9186  *   3         2         1
9187  *  10987654321098765432109876543210
9188  *  001000               x1110000101
9189  *     rt -----
9190  *          rs -----
9191  *               rd -----
9192  */
9193 static char *LWXS_16_(uint64 instruction, Dis_info *info)
9194 {
9195     uint64 rt3_value = extract_rt3_9_8_7(instruction);
9196     uint64 rs3_value = extract_rs3_6_5_4(instruction);
9197     uint64 rd3_value = extract_rd3_3_2_1(instruction);
9198 
9199     const char *rd3 = GPR(decode_gpr_gpr3(rd3_value, info), info);
9200     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
9201     uint64 rt3 = decode_gpr_gpr3(rt3_value, info);
9202 
9203     return img_format("LWXS %s, %s(0x%" PRIx64 ")", rd3, rs3, rt3);
9204 }
9205 
9206 
9207 /*
9208  *
9209  *
9210  *   3         2         1
9211  *  10987654321098765432109876543210
9212  *  001000               x1110000101
9213  *     rt -----
9214  *          rs -----
9215  *               rd -----
9216  */
9217 static char *LWXS_32_(uint64 instruction, Dis_info *info)
9218 {
9219     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9220     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9221     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9222 
9223     const char *rd = GPR(rd_value, info);
9224     const char *rs = GPR(rs_value, info);
9225     const char *rt = GPR(rt_value, info);
9226 
9227     return img_format("LWXS %s, %s(%s)", rd, rs, rt);
9228 }
9229 
9230 
9231 /*
9232  * [DSP] MADD ac, rs, rt - Multiply two words and add to the specified
9233  *         accumulator
9234  *
9235  *   3         2         1
9236  *  10987654321098765432109876543210
9237  *  001000               x1110000101
9238  *     rt -----
9239  *          rs -----
9240  *               rd -----
9241  */
9242 static char *MADD_DSP_(uint64 instruction, Dis_info *info)
9243 {
9244     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9245     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9246     uint64 ac_value = extract_ac_15_14(instruction);
9247 
9248     const char *ac = AC(ac_value, info);
9249     const char *rs = GPR(rs_value, info);
9250     const char *rt = GPR(rt_value, info);
9251 
9252     return img_format("MADD %s, %s, %s", ac, rs, rt);
9253 }
9254 
9255 
9256 /*
9257  *
9258  *
9259  *   3         2         1
9260  *  10987654321098765432109876543210
9261  *  001000               x1110000101
9262  *     rt -----
9263  *          rs -----
9264  *               rd -----
9265  */
9266 static char *MADDF_D(uint64 instruction, Dis_info *info)
9267 {
9268     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9269     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9270     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9271 
9272     const char *fd = FPR(fd_value, info);
9273     const char *fs = FPR(fs_value, info);
9274     const char *ft = FPR(ft_value, info);
9275 
9276     return img_format("MADDF.D %s, %s, %s", fd, fs, ft);
9277 }
9278 
9279 
9280 /*
9281  *
9282  *
9283  *   3         2         1
9284  *  10987654321098765432109876543210
9285  *  001000               x1110000101
9286  *     rt -----
9287  *          rs -----
9288  *               rd -----
9289  */
9290 static char *MADDF_S(uint64 instruction, Dis_info *info)
9291 {
9292     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9293     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9294     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9295 
9296     const char *fd = FPR(fd_value, info);
9297     const char *fs = FPR(fs_value, info);
9298     const char *ft = FPR(ft_value, info);
9299 
9300     return img_format("MADDF.S %s, %s, %s", fd, fs, ft);
9301 }
9302 
9303 
9304 /*
9305  * [DSP] MADDU ac, rs, rt - Multiply two unsigned words and add to the
9306  *         specified accumulator
9307  *
9308  *   3         2         1
9309  *  10987654321098765432109876543210
9310  *  001000               x1110000101
9311  *     rt -----
9312  *          rs -----
9313  *               rd -----
9314  */
9315 static char *MADDU_DSP_(uint64 instruction, Dis_info *info)
9316 {
9317     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9318     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9319     uint64 ac_value = extract_ac_15_14(instruction);
9320 
9321     const char *ac = AC(ac_value, info);
9322     const char *rs = GPR(rs_value, info);
9323     const char *rt = GPR(rt_value, info);
9324 
9325     return img_format("MADDU %s, %s, %s", ac, rs, rt);
9326 }
9327 
9328 
9329 /*
9330  * [DSP] MAQ_S.W.PHL ac, rs, rt - Multiply the left-most single vector
9331  *         fractional halfword elements with accumulation
9332  *
9333  *   3         2         1
9334  *  10987654321098765432109876543210
9335  *  001000               x1110000101
9336  *     rt -----
9337  *          rs -----
9338  *               rd -----
9339  */
9340 static char *MAQ_S_W_PHL(uint64 instruction, Dis_info *info)
9341 {
9342     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9343     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9344     uint64 ac_value = extract_ac_15_14(instruction);
9345 
9346     const char *ac = AC(ac_value, info);
9347     const char *rs = GPR(rs_value, info);
9348     const char *rt = GPR(rt_value, info);
9349 
9350     return img_format("MAQ_S.W.PHL %s, %s, %s", ac, rs, rt);
9351 }
9352 
9353 
9354 /*
9355  * [DSP] MAQ_S.W.PHR ac, rs, rt - Multiply the right-most single vector
9356  *         fractional halfword elements with accumulation
9357  *
9358  *   3         2         1
9359  *  10987654321098765432109876543210
9360  *  001000               x1110000101
9361  *     rt -----
9362  *          rs -----
9363  *               rd -----
9364  */
9365 static char *MAQ_S_W_PHR(uint64 instruction, Dis_info *info)
9366 {
9367     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9368     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9369     uint64 ac_value = extract_ac_15_14(instruction);
9370 
9371     const char *ac = AC(ac_value, info);
9372     const char *rs = GPR(rs_value, info);
9373     const char *rt = GPR(rt_value, info);
9374 
9375     return img_format("MAQ_S.W.PHR %s, %s, %s", ac, rs, rt);
9376 }
9377 
9378 
9379 /*
9380  * [DSP] MAQ_SA.W.PHL ac, rs, rt - Multiply the left-most single vector
9381  *         fractional halfword elements with saturating accumulation
9382  *
9383  *   3         2         1
9384  *  10987654321098765432109876543210
9385  *  001000               x1110000101
9386  *     rt -----
9387  *          rs -----
9388  *               rd -----
9389  */
9390 static char *MAQ_SA_W_PHL(uint64 instruction, Dis_info *info)
9391 {
9392     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9393     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9394     uint64 ac_value = extract_ac_15_14(instruction);
9395 
9396     const char *ac = AC(ac_value, info);
9397     const char *rs = GPR(rs_value, info);
9398     const char *rt = GPR(rt_value, info);
9399 
9400     return img_format("MAQ_SA.W.PHL %s, %s, %s", ac, rs, rt);
9401 }
9402 
9403 
9404 /*
9405  * [DSP] MAQ_SA.W.PHR ac, rs, rt - Multiply the right-most single vector
9406  *         fractional halfword elements with saturating accumulation
9407  *
9408  *   3         2         1
9409  *  10987654321098765432109876543210
9410  *  001000               x1110000101
9411  *     rt -----
9412  *          rs -----
9413  *               rd -----
9414  */
9415 static char *MAQ_SA_W_PHR(uint64 instruction, Dis_info *info)
9416 {
9417     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9418     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9419     uint64 ac_value = extract_ac_15_14(instruction);
9420 
9421     const char *ac = AC(ac_value, info);
9422     const char *rs = GPR(rs_value, info);
9423     const char *rt = GPR(rt_value, info);
9424 
9425     return img_format("MAQ_SA.W.PHR %s, %s, %s", ac, rs, rt);
9426 }
9427 
9428 
9429 /*
9430  *
9431  *
9432  *   3         2         1
9433  *  10987654321098765432109876543210
9434  *  001000               x1110000101
9435  *     rt -----
9436  *          rs -----
9437  *               rd -----
9438  */
9439 static char *MAX_D(uint64 instruction, Dis_info *info)
9440 {
9441     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9442     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9443     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9444 
9445     const char *fd = FPR(fd_value, info);
9446     const char *fs = FPR(fs_value, info);
9447     const char *ft = FPR(ft_value, info);
9448 
9449     return img_format("MAX.D %s, %s, %s", fd, fs, ft);
9450 }
9451 
9452 
9453 /*
9454  *
9455  *
9456  *   3         2         1
9457  *  10987654321098765432109876543210
9458  *  001000               x1110000101
9459  *     rt -----
9460  *          rs -----
9461  *               rd -----
9462  */
9463 static char *MAX_S(uint64 instruction, Dis_info *info)
9464 {
9465     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9466     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9467     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9468 
9469     const char *fd = FPR(fd_value, info);
9470     const char *fs = FPR(fs_value, info);
9471     const char *ft = FPR(ft_value, info);
9472 
9473     return img_format("MAX.S %s, %s, %s", fd, fs, ft);
9474 }
9475 
9476 
9477 /*
9478  *
9479  *
9480  *   3         2         1
9481  *  10987654321098765432109876543210
9482  *  001000               x1110000101
9483  *     rt -----
9484  *          rs -----
9485  *               rd -----
9486  */
9487 static char *MAXA_D(uint64 instruction, Dis_info *info)
9488 {
9489     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9490     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9491     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9492 
9493     const char *fd = FPR(fd_value, info);
9494     const char *fs = FPR(fs_value, info);
9495     const char *ft = FPR(ft_value, info);
9496 
9497     return img_format("MAXA.D %s, %s, %s", fd, fs, ft);
9498 }
9499 
9500 
9501 /*
9502  *
9503  *
9504  *   3         2         1
9505  *  10987654321098765432109876543210
9506  *  001000               x1110000101
9507  *     rt -----
9508  *          rs -----
9509  *               rd -----
9510  */
9511 static char *MAXA_S(uint64 instruction, Dis_info *info)
9512 {
9513     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9514     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9515     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9516 
9517     const char *fd = FPR(fd_value, info);
9518     const char *fs = FPR(fs_value, info);
9519     const char *ft = FPR(ft_value, info);
9520 
9521     return img_format("MAXA.S %s, %s, %s", fd, fs, ft);
9522 }
9523 
9524 
9525 /*
9526  *
9527  *
9528  *   3         2         1
9529  *  10987654321098765432109876543210
9530  *  001000               x1110000101
9531  *     rt -----
9532  *          rs -----
9533  *               rd -----
9534  */
9535 static char *MFC0(uint64 instruction, Dis_info *info)
9536 {
9537     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9538     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
9539     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
9540 
9541     const char *rt = GPR(rt_value, info);
9542 
9543     return img_format("MFC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
9544                       rt, c0s_value, sel_value);
9545 }
9546 
9547 
9548 /*
9549  *
9550  *
9551  *   3         2         1
9552  *  10987654321098765432109876543210
9553  *  001000               x1110000101
9554  *     rt -----
9555  *          rs -----
9556  *               rd -----
9557  */
9558 static char *MFC1(uint64 instruction, Dis_info *info)
9559 {
9560     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9561     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9562 
9563     const char *rt = GPR(rt_value, info);
9564     const char *fs = FPR(fs_value, info);
9565 
9566     return img_format("MFC1 %s, %s", rt, fs);
9567 }
9568 
9569 
9570 /*
9571  *
9572  *
9573  *   3         2         1
9574  *  10987654321098765432109876543210
9575  *  001000               x1110000101
9576  *     rt -----
9577  *          rs -----
9578  *               rd -----
9579  */
9580 static char *MFC2(uint64 instruction, Dis_info *info)
9581 {
9582     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9583     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
9584 
9585     const char *rt = GPR(rt_value, info);
9586 
9587     return img_format("MFC2 %s, CP%" PRIu64, rt, cs_value);
9588 }
9589 
9590 
9591 /*
9592  *
9593  *
9594  *   3         2         1
9595  *  10987654321098765432109876543210
9596  *  001000               x1110000101
9597  *     rt -----
9598  *          rs -----
9599  *               rd -----
9600  */
9601 static char *MFGC0(uint64 instruction, Dis_info *info)
9602 {
9603     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9604     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
9605     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
9606 
9607     const char *rt = GPR(rt_value, info);
9608 
9609     return img_format("MFGC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
9610                       rt, c0s_value, sel_value);
9611 }
9612 
9613 
9614 /*
9615  *
9616  *
9617  *   3         2         1
9618  *  10987654321098765432109876543210
9619  *  001000               x1110000101
9620  *     rt -----
9621  *          rs -----
9622  *               rd -----
9623  */
9624 static char *MFHC0(uint64 instruction, Dis_info *info)
9625 {
9626     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9627     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
9628     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
9629 
9630     const char *rt = GPR(rt_value, info);
9631 
9632     return img_format("MFHC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
9633                       rt, c0s_value, sel_value);
9634 }
9635 
9636 
9637 /*
9638  *
9639  *
9640  *   3         2         1
9641  *  10987654321098765432109876543210
9642  *  001000               x1110000101
9643  *     rt -----
9644  *          rs -----
9645  *               rd -----
9646  */
9647 static char *MFHC1(uint64 instruction, Dis_info *info)
9648 {
9649     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9650     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9651 
9652     const char *rt = GPR(rt_value, info);
9653     const char *fs = FPR(fs_value, info);
9654 
9655     return img_format("MFHC1 %s, %s", rt, fs);
9656 }
9657 
9658 
9659 /*
9660  *
9661  *
9662  *   3         2         1
9663  *  10987654321098765432109876543210
9664  *  001000               x1110000101
9665  *     rt -----
9666  *          rs -----
9667  *               rd -----
9668  */
9669 static char *MFHC2(uint64 instruction, Dis_info *info)
9670 {
9671     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9672     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
9673 
9674     const char *rt = GPR(rt_value, info);
9675 
9676     return img_format("MFHC2 %s, CP%" PRIu64, rt, cs_value);
9677 }
9678 
9679 
9680 /*
9681  *
9682  *
9683  *   3         2         1
9684  *  10987654321098765432109876543210
9685  *  001000               x1110000101
9686  *     rt -----
9687  *          rs -----
9688  *               rd -----
9689  */
9690 static char *MFHGC0(uint64 instruction, Dis_info *info)
9691 {
9692     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9693     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
9694     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
9695 
9696     const char *rt = GPR(rt_value, info);
9697 
9698     return img_format("MFHGC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
9699                       rt, c0s_value, sel_value);
9700 }
9701 
9702 
9703 /*
9704  * [DSP] MFHI rs, ac - Move from HI register
9705  *
9706  *   3         2         1
9707  *  10987654321098765432109876543210
9708  *  001000     xxxxx  00000001111111
9709  *     rt -----
9710  *               ac --
9711  */
9712 static char *MFHI_DSP_(uint64 instruction, Dis_info *info)
9713 {
9714     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9715     uint64 ac_value = extract_ac_15_14(instruction);
9716 
9717     const char *rt = GPR(rt_value, info);
9718     const char *ac = AC(ac_value, info);
9719 
9720     return img_format("MFHI %s, %s", rt, ac);
9721 }
9722 
9723 
9724 /*
9725  *
9726  *
9727  *   3         2         1
9728  *  10987654321098765432109876543210
9729  *  001000               x1110000101
9730  *     rt -----
9731  *          rs -----
9732  *               rd -----
9733  */
9734 static char *MFHTR(uint64 instruction, Dis_info *info)
9735 {
9736     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9737     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
9738     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
9739     uint64 u_value = extract_u_10(instruction);
9740 
9741     const char *rt = GPR(rt_value, info);
9742 
9743     return img_format("MFHTR %s, 0x%" PRIx64 ", 0x%" PRIx64 ", 0x%" PRIx64,
9744                       rt, c0s_value, u_value, sel_value);
9745 }
9746 
9747 
9748 /*
9749  * [DSP] MFLO rs, ac - Move from HI register
9750  *
9751  *   3         2         1
9752  *  10987654321098765432109876543210
9753  *  001000     xxxxx  01000001111111
9754  *     rt -----
9755  *               ac --
9756  */
9757 static char *MFLO_DSP_(uint64 instruction, Dis_info *info)
9758 {
9759     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9760     uint64 ac_value = extract_ac_15_14(instruction);
9761 
9762     const char *rt = GPR(rt_value, info);
9763     const char *ac = AC(ac_value, info);
9764 
9765     return img_format("MFLO %s, %s", rt, ac);
9766 }
9767 
9768 
9769 /*
9770  *
9771  *
9772  *   3         2         1
9773  *  10987654321098765432109876543210
9774  *  001000               x1110000101
9775  *     rt -----
9776  *          rs -----
9777  *               rd -----
9778  */
9779 static char *MFTR(uint64 instruction, Dis_info *info)
9780 {
9781     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9782     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
9783     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
9784     uint64 u_value = extract_u_10(instruction);
9785 
9786     const char *rt = GPR(rt_value, info);
9787 
9788     return img_format("MFTR %s, 0x%" PRIx64 ", 0x%" PRIx64 ", 0x%" PRIx64,
9789                       rt, c0s_value, u_value, sel_value);
9790 }
9791 
9792 
9793 /*
9794  *
9795  *
9796  *   3         2         1
9797  *  10987654321098765432109876543210
9798  *  001000               x1110000101
9799  *     rt -----
9800  *          rs -----
9801  *               rd -----
9802  */
9803 static char *MIN_D(uint64 instruction, Dis_info *info)
9804 {
9805     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9806     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9807     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9808 
9809     const char *fd = FPR(fd_value, info);
9810     const char *fs = FPR(fs_value, info);
9811     const char *ft = FPR(ft_value, info);
9812 
9813     return img_format("MIN.D %s, %s, %s", fd, fs, ft);
9814 }
9815 
9816 
9817 /*
9818  *
9819  *
9820  *   3         2         1
9821  *  10987654321098765432109876543210
9822  *  001000               x1110000101
9823  *     rt -----
9824  *          rs -----
9825  *               rd -----
9826  */
9827 static char *MIN_S(uint64 instruction, Dis_info *info)
9828 {
9829     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9830     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9831     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9832 
9833     const char *fd = FPR(fd_value, info);
9834     const char *fs = FPR(fs_value, info);
9835     const char *ft = FPR(ft_value, info);
9836 
9837     return img_format("MIN.S %s, %s, %s", fd, fs, ft);
9838 }
9839 
9840 
9841 /*
9842  *
9843  *
9844  *   3         2         1
9845  *  10987654321098765432109876543210
9846  *  001000               x1110000101
9847  *     rt -----
9848  *          rs -----
9849  *               rd -----
9850  */
9851 static char *MINA_D(uint64 instruction, Dis_info *info)
9852 {
9853     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9854     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9855     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9856 
9857     const char *fd = FPR(fd_value, info);
9858     const char *fs = FPR(fs_value, info);
9859     const char *ft = FPR(ft_value, info);
9860 
9861     return img_format("MINA.D %s, %s, %s", fd, fs, ft);
9862 }
9863 
9864 
9865 /*
9866  *
9867  *
9868  *   3         2         1
9869  *  10987654321098765432109876543210
9870  *  001000               x1110000101
9871  *     rt -----
9872  *          rs -----
9873  *               rd -----
9874  */
9875 static char *MINA_S(uint64 instruction, Dis_info *info)
9876 {
9877     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9878     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9879     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
9880 
9881     const char *fd = FPR(fd_value, info);
9882     const char *fs = FPR(fs_value, info);
9883     const char *ft = FPR(ft_value, info);
9884 
9885     return img_format("MINA.S %s, %s, %s", fd, fs, ft);
9886 }
9887 
9888 
9889 /*
9890  *
9891  *
9892  *   3         2         1
9893  *  10987654321098765432109876543210
9894  *  001000               x1110000101
9895  *     rt -----
9896  *          rs -----
9897  *               rd -----
9898  */
9899 static char *MOD(uint64 instruction, Dis_info *info)
9900 {
9901     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9902     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9903     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9904 
9905     const char *rd = GPR(rd_value, info);
9906     const char *rs = GPR(rs_value, info);
9907     const char *rt = GPR(rt_value, info);
9908 
9909     return img_format("MOD %s, %s, %s", rd, rs, rt);
9910 }
9911 
9912 
9913 /*
9914  * [DSP] MODSUB rd, rs, rt - Modular subtraction on an index value
9915  *
9916  *   3         2         1
9917  *  10987654321098765432109876543210
9918  *  001000               x1110000101
9919  *     rt -----
9920  *          rs -----
9921  *               rd -----
9922  */
9923 static char *MODSUB(uint64 instruction, Dis_info *info)
9924 {
9925     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9926     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9927     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9928 
9929     const char *rd = GPR(rd_value, info);
9930     const char *rs = GPR(rs_value, info);
9931     const char *rt = GPR(rt_value, info);
9932 
9933     return img_format("MODSUB %s, %s, %s", rd, rs, rt);
9934 }
9935 
9936 
9937 /*
9938  *
9939  *
9940  *   3         2         1
9941  *  10987654321098765432109876543210
9942  *  001000               x1010010101
9943  *     rt -----
9944  *          rs -----
9945  *               rd -----
9946  */
9947 static char *MODU(uint64 instruction, Dis_info *info)
9948 {
9949     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
9950     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
9951     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
9952 
9953     const char *rd = GPR(rd_value, info);
9954     const char *rs = GPR(rs_value, info);
9955     const char *rt = GPR(rt_value, info);
9956 
9957     return img_format("MODU %s, %s, %s", rd, rs, rt);
9958 }
9959 
9960 
9961 /*
9962  *
9963  *
9964  *   3         2         1
9965  *  10987654321098765432109876543210
9966  *  001000               x1110000101
9967  *     rt -----
9968  *          rs -----
9969  *               rd -----
9970  */
9971 static char *MOV_D(uint64 instruction, Dis_info *info)
9972 {
9973     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9974     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9975 
9976     const char *ft = FPR(ft_value, info);
9977     const char *fs = FPR(fs_value, info);
9978 
9979     return img_format("MOV.D %s, %s", ft, fs);
9980 }
9981 
9982 
9983 /*
9984  *
9985  *
9986  *   3         2         1
9987  *  10987654321098765432109876543210
9988  *  001000               x1110000101
9989  *     rt -----
9990  *          rs -----
9991  *               rd -----
9992  */
9993 static char *MOV_S(uint64 instruction, Dis_info *info)
9994 {
9995     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
9996     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
9997 
9998     const char *ft = FPR(ft_value, info);
9999     const char *fs = FPR(fs_value, info);
10000 
10001     return img_format("MOV.S %s, %s", ft, fs);
10002 }
10003 
10004 
10005 /*
10006  *
10007  *
10008  *   3         2         1
10009  *  10987654321098765432109876543210
10010  *  001000               x1110000101
10011  *     rt -----
10012  *          rs -----
10013  *               rd -----
10014  */
10015 static char *MOVE_BALC(uint64 instruction, Dis_info *info)
10016 {
10017     uint64 rtz4_value = extract_rtz4_27_26_25_23_22_21(instruction);
10018     uint64 rd1_value = extract_rdl_25_24(instruction);
10019     int64 s_value = extract_s__se21_0_20_to_1_s1(instruction);
10020 
10021     const char *rd1 = GPR(decode_gpr_gpr1(rd1_value, info), info);
10022     const char *rtz4 = GPR(decode_gpr_gpr4_zero(rtz4_value, info), info);
10023     g_autofree char *s = ADDRESS(s_value, 4, info);
10024 
10025     return img_format("MOVE.BALC %s, %s, %s", rd1, rtz4, s);
10026 }
10027 
10028 
10029 /*
10030  *
10031  *
10032  *   3         2         1
10033  *  10987654321098765432109876543210
10034  *  001000               x1110000101
10035  *     rt -----
10036  *          rs -----
10037  *               rd -----
10038  */
10039 static char *MOVEP(uint64 instruction, Dis_info *info)
10040 {
10041     uint64 rtz4_value = extract_rtz4_9_7_6_5(instruction);
10042     uint64 rd2_value = extract_rd2_3_8(instruction);
10043     uint64 rsz4_value = extract_rsz4_4_2_1_0(instruction);
10044 
10045     const char *rd2 = GPR(decode_gpr_gpr2_reg1(rd2_value, info), info);
10046     const char *re2 = GPR(decode_gpr_gpr2_reg2(rd2_value, info), info);
10047     /* !!!!!!!!!! - no conversion function */
10048     const char *rsz4 = GPR(decode_gpr_gpr4_zero(rsz4_value, info), info);
10049     const char *rtz4 = GPR(decode_gpr_gpr4_zero(rtz4_value, info), info);
10050 
10051     return img_format("MOVEP %s, %s, %s, %s", rd2, re2, rsz4, rtz4);
10052     /* hand edited */
10053 }
10054 
10055 
10056 /*
10057  *
10058  *
10059  *   3         2         1
10060  *  10987654321098765432109876543210
10061  *  001000               x1110000101
10062  *     rt -----
10063  *          rs -----
10064  *               rd -----
10065  */
10066 static char *MOVEP_REV_(uint64 instruction, Dis_info *info)
10067 {
10068     uint64 rt4_value = extract_rt4_9_7_6_5(instruction);
10069     uint64 rd2_value = extract_rd2_3_8(instruction);
10070     uint64 rs4_value = extract_rs4_4_2_1_0(instruction);
10071 
10072     const char *rs4 = GPR(decode_gpr_gpr4(rs4_value, info), info);
10073     const char *rt4 = GPR(decode_gpr_gpr4(rt4_value, info), info);
10074     const char *rd2 = GPR(decode_gpr_gpr2_reg1(rd2_value, info), info);
10075     const char *rs2 = GPR(decode_gpr_gpr2_reg2(rd2_value, info), info);
10076     /* !!!!!!!!!! - no conversion function */
10077 
10078     return img_format("MOVEP %s, %s, %s, %s", rs4, rt4, rd2, rs2);
10079     /* hand edited */
10080 }
10081 
10082 
10083 /*
10084  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10085  *
10086  *   3         2         1
10087  *  10987654321098765432109876543210
10088  *  001000               00010001101
10089  *     rt -----
10090  *          rs -----
10091  *               rd -----
10092  */
10093 static char *MOVE(uint64 instruction, Dis_info *info)
10094 {
10095     uint64 rt_value = extract_rt_9_8_7_6_5(instruction);
10096     uint64 rs_value = extract_rs_4_3_2_1_0(instruction);
10097 
10098     const char *rt = GPR(rt_value, info);
10099     const char *rs = GPR(rs_value, info);
10100 
10101     return img_format("MOVE %s, %s", rt, rs);
10102 }
10103 
10104 
10105 /*
10106  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10107  *
10108  *   3         2         1
10109  *  10987654321098765432109876543210
10110  *  001000               00010001101
10111  *     rt -----
10112  *          rs -----
10113  *               rd -----
10114  */
10115 static char *MOVN(uint64 instruction, Dis_info *info)
10116 {
10117     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10118     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10119     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10120 
10121     const char *rd = GPR(rd_value, info);
10122     const char *rs = GPR(rs_value, info);
10123     const char *rt = GPR(rt_value, info);
10124 
10125     return img_format("MOVN %s, %s, %s", rd, rs, rt);
10126 }
10127 
10128 
10129 /*
10130  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10131  *
10132  *   3         2         1
10133  *  10987654321098765432109876543210
10134  *  001000               00010001101
10135  *     rt -----
10136  *          rs -----
10137  *               rd -----
10138  */
10139 static char *MOVZ(uint64 instruction, Dis_info *info)
10140 {
10141     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10142     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10143     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10144 
10145     const char *rd = GPR(rd_value, info);
10146     const char *rs = GPR(rs_value, info);
10147     const char *rt = GPR(rt_value, info);
10148 
10149     return img_format("MOVZ %s, %s, %s", rd, rs, rt);
10150 }
10151 
10152 
10153 /*
10154  * [DSP] MSUB ac, rs, rt - Multiply word and subtract from accumulator
10155  *
10156  *   3         2         1
10157  *  10987654321098765432109876543210
10158  *  001000            10101010111111
10159  *     rt -----
10160  *          rs -----
10161  *               ac --
10162  */
10163 static char *MSUB_DSP_(uint64 instruction, Dis_info *info)
10164 {
10165     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10166     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10167     uint64 ac_value = extract_ac_15_14(instruction);
10168 
10169     const char *ac = AC(ac_value, info);
10170     const char *rs = GPR(rs_value, info);
10171     const char *rt = GPR(rt_value, info);
10172 
10173     return img_format("MSUB %s, %s, %s", ac, rs, rt);
10174 }
10175 
10176 
10177 /*
10178  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10179  *
10180  *   3         2         1
10181  *  10987654321098765432109876543210
10182  *  001000               00010001101
10183  *     rt -----
10184  *          rs -----
10185  *               rd -----
10186  */
10187 static char *MSUBF_D(uint64 instruction, Dis_info *info)
10188 {
10189     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
10190     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
10191     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
10192 
10193     const char *fd = FPR(fd_value, info);
10194     const char *fs = FPR(fs_value, info);
10195     const char *ft = FPR(ft_value, info);
10196 
10197     return img_format("MSUBF.D %s, %s, %s", fd, fs, ft);
10198 }
10199 
10200 
10201 /*
10202  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10203  *
10204  *   3         2         1
10205  *  10987654321098765432109876543210
10206  *  001000               00010001101
10207  *     rt -----
10208  *          rs -----
10209  *               rd -----
10210  */
10211 static char *MSUBF_S(uint64 instruction, Dis_info *info)
10212 {
10213     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
10214     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
10215     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
10216 
10217     const char *fd = FPR(fd_value, info);
10218     const char *fs = FPR(fs_value, info);
10219     const char *ft = FPR(ft_value, info);
10220 
10221     return img_format("MSUBF.S %s, %s, %s", fd, fs, ft);
10222 }
10223 
10224 
10225 /*
10226  * [DSP] MSUBU ac, rs, rt - Multiply word and add to accumulator
10227  *
10228  *   3         2         1
10229  *  10987654321098765432109876543210
10230  *  001000            11101010111111
10231  *     rt -----
10232  *          rs -----
10233  *               ac --
10234  */
10235 static char *MSUBU_DSP_(uint64 instruction, Dis_info *info)
10236 {
10237     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10238     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10239     uint64 ac_value = extract_ac_15_14(instruction);
10240 
10241     const char *ac = AC(ac_value, info);
10242     const char *rs = GPR(rs_value, info);
10243     const char *rt = GPR(rt_value, info);
10244 
10245     return img_format("MSUBU %s, %s, %s", ac, rs, rt);
10246 }
10247 
10248 
10249 /*
10250  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10251  *
10252  *   3         2         1
10253  *  10987654321098765432109876543210
10254  *  001000               00010001101
10255  *     rt -----
10256  *          rs -----
10257  *               rd -----
10258  */
10259 static char *MTC0(uint64 instruction, Dis_info *info)
10260 {
10261     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10262     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
10263     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
10264 
10265     const char *rt = GPR(rt_value, info);
10266 
10267     return img_format("MTC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
10268                       rt, c0s_value, sel_value);
10269 }
10270 
10271 
10272 /*
10273  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10274  *
10275  *   3         2         1
10276  *  10987654321098765432109876543210
10277  *  001000               00010001101
10278  *     rt -----
10279  *          rs -----
10280  *               rd -----
10281  */
10282 static char *MTC1(uint64 instruction, Dis_info *info)
10283 {
10284     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10285     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
10286 
10287     const char *rt = GPR(rt_value, info);
10288     const char *fs = FPR(fs_value, info);
10289 
10290     return img_format("MTC1 %s, %s", rt, fs);
10291 }
10292 
10293 
10294 /*
10295  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10296  *
10297  *   3         2         1
10298  *  10987654321098765432109876543210
10299  *  001000               00010001101
10300  *     rt -----
10301  *          rs -----
10302  *               rd -----
10303  */
10304 static char *MTC2(uint64 instruction, Dis_info *info)
10305 {
10306     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10307     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
10308 
10309     const char *rt = GPR(rt_value, info);
10310 
10311     return img_format("MTC2 %s, CP%" PRIu64, rt, cs_value);
10312 }
10313 
10314 
10315 /*
10316  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10317  *
10318  *   3         2         1
10319  *  10987654321098765432109876543210
10320  *  001000               00010001101
10321  *     rt -----
10322  *          rs -----
10323  *               rd -----
10324  */
10325 static char *MTGC0(uint64 instruction, Dis_info *info)
10326 {
10327     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10328     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
10329     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
10330 
10331     const char *rt = GPR(rt_value, info);
10332 
10333     return img_format("MTGC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
10334                       rt, c0s_value, sel_value);
10335 }
10336 
10337 
10338 /*
10339  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10340  *
10341  *   3         2         1
10342  *  10987654321098765432109876543210
10343  *  001000               00010001101
10344  *     rt -----
10345  *          rs -----
10346  *               rd -----
10347  */
10348 static char *MTHC0(uint64 instruction, Dis_info *info)
10349 {
10350     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10351     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
10352     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
10353 
10354     const char *rt = GPR(rt_value, info);
10355 
10356     return img_format("MTHC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
10357                       rt, c0s_value, sel_value);
10358 }
10359 
10360 
10361 /*
10362  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10363  *
10364  *   3         2         1
10365  *  10987654321098765432109876543210
10366  *  001000               00010001101
10367  *     rt -----
10368  *          rs -----
10369  *               rd -----
10370  */
10371 static char *MTHC1(uint64 instruction, Dis_info *info)
10372 {
10373     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10374     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
10375 
10376     const char *rt = GPR(rt_value, info);
10377     const char *fs = FPR(fs_value, info);
10378 
10379     return img_format("MTHC1 %s, %s", rt, fs);
10380 }
10381 
10382 
10383 /*
10384  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10385  *
10386  *   3         2         1
10387  *  10987654321098765432109876543210
10388  *  001000               00010001101
10389  *     rt -----
10390  *          rs -----
10391  *               rd -----
10392  */
10393 static char *MTHC2(uint64 instruction, Dis_info *info)
10394 {
10395     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10396     uint64 cs_value = extract_cs_20_19_18_17_16(instruction);
10397 
10398     const char *rt = GPR(rt_value, info);
10399 
10400     return img_format("MTHC2 %s, CP%" PRIu64, rt, cs_value);
10401 }
10402 
10403 
10404 /*
10405  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10406  *
10407  *   3         2         1
10408  *  10987654321098765432109876543210
10409  *  001000               00010001101
10410  *     rt -----
10411  *          rs -----
10412  *               rd -----
10413  */
10414 static char *MTHGC0(uint64 instruction, Dis_info *info)
10415 {
10416     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10417     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
10418     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
10419 
10420     const char *rt = GPR(rt_value, info);
10421 
10422     return img_format("MTHGC0 %s, CP%" PRIu64 ", 0x%" PRIx64,
10423                       rt, c0s_value, sel_value);
10424 }
10425 
10426 
10427 /*
10428  * [DSP] MTHI rs, ac - Move to HI register
10429  *
10430  *   3         2         1
10431  *  10987654321098765432109876543210
10432  *  001000xxxxx       10000001111111
10433  *          rs -----
10434  *               ac --
10435  */
10436 static char *MTHI_DSP_(uint64 instruction, Dis_info *info)
10437 {
10438     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10439     uint64 ac_value = extract_ac_15_14(instruction);
10440 
10441     const char *rs = GPR(rs_value, info);
10442     const char *ac = AC(ac_value, info);
10443 
10444     return img_format("MTHI %s, %s", rs, ac);
10445 }
10446 
10447 
10448 /*
10449  * [DSP] MTHLIP rs, ac - Copy LO to HI and a GPR to LO and increment pos by 32
10450  *
10451  *   3         2         1
10452  *  10987654321098765432109876543210
10453  *  001000xxxxx       00001001111111
10454  *          rs -----
10455  *               ac --
10456  */
10457 static char *MTHLIP(uint64 instruction, Dis_info *info)
10458 {
10459     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10460     uint64 ac_value = extract_ac_15_14(instruction);
10461 
10462     const char *rs = GPR(rs_value, info);
10463     const char *ac = AC(ac_value, info);
10464 
10465     return img_format("MTHLIP %s, %s", rs, ac);
10466 }
10467 
10468 
10469 /*
10470  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10471  *
10472  *   3         2         1
10473  *  10987654321098765432109876543210
10474  *  001000               00010001101
10475  *     rt -----
10476  *          rs -----
10477  *               rd -----
10478  */
10479 static char *MTHTR(uint64 instruction, Dis_info *info)
10480 {
10481     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10482     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
10483     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
10484     uint64 u_value = extract_u_10(instruction);
10485 
10486     const char *rt = GPR(rt_value, info);
10487 
10488     return img_format("MTHTR %s, 0x%" PRIx64 ", 0x%" PRIx64 ", 0x%" PRIx64,
10489                       rt, c0s_value, u_value, sel_value);
10490 }
10491 
10492 
10493 /*
10494  * [DSP] MTLO rs, ac - Move to LO register
10495  *
10496  *   3         2         1
10497  *  10987654321098765432109876543210
10498  *  001000xxxxx       11000001111111
10499  *          rs -----
10500  *               ac --
10501  */
10502 static char *MTLO_DSP_(uint64 instruction, Dis_info *info)
10503 {
10504     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10505     uint64 ac_value = extract_ac_15_14(instruction);
10506 
10507     const char *rs = GPR(rs_value, info);
10508     const char *ac = AC(ac_value, info);
10509 
10510     return img_format("MTLO %s, %s", rs, ac);
10511 }
10512 
10513 
10514 /*
10515  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10516  *
10517  *   3         2         1
10518  *  10987654321098765432109876543210
10519  *  001000               00010001101
10520  *     rt -----
10521  *          rs -----
10522  *               rd -----
10523  */
10524 static char *MTTR(uint64 instruction, Dis_info *info)
10525 {
10526     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10527     uint64 c0s_value = extract_c0s_20_19_18_17_16(instruction);
10528     uint64 sel_value = extract_sel_15_14_13_12_11(instruction);
10529     uint64 u_value = extract_u_10(instruction);
10530 
10531     const char *rt = GPR(rt_value, info);
10532 
10533     return img_format("MTTR %s, 0x%" PRIx64 ", 0x%" PRIx64 ", 0x%" PRIx64,
10534                       rt, c0s_value, u_value, sel_value);
10535 }
10536 
10537 
10538 /*
10539  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10540  *
10541  *   3         2         1
10542  *  10987654321098765432109876543210
10543  *  001000               00010001101
10544  *     rt -----
10545  *          rs -----
10546  *               rd -----
10547  */
10548 static char *MUH(uint64 instruction, Dis_info *info)
10549 {
10550     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10551     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10552     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10553 
10554     const char *rd = GPR(rd_value, info);
10555     const char *rs = GPR(rs_value, info);
10556     const char *rt = GPR(rt_value, info);
10557 
10558     return img_format("MUH %s, %s, %s", rd, rs, rt);
10559 }
10560 
10561 
10562 /*
10563  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10564  *
10565  *   3         2         1
10566  *  10987654321098765432109876543210
10567  *  001000               00010001101
10568  *     rt -----
10569  *          rs -----
10570  *               rd -----
10571  */
10572 static char *MUHU(uint64 instruction, Dis_info *info)
10573 {
10574     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10575     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10576     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10577 
10578     const char *rd = GPR(rd_value, info);
10579     const char *rs = GPR(rs_value, info);
10580     const char *rt = GPR(rt_value, info);
10581 
10582     return img_format("MUHU %s, %s, %s", rd, rs, rt);
10583 }
10584 
10585 
10586 /*
10587  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10588  *
10589  *   3         2         1
10590  *  10987654321098765432109876543210
10591  *  001000               00010001101
10592  *     rt -----
10593  *          rs -----
10594  *               rd -----
10595  */
10596 static char *MUL_32_(uint64 instruction, Dis_info *info)
10597 {
10598     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10599     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10600     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10601 
10602     const char *rd = GPR(rd_value, info);
10603     const char *rs = GPR(rs_value, info);
10604     const char *rt = GPR(rt_value, info);
10605 
10606     return img_format("MUL %s, %s, %s", rd, rs, rt);
10607 }
10608 
10609 
10610 /*
10611  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10612  *
10613  *   3         2         1
10614  *  10987654321098765432109876543210
10615  *  001000               00010001101
10616  *     rt -----
10617  *          rs -----
10618  *               rd -----
10619  */
10620 static char *MUL_4X4_(uint64 instruction, Dis_info *info)
10621 {
10622     uint64 rt4_value = extract_rt4_9_7_6_5(instruction);
10623     uint64 rs4_value = extract_rs4_4_2_1_0(instruction);
10624 
10625     const char *rs4 = GPR(decode_gpr_gpr4(rs4_value, info), info);
10626     const char *rt4 = GPR(decode_gpr_gpr4(rt4_value, info), info);
10627 
10628     return img_format("MUL %s, %s", rs4, rt4);
10629 }
10630 
10631 
10632 /*
10633  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10634  *
10635  *   3         2         1
10636  *  10987654321098765432109876543210
10637  *  001000               00010001101
10638  *     rt -----
10639  *          rs -----
10640  *               rd -----
10641  */
10642 static char *MUL_D(uint64 instruction, Dis_info *info)
10643 {
10644     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
10645     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
10646     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
10647 
10648     const char *fd = FPR(fd_value, info);
10649     const char *fs = FPR(fs_value, info);
10650     const char *ft = FPR(ft_value, info);
10651 
10652     return img_format("MUL.D %s, %s, %s", fd, fs, ft);
10653 }
10654 
10655 
10656 /*
10657  * [DSP] MUL.PH rd, rs, rt - Multiply vector integer half words to same size
10658  *   products
10659  *
10660  *   3         2         1
10661  *  10987654321098765432109876543210
10662  *  001000               00000101101
10663  *     rt -----
10664  *          rs -----
10665  *               rd -----
10666  */
10667 static char *MUL_PH(uint64 instruction, Dis_info *info)
10668 {
10669     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10670     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10671     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10672 
10673     const char *rd = GPR(rd_value, info);
10674     const char *rs = GPR(rs_value, info);
10675     const char *rt = GPR(rt_value, info);
10676 
10677     return img_format("MUL.PH %s, %s, %s", rd, rs, rt);
10678 }
10679 
10680 
10681 /*
10682  * [DSP] MUL_S.PH rd, rs, rt - Multiply vector integer half words to same size
10683  *   products (saturated)
10684  *
10685  *   3         2         1
10686  *  10987654321098765432109876543210
10687  *  001000               10000101101
10688  *     rt -----
10689  *          rs -----
10690  *               rd -----
10691  */
10692 static char *MUL_S_PH(uint64 instruction, Dis_info *info)
10693 {
10694     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10695     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10696     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10697 
10698     const char *rd = GPR(rd_value, info);
10699     const char *rs = GPR(rs_value, info);
10700     const char *rt = GPR(rt_value, info);
10701 
10702     return img_format("MUL_S.PH %s, %s, %s", rd, rs, rt);
10703 }
10704 
10705 
10706 /*
10707  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
10708  *
10709  *   3         2         1
10710  *  10987654321098765432109876543210
10711  *  001000               00010001101
10712  *     rt -----
10713  *          rs -----
10714  *               rd -----
10715  */
10716 static char *MUL_S(uint64 instruction, Dis_info *info)
10717 {
10718     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
10719     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
10720     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
10721 
10722     const char *fd = FPR(fd_value, info);
10723     const char *fs = FPR(fs_value, info);
10724     const char *ft = FPR(ft_value, info);
10725 
10726     return img_format("MUL.S %s, %s, %s", fd, fs, ft);
10727 }
10728 
10729 
10730 /*
10731  * [DSP] MULEQ_S.W.PHL rd, rs, rt - Multiply vector fractional left halfwords
10732  *   to expanded width products
10733  *
10734  *   3         2         1
10735  *  10987654321098765432109876543210
10736  *  001000               x0000100101
10737  *     rt -----
10738  *          rs -----
10739  *               rd -----
10740  */
10741 static char *MULEQ_S_W_PHL(uint64 instruction, Dis_info *info)
10742 {
10743     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10744     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10745     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10746 
10747     const char *rd = GPR(rd_value, info);
10748     const char *rs = GPR(rs_value, info);
10749     const char *rt = GPR(rt_value, info);
10750 
10751     return img_format("MULEQ_S.W.PHL %s, %s, %s", rd, rs, rt);
10752 }
10753 
10754 
10755 /*
10756  * [DSP] MULEQ_S.W.PHR rd, rs, rt - Multiply vector fractional right halfwords
10757  *   to expanded width products
10758  *
10759  *   3         2         1
10760  *  10987654321098765432109876543210
10761  *  001000               x0001100101
10762  *     rt -----
10763  *          rs -----
10764  *               rd -----
10765  */
10766 static char *MULEQ_S_W_PHR(uint64 instruction, Dis_info *info)
10767 {
10768     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10769     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10770     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10771 
10772     const char *rd = GPR(rd_value, info);
10773     const char *rs = GPR(rs_value, info);
10774     const char *rt = GPR(rt_value, info);
10775 
10776     return img_format("MULEQ_S.W.PHR %s, %s, %s", rd, rs, rt);
10777 }
10778 
10779 
10780 /*
10781  * [DSP] MULEU_S.PH.QBL rd, rs, rt - Multiply vector fractional left bytes
10782  *   by halfwords to halfword products
10783  *
10784  *   3         2         1
10785  *  10987654321098765432109876543210
10786  *  001000               x0010010101
10787  *     rt -----
10788  *          rs -----
10789  *               rd -----
10790  */
10791 static char *MULEU_S_PH_QBL(uint64 instruction, Dis_info *info)
10792 {
10793     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10794     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10795     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10796 
10797     const char *rd = GPR(rd_value, info);
10798     const char *rs = GPR(rs_value, info);
10799     const char *rt = GPR(rt_value, info);
10800 
10801     return img_format("MULEU_S.PH.QBL %s, %s, %s", rd, rs, rt);
10802 }
10803 
10804 
10805 /*
10806  * [DSP] MULEU_S.PH.QBR rd, rs, rt - Multiply vector fractional right bytes
10807  *   by halfwords to halfword products
10808  *
10809  *   3         2         1
10810  *  10987654321098765432109876543210
10811  *  001000               x0011010101
10812  *     rt -----
10813  *          rs -----
10814  *               rd -----
10815  */
10816 static char *MULEU_S_PH_QBR(uint64 instruction, Dis_info *info)
10817 {
10818     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10819     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10820     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10821 
10822     const char *rd = GPR(rd_value, info);
10823     const char *rs = GPR(rs_value, info);
10824     const char *rt = GPR(rt_value, info);
10825 
10826     return img_format("MULEU_S.PH.QBR %s, %s, %s", rd, rs, rt);
10827 }
10828 
10829 
10830 /*
10831  * [DSP] MULQ_RS.PH rd, rs, rt - Multiply vector fractional halfwords
10832  *   to fractional halfword products
10833  *
10834  *   3         2         1
10835  *  10987654321098765432109876543210
10836  *  001000               x0100010101
10837  *     rt -----
10838  *          rs -----
10839  *               rd -----
10840  */
10841 static char *MULQ_RS_PH(uint64 instruction, Dis_info *info)
10842 {
10843     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10844     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10845     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10846 
10847     const char *rd = GPR(rd_value, info);
10848     const char *rs = GPR(rs_value, info);
10849     const char *rt = GPR(rt_value, info);
10850 
10851     return img_format("MULQ_RS.PH %s, %s, %s", rd, rs, rt);
10852 }
10853 
10854 
10855 /*
10856  * [DSP] MULQ_RS.W rd, rs, rt - Multiply fractional words to same size
10857  *   product with saturation and rounding
10858  *
10859  *   3         2         1
10860  *  10987654321098765432109876543210
10861  *  001000               x0110010101
10862  *     rt -----
10863  *          rs -----
10864  *               rd -----
10865  */
10866 static char *MULQ_RS_W(uint64 instruction, Dis_info *info)
10867 {
10868     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10869     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10870     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10871 
10872     const char *rd = GPR(rd_value, info);
10873     const char *rs = GPR(rs_value, info);
10874     const char *rt = GPR(rt_value, info);
10875 
10876     return img_format("MULQ_RS.W %s, %s, %s", rd, rs, rt);
10877 }
10878 
10879 
10880 /*
10881  * [DSP] MULQ_S.PH rd, rs, rt - Multiply fractional halfwords to same size
10882  *   products
10883  *
10884  *   3         2         1
10885  *  10987654321098765432109876543210
10886  *  001000               x0101010101
10887  *     rt -----
10888  *          rs -----
10889  *               rd -----
10890  */
10891 static char *MULQ_S_PH(uint64 instruction, Dis_info *info)
10892 {
10893     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10894     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10895     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10896 
10897     const char *rd = GPR(rd_value, info);
10898     const char *rs = GPR(rs_value, info);
10899     const char *rt = GPR(rt_value, info);
10900 
10901     return img_format("MULQ_S.PH %s, %s, %s", rd, rs, rt);
10902 }
10903 
10904 
10905 /*
10906  * [DSP] MULQ_S.W rd, rs, rt - Multiply fractional words to same size product
10907  *   with saturation
10908  *
10909  *   3         2         1
10910  *  10987654321098765432109876543210
10911  *  001000               x0111010101
10912  *     rt -----
10913  *          rs -----
10914  *               rd -----
10915  */
10916 static char *MULQ_S_W(uint64 instruction, Dis_info *info)
10917 {
10918     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10919     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10920     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
10921 
10922     const char *rd = GPR(rd_value, info);
10923     const char *rs = GPR(rs_value, info);
10924     const char *rt = GPR(rt_value, info);
10925 
10926     return img_format("MULQ_S.W %s, %s, %s", rd, rs, rt);
10927 }
10928 
10929 
10930 /*
10931  * [DSP] MULSA.W.PH ac, rs, rt - Multiply and subtract vector integer halfword
10932  *   elements and accumulate
10933  *
10934  *   3         2         1
10935  *  10987654321098765432109876543210
10936  *  001000            10110010111111
10937  *     rt -----
10938  *          rs -----
10939  *               ac --
10940  */
10941 static char *MULSA_W_PH(uint64 instruction, Dis_info *info)
10942 {
10943     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10944     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10945     uint64 ac_value = extract_ac_15_14(instruction);
10946 
10947     const char *ac = AC(ac_value, info);
10948     const char *rs = GPR(rs_value, info);
10949     const char *rt = GPR(rt_value, info);
10950 
10951     return img_format("MULSA.W.PH %s, %s, %s", ac, rs, rt);
10952 }
10953 
10954 
10955 /*
10956  * [DSP] MULSAQ_S.W.PH ac, rs, rt - Multiply and subtract vector fractional
10957  *   halfwords and accumulate
10958  *
10959  *   3         2         1
10960  *  10987654321098765432109876543210
10961  *  001000            11110010111111
10962  *     rt -----
10963  *          rs -----
10964  *               ac --
10965  */
10966 static char *MULSAQ_S_W_PH(uint64 instruction, Dis_info *info)
10967 {
10968     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10969     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10970     uint64 ac_value = extract_ac_15_14(instruction);
10971 
10972     const char *ac = AC(ac_value, info);
10973     const char *rs = GPR(rs_value, info);
10974     const char *rt = GPR(rt_value, info);
10975 
10976     return img_format("MULSAQ_S.W.PH %s, %s, %s", ac, rs, rt);
10977 }
10978 
10979 
10980 /*
10981  * [DSP] MULT ac, rs, rt - Multiply word
10982  *
10983  *   3         2         1
10984  *  10987654321098765432109876543210
10985  *  001000            00110010111111
10986  *     rt -----
10987  *          rs -----
10988  *               ac --
10989  */
10990 static char *MULT_DSP_(uint64 instruction, Dis_info *info)
10991 {
10992     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
10993     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
10994     uint64 ac_value = extract_ac_15_14(instruction);
10995 
10996     const char *ac = AC(ac_value, info);
10997     const char *rs = GPR(rs_value, info);
10998     const char *rt = GPR(rt_value, info);
10999 
11000     return img_format("MULT %s, %s, %s", ac, rs, rt);
11001 }
11002 
11003 
11004 /*
11005  * [DSP] MULTU ac, rs, rt - Multiply unsigned word
11006  *
11007  *   3         2         1
11008  *  10987654321098765432109876543210
11009  *  001000            01110010111111
11010  *     rt -----
11011  *          rs -----
11012  *               ac --
11013  */
11014 static char *MULTU_DSP_(uint64 instruction, Dis_info *info)
11015 {
11016     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11017     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11018     uint64 ac_value = extract_ac_15_14(instruction);
11019 
11020     const char *ac = AC(ac_value, info);
11021     const char *rs = GPR(rs_value, info);
11022     const char *rt = GPR(rt_value, info);
11023 
11024     return img_format("MULTU %s, %s, %s", ac, rs, rt);
11025 }
11026 
11027 
11028 /*
11029  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11030  *
11031  *   3         2         1
11032  *  10987654321098765432109876543210
11033  *  001000               00010001101
11034  *     rt -----
11035  *          rs -----
11036  *               rd -----
11037  */
11038 static char *MULU(uint64 instruction, Dis_info *info)
11039 {
11040     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11041     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11042     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11043 
11044     const char *rd = GPR(rd_value, info);
11045     const char *rs = GPR(rs_value, info);
11046     const char *rt = GPR(rt_value, info);
11047 
11048     return img_format("MULU %s, %s, %s", rd, rs, rt);
11049 }
11050 
11051 
11052 /*
11053  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11054  *
11055  *   3         2         1
11056  *  10987654321098765432109876543210
11057  *  001000               00010001101
11058  *     rt -----
11059  *          rs -----
11060  *               rd -----
11061  */
11062 static char *NEG_D(uint64 instruction, Dis_info *info)
11063 {
11064     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
11065     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
11066 
11067     const char *ft = FPR(ft_value, info);
11068     const char *fs = FPR(fs_value, info);
11069 
11070     return img_format("NEG.D %s, %s", ft, fs);
11071 }
11072 
11073 
11074 /*
11075  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11076  *
11077  *   3         2         1
11078  *  10987654321098765432109876543210
11079  *  001000               00010001101
11080  *     rt -----
11081  *          rs -----
11082  *               rd -----
11083  */
11084 static char *NEG_S(uint64 instruction, Dis_info *info)
11085 {
11086     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
11087     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
11088 
11089     const char *ft = FPR(ft_value, info);
11090     const char *fs = FPR(fs_value, info);
11091 
11092     return img_format("NEG.S %s, %s", ft, fs);
11093 }
11094 
11095 
11096 /*
11097  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11098  *
11099  *   3         2         1
11100  *  10987654321098765432109876543210
11101  *  001000               00010001101
11102  *     rt -----
11103  *          rs -----
11104  *               rd -----
11105  */
11106 static char *NOP_16_(uint64 instruction, Dis_info *info)
11107 {
11108     (void)instruction;
11109 
11110     return g_strdup("NOP ");
11111 }
11112 
11113 
11114 /*
11115  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11116  *
11117  *   3         2         1
11118  *  10987654321098765432109876543210
11119  *  001000               00010001101
11120  *     rt -----
11121  *          rs -----
11122  *               rd -----
11123  */
11124 static char *NOP_32_(uint64 instruction, Dis_info *info)
11125 {
11126     (void)instruction;
11127 
11128     return g_strdup("NOP ");
11129 }
11130 
11131 
11132 /*
11133  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11134  *
11135  *   3         2         1
11136  *  10987654321098765432109876543210
11137  *  001000               00010001101
11138  *     rt -----
11139  *          rs -----
11140  *               rd -----
11141  */
11142 static char *NOR(uint64 instruction, Dis_info *info)
11143 {
11144     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11145     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11146     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11147 
11148     const char *rd = GPR(rd_value, info);
11149     const char *rs = GPR(rs_value, info);
11150     const char *rt = GPR(rt_value, info);
11151 
11152     return img_format("NOR %s, %s, %s", rd, rs, rt);
11153 }
11154 
11155 
11156 /*
11157  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11158  *
11159  *   3         2         1
11160  *  10987654321098765432109876543210
11161  *  001000               00010001101
11162  *     rt -----
11163  *          rs -----
11164  *               rd -----
11165  */
11166 static char *NOT_16_(uint64 instruction, Dis_info *info)
11167 {
11168     uint64 rt3_value = extract_rt3_9_8_7(instruction);
11169     uint64 rs3_value = extract_rs3_6_5_4(instruction);
11170 
11171     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
11172     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
11173 
11174     return img_format("NOT %s, %s", rt3, rs3);
11175 }
11176 
11177 
11178 /*
11179  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11180  *
11181  *   3         2         1
11182  *  10987654321098765432109876543210
11183  *  001000               00010001101
11184  *     rt -----
11185  *          rs -----
11186  *               rd -----
11187  */
11188 static char *OR_16_(uint64 instruction, Dis_info *info)
11189 {
11190     uint64 rt3_value = extract_rt3_9_8_7(instruction);
11191     uint64 rs3_value = extract_rs3_6_5_4(instruction);
11192 
11193     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
11194     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
11195 
11196     return img_format("OR %s, %s", rs3, rt3);
11197 }
11198 
11199 
11200 /*
11201  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11202  *
11203  *   3         2         1
11204  *  10987654321098765432109876543210
11205  *  001000               00010001101
11206  *     rt -----
11207  *          rs -----
11208  *               rd -----
11209  */
11210 static char *OR_32_(uint64 instruction, Dis_info *info)
11211 {
11212     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11213     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11214     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11215 
11216     const char *rd = GPR(rd_value, info);
11217     const char *rs = GPR(rs_value, info);
11218     const char *rt = GPR(rt_value, info);
11219 
11220     return img_format("OR %s, %s, %s", rd, rs, rt);
11221 }
11222 
11223 
11224 /*
11225  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11226  *
11227  *   3         2         1
11228  *  10987654321098765432109876543210
11229  *  001000               00010001101
11230  *     rt -----
11231  *          rs -----
11232  *               rd -----
11233  */
11234 static char *ORI(uint64 instruction, Dis_info *info)
11235 {
11236     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11237     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11238     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
11239 
11240     const char *rt = GPR(rt_value, info);
11241     const char *rs = GPR(rs_value, info);
11242 
11243     return img_format("ORI %s, %s, 0x%" PRIx64, rt, rs, u_value);
11244 }
11245 
11246 
11247 /*
11248  * [DSP] PACKRL.PH rd, rs, rt - Pack a word using the right halfword from one
11249  *         source register and left halfword from another source register
11250  *
11251  *   3         2         1
11252  *  10987654321098765432109876543210
11253  *  001000               00010001101
11254  *     rt -----
11255  *          rs -----
11256  *               rd -----
11257  */
11258 static char *PACKRL_PH(uint64 instruction, Dis_info *info)
11259 {
11260     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11261     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11262     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11263 
11264     const char *rd = GPR(rd_value, info);
11265     const char *rs = GPR(rs_value, info);
11266     const char *rt = GPR(rt_value, info);
11267 
11268     return img_format("PACKRL.PH %s, %s, %s", rd, rs, rt);
11269 }
11270 
11271 
11272 /*
11273  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
11274  *
11275  *   3         2         1
11276  *  10987654321098765432109876543210
11277  *  001000               00010001101
11278  *     rt -----
11279  *          rs -----
11280  *               rd -----
11281  */
11282 static char *PAUSE(uint64 instruction, Dis_info *info)
11283 {
11284     (void)instruction;
11285 
11286     return g_strdup("PAUSE ");
11287 }
11288 
11289 
11290 /*
11291  * [DSP] PICK.PH rd, rs, rt - Pick a vector of halfwords based on condition
11292  *         code bits
11293  *
11294  *   3         2         1
11295  *  10987654321098765432109876543210
11296  *  001000               00010001101
11297  *     rt -----
11298  *          rs -----
11299  *               rd -----
11300  */
11301 static char *PICK_PH(uint64 instruction, Dis_info *info)
11302 {
11303     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11304     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11305     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11306 
11307     const char *rd = GPR(rd_value, info);
11308     const char *rs = GPR(rs_value, info);
11309     const char *rt = GPR(rt_value, info);
11310 
11311     return img_format("PICK.PH %s, %s, %s", rd, rs, rt);
11312 }
11313 
11314 
11315 /*
11316  * [DSP] PICK.QB rd, rs, rt - Pick a vector of byte values based on condition
11317  *         code bits
11318  *
11319  *   3         2         1
11320  *  10987654321098765432109876543210
11321  *  001000               00010001101
11322  *     rt -----
11323  *          rs -----
11324  *               rd -----
11325  */
11326 static char *PICK_QB(uint64 instruction, Dis_info *info)
11327 {
11328     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11329     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11330     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11331 
11332     const char *rd = GPR(rd_value, info);
11333     const char *rs = GPR(rs_value, info);
11334     const char *rt = GPR(rt_value, info);
11335 
11336     return img_format("PICK.QB %s, %s, %s", rd, rs, rt);
11337 }
11338 
11339 
11340 /*
11341  * [DSP] PRECEQ.W.PHL rt, rs - Expand the precision of the left-most element
11342  *         of a paired halfword
11343  *
11344  *   3         2         1
11345  *  10987654321098765432109876543210
11346  *  001000               00010001101
11347  *     rt -----
11348  *          rs -----
11349  *               rd -----
11350  */
11351 static char *PRECEQ_W_PHL(uint64 instruction, Dis_info *info)
11352 {
11353     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11354     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11355 
11356     const char *rt = GPR(rt_value, info);
11357     const char *rs = GPR(rs_value, info);
11358 
11359     return img_format("PRECEQ.W.PHL %s, %s", rt, rs);
11360 }
11361 
11362 
11363 /*
11364  * [DSP] PRECEQ.W.PHR rt, rs - Expand the precision of the right-most element
11365  *         of a paired halfword
11366  *
11367  *   3         2         1
11368  *  10987654321098765432109876543210
11369  *  001000               00010001101
11370  *     rt -----
11371  *          rs -----
11372  *               rd -----
11373  */
11374 static char *PRECEQ_W_PHR(uint64 instruction, Dis_info *info)
11375 {
11376     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11377     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11378 
11379     const char *rt = GPR(rt_value, info);
11380     const char *rs = GPR(rs_value, info);
11381 
11382     return img_format("PRECEQ.W.PHR %s, %s", rt, rs);
11383 }
11384 
11385 
11386 /*
11387  * [DSP] PRECEQU.PH.QBLA rt, rs - Expand the precision of the two
11388  *         left-alternate elements of a quad byte vector
11389  *
11390  *   3         2         1
11391  *  10987654321098765432109876543210
11392  *  001000               00010001101
11393  *     rt -----
11394  *          rs -----
11395  *               rd -----
11396  */
11397 static char *PRECEQU_PH_QBLA(uint64 instruction, Dis_info *info)
11398 {
11399     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11400     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11401 
11402     const char *rt = GPR(rt_value, info);
11403     const char *rs = GPR(rs_value, info);
11404 
11405     return img_format("PRECEQU.PH.QBLA %s, %s", rt, rs);
11406 }
11407 
11408 
11409 /*
11410  * [DSP] PRECEQU.PH.QBL rt, rs - Expand the precision of the two left-most
11411  *         elements of a quad byte vector
11412  *
11413  *   3         2         1
11414  *  10987654321098765432109876543210
11415  *  001000               00010001101
11416  *     rt -----
11417  *          rs -----
11418  *               rd -----
11419  */
11420 static char *PRECEQU_PH_QBL(uint64 instruction, Dis_info *info)
11421 {
11422     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11423     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11424 
11425     const char *rt = GPR(rt_value, info);
11426     const char *rs = GPR(rs_value, info);
11427 
11428     return img_format("PRECEQU.PH.QBL %s, %s", rt, rs);
11429 }
11430 
11431 
11432 /*
11433  * [DSP] PRECEQU.PH.QBRA rt, rs - Expand the precision of the two
11434  *         right-alternate elements of a quad byte vector
11435  *
11436  *   3         2         1
11437  *  10987654321098765432109876543210
11438  *  001000               00010001101
11439  *     rt -----
11440  *          rs -----
11441  *               rd -----
11442  */
11443 static char *PRECEQU_PH_QBRA(uint64 instruction, Dis_info *info)
11444 {
11445     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11446     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11447 
11448     const char *rt = GPR(rt_value, info);
11449     const char *rs = GPR(rs_value, info);
11450 
11451     return img_format("PRECEQU.PH.QBRA %s, %s", rt, rs);
11452 }
11453 
11454 
11455 /*
11456  * [DSP] PRECEQU.PH.QBR rt, rs - Expand the precision of the two right-most
11457  *         elements of a quad byte vector
11458  *
11459  *   3         2         1
11460  *  10987654321098765432109876543210
11461  *  001000               00010001101
11462  *     rt -----
11463  *          rs -----
11464  *               rd -----
11465  */
11466 static char *PRECEQU_PH_QBR(uint64 instruction, Dis_info *info)
11467 {
11468     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11469     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11470 
11471     const char *rt = GPR(rt_value, info);
11472     const char *rs = GPR(rs_value, info);
11473 
11474     return img_format("PRECEQU.PH.QBR %s, %s", rt, rs);
11475 }
11476 
11477 
11478 /*
11479  * [DSP] PRECEU.PH.QBLA rt, rs - Expand the precision of the two
11480  *         left-alternate elements of a quad byte vector to four unsigned
11481  *         halfwords
11482  *
11483  *   3         2         1
11484  *  10987654321098765432109876543210
11485  *  001000               00010001101
11486  *     rt -----
11487  *          rs -----
11488  *               rd -----
11489  */
11490 static char *PRECEU_PH_QBLA(uint64 instruction, Dis_info *info)
11491 {
11492     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11493     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11494 
11495     const char *rt = GPR(rt_value, info);
11496     const char *rs = GPR(rs_value, info);
11497 
11498     return img_format("PRECEU.PH.QBLA %s, %s", rt, rs);
11499 }
11500 
11501 
11502 /*
11503  * [DSP] PRECEU.PH.QBL rt, rs - Expand the precision of the two left-most
11504  *         elements of a quad byte vector to form unsigned halfwords
11505  *
11506  *   3         2         1
11507  *  10987654321098765432109876543210
11508  *  001000               00010001101
11509  *     rt -----
11510  *          rs -----
11511  *               rd -----
11512  */
11513 static char *PRECEU_PH_QBL(uint64 instruction, Dis_info *info)
11514 {
11515     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11516     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11517 
11518     const char *rt = GPR(rt_value, info);
11519     const char *rs = GPR(rs_value, info);
11520 
11521     return img_format("PRECEU.PH.QBL %s, %s", rt, rs);
11522 }
11523 
11524 
11525 /*
11526  * [DSP] PRECEU.PH.QBRA rt, rs - Expand the precision of the two
11527  *         right-alternate elements of a quad byte vector to form four
11528  *         unsigned halfwords
11529  *
11530  *   3         2         1
11531  *  10987654321098765432109876543210
11532  *  001000               00010001101
11533  *     rt -----
11534  *          rs -----
11535  *               rd -----
11536  */
11537 static char *PRECEU_PH_QBRA(uint64 instruction, Dis_info *info)
11538 {
11539     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11540     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11541 
11542     const char *rt = GPR(rt_value, info);
11543     const char *rs = GPR(rs_value, info);
11544 
11545     return img_format("PRECEU.PH.QBRA %s, %s", rt, rs);
11546 }
11547 
11548 
11549 /*
11550  * [DSP] PRECEU.PH.QBR rt, rs - Expand the precision of the two right-most
11551  *         elements of a quad byte vector to form unsigned halfwords
11552  *
11553  *   3         2         1
11554  *  10987654321098765432109876543210
11555  *  001000               00010001101
11556  *     rt -----
11557  *          rs -----
11558  *               rd -----
11559  */
11560 static char *PRECEU_PH_QBR(uint64 instruction, Dis_info *info)
11561 {
11562     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11563     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11564 
11565     const char *rt = GPR(rt_value, info);
11566     const char *rs = GPR(rs_value, info);
11567 
11568     return img_format("PRECEU.PH.QBR %s, %s", rt, rs);
11569 }
11570 
11571 
11572 /*
11573  * [DSP] PRECR.QB.PH rd, rs, rt - Reduce the precision of four integer
11574  *   halfwords to four bytes
11575  *
11576  *   3         2         1
11577  *  10987654321098765432109876543210
11578  *  001000               x0001101101
11579  *     rt -----
11580  *          rs -----
11581  *               rd -----
11582  */
11583 static char *PRECR_QB_PH(uint64 instruction, Dis_info *info)
11584 {
11585     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11586     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11587     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11588 
11589     const char *rd = GPR(rd_value, info);
11590     const char *rs = GPR(rs_value, info);
11591     const char *rt = GPR(rt_value, info);
11592 
11593     return img_format("PRECR.QB.PH %s, %s, %s", rd, rs, rt);
11594 }
11595 
11596 
11597 /*
11598  * [DSP] PRECR_SRA.PH.W rt, rs, sa - Reduce the precision of two integer
11599  *   words to halfwords after a right shift
11600  *
11601  *   3         2         1
11602  *  10987654321098765432109876543210
11603  *  001000               x1110000101
11604  *     rt -----
11605  *          rs -----
11606  *               rd -----
11607  */
11608 static char *PRECR_SRA_PH_W(uint64 instruction, Dis_info *info)
11609 {
11610     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11611     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11612     uint64 sa_value = extract_sa_15_14_13_12_11(instruction);
11613 
11614     const char *rt = GPR(rt_value, info);
11615     const char *rs = GPR(rs_value, info);
11616 
11617     return img_format("PRECR_SRA.PH.W %s, %s, 0x%" PRIx64, rt, rs, sa_value);
11618 }
11619 
11620 
11621 /*
11622  * [DSP] PRECR_SRA_R.PH.W rt, rs, sa - Reduce the precision of two integer
11623  *   words to halfwords after a right shift with rounding
11624  *
11625  *   3         2         1
11626  *  10987654321098765432109876543210
11627  *  001000               x1110000101
11628  *     rt -----
11629  *          rs -----
11630  *               rd -----
11631  */
11632 static char *PRECR_SRA_R_PH_W(uint64 instruction, Dis_info *info)
11633 {
11634     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11635     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11636     uint64 sa_value = extract_sa_15_14_13_12_11(instruction);
11637 
11638     const char *rt = GPR(rt_value, info);
11639     const char *rs = GPR(rs_value, info);
11640 
11641     return img_format("PRECR_SRA_R.PH.W %s, %s, 0x%" PRIx64, rt, rs, sa_value);
11642 }
11643 
11644 
11645 /*
11646  * [DSP] PRECRQ.PH.W rd, rs, rt - Reduce the precision of fractional
11647  *   words to fractional halfwords
11648  *
11649  *   3         2         1
11650  *  10987654321098765432109876543210
11651  *  001000               x1110000101
11652  *     rt -----
11653  *          rs -----
11654  *               rd -----
11655  */
11656 static char *PRECRQ_PH_W(uint64 instruction, Dis_info *info)
11657 {
11658     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11659     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11660     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11661 
11662     const char *rd = GPR(rd_value, info);
11663     const char *rs = GPR(rs_value, info);
11664     const char *rt = GPR(rt_value, info);
11665 
11666     return img_format("PRECRQ.PH.W %s, %s, %s", rd, rs, rt);
11667 }
11668 
11669 
11670 /*
11671  * [DSP] PRECRQ.QB.PH rd, rs, rt - Reduce the precision of four fractional
11672  *   halfwords to four bytes
11673  *
11674  *   3         2         1
11675  *  10987654321098765432109876543210
11676  *  001000               x0010101101
11677  *     rt -----
11678  *          rs -----
11679  *               rd -----
11680  */
11681 static char *PRECRQ_QB_PH(uint64 instruction, Dis_info *info)
11682 {
11683     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11684     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11685     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11686 
11687     const char *rd = GPR(rd_value, info);
11688     const char *rs = GPR(rs_value, info);
11689     const char *rt = GPR(rt_value, info);
11690 
11691     return img_format("PRECRQ.QB.PH %s, %s, %s", rd, rs, rt);
11692 }
11693 
11694 
11695 /*
11696  * [DSP] PRECRQ_RS.PH.W rd, rs, rt - Reduce the precision of fractional
11697  *   words to halfwords with rounding and saturation
11698  *
11699  *   3         2         1
11700  *  10987654321098765432109876543210
11701  *  001000               x1110000101
11702  *     rt -----
11703  *          rs -----
11704  *               rd -----
11705  */
11706 static char *PRECRQ_RS_PH_W(uint64 instruction, Dis_info *info)
11707 {
11708     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11709     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11710     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11711 
11712     const char *rd = GPR(rd_value, info);
11713     const char *rs = GPR(rs_value, info);
11714     const char *rt = GPR(rt_value, info);
11715 
11716     return img_format("PRECRQ_RS.PH.W %s, %s, %s", rd, rs, rt);
11717 }
11718 
11719 
11720 /*
11721  * [DSP] PRECRQU_S.QB.PH rd, rs, rt - Reduce the precision of fractional
11722  *   halfwords to unsigned bytes with saturation
11723  *
11724  *   3         2         1
11725  *  10987654321098765432109876543210
11726  *  001000               x1110000101
11727  *     rt -----
11728  *          rs -----
11729  *               rd -----
11730  */
11731 static char *PRECRQU_S_QB_PH(uint64 instruction, Dis_info *info)
11732 {
11733     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11734     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11735     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
11736 
11737     const char *rd = GPR(rd_value, info);
11738     const char *rs = GPR(rs_value, info);
11739     const char *rt = GPR(rt_value, info);
11740 
11741     return img_format("PRECRQU_S.QB.PH %s, %s, %s", rd, rs, rt);
11742 }
11743 
11744 
11745 /*
11746  *
11747  *
11748  *   3         2         1
11749  *  10987654321098765432109876543210
11750  *  001000               x1110000101
11751  *     rt -----
11752  *          rs -----
11753  *               rd -----
11754  */
11755 static char *PREF_S9_(uint64 instruction, Dis_info *info)
11756 {
11757     uint64 hint_value = extract_hint_25_24_23_22_21(instruction);
11758     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11759     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
11760 
11761     const char *rs = GPR(rs_value, info);
11762 
11763     return img_format("PREF 0x%" PRIx64 ", %" PRId64 "(%s)",
11764                       hint_value, s_value, rs);
11765 }
11766 
11767 
11768 /*
11769  *
11770  *
11771  *   3         2         1
11772  *  10987654321098765432109876543210
11773  *  001000               x1110000101
11774  *     rt -----
11775  *          rs -----
11776  *               rd -----
11777  */
11778 static char *PREF_U12_(uint64 instruction, Dis_info *info)
11779 {
11780     uint64 hint_value = extract_hint_25_24_23_22_21(instruction);
11781     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11782     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
11783 
11784     const char *rs = GPR(rs_value, info);
11785 
11786     return img_format("PREF 0x%" PRIx64 ", 0x%" PRIx64 "(%s)",
11787                       hint_value, u_value, rs);
11788 }
11789 
11790 
11791 /*
11792  *
11793  *
11794  *   3         2         1
11795  *  10987654321098765432109876543210
11796  *  001000               x1110000101
11797  *     rt -----
11798  *          rs -----
11799  *               rd -----
11800  */
11801 static char *PREFE(uint64 instruction, Dis_info *info)
11802 {
11803     uint64 hint_value = extract_hint_25_24_23_22_21(instruction);
11804     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11805     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
11806 
11807     const char *rs = GPR(rs_value, info);
11808 
11809     return img_format("PREFE 0x%" PRIx64 ", %" PRId64 "(%s)",
11810                       hint_value, s_value, rs);
11811 }
11812 
11813 
11814 /*
11815  * [DSP] PREPEND rt, rs, sa - Right shift and prepend bits to the MSB
11816  *
11817  *   3         2         1
11818  *  10987654321098765432109876543210
11819  *  001000               x1110000101
11820  *     rt -----
11821  *          rs -----
11822  *               rd -----
11823  */
11824 static char *PREPEND(uint64 instruction, Dis_info *info)
11825 {
11826     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11827     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11828     uint64 sa_value = extract_sa_15_14_13_12_11(instruction);
11829 
11830     const char *rt = GPR(rt_value, info);
11831     const char *rs = GPR(rs_value, info);
11832 
11833     return img_format("PREPEND %s, %s, 0x%" PRIx64, rt, rs, sa_value);
11834 }
11835 
11836 
11837 /*
11838  * [DSP] RADDU.W.QB rt, rs - Unsigned reduction add of vector quad bytes
11839  *
11840  *   3         2         1
11841  *  10987654321098765432109876543210
11842  *  001000          1111000100111111
11843  *     rt -----
11844  *          rs -----
11845  */
11846 static char *RADDU_W_QB(uint64 instruction, Dis_info *info)
11847 {
11848     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11849     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11850 
11851     const char *rt = GPR(rt_value, info);
11852     const char *rs = GPR(rs_value, info);
11853 
11854     return img_format("RADDU.W.QB %s, %s", rt, rs);
11855 }
11856 
11857 
11858 /*
11859  * [DSP] RDDSP rt, mask - Read DSPControl register fields to a GPR
11860  *
11861  *   3         2         1
11862  *  10987654321098765432109876543210
11863  *  001000            00011001111111
11864  *     rt -----
11865  *        mask -------
11866  */
11867 static char *RDDSP(uint64 instruction, Dis_info *info)
11868 {
11869     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11870     uint64 mask_value = extract_mask_20_19_18_17_16_15_14(instruction);
11871 
11872     const char *rt = GPR(rt_value, info);
11873 
11874     return img_format("RDDSP %s, 0x%" PRIx64, rt, mask_value);
11875 }
11876 
11877 
11878 /*
11879  *
11880  *
11881  *   3         2         1
11882  *  10987654321098765432109876543210
11883  *  001000               x1110000101
11884  *     rt -----
11885  *          rs -----
11886  *               rd -----
11887  */
11888 static char *RDHWR(uint64 instruction, Dis_info *info)
11889 {
11890     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11891     uint64 hs_value = extract_hs_20_19_18_17_16(instruction);
11892     uint64 sel_value = extract_sel_13_12_11(instruction);
11893 
11894     const char *rt = GPR(rt_value, info);
11895 
11896     return img_format("RDHWR %s, CP%" PRIu64 ", 0x%" PRIx64,
11897                       rt, hs_value, sel_value);
11898 }
11899 
11900 
11901 /*
11902  *
11903  *
11904  *   3         2         1
11905  *  10987654321098765432109876543210
11906  *  001000               x1110000101
11907  *     rt -----
11908  *          rs -----
11909  *               rd -----
11910  */
11911 static char *RDPGPR(uint64 instruction, Dis_info *info)
11912 {
11913     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11914     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
11915 
11916     const char *rt = GPR(rt_value, info);
11917     const char *rs = GPR(rs_value, info);
11918 
11919     return img_format("RDPGPR %s, %s", rt, rs);
11920 }
11921 
11922 
11923 /*
11924  *
11925  *
11926  *   3         2         1
11927  *  10987654321098765432109876543210
11928  *  001000               x1110000101
11929  *     rt -----
11930  *          rs -----
11931  *               rd -----
11932  */
11933 static char *RECIP_D(uint64 instruction, Dis_info *info)
11934 {
11935     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
11936     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
11937 
11938     const char *ft = FPR(ft_value, info);
11939     const char *fs = FPR(fs_value, info);
11940 
11941     return img_format("RECIP.D %s, %s", ft, fs);
11942 }
11943 
11944 
11945 /*
11946  *
11947  *
11948  *   3         2         1
11949  *  10987654321098765432109876543210
11950  *  001000               x1110000101
11951  *     rt -----
11952  *          rs -----
11953  *               rd -----
11954  */
11955 static char *RECIP_S(uint64 instruction, Dis_info *info)
11956 {
11957     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
11958     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
11959 
11960     const char *ft = FPR(ft_value, info);
11961     const char *fs = FPR(fs_value, info);
11962 
11963     return img_format("RECIP.S %s, %s", ft, fs);
11964 }
11965 
11966 
11967 /*
11968  * [DSP] REPL.PH rd, s - Replicate immediate integer into all vector element
11969  *   positions
11970  *
11971  *   3         2         1
11972  *  10987654321098765432109876543210
11973  *  001000               x0000111101
11974  *     rt -----
11975  *           s ----------
11976  */
11977 static char *REPL_PH(uint64 instruction, Dis_info *info)
11978 {
11979     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
11980     int64 s_value = extract_s__se9_20_19_18_17_16_15_14_13_12_11(instruction);
11981 
11982     const char *rt = GPR(rt_value, info);
11983 
11984     return img_format("REPL.PH %s, %" PRId64, rt, s_value);
11985 }
11986 
11987 
11988 /*
11989  * [DSP] REPL.QB rd, u - Replicate immediate integer into all vector element
11990  *   positions
11991  *
11992  *   3         2         1
11993  *  10987654321098765432109876543210
11994  *  001000             x010111111111
11995  *     rt -----
11996  *           u --------
11997  */
11998 static char *REPL_QB(uint64 instruction, Dis_info *info)
11999 {
12000     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12001     uint64 u_value = extract_u_20_19_18_17_16_15_14_13(instruction);
12002 
12003     const char *rt = GPR(rt_value, info);
12004 
12005     return img_format("REPL.QB %s, 0x%" PRIx64, rt, u_value);
12006 }
12007 
12008 
12009 /*
12010  * [DSP] REPLV.PH rt, rs - Replicate a halfword into all vector element
12011  *   positions
12012  *
12013  *   3         2         1
12014  *  10987654321098765432109876543210
12015  *  001000          0000001100111111
12016  *     rt -----
12017  *          rs -----
12018  */
12019 static char *REPLV_PH(uint64 instruction, Dis_info *info)
12020 {
12021     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12022     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12023 
12024     const char *rt = GPR(rt_value, info);
12025     const char *rs = GPR(rs_value, info);
12026 
12027     return img_format("REPLV.PH %s, %s", rt, rs);
12028 }
12029 
12030 
12031 /*
12032  * [DSP] REPLV.QB rt, rs - Replicate byte into all vector element positions
12033  *
12034  *   3         2         1
12035  *  10987654321098765432109876543210
12036  *  001000          0001001100111111
12037  *     rt -----
12038  *          rs -----
12039  */
12040 static char *REPLV_QB(uint64 instruction, Dis_info *info)
12041 {
12042     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12043     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12044 
12045     const char *rt = GPR(rt_value, info);
12046     const char *rs = GPR(rs_value, info);
12047 
12048     return img_format("REPLV.QB %s, %s", rt, rs);
12049 }
12050 
12051 
12052 /*
12053  *
12054  *
12055  *   3         2         1
12056  *  10987654321098765432109876543210
12057  *  001000               x1110000101
12058  *     rt -----
12059  *          rs -----
12060  *               rd -----
12061  */
12062 static char *RESTORE_32_(uint64 instruction, Dis_info *info)
12063 {
12064     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12065     uint64 count_value = extract_count_19_18_17_16(instruction);
12066     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3__s3(instruction);
12067     uint64 gp_value = extract_gp_2(instruction);
12068 
12069     g_autofree char *save_restore_str = save_restore_list(
12070         rt_value, count_value, gp_value, info);
12071     return img_format("RESTORE 0x%" PRIx64 "%s", u_value, save_restore_str);
12072 }
12073 
12074 
12075 /*
12076  *
12077  *
12078  *   3         2         1
12079  *  10987654321098765432109876543210
12080  *  001000               x1110000101
12081  *     rt -----
12082  *          rs -----
12083  *               rd -----
12084  */
12085 static char *RESTORE_JRC_16_(uint64 instruction, Dis_info *info)
12086 {
12087     uint64 rt1_value = extract_rtl_11(instruction);
12088     uint64 u_value = extract_u_7_6_5_4__s4(instruction);
12089     uint64 count_value = extract_count_3_2_1_0(instruction);
12090 
12091     g_autofree char *save_restore_str = save_restore_list(
12092         encode_rt1_from_rt(rt1_value), count_value, 0, info);
12093     return img_format("RESTORE.JRC 0x%" PRIx64 "%s", u_value, save_restore_str);
12094 }
12095 
12096 
12097 /*
12098  *
12099  *
12100  *   3         2         1
12101  *  10987654321098765432109876543210
12102  *  001000               x1110000101
12103  *     rt -----
12104  *          rs -----
12105  *               rd -----
12106  */
12107 static char *RESTORE_JRC_32_(uint64 instruction, Dis_info *info)
12108 {
12109     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12110     uint64 count_value = extract_count_19_18_17_16(instruction);
12111     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3__s3(instruction);
12112     uint64 gp_value = extract_gp_2(instruction);
12113 
12114     g_autofree char *save_restore_str = save_restore_list(
12115         rt_value, count_value, gp_value, info);
12116     return img_format("RESTORE.JRC 0x%" PRIx64 "%s", u_value,
12117                       save_restore_str);
12118 }
12119 
12120 
12121 /*
12122  *
12123  *
12124  *   3         2         1
12125  *  10987654321098765432109876543210
12126  *  001000               x1110000101
12127  *     rt -----
12128  *          rs -----
12129  *               rd -----
12130  */
12131 static char *RESTOREF(uint64 instruction, Dis_info *info)
12132 {
12133     uint64 count_value = extract_count_19_18_17_16(instruction);
12134     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3__s3(instruction);
12135 
12136 
12137     return img_format("RESTOREF 0x%" PRIx64 ", 0x%" PRIx64,
12138                       u_value, count_value);
12139 }
12140 
12141 
12142 /*
12143  *
12144  *
12145  *   3         2         1
12146  *  10987654321098765432109876543210
12147  *  001000               x1110000101
12148  *     rt -----
12149  *          rs -----
12150  *               rd -----
12151  */
12152 static char *RINT_D(uint64 instruction, Dis_info *info)
12153 {
12154     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12155     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12156 
12157     const char *ft = FPR(ft_value, info);
12158     const char *fs = FPR(fs_value, info);
12159 
12160     return img_format("RINT.D %s, %s", ft, fs);
12161 }
12162 
12163 
12164 /*
12165  *
12166  *
12167  *   3         2         1
12168  *  10987654321098765432109876543210
12169  *  001000               x1110000101
12170  *     rt -----
12171  *          rs -----
12172  *               rd -----
12173  */
12174 static char *RINT_S(uint64 instruction, Dis_info *info)
12175 {
12176     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12177     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12178 
12179     const char *ft = FPR(ft_value, info);
12180     const char *fs = FPR(fs_value, info);
12181 
12182     return img_format("RINT.S %s, %s", ft, fs);
12183 }
12184 
12185 
12186 /*
12187  *
12188  *
12189  *   3         2         1
12190  *  10987654321098765432109876543210
12191  *  001000               x1110000101
12192  *     rt -----
12193  *          rs -----
12194  *               rd -----
12195  */
12196 static char *ROTR(uint64 instruction, Dis_info *info)
12197 {
12198     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12199     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12200     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
12201 
12202     const char *rt = GPR(rt_value, info);
12203     const char *rs = GPR(rs_value, info);
12204 
12205     return img_format("ROTR %s, %s, 0x%" PRIx64, rt, rs, shift_value);
12206 }
12207 
12208 
12209 /*
12210  *
12211  *
12212  *   3         2         1
12213  *  10987654321098765432109876543210
12214  *  001000               x1110000101
12215  *     rt -----
12216  *          rs -----
12217  *               rd -----
12218  */
12219 static char *ROTRV(uint64 instruction, Dis_info *info)
12220 {
12221     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12222     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12223     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
12224 
12225     const char *rd = GPR(rd_value, info);
12226     const char *rs = GPR(rs_value, info);
12227     const char *rt = GPR(rt_value, info);
12228 
12229     return img_format("ROTRV %s, %s, %s", rd, rs, rt);
12230 }
12231 
12232 
12233 /*
12234  *
12235  *
12236  *   3         2         1
12237  *  10987654321098765432109876543210
12238  *  001000               x1110000101
12239  *     rt -----
12240  *          rs -----
12241  *               rd -----
12242  */
12243 static char *ROTX(uint64 instruction, Dis_info *info)
12244 {
12245     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12246     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12247     uint64 shiftx_value = extract_shiftx_10_9_8_7__s1(instruction);
12248     uint64 stripe_value = extract_stripe_6(instruction);
12249     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
12250 
12251     const char *rt = GPR(rt_value, info);
12252     const char *rs = GPR(rs_value, info);
12253 
12254     return img_format("ROTX %s, %s, 0x%" PRIx64 ", 0x%" PRIx64 ", 0x%" PRIx64,
12255                        rt, rs, shift_value, shiftx_value, stripe_value);
12256 }
12257 
12258 
12259 /*
12260  *
12261  *
12262  *   3         2         1
12263  *  10987654321098765432109876543210
12264  *  001000               x1110000101
12265  *     rt -----
12266  *          rs -----
12267  *               rd -----
12268  */
12269 static char *ROUND_L_D(uint64 instruction, Dis_info *info)
12270 {
12271     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12272     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12273 
12274     const char *ft = FPR(ft_value, info);
12275     const char *fs = FPR(fs_value, info);
12276 
12277     return img_format("ROUND.L.D %s, %s", ft, fs);
12278 }
12279 
12280 
12281 /*
12282  *
12283  *
12284  *   3         2         1
12285  *  10987654321098765432109876543210
12286  *  001000               x1110000101
12287  *     rt -----
12288  *          rs -----
12289  *               rd -----
12290  */
12291 static char *ROUND_L_S(uint64 instruction, Dis_info *info)
12292 {
12293     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12294     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12295 
12296     const char *ft = FPR(ft_value, info);
12297     const char *fs = FPR(fs_value, info);
12298 
12299     return img_format("ROUND.L.S %s, %s", ft, fs);
12300 }
12301 
12302 
12303 /*
12304  *
12305  *
12306  *   3         2         1
12307  *  10987654321098765432109876543210
12308  *  001000               x1110000101
12309  *     rt -----
12310  *          rs -----
12311  *               rd -----
12312  */
12313 static char *ROUND_W_D(uint64 instruction, Dis_info *info)
12314 {
12315     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12316     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12317 
12318     const char *ft = FPR(ft_value, info);
12319     const char *fs = FPR(fs_value, info);
12320 
12321     return img_format("ROUND.W.D %s, %s", ft, fs);
12322 }
12323 
12324 
12325 /*
12326  *
12327  *
12328  *   3         2         1
12329  *  10987654321098765432109876543210
12330  *  001000               x1110000101
12331  *     rt -----
12332  *          rs -----
12333  *               rd -----
12334  */
12335 static char *ROUND_W_S(uint64 instruction, Dis_info *info)
12336 {
12337     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12338     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12339 
12340     const char *ft = FPR(ft_value, info);
12341     const char *fs = FPR(fs_value, info);
12342 
12343     return img_format("ROUND.W.S %s, %s", ft, fs);
12344 }
12345 
12346 
12347 /*
12348  *
12349  *
12350  *   3         2         1
12351  *  10987654321098765432109876543210
12352  *  001000               x1110000101
12353  *     rt -----
12354  *          rs -----
12355  *               rd -----
12356  */
12357 static char *RSQRT_D(uint64 instruction, Dis_info *info)
12358 {
12359     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12360     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12361 
12362     const char *ft = FPR(ft_value, info);
12363     const char *fs = FPR(fs_value, info);
12364 
12365     return img_format("RSQRT.D %s, %s", ft, fs);
12366 }
12367 
12368 
12369 /*
12370  *
12371  *
12372  *   3         2         1
12373  *  10987654321098765432109876543210
12374  *  001000               x1110000101
12375  *     rt -----
12376  *          rs -----
12377  *               rd -----
12378  */
12379 static char *RSQRT_S(uint64 instruction, Dis_info *info)
12380 {
12381     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12382     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
12383 
12384     const char *ft = FPR(ft_value, info);
12385     const char *fs = FPR(fs_value, info);
12386 
12387     return img_format("RSQRT.S %s, %s", ft, fs);
12388 }
12389 
12390 
12391 /*
12392  *
12393  *
12394  *   3         2         1
12395  *  10987654321098765432109876543210
12396  *  001000               01001001101
12397  *     rt -----
12398  *          rs -----
12399  *               rd -----
12400  */
12401 static char *SAVE_16_(uint64 instruction, Dis_info *info)
12402 {
12403     uint64 rt1_value = extract_rtl_11(instruction);
12404     uint64 u_value = extract_u_7_6_5_4__s4(instruction);
12405     uint64 count_value = extract_count_3_2_1_0(instruction);
12406 
12407     g_autofree char *save_restore_str = save_restore_list(
12408         encode_rt1_from_rt(rt1_value), count_value, 0, info);
12409     return img_format("SAVE 0x%" PRIx64 "%s", u_value, save_restore_str);
12410 }
12411 
12412 
12413 /*
12414  *
12415  *
12416  *   3         2         1
12417  *  10987654321098765432109876543210
12418  *  001000               01001001101
12419  *     rt -----
12420  *          rs -----
12421  *               rd -----
12422  */
12423 static char *SAVE_32_(uint64 instruction, Dis_info *info)
12424 {
12425     uint64 count_value = extract_count_19_18_17_16(instruction);
12426     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12427     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3__s3(instruction);
12428     uint64 gp_value = extract_gp_2(instruction);
12429 
12430     g_autofree char *save_restore_str = save_restore_list(
12431         rt_value, count_value, gp_value, info);
12432     return img_format("SAVE 0x%" PRIx64 "%s", u_value, save_restore_str);
12433 }
12434 
12435 
12436 /*
12437  *
12438  *
12439  *   3         2         1
12440  *  10987654321098765432109876543210
12441  *  001000               01001001101
12442  *     rt -----
12443  *          rs -----
12444  *               rd -----
12445  */
12446 static char *SAVEF(uint64 instruction, Dis_info *info)
12447 {
12448     uint64 count_value = extract_count_19_18_17_16(instruction);
12449     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3__s3(instruction);
12450 
12451 
12452     return img_format("SAVEF 0x%" PRIx64 ", 0x%" PRIx64, u_value, count_value);
12453 }
12454 
12455 
12456 /*
12457  *
12458  *
12459  *   3         2         1
12460  *  10987654321098765432109876543210
12461  *  001000               01001001101
12462  *     rt -----
12463  *          rs -----
12464  *               rd -----
12465  */
12466 static char *SB_16_(uint64 instruction, Dis_info *info)
12467 {
12468     uint64 rtz3_value = extract_rtz3_9_8_7(instruction);
12469     uint64 rs3_value = extract_rs3_6_5_4(instruction);
12470     uint64 u_value = extract_u_1_0(instruction);
12471 
12472     const char *rtz3 = GPR(decode_gpr_gpr3_src_store(rtz3_value, info), info);
12473     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
12474 
12475     return img_format("SB %s, 0x%" PRIx64 "(%s)", rtz3, u_value, rs3);
12476 }
12477 
12478 
12479 /*
12480  *
12481  *
12482  *   3         2         1
12483  *  10987654321098765432109876543210
12484  *  001000               01001001101
12485  *     rt -----
12486  *          rs -----
12487  *               rd -----
12488  */
12489 static char *SB_GP_(uint64 instruction, Dis_info *info)
12490 {
12491     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12492     uint64 u_value = extract_u_17_to_0(instruction);
12493 
12494     const char *rt = GPR(rt_value, info);
12495 
12496     return img_format("SB %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
12497 }
12498 
12499 
12500 /*
12501  *
12502  *
12503  *   3         2         1
12504  *  10987654321098765432109876543210
12505  *  001000               01001001101
12506  *     rt -----
12507  *          rs -----
12508  *               rd -----
12509  */
12510 static char *SB_S9_(uint64 instruction, Dis_info *info)
12511 {
12512     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12513     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12514     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
12515 
12516     const char *rt = GPR(rt_value, info);
12517     const char *rs = GPR(rs_value, info);
12518 
12519     return img_format("SB %s, %" PRId64 "(%s)", rt, s_value, rs);
12520 }
12521 
12522 
12523 /*
12524  *
12525  *
12526  *   3         2         1
12527  *  10987654321098765432109876543210
12528  *  001000               01001001101
12529  *     rt -----
12530  *          rs -----
12531  *               rd -----
12532  */
12533 static char *SB_U12_(uint64 instruction, Dis_info *info)
12534 {
12535     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12536     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12537     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
12538 
12539     const char *rt = GPR(rt_value, info);
12540     const char *rs = GPR(rs_value, info);
12541 
12542     return img_format("SB %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
12543 }
12544 
12545 
12546 /*
12547  *
12548  *
12549  *   3         2         1
12550  *  10987654321098765432109876543210
12551  *  001000               01001001101
12552  *     rt -----
12553  *          rs -----
12554  *               rd -----
12555  */
12556 static char *SBE(uint64 instruction, Dis_info *info)
12557 {
12558     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12559     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12560     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
12561 
12562     const char *rt = GPR(rt_value, info);
12563     const char *rs = GPR(rs_value, info);
12564 
12565     return img_format("SBE %s, %" PRId64 "(%s)", rt, s_value, rs);
12566 }
12567 
12568 
12569 /*
12570  *
12571  *
12572  *   3         2         1
12573  *  10987654321098765432109876543210
12574  *  001000               01001001101
12575  *     rt -----
12576  *          rs -----
12577  *               rd -----
12578  */
12579 static char *SBX(uint64 instruction, Dis_info *info)
12580 {
12581     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12582     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12583     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
12584 
12585     const char *rd = GPR(rd_value, info);
12586     const char *rs = GPR(rs_value, info);
12587     const char *rt = GPR(rt_value, info);
12588 
12589     return img_format("SBX %s, %s(%s)", rd, rs, rt);
12590 }
12591 
12592 
12593 /*
12594  *
12595  *
12596  *   3         2         1
12597  *  10987654321098765432109876543210
12598  *  001000               01001001101
12599  *     rt -----
12600  *          rs -----
12601  *               rd -----
12602  */
12603 static char *SC(uint64 instruction, Dis_info *info)
12604 {
12605     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12606     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12607     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_s2(instruction);
12608 
12609     const char *rt = GPR(rt_value, info);
12610     const char *rs = GPR(rs_value, info);
12611 
12612     return img_format("SC %s, %" PRId64 "(%s)", rt, s_value, rs);
12613 }
12614 
12615 
12616 /*
12617  *
12618  *
12619  *   3         2         1
12620  *  10987654321098765432109876543210
12621  *  001000               01001001101
12622  *     rt -----
12623  *          rs -----
12624  *               rd -----
12625  */
12626 static char *SCD(uint64 instruction, Dis_info *info)
12627 {
12628     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12629     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12630     int64 s_value = extract_s__se8_15_7_6_5_4_3_s3(instruction);
12631 
12632     const char *rt = GPR(rt_value, info);
12633     const char *rs = GPR(rs_value, info);
12634 
12635     return img_format("SCD %s, %" PRId64 "(%s)", rt, s_value, rs);
12636 }
12637 
12638 
12639 /*
12640  *
12641  *
12642  *   3         2         1
12643  *  10987654321098765432109876543210
12644  *  001000               01001001101
12645  *     rt -----
12646  *          rs -----
12647  *               rd -----
12648  */
12649 static char *SCDP(uint64 instruction, Dis_info *info)
12650 {
12651     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12652     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12653     uint64 ru_value = extract_ru_7_6_5_4_3(instruction);
12654 
12655     const char *rt = GPR(rt_value, info);
12656     const char *ru = GPR(ru_value, info);
12657     const char *rs = GPR(rs_value, info);
12658 
12659     return img_format("SCDP %s, %s, (%s)", rt, ru, rs);
12660 }
12661 
12662 
12663 /*
12664  *
12665  *
12666  *   3         2         1
12667  *  10987654321098765432109876543210
12668  *  001000               01001001101
12669  *     rt -----
12670  *          rs -----
12671  *               rd -----
12672  */
12673 static char *SCE(uint64 instruction, Dis_info *info)
12674 {
12675     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12676     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12677     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_s2(instruction);
12678 
12679     const char *rt = GPR(rt_value, info);
12680     const char *rs = GPR(rs_value, info);
12681 
12682     return img_format("SCE %s, %" PRId64 "(%s)", rt, s_value, rs);
12683 }
12684 
12685 
12686 /*
12687  *
12688  *
12689  *   3         2         1
12690  *  10987654321098765432109876543210
12691  *  001000               01001001101
12692  *     rt -----
12693  *          rs -----
12694  *               rd -----
12695  */
12696 static char *SCWP(uint64 instruction, Dis_info *info)
12697 {
12698     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12699     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12700     uint64 ru_value = extract_ru_7_6_5_4_3(instruction);
12701 
12702     const char *rt = GPR(rt_value, info);
12703     const char *ru = GPR(ru_value, info);
12704     const char *rs = GPR(rs_value, info);
12705 
12706     return img_format("SCWP %s, %s, (%s)", rt, ru, rs);
12707 }
12708 
12709 
12710 /*
12711  *
12712  *
12713  *   3         2         1
12714  *  10987654321098765432109876543210
12715  *  001000               01001001101
12716  *     rt -----
12717  *          rs -----
12718  *               rd -----
12719  */
12720 static char *SCWPE(uint64 instruction, Dis_info *info)
12721 {
12722     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12723     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12724     uint64 ru_value = extract_ru_7_6_5_4_3(instruction);
12725 
12726     const char *rt = GPR(rt_value, info);
12727     const char *ru = GPR(ru_value, info);
12728     const char *rs = GPR(rs_value, info);
12729 
12730     return img_format("SCWPE %s, %s, (%s)", rt, ru, rs);
12731 }
12732 
12733 
12734 /*
12735  *
12736  *
12737  *   3         2         1
12738  *  10987654321098765432109876543210
12739  *  001000               01001001101
12740  *     rt -----
12741  *          rs -----
12742  *               rd -----
12743  */
12744 static char *SD_GP_(uint64 instruction, Dis_info *info)
12745 {
12746     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12747     uint64 u_value = extract_u_20_to_3__s3(instruction);
12748 
12749     const char *rt = GPR(rt_value, info);
12750 
12751     return img_format("SD %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
12752 }
12753 
12754 
12755 /*
12756  *
12757  *
12758  *   3         2         1
12759  *  10987654321098765432109876543210
12760  *  001000               01001001101
12761  *     rt -----
12762  *          rs -----
12763  *               rd -----
12764  */
12765 static char *SD_S9_(uint64 instruction, Dis_info *info)
12766 {
12767     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12768     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12769     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
12770 
12771     const char *rt = GPR(rt_value, info);
12772     const char *rs = GPR(rs_value, info);
12773 
12774     return img_format("SD %s, %" PRId64 "(%s)", rt, s_value, rs);
12775 }
12776 
12777 
12778 /*
12779  *
12780  *
12781  *   3         2         1
12782  *  10987654321098765432109876543210
12783  *  001000               01001001101
12784  *     rt -----
12785  *          rs -----
12786  *               rd -----
12787  */
12788 static char *SD_U12_(uint64 instruction, Dis_info *info)
12789 {
12790     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12791     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12792     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
12793 
12794     const char *rt = GPR(rt_value, info);
12795     const char *rs = GPR(rs_value, info);
12796 
12797     return img_format("SD %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
12798 }
12799 
12800 
12801 /*
12802  *
12803  *
12804  *   3         2         1
12805  *  10987654321098765432109876543210
12806  *  001000               01001001101
12807  *     rt -----
12808  *          rs -----
12809  *               rd -----
12810  */
12811 static char *SDBBP_16_(uint64 instruction, Dis_info *info)
12812 {
12813     uint64 code_value = extract_code_2_1_0(instruction);
12814 
12815 
12816     return img_format("SDBBP 0x%" PRIx64, code_value);
12817 }
12818 
12819 
12820 /*
12821  *
12822  *
12823  *   3         2         1
12824  *  10987654321098765432109876543210
12825  *  001000               01001001101
12826  *     rt -----
12827  *          rs -----
12828  *               rd -----
12829  */
12830 static char *SDBBP_32_(uint64 instruction, Dis_info *info)
12831 {
12832     uint64 code_value = extract_code_18_to_0(instruction);
12833 
12834 
12835     return img_format("SDBBP 0x%" PRIx64, code_value);
12836 }
12837 
12838 
12839 /*
12840  *
12841  *
12842  *   3         2         1
12843  *  10987654321098765432109876543210
12844  *  001000               01001001101
12845  *     rt -----
12846  *          rs -----
12847  *               rd -----
12848  */
12849 static char *SDC1_GP_(uint64 instruction, Dis_info *info)
12850 {
12851     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12852     uint64 u_value = extract_u_17_to_2__s2(instruction);
12853 
12854     const char *ft = FPR(ft_value, info);
12855 
12856     return img_format("SDC1 %s, 0x%" PRIx64 "($%d)", ft, u_value, 28);
12857 }
12858 
12859 
12860 /*
12861  *
12862  *
12863  *   3         2         1
12864  *  10987654321098765432109876543210
12865  *  001000               01001001101
12866  *     rt -----
12867  *          rs -----
12868  *               rd -----
12869  */
12870 static char *SDC1_S9_(uint64 instruction, Dis_info *info)
12871 {
12872     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12873     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12874     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
12875 
12876     const char *ft = FPR(ft_value, info);
12877     const char *rs = GPR(rs_value, info);
12878 
12879     return img_format("SDC1 %s, %" PRId64 "(%s)", ft, s_value, rs);
12880 }
12881 
12882 
12883 /*
12884  *
12885  *
12886  *   3         2         1
12887  *  10987654321098765432109876543210
12888  *  001000               01001001101
12889  *     rt -----
12890  *          rs -----
12891  *               rd -----
12892  */
12893 static char *SDC1_U12_(uint64 instruction, Dis_info *info)
12894 {
12895     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
12896     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12897     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
12898 
12899     const char *ft = FPR(ft_value, info);
12900     const char *rs = GPR(rs_value, info);
12901 
12902     return img_format("SDC1 %s, 0x%" PRIx64 "(%s)", ft, u_value, rs);
12903 }
12904 
12905 
12906 /*
12907  *
12908  *
12909  *   3         2         1
12910  *  10987654321098765432109876543210
12911  *  001000               01001001101
12912  *     rt -----
12913  *          rs -----
12914  *               rd -----
12915  */
12916 static char *SDC1X(uint64 instruction, Dis_info *info)
12917 {
12918     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12919     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12920     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
12921 
12922     const char *ft = FPR(ft_value, info);
12923     const char *rs = GPR(rs_value, info);
12924     const char *rt = GPR(rt_value, info);
12925 
12926     return img_format("SDC1X %s, %s(%s)", ft, rs, rt);
12927 }
12928 
12929 
12930 /*
12931  *
12932  *
12933  *   3         2         1
12934  *  10987654321098765432109876543210
12935  *  001000               01001001101
12936  *     rt -----
12937  *          rs -----
12938  *               rd -----
12939  */
12940 static char *SDC1XS(uint64 instruction, Dis_info *info)
12941 {
12942     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12943     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12944     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
12945 
12946     const char *ft = FPR(ft_value, info);
12947     const char *rs = GPR(rs_value, info);
12948     const char *rt = GPR(rt_value, info);
12949 
12950     return img_format("SDC1XS %s, %s(%s)", ft, rs, rt);
12951 }
12952 
12953 
12954 /*
12955  *
12956  *
12957  *   3         2         1
12958  *  10987654321098765432109876543210
12959  *  001000               01001001101
12960  *     rt -----
12961  *          rs -----
12962  *               rd -----
12963  */
12964 static char *SDC2(uint64 instruction, Dis_info *info)
12965 {
12966     uint64 cs_value = extract_cs_25_24_23_22_21(instruction);
12967     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12968     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
12969 
12970     const char *rs = GPR(rs_value, info);
12971 
12972     return img_format("SDC2 CP%" PRIu64 ", %" PRId64 "(%s)",
12973                       cs_value, s_value, rs);
12974 }
12975 
12976 
12977 /*
12978  *
12979  *
12980  *   3         2         1
12981  *  10987654321098765432109876543210
12982  *  001000               01001001101
12983  *     rt -----
12984  *          rs -----
12985  *               rd -----
12986  */
12987 static char *SDM(uint64 instruction, Dis_info *info)
12988 {
12989     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
12990     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
12991     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
12992     uint64 count3_value = extract_count3_14_13_12(instruction);
12993 
12994     const char *rt = GPR(rt_value, info);
12995     const char *rs = GPR(rs_value, info);
12996     uint64 count3 = encode_count3_from_count(count3_value);
12997 
12998     return img_format("SDM %s, %" PRId64 "(%s), 0x%" PRIx64,
12999                       rt, s_value, rs, count3);
13000 }
13001 
13002 
13003 /*
13004  *
13005  *
13006  *   3         2         1
13007  *  10987654321098765432109876543210
13008  *  001000               01001001101
13009  *     rt -----
13010  *          rs -----
13011  *               rd -----
13012  */
13013 static char *SDPC_48_(uint64 instruction, Dis_info *info)
13014 {
13015     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
13016     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
13017 
13018     const char *rt = GPR(rt_value, info);
13019     g_autofree char *s = ADDRESS(s_value, 6, info);
13020 
13021     return img_format("SDPC %s, %s", rt, s);
13022 }
13023 
13024 
13025 /*
13026  *
13027  *
13028  *   3         2         1
13029  *  10987654321098765432109876543210
13030  *  001000               01001001101
13031  *     rt -----
13032  *          rs -----
13033  *               rd -----
13034  */
13035 static char *SDXS(uint64 instruction, Dis_info *info)
13036 {
13037     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13038     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13039     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13040 
13041     const char *rd = GPR(rd_value, info);
13042     const char *rs = GPR(rs_value, info);
13043     const char *rt = GPR(rt_value, info);
13044 
13045     return img_format("SDXS %s, %s(%s)", rd, rs, rt);
13046 }
13047 
13048 
13049 /*
13050  *
13051  *
13052  *   3         2         1
13053  *  10987654321098765432109876543210
13054  *  001000               01001001101
13055  *     rt -----
13056  *          rs -----
13057  *               rd -----
13058  */
13059 static char *SDX(uint64 instruction, Dis_info *info)
13060 {
13061     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13062     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13063     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13064 
13065     const char *rd = GPR(rd_value, info);
13066     const char *rs = GPR(rs_value, info);
13067     const char *rt = GPR(rt_value, info);
13068 
13069     return img_format("SDX %s, %s(%s)", rd, rs, rt);
13070 }
13071 
13072 
13073 /*
13074  *
13075  *
13076  *   3         2         1
13077  *  10987654321098765432109876543210
13078  *  001000               01001001101
13079  *     rt -----
13080  *          rs -----
13081  *               rd -----
13082  */
13083 static char *SEB(uint64 instruction, Dis_info *info)
13084 {
13085     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13086     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13087 
13088     const char *rt = GPR(rt_value, info);
13089     const char *rs = GPR(rs_value, info);
13090 
13091     return img_format("SEB %s, %s", rt, rs);
13092 }
13093 
13094 
13095 /*
13096  *
13097  *
13098  *   3         2         1
13099  *  10987654321098765432109876543210
13100  *  001000               01001001101
13101  *     rt -----
13102  *          rs -----
13103  *               rd -----
13104  */
13105 static char *SEH(uint64 instruction, Dis_info *info)
13106 {
13107     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13108     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13109 
13110     const char *rt = GPR(rt_value, info);
13111     const char *rs = GPR(rs_value, info);
13112 
13113     return img_format("SEH %s, %s", rt, rs);
13114 }
13115 
13116 
13117 /*
13118  *
13119  *
13120  *   3         2         1
13121  *  10987654321098765432109876543210
13122  *  001000               01001001101
13123  *     rt -----
13124  *          rs -----
13125  *               rd -----
13126  */
13127 static char *SEL_D(uint64 instruction, Dis_info *info)
13128 {
13129     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
13130     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
13131     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
13132 
13133     const char *fd = FPR(fd_value, info);
13134     const char *fs = FPR(fs_value, info);
13135     const char *ft = FPR(ft_value, info);
13136 
13137     return img_format("SEL.D %s, %s, %s", fd, fs, ft);
13138 }
13139 
13140 
13141 /*
13142  *
13143  *
13144  *   3         2         1
13145  *  10987654321098765432109876543210
13146  *  001000               01001001101
13147  *     rt -----
13148  *          rs -----
13149  *               rd -----
13150  */
13151 static char *SEL_S(uint64 instruction, Dis_info *info)
13152 {
13153     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
13154     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
13155     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
13156 
13157     const char *fd = FPR(fd_value, info);
13158     const char *fs = FPR(fs_value, info);
13159     const char *ft = FPR(ft_value, info);
13160 
13161     return img_format("SEL.S %s, %s, %s", fd, fs, ft);
13162 }
13163 
13164 
13165 /*
13166  *
13167  *
13168  *   3         2         1
13169  *  10987654321098765432109876543210
13170  *  001000               01001001101
13171  *     rt -----
13172  *          rs -----
13173  *               rd -----
13174  */
13175 static char *SELEQZ_D(uint64 instruction, Dis_info *info)
13176 {
13177     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
13178     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
13179     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
13180 
13181     const char *fd = FPR(fd_value, info);
13182     const char *fs = FPR(fs_value, info);
13183     const char *ft = FPR(ft_value, info);
13184 
13185     return img_format("SELEQZ.D %s, %s, %s", fd, fs, ft);
13186 }
13187 
13188 
13189 /*
13190  *
13191  *
13192  *   3         2         1
13193  *  10987654321098765432109876543210
13194  *  001000               01001001101
13195  *     rt -----
13196  *          rs -----
13197  *               rd -----
13198  */
13199 static char *SELEQZ_S(uint64 instruction, Dis_info *info)
13200 {
13201     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
13202     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
13203     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
13204 
13205     const char *fd = FPR(fd_value, info);
13206     const char *fs = FPR(fs_value, info);
13207     const char *ft = FPR(ft_value, info);
13208 
13209     return img_format("SELEQZ.S %s, %s, %s", fd, fs, ft);
13210 }
13211 
13212 
13213 /*
13214  *
13215  *
13216  *   3         2         1
13217  *  10987654321098765432109876543210
13218  *  001000               01001001101
13219  *     rt -----
13220  *          rs -----
13221  *               rd -----
13222  */
13223 static char *SELNEZ_D(uint64 instruction, Dis_info *info)
13224 {
13225     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
13226     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
13227     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
13228 
13229     const char *fd = FPR(fd_value, info);
13230     const char *fs = FPR(fs_value, info);
13231     const char *ft = FPR(ft_value, info);
13232 
13233     return img_format("SELNEZ.D %s, %s, %s", fd, fs, ft);
13234 }
13235 
13236 
13237 /*
13238  *
13239  *
13240  *   3         2         1
13241  *  10987654321098765432109876543210
13242  *  001000               01001001101
13243  *     rt -----
13244  *          rs -----
13245  *               rd -----
13246  */
13247 static char *SELNEZ_S(uint64 instruction, Dis_info *info)
13248 {
13249     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
13250     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
13251     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
13252 
13253     const char *fd = FPR(fd_value, info);
13254     const char *fs = FPR(fs_value, info);
13255     const char *ft = FPR(ft_value, info);
13256 
13257     return img_format("SELNEZ.S %s, %s, %s", fd, fs, ft);
13258 }
13259 
13260 
13261 /*
13262  *
13263  *
13264  *   3         2         1
13265  *  10987654321098765432109876543210
13266  *  001000               01001001101
13267  *     rt -----
13268  *          rs -----
13269  *               rd -----
13270  */
13271 static char *SEQI(uint64 instruction, Dis_info *info)
13272 {
13273     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13274     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13275     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
13276 
13277     const char *rt = GPR(rt_value, info);
13278     const char *rs = GPR(rs_value, info);
13279 
13280     return img_format("SEQI %s, %s, 0x%" PRIx64, rt, rs, u_value);
13281 }
13282 
13283 
13284 /*
13285  *
13286  *
13287  *   3         2         1
13288  *  10987654321098765432109876543210
13289  *  001000               01001001101
13290  *     rt -----
13291  *          rs -----
13292  *               rd -----
13293  */
13294 static char *SH_16_(uint64 instruction, Dis_info *info)
13295 {
13296     uint64 rtz3_value = extract_rtz3_9_8_7(instruction);
13297     uint64 rs3_value = extract_rs3_6_5_4(instruction);
13298     uint64 u_value = extract_u_2_1__s1(instruction);
13299 
13300     const char *rtz3 = GPR(decode_gpr_gpr3_src_store(rtz3_value, info), info);
13301     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
13302 
13303     return img_format("SH %s, 0x%" PRIx64 "(%s)", rtz3, u_value, rs3);
13304 }
13305 
13306 
13307 /*
13308  *
13309  *
13310  *   3         2         1
13311  *  10987654321098765432109876543210
13312  *  001000               01001001101
13313  *     rt -----
13314  *          rs -----
13315  *               rd -----
13316  */
13317 static char *SH_GP_(uint64 instruction, Dis_info *info)
13318 {
13319     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13320     uint64 u_value = extract_u_17_to_1__s1(instruction);
13321 
13322     const char *rt = GPR(rt_value, info);
13323 
13324     return img_format("SH %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
13325 }
13326 
13327 
13328 /*
13329  *
13330  *
13331  *   3         2         1
13332  *  10987654321098765432109876543210
13333  *  001000               01001001101
13334  *     rt -----
13335  *          rs -----
13336  *               rd -----
13337  */
13338 static char *SH_S9_(uint64 instruction, Dis_info *info)
13339 {
13340     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13341     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13342     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
13343 
13344     const char *rt = GPR(rt_value, info);
13345     const char *rs = GPR(rs_value, info);
13346 
13347     return img_format("SH %s, %" PRId64 "(%s)", rt, s_value, rs);
13348 }
13349 
13350 
13351 /*
13352  *
13353  *
13354  *   3         2         1
13355  *  10987654321098765432109876543210
13356  *  001000               01001001101
13357  *     rt -----
13358  *          rs -----
13359  *               rd -----
13360  */
13361 static char *SH_U12_(uint64 instruction, Dis_info *info)
13362 {
13363     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13364     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13365     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
13366 
13367     const char *rt = GPR(rt_value, info);
13368     const char *rs = GPR(rs_value, info);
13369 
13370     return img_format("SH %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
13371 }
13372 
13373 
13374 /*
13375  *
13376  *
13377  *   3         2         1
13378  *  10987654321098765432109876543210
13379  *  001000               01001001101
13380  *     rt -----
13381  *          rs -----
13382  *               rd -----
13383  */
13384 static char *SHE(uint64 instruction, Dis_info *info)
13385 {
13386     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13387     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13388     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
13389 
13390     const char *rt = GPR(rt_value, info);
13391     const char *rs = GPR(rs_value, info);
13392 
13393     return img_format("SHE %s, %" PRId64 "(%s)", rt, s_value, rs);
13394 }
13395 
13396 
13397 /*
13398  * [DSP] SHILO ac, shift - Shift an accumulator value leaving the result in
13399  *   the same accumulator
13400  *
13401  *   3         2         1
13402  *  10987654321098765432109876543210
13403  *  001000xxxx        xxxx0000011101
13404  *      shift ------
13405  *               ac --
13406  */
13407 static char *SHILO(uint64 instruction, Dis_info *info)
13408 {
13409     int64 shift_value = extract_shift__se5_21_20_19_18_17_16(instruction);
13410     uint64 ac_value = extract_ac_15_14(instruction);
13411 
13412     const char *ac = AC(ac_value, info);
13413 
13414     return img_format("SHILO %s, 0x%" PRIx64, ac, shift_value);
13415 }
13416 
13417 
13418 /*
13419  * [DSP] SHILOV ac, rs - Variable shift of accumulator value leaving the result
13420  *   in the same accumulator
13421  *
13422  *   3         2         1
13423  *  10987654321098765432109876543210
13424  *  001000xxxxx       01001001111111
13425  *          rs -----
13426  *               ac --
13427  */
13428 static char *SHILOV(uint64 instruction, Dis_info *info)
13429 {
13430     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13431     uint64 ac_value = extract_ac_15_14(instruction);
13432 
13433     const char *rs = GPR(rs_value, info);
13434     const char *ac = AC(ac_value, info);
13435 
13436     return img_format("SHILOV %s, %s", ac, rs);
13437 }
13438 
13439 
13440 /*
13441  * [DSP] SHLL.PH rt, rs, sa - Shift left logical vector pair halfwords
13442  *
13443  *   3         2         1
13444  *  10987654321098765432109876543210
13445  *  001000              001110110101
13446  *     rt -----
13447  *          rs -----
13448  *               sa ----
13449  */
13450 static char *SHLL_PH(uint64 instruction, Dis_info *info)
13451 {
13452     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13453     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13454     uint64 sa_value = extract_sa_15_14_13_12(instruction);
13455 
13456     const char *rt = GPR(rt_value, info);
13457     const char *rs = GPR(rs_value, info);
13458 
13459     return img_format("SHLL.PH %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13460 }
13461 
13462 
13463 /*
13464  * [DSP] SHLL.QB rt, rs, sa - Shift left logical vector quad bytes
13465  *
13466  *   3         2         1
13467  *  10987654321098765432109876543210
13468  *  001000             0100001111111
13469  *     rt -----
13470  *          rs -----
13471  *               sa ---
13472  */
13473 static char *SHLL_QB(uint64 instruction, Dis_info *info)
13474 {
13475     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13476     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13477     uint64 sa_value = extract_sa_15_14_13(instruction);
13478 
13479     const char *rt = GPR(rt_value, info);
13480     const char *rs = GPR(rs_value, info);
13481 
13482     return img_format("SHLL.QB %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13483 }
13484 
13485 
13486 /*
13487  * [DSP] SHLL_S.PH rt, rs, sa - Shift left logical vector pair halfwords
13488  *   with saturation
13489  *
13490  *   3         2         1
13491  *  10987654321098765432109876543210
13492  *  001000              001110110101
13493  *     rt -----
13494  *          rs -----
13495  *               sa ----
13496  */
13497 static char *SHLL_S_PH(uint64 instruction, Dis_info *info)
13498 {
13499     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13500     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13501     uint64 sa_value = extract_sa_15_14_13_12(instruction);
13502 
13503     const char *rt = GPR(rt_value, info);
13504     const char *rs = GPR(rs_value, info);
13505 
13506     return img_format("SHLL_S.PH %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13507 }
13508 
13509 
13510 /*
13511  * [DSP] SHLL_S.PH rt, rs, sa - Shift left logical word with saturation
13512  *
13513  *   3         2         1
13514  *  10987654321098765432109876543210
13515  *  001000               x1111110101
13516  *     rt -----
13517  *          rs -----
13518  *               sa -----
13519  */
13520 static char *SHLL_S_W(uint64 instruction, Dis_info *info)
13521 {
13522     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13523     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13524     uint64 sa_value = extract_sa_15_14_13_12_11(instruction);
13525 
13526     const char *rt = GPR(rt_value, info);
13527     const char *rs = GPR(rs_value, info);
13528 
13529     return img_format("SHLL_S.W %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13530 }
13531 
13532 
13533 /*
13534  * [DSP] SHLLV.PH rd, rt, rs - Shift left logical variable vector pair
13535  *   halfwords
13536  *
13537  *   3         2         1
13538  *  10987654321098765432109876543210
13539  *  001000               01110001101
13540  *     rt -----
13541  *          rs -----
13542  *               rd -----
13543  */
13544 static char *SHLLV_PH(uint64 instruction, Dis_info *info)
13545 {
13546     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13547     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13548     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13549 
13550     const char *rd = GPR(rd_value, info);
13551     const char *rt = GPR(rt_value, info);
13552     const char *rs = GPR(rs_value, info);
13553 
13554     return img_format("SHLLV.PH %s, %s, %s", rd, rt, rs);
13555 }
13556 
13557 
13558 /*
13559  * [DSP] SHLLV_S.QB rd, rt, rs - Shift left logical variable vector quad bytes
13560  *
13561  *   3         2         1
13562  *  10987654321098765432109876543210
13563  *  001000               x1110010101
13564  *     rt -----
13565  *          rs -----
13566  *               rd -----
13567  */
13568 static char *SHLLV_QB(uint64 instruction, Dis_info *info)
13569 {
13570     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13571     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13572     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13573 
13574     const char *rd = GPR(rd_value, info);
13575     const char *rt = GPR(rt_value, info);
13576     const char *rs = GPR(rs_value, info);
13577 
13578     return img_format("SHLLV.QB %s, %s, %s", rd, rt, rs);
13579 }
13580 
13581 
13582 /*
13583  * [DSP] SHLLV.PH rd, rt, rs - Shift left logical variable vector pair
13584  *   halfwords with saturation
13585  *
13586  *   3         2         1
13587  *  10987654321098765432109876543210
13588  *  001000               11110001101
13589  *     rt -----
13590  *          rs -----
13591  *               rd -----
13592  */
13593 static char *SHLLV_S_PH(uint64 instruction, Dis_info *info)
13594 {
13595     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13596     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13597     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13598 
13599     const char *rd = GPR(rd_value, info);
13600     const char *rt = GPR(rt_value, info);
13601     const char *rs = GPR(rs_value, info);
13602 
13603     return img_format("SHLLV_S.PH %s, %s, %s", rd, rt, rs);
13604 }
13605 
13606 
13607 /*
13608  * [DSP] SHLLV_S.W rd, rt, rs - Shift left logical variable vector word
13609  *
13610  *   3         2         1
13611  *  10987654321098765432109876543210
13612  *  001000               x1111010101
13613  *     rt -----
13614  *          rs -----
13615  *               rd -----
13616  */
13617 static char *SHLLV_S_W(uint64 instruction, Dis_info *info)
13618 {
13619     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13620     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13621     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13622 
13623     const char *rd = GPR(rd_value, info);
13624     const char *rt = GPR(rt_value, info);
13625     const char *rs = GPR(rs_value, info);
13626 
13627     return img_format("SHLLV_S.W %s, %s, %s", rd, rt, rs);
13628 }
13629 
13630 
13631 /*
13632  *
13633  *
13634  *   3         2         1
13635  *  10987654321098765432109876543210
13636  *  001000               01001001101
13637  *     rt -----
13638  *          rs -----
13639  *               rd -----
13640  */
13641 static char *SHRA_PH(uint64 instruction, Dis_info *info)
13642 {
13643     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13644     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13645     uint64 sa_value = extract_sa_15_14_13_12(instruction);
13646 
13647     const char *rt = GPR(rt_value, info);
13648     const char *rs = GPR(rs_value, info);
13649 
13650     return img_format("SHRA.PH %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13651 }
13652 
13653 
13654 /*
13655  *
13656  *
13657  *   3         2         1
13658  *  10987654321098765432109876543210
13659  *  001000               01001001101
13660  *     rt -----
13661  *          rs -----
13662  *               rd -----
13663  */
13664 static char *SHRA_QB(uint64 instruction, Dis_info *info)
13665 {
13666     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13667     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13668     uint64 sa_value = extract_sa_15_14_13(instruction);
13669 
13670     const char *rt = GPR(rt_value, info);
13671     const char *rs = GPR(rs_value, info);
13672 
13673     return img_format("SHRA.QB %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13674 }
13675 
13676 
13677 /*
13678  *
13679  *
13680  *   3         2         1
13681  *  10987654321098765432109876543210
13682  *  001000               01001001101
13683  *     rt -----
13684  *          rs -----
13685  *               rd -----
13686  */
13687 static char *SHRA_R_PH(uint64 instruction, Dis_info *info)
13688 {
13689     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13690     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13691     uint64 sa_value = extract_sa_15_14_13_12(instruction);
13692 
13693     const char *rt = GPR(rt_value, info);
13694     const char *rs = GPR(rs_value, info);
13695 
13696     return img_format("SHRA_R.PH %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13697 }
13698 
13699 
13700 /*
13701  *
13702  *
13703  *   3         2         1
13704  *  10987654321098765432109876543210
13705  *  001000               01001001101
13706  *     rt -----
13707  *          rs -----
13708  *               rd -----
13709  */
13710 static char *SHRA_R_QB(uint64 instruction, Dis_info *info)
13711 {
13712     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13713     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13714     uint64 sa_value = extract_sa_15_14_13(instruction);
13715 
13716     const char *rt = GPR(rt_value, info);
13717     const char *rs = GPR(rs_value, info);
13718 
13719     return img_format("SHRA_R.QB %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13720 }
13721 
13722 
13723 /*
13724  *
13725  *
13726  *   3         2         1
13727  *  10987654321098765432109876543210
13728  *  001000               01001001101
13729  *     rt -----
13730  *          rs -----
13731  *               rd -----
13732  */
13733 static char *SHRA_R_W(uint64 instruction, Dis_info *info)
13734 {
13735     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13736     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13737     uint64 sa_value = extract_sa_15_14_13_12_11(instruction);
13738 
13739     const char *rt = GPR(rt_value, info);
13740     const char *rs = GPR(rs_value, info);
13741 
13742     return img_format("SHRA_R.W %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13743 }
13744 
13745 
13746 /*
13747  *
13748  *
13749  *   3         2         1
13750  *  10987654321098765432109876543210
13751  *  001000               01001001101
13752  *     rt -----
13753  *          rs -----
13754  *               rd -----
13755  */
13756 static char *SHRAV_PH(uint64 instruction, Dis_info *info)
13757 {
13758     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13759     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13760     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13761 
13762     const char *rd = GPR(rd_value, info);
13763     const char *rt = GPR(rt_value, info);
13764     const char *rs = GPR(rs_value, info);
13765 
13766     return img_format("SHRAV.PH %s, %s, %s", rd, rt, rs);
13767 }
13768 
13769 
13770 /*
13771  *
13772  *
13773  *   3         2         1
13774  *  10987654321098765432109876543210
13775  *  001000               01001001101
13776  *     rt -----
13777  *          rs -----
13778  *               rd -----
13779  */
13780 static char *SHRAV_QB(uint64 instruction, Dis_info *info)
13781 {
13782     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13783     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13784     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13785 
13786     const char *rd = GPR(rd_value, info);
13787     const char *rt = GPR(rt_value, info);
13788     const char *rs = GPR(rs_value, info);
13789 
13790     return img_format("SHRAV.QB %s, %s, %s", rd, rt, rs);
13791 }
13792 
13793 
13794 /*
13795  *
13796  *
13797  *   3         2         1
13798  *  10987654321098765432109876543210
13799  *  001000               01001001101
13800  *     rt -----
13801  *          rs -----
13802  *               rd -----
13803  */
13804 static char *SHRAV_R_PH(uint64 instruction, Dis_info *info)
13805 {
13806     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13807     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13808     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13809 
13810     const char *rd = GPR(rd_value, info);
13811     const char *rt = GPR(rt_value, info);
13812     const char *rs = GPR(rs_value, info);
13813 
13814     return img_format("SHRAV_R.PH %s, %s, %s", rd, rt, rs);
13815 }
13816 
13817 
13818 /*
13819  *
13820  *
13821  *   3         2         1
13822  *  10987654321098765432109876543210
13823  *  001000               01001001101
13824  *     rt -----
13825  *          rs -----
13826  *               rd -----
13827  */
13828 static char *SHRAV_R_QB(uint64 instruction, Dis_info *info)
13829 {
13830     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13831     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13832     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13833 
13834     const char *rd = GPR(rd_value, info);
13835     const char *rt = GPR(rt_value, info);
13836     const char *rs = GPR(rs_value, info);
13837 
13838     return img_format("SHRAV_R.QB %s, %s, %s", rd, rt, rs);
13839 }
13840 
13841 
13842 /*
13843  *
13844  *
13845  *   3         2         1
13846  *  10987654321098765432109876543210
13847  *  001000               01001001101
13848  *     rt -----
13849  *          rs -----
13850  *               rd -----
13851  */
13852 static char *SHRAV_R_W(uint64 instruction, Dis_info *info)
13853 {
13854     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13855     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13856     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13857 
13858     const char *rd = GPR(rd_value, info);
13859     const char *rt = GPR(rt_value, info);
13860     const char *rs = GPR(rs_value, info);
13861 
13862     return img_format("SHRAV_R.W %s, %s, %s", rd, rt, rs);
13863 }
13864 
13865 
13866 /*
13867  * [DSP] SHRL.PH rt, rs, sa - Shift right logical two halfwords
13868  *
13869  *   3         2         1
13870  *  10987654321098765432109876543210
13871  *  001000              001111111111
13872  *     rt -----
13873  *          rs -----
13874  *               sa ----
13875  */
13876 static char *SHRL_PH(uint64 instruction, Dis_info *info)
13877 {
13878     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13879     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13880     uint64 sa_value = extract_sa_15_14_13_12(instruction);
13881 
13882     const char *rt = GPR(rt_value, info);
13883     const char *rs = GPR(rs_value, info);
13884 
13885     return img_format("SHRL.PH %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13886 }
13887 
13888 
13889 /*
13890  * [DSP] SHRL.QB rt, rs, sa - Shift right logical vector quad bytes
13891  *
13892  *   3         2         1
13893  *  10987654321098765432109876543210
13894  *  001000             1100001111111
13895  *     rt -----
13896  *          rs -----
13897  *               sa ---
13898  */
13899 static char *SHRL_QB(uint64 instruction, Dis_info *info)
13900 {
13901     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13902     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13903     uint64 sa_value = extract_sa_15_14_13(instruction);
13904 
13905     const char *rt = GPR(rt_value, info);
13906     const char *rs = GPR(rs_value, info);
13907 
13908     return img_format("SHRL.QB %s, %s, 0x%" PRIx64, rt, rs, sa_value);
13909 }
13910 
13911 
13912 /*
13913  * [DSP] SHLLV.PH rd, rt, rs - Shift right logical variable vector pair of
13914  *   halfwords
13915  *
13916  *   3         2         1
13917  *  10987654321098765432109876543210
13918  *  001000               x1100010101
13919  *     rt -----
13920  *          rs -----
13921  *               rd -----
13922  */
13923 static char *SHRLV_PH(uint64 instruction, Dis_info *info)
13924 {
13925     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13926     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13927     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13928 
13929     const char *rd = GPR(rd_value, info);
13930     const char *rt = GPR(rt_value, info);
13931     const char *rs = GPR(rs_value, info);
13932 
13933     return img_format("SHRLV.PH %s, %s, %s", rd, rt, rs);
13934 }
13935 
13936 
13937 /*
13938  * [DSP] SHLLV.QB rd, rt, rs - Shift right logical variable vector quad bytes
13939  *
13940  *   3         2         1
13941  *  10987654321098765432109876543210
13942  *  001000               x1101010101
13943  *     rt -----
13944  *          rs -----
13945  *               rd -----
13946  */
13947 static char *SHRLV_QB(uint64 instruction, Dis_info *info)
13948 {
13949     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13950     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13951     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13952 
13953     const char *rd = GPR(rd_value, info);
13954     const char *rt = GPR(rt_value, info);
13955     const char *rs = GPR(rs_value, info);
13956 
13957     return img_format("SHRLV.QB %s, %s, %s", rd, rt, rs);
13958 }
13959 
13960 
13961 /*
13962  *
13963  *
13964  *   3         2         1
13965  *  10987654321098765432109876543210
13966  *  001000               01001001101
13967  *     rt -----
13968  *          rs -----
13969  *               rd -----
13970  */
13971 static char *SHX(uint64 instruction, Dis_info *info)
13972 {
13973     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13974     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13975     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
13976 
13977     const char *rd = GPR(rd_value, info);
13978     const char *rs = GPR(rs_value, info);
13979     const char *rt = GPR(rt_value, info);
13980 
13981     return img_format("SHX %s, %s(%s)", rd, rs, rt);
13982 }
13983 
13984 
13985 /*
13986  *
13987  *
13988  *   3         2         1
13989  *  10987654321098765432109876543210
13990  *  001000               01001001101
13991  *     rt -----
13992  *          rs -----
13993  *               rd -----
13994  */
13995 static char *SHXS(uint64 instruction, Dis_info *info)
13996 {
13997     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
13998     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
13999     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14000 
14001     const char *rd = GPR(rd_value, info);
14002     const char *rs = GPR(rs_value, info);
14003     const char *rt = GPR(rt_value, info);
14004 
14005     return img_format("SHXS %s, %s(%s)", rd, rs, rt);
14006 }
14007 
14008 
14009 /*
14010  *
14011  *
14012  *   3         2         1
14013  *  10987654321098765432109876543210
14014  *  001000               01001001101
14015  *     rt -----
14016  *          rs -----
14017  *               rd -----
14018  */
14019 static char *SIGRIE(uint64 instruction, Dis_info *info)
14020 {
14021     uint64 code_value = extract_code_18_to_0(instruction);
14022 
14023 
14024     return img_format("SIGRIE 0x%" PRIx64, code_value);
14025 }
14026 
14027 
14028 /*
14029  *
14030  *
14031  *   3         2         1
14032  *  10987654321098765432109876543210
14033  *  001000               01001001101
14034  *     rt -----
14035  *          rs -----
14036  *               rd -----
14037  */
14038 static char *SLL_16_(uint64 instruction, Dis_info *info)
14039 {
14040     uint64 rt3_value = extract_rt3_9_8_7(instruction);
14041     uint64 rs3_value = extract_rs3_6_5_4(instruction);
14042     uint64 shift3_value = extract_shift3_2_1_0(instruction);
14043 
14044     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
14045     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
14046     uint64 shift3 = encode_shift3_from_shift(shift3_value);
14047 
14048     return img_format("SLL %s, %s, 0x%" PRIx64, rt3, rs3, shift3);
14049 }
14050 
14051 
14052 /*
14053  *
14054  *
14055  *   3         2         1
14056  *  10987654321098765432109876543210
14057  *  001000               01001001101
14058  *     rt -----
14059  *          rs -----
14060  *               rd -----
14061  */
14062 static char *SLL_32_(uint64 instruction, Dis_info *info)
14063 {
14064     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14065     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14066     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
14067 
14068     const char *rt = GPR(rt_value, info);
14069     const char *rs = GPR(rs_value, info);
14070 
14071     return img_format("SLL %s, %s, 0x%" PRIx64, rt, rs, shift_value);
14072 }
14073 
14074 
14075 /*
14076  *
14077  *
14078  *   3         2         1
14079  *  10987654321098765432109876543210
14080  *  001000               01001001101
14081  *     rt -----
14082  *          rs -----
14083  *               rd -----
14084  */
14085 static char *SLLV(uint64 instruction, Dis_info *info)
14086 {
14087     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14088     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14089     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14090 
14091     const char *rd = GPR(rd_value, info);
14092     const char *rs = GPR(rs_value, info);
14093     const char *rt = GPR(rt_value, info);
14094 
14095     return img_format("SLLV %s, %s, %s", rd, rs, rt);
14096 }
14097 
14098 
14099 /*
14100  *
14101  *
14102  *   3         2         1
14103  *  10987654321098765432109876543210
14104  *  001000               01001001101
14105  *     rt -----
14106  *          rs -----
14107  *               rd -----
14108  */
14109 static char *SLT(uint64 instruction, Dis_info *info)
14110 {
14111     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14112     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14113     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14114 
14115     const char *rd = GPR(rd_value, info);
14116     const char *rs = GPR(rs_value, info);
14117     const char *rt = GPR(rt_value, info);
14118 
14119     return img_format("SLT %s, %s, %s", rd, rs, rt);
14120 }
14121 
14122 
14123 /*
14124  *
14125  *
14126  *   3         2         1
14127  *  10987654321098765432109876543210
14128  *  001000               01001001101
14129  *     rt -----
14130  *          rs -----
14131  *               rd -----
14132  */
14133 static char *SLTI(uint64 instruction, Dis_info *info)
14134 {
14135     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14136     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14137     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
14138 
14139     const char *rt = GPR(rt_value, info);
14140     const char *rs = GPR(rs_value, info);
14141 
14142     return img_format("SLTI %s, %s, 0x%" PRIx64, rt, rs, u_value);
14143 }
14144 
14145 
14146 /*
14147  *
14148  *
14149  *   3         2         1
14150  *  10987654321098765432109876543210
14151  *  001000               01001001101
14152  *     rt -----
14153  *          rs -----
14154  *               rd -----
14155  */
14156 static char *SLTIU(uint64 instruction, Dis_info *info)
14157 {
14158     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14159     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14160     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
14161 
14162     const char *rt = GPR(rt_value, info);
14163     const char *rs = GPR(rs_value, info);
14164 
14165     return img_format("SLTIU %s, %s, 0x%" PRIx64, rt, rs, u_value);
14166 }
14167 
14168 
14169 /*
14170  *
14171  *
14172  *   3         2         1
14173  *  10987654321098765432109876543210
14174  *  001000               01001001101
14175  *     rt -----
14176  *          rs -----
14177  *               rd -----
14178  */
14179 static char *SLTU(uint64 instruction, Dis_info *info)
14180 {
14181     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14182     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14183     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14184 
14185     const char *rd = GPR(rd_value, info);
14186     const char *rs = GPR(rs_value, info);
14187     const char *rt = GPR(rt_value, info);
14188 
14189     return img_format("SLTU %s, %s, %s", rd, rs, rt);
14190 }
14191 
14192 
14193 /*
14194  *
14195  *
14196  *   3         2         1
14197  *  10987654321098765432109876543210
14198  *  001000               01001001101
14199  *     rt -----
14200  *          rs -----
14201  *               rd -----
14202  */
14203 static char *SOV(uint64 instruction, Dis_info *info)
14204 {
14205     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14206     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14207     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14208 
14209     const char *rd = GPR(rd_value, info);
14210     const char *rs = GPR(rs_value, info);
14211     const char *rt = GPR(rt_value, info);
14212 
14213     return img_format("SOV %s, %s, %s", rd, rs, rt);
14214 }
14215 
14216 
14217 /*
14218  *
14219  *
14220  *   3         2         1
14221  *  10987654321098765432109876543210
14222  *  001000               01001001101
14223  *     rt -----
14224  *          rs -----
14225  *               rd -----
14226  */
14227 static char *SPECIAL2(uint64 instruction, Dis_info *info)
14228 {
14229     uint64 op_value = extract_op_25_to_3(instruction);
14230 
14231 
14232     return img_format("SPECIAL2 0x%" PRIx64, op_value);
14233 }
14234 
14235 
14236 /*
14237  *
14238  *
14239  *   3         2         1
14240  *  10987654321098765432109876543210
14241  *  001000               01001001101
14242  *     rt -----
14243  *          rs -----
14244  *               rd -----
14245  */
14246 static char *SQRT_D(uint64 instruction, Dis_info *info)
14247 {
14248     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
14249     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
14250 
14251     const char *ft = FPR(ft_value, info);
14252     const char *fs = FPR(fs_value, info);
14253 
14254     return img_format("SQRT.D %s, %s", ft, fs);
14255 }
14256 
14257 
14258 /*
14259  *
14260  *
14261  *   3         2         1
14262  *  10987654321098765432109876543210
14263  *  001000               01001001101
14264  *     rt -----
14265  *          rs -----
14266  *               rd -----
14267  */
14268 static char *SQRT_S(uint64 instruction, Dis_info *info)
14269 {
14270     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
14271     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
14272 
14273     const char *ft = FPR(ft_value, info);
14274     const char *fs = FPR(fs_value, info);
14275 
14276     return img_format("SQRT.S %s, %s", ft, fs);
14277 }
14278 
14279 
14280 /*
14281  * SRA rd, rt, sa - Shift Word Right Arithmetic
14282  *
14283  *   3         2         1
14284  *  10987654321098765432109876543210
14285  *  00000000000               000011
14286  *          rt -----
14287  *               rd -----
14288  *                    sa -----
14289  */
14290 static char *SRA(uint64 instruction, Dis_info *info)
14291 {
14292     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14293     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14294     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
14295 
14296     const char *rt = GPR(rt_value, info);
14297     const char *rs = GPR(rs_value, info);
14298 
14299     return img_format("SRA %s, %s, 0x%" PRIx64, rt, rs, shift_value);
14300 }
14301 
14302 
14303 /*
14304  * SRAV rd, rt, rs - Shift Word Right Arithmetic Variable
14305  *
14306  *   3         2         1
14307  *  10987654321098765432109876543210
14308  *  001000               00000000111
14309  *     rs -----
14310  *          rt -----
14311  *               rd -----
14312  */
14313 static char *SRAV(uint64 instruction, Dis_info *info)
14314 {
14315     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14316     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14317     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14318 
14319     const char *rd = GPR(rd_value, info);
14320     const char *rs = GPR(rs_value, info);
14321     const char *rt = GPR(rt_value, info);
14322 
14323     return img_format("SRAV %s, %s, %s", rd, rs, rt);
14324 }
14325 
14326 
14327 /*
14328  *
14329  *
14330  *   3         2         1
14331  *  10987654321098765432109876543210
14332  *  001000               00000000111
14333  *     rs -----
14334  *          rt -----
14335  *               rd -----
14336  */
14337 static char *SRL_16_(uint64 instruction, Dis_info *info)
14338 {
14339     uint64 rt3_value = extract_rt3_9_8_7(instruction);
14340     uint64 rs3_value = extract_rs3_6_5_4(instruction);
14341     uint64 shift3_value = extract_shift3_2_1_0(instruction);
14342 
14343     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
14344     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
14345     uint64 shift3 = encode_shift3_from_shift(shift3_value);
14346 
14347     return img_format("SRL %s, %s, 0x%" PRIx64, rt3, rs3, shift3);
14348 }
14349 
14350 
14351 /*
14352  *
14353  *
14354  *   3         2         1
14355  *  10987654321098765432109876543210
14356  *  001000               01001001101
14357  *     rt -----
14358  *          rs -----
14359  *               rd -----
14360  */
14361 static char *SRL_32_(uint64 instruction, Dis_info *info)
14362 {
14363     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14364     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14365     uint64 shift_value = extract_shift_4_3_2_1_0(instruction);
14366 
14367     const char *rt = GPR(rt_value, info);
14368     const char *rs = GPR(rs_value, info);
14369 
14370     return img_format("SRL %s, %s, 0x%" PRIx64, rt, rs, shift_value);
14371 }
14372 
14373 
14374 /*
14375  *
14376  *
14377  *   3         2         1
14378  *  10987654321098765432109876543210
14379  *  001000               01001001101
14380  *     rt -----
14381  *          rs -----
14382  *               rd -----
14383  */
14384 static char *SRLV(uint64 instruction, Dis_info *info)
14385 {
14386     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14387     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14388     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14389 
14390     const char *rd = GPR(rd_value, info);
14391     const char *rs = GPR(rs_value, info);
14392     const char *rt = GPR(rt_value, info);
14393 
14394     return img_format("SRLV %s, %s, %s", rd, rs, rt);
14395 }
14396 
14397 
14398 /*
14399  *
14400  *
14401  *   3         2         1
14402  *  10987654321098765432109876543210
14403  *  001000               01001001101
14404  *     rt -----
14405  *          rs -----
14406  *               rd -----
14407  */
14408 static char *SUB(uint64 instruction, Dis_info *info)
14409 {
14410     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14411     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14412     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14413 
14414     const char *rd = GPR(rd_value, info);
14415     const char *rs = GPR(rs_value, info);
14416     const char *rt = GPR(rt_value, info);
14417 
14418     return img_format("SUB %s, %s, %s", rd, rs, rt);
14419 }
14420 
14421 
14422 /*
14423  *
14424  *
14425  *   3         2         1
14426  *  10987654321098765432109876543210
14427  *  001000               01001001101
14428  *     rt -----
14429  *          rs -----
14430  *               rd -----
14431  */
14432 static char *SUB_D(uint64 instruction, Dis_info *info)
14433 {
14434     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
14435     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
14436     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
14437 
14438     const char *fd = FPR(fd_value, info);
14439     const char *fs = FPR(fs_value, info);
14440     const char *ft = FPR(ft_value, info);
14441 
14442     return img_format("SUB.D %s, %s, %s", fd, fs, ft);
14443 }
14444 
14445 
14446 /*
14447  *
14448  *
14449  *   3         2         1
14450  *  10987654321098765432109876543210
14451  *  001000               01001001101
14452  *     rt -----
14453  *          rs -----
14454  *               rd -----
14455  */
14456 static char *SUB_S(uint64 instruction, Dis_info *info)
14457 {
14458     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
14459     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
14460     uint64 fd_value = extract_fd_15_14_13_12_11(instruction);
14461 
14462     const char *fd = FPR(fd_value, info);
14463     const char *fs = FPR(fs_value, info);
14464     const char *ft = FPR(ft_value, info);
14465 
14466     return img_format("SUB.S %s, %s, %s", fd, fs, ft);
14467 }
14468 
14469 
14470 /*
14471  *
14472  *
14473  *   3         2         1
14474  *  10987654321098765432109876543210
14475  *  001000               01001001101
14476  *     rt -----
14477  *          rs -----
14478  *               rd -----
14479  */
14480 static char *SUBQ_PH(uint64 instruction, Dis_info *info)
14481 {
14482     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14483     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14484     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14485 
14486     const char *rd = GPR(rd_value, info);
14487     const char *rs = GPR(rs_value, info);
14488     const char *rt = GPR(rt_value, info);
14489 
14490     return img_format("SUBQ.PH %s, %s, %s", rd, rs, rt);
14491 }
14492 
14493 
14494 /*
14495  * [DSP] SUBQ.S.PH rd, rt, rs - Subtract fractional halfword vectors and shift
14496  *   right to halve results
14497  *
14498  *   3         2         1
14499  *  10987654321098765432109876543210
14500  *  001000               01001001101
14501  *     rt -----
14502  *          rs -----
14503  *               rd -----
14504  */
14505 static char *SUBQ_S_PH(uint64 instruction, Dis_info *info)
14506 {
14507     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14508     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14509     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14510 
14511     const char *rd = GPR(rd_value, info);
14512     const char *rs = GPR(rs_value, info);
14513     const char *rt = GPR(rt_value, info);
14514 
14515     return img_format("SUBQ_S.PH %s, %s, %s", rd, rs, rt);
14516 }
14517 
14518 
14519 /*
14520  * [DSP] SUBQ.S.W rd, rt, rs - Subtract fractional halfword vectors and shift
14521  *   right to halve results
14522  *
14523  *   3         2         1
14524  *  10987654321098765432109876543210
14525  *  001000               01001001101
14526  *     rt -----
14527  *          rs -----
14528  *               rd -----
14529  */
14530 static char *SUBQ_S_W(uint64 instruction, Dis_info *info)
14531 {
14532     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14533     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14534     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14535 
14536     const char *rd = GPR(rd_value, info);
14537     const char *rs = GPR(rs_value, info);
14538     const char *rt = GPR(rt_value, info);
14539 
14540     return img_format("SUBQ_S.W %s, %s, %s", rd, rs, rt);
14541 }
14542 
14543 
14544 /*
14545  * [DSP] SUBQH.PH rd, rt, rs - Subtract fractional halfword vectors and shift
14546  *   right to halve results
14547  *
14548  *   3         2         1
14549  *  10987654321098765432109876543210
14550  *  001000               01001001101
14551  *     rt -----
14552  *          rs -----
14553  *               rd -----
14554  */
14555 static char *SUBQH_PH(uint64 instruction, Dis_info *info)
14556 {
14557     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14558     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14559     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14560 
14561     const char *rd = GPR(rd_value, info);
14562     const char *rs = GPR(rs_value, info);
14563     const char *rt = GPR(rt_value, info);
14564 
14565     return img_format("SUBQH.PH %s, %s, %s", rd, rs, rt);
14566 }
14567 
14568 
14569 /*
14570  * [DSP] SUBQH_R.PH rd, rt, rs - Subtract fractional halfword vectors and shift
14571  *   right to halve results
14572  *
14573  *   3         2         1
14574  *  10987654321098765432109876543210
14575  *  001000               01001001101
14576  *     rt -----
14577  *          rs -----
14578  *               rd -----
14579  */
14580 static char *SUBQH_R_PH(uint64 instruction, Dis_info *info)
14581 {
14582     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14583     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14584     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14585 
14586     const char *rd = GPR(rd_value, info);
14587     const char *rs = GPR(rs_value, info);
14588     const char *rt = GPR(rt_value, info);
14589 
14590     return img_format("SUBQH_R.PH %s, %s, %s", rd, rs, rt);
14591 }
14592 
14593 
14594 /*
14595  * [DSP] SUBQH_R.W rd, rt, rs - Subtract fractional halfword vectors and shift
14596  *   right to halve results with rounding
14597  *
14598  *   3         2         1
14599  *  10987654321098765432109876543210
14600  *  001000               11001001101
14601  *     rt -----
14602  *          rs -----
14603  *               rd -----
14604  */
14605 static char *SUBQH_R_W(uint64 instruction, Dis_info *info)
14606 {
14607     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14608     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14609     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14610 
14611     const char *rd = GPR(rd_value, info);
14612     const char *rs = GPR(rs_value, info);
14613     const char *rt = GPR(rt_value, info);
14614 
14615     return img_format("SUBQH_R.W %s, %s, %s", rd, rs, rt);
14616 }
14617 
14618 
14619 /*
14620  * [DSP] SUBQH.W rd, rs, rt - Subtract fractional words and shift right to
14621  *   halve results
14622  *
14623  *   3         2         1
14624  *  10987654321098765432109876543210
14625  *  001000               01010001101
14626  *     rt -----
14627  *          rs -----
14628  *               rd -----
14629  */
14630 static char *SUBQH_W(uint64 instruction, Dis_info *info)
14631 {
14632     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14633     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14634     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14635 
14636     const char *rd = GPR(rd_value, info);
14637     const char *rs = GPR(rs_value, info);
14638     const char *rt = GPR(rt_value, info);
14639 
14640     return img_format("SUBQH.W %s, %s, %s", rd, rs, rt);
14641 }
14642 
14643 
14644 /*
14645  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14646  *
14647  *   3         2         1
14648  *  10987654321098765432109876543210
14649  *  001000               00010001101
14650  *     rt -----
14651  *          rs -----
14652  *               rd -----
14653  */
14654 static char *SUBU_16_(uint64 instruction, Dis_info *info)
14655 {
14656     uint64 rt3_value = extract_rt3_9_8_7(instruction);
14657     uint64 rs3_value = extract_rs3_6_5_4(instruction);
14658     uint64 rd3_value = extract_rd3_3_2_1(instruction);
14659 
14660     const char *rd3 = GPR(decode_gpr_gpr3(rd3_value, info), info);
14661     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
14662     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
14663 
14664     return img_format("SUBU %s, %s, %s", rd3, rs3, rt3);
14665 }
14666 
14667 
14668 /*
14669  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14670  *
14671  *   3         2         1
14672  *  10987654321098765432109876543210
14673  *  001000               00010001101
14674  *     rt -----
14675  *          rs -----
14676  *               rd -----
14677  */
14678 static char *SUBU_32_(uint64 instruction, Dis_info *info)
14679 {
14680     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14681     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14682     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14683 
14684     const char *rd = GPR(rd_value, info);
14685     const char *rs = GPR(rs_value, info);
14686     const char *rt = GPR(rt_value, info);
14687 
14688     return img_format("SUBU %s, %s, %s", rd, rs, rt);
14689 }
14690 
14691 
14692 /*
14693  * [DSP] SUBU.PH rd, rs, rt - Subtract unsigned unsigned halfwords
14694  *
14695  *   3         2         1
14696  *  10987654321098765432109876543210
14697  *  001000               01100001101
14698  *     rt -----
14699  *          rs -----
14700  *               rd -----
14701  */
14702 static char *SUBU_PH(uint64 instruction, Dis_info *info)
14703 {
14704     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14705     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14706     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14707 
14708     const char *rd = GPR(rd_value, info);
14709     const char *rs = GPR(rs_value, info);
14710     const char *rt = GPR(rt_value, info);
14711 
14712     return img_format("SUBU.PH %s, %s, %s", rd, rs, rt);
14713 }
14714 
14715 
14716 /*
14717  * [DSP] SUBU.QB rd, rs, rt - Subtract unsigned quad byte vectors
14718  *
14719  *   3         2         1
14720  *  10987654321098765432109876543210
14721  *  001000               01011001101
14722  *     rt -----
14723  *          rs -----
14724  *               rd -----
14725  */
14726 static char *SUBU_QB(uint64 instruction, Dis_info *info)
14727 {
14728     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14729     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14730     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14731 
14732     const char *rd = GPR(rd_value, info);
14733     const char *rs = GPR(rs_value, info);
14734     const char *rt = GPR(rt_value, info);
14735 
14736     return img_format("SUBU.QB %s, %s, %s", rd, rs, rt);
14737 }
14738 
14739 
14740 /*
14741  * [DSP] SUBU_S.PH rd, rs, rt - Subtract unsigned unsigned halfwords with
14742  *   8-bit saturation
14743  *
14744  *   3         2         1
14745  *  10987654321098765432109876543210
14746  *  001000               11100001101
14747  *     rt -----
14748  *          rs -----
14749  *               rd -----
14750  */
14751 static char *SUBU_S_PH(uint64 instruction, Dis_info *info)
14752 {
14753     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14754     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14755     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14756 
14757     const char *rd = GPR(rd_value, info);
14758     const char *rs = GPR(rs_value, info);
14759     const char *rt = GPR(rt_value, info);
14760 
14761     return img_format("SUBU_S.PH %s, %s, %s", rd, rs, rt);
14762 }
14763 
14764 
14765 /*
14766  * [DSP] SUBU_S.QB rd, rs, rt - Subtract unsigned quad byte vectors with
14767  *   8-bit saturation
14768  *
14769  *   3         2         1
14770  *  10987654321098765432109876543210
14771  *  001000               11011001101
14772  *     rt -----
14773  *          rs -----
14774  *               rd -----
14775  */
14776 static char *SUBU_S_QB(uint64 instruction, Dis_info *info)
14777 {
14778     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14779     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14780     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14781 
14782     const char *rd = GPR(rd_value, info);
14783     const char *rs = GPR(rs_value, info);
14784     const char *rt = GPR(rt_value, info);
14785 
14786     return img_format("SUBU_S.QB %s, %s, %s", rd, rs, rt);
14787 }
14788 
14789 
14790 /*
14791  * [DSP] SUBUH.QB rd, rs, rt - Subtract unsigned bytes and right shift
14792  *   to halve results
14793  *
14794  *   3         2         1
14795  *  10987654321098765432109876543210
14796  *  001000               01101001101
14797  *     rt -----
14798  *          rs -----
14799  *               rd -----
14800  */
14801 static char *SUBUH_QB(uint64 instruction, Dis_info *info)
14802 {
14803     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14804     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14805     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14806 
14807     const char *rd = GPR(rd_value, info);
14808     const char *rs = GPR(rs_value, info);
14809     const char *rt = GPR(rt_value, info);
14810 
14811     return img_format("SUBUH.QB %s, %s, %s", rd, rs, rt);
14812 }
14813 
14814 
14815 /*
14816  * [DSP] SUBUH_R.QB rd, rs, rt - Subtract unsigned bytes and right shift
14817  *   to halve results with rounding
14818  *
14819  *   3         2         1
14820  *  10987654321098765432109876543210
14821  *  001000               11101001101
14822  *     rt -----
14823  *          rs -----
14824  *               rd -----
14825  */
14826 static char *SUBUH_R_QB(uint64 instruction, Dis_info *info)
14827 {
14828     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14829     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14830     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
14831 
14832     const char *rd = GPR(rd_value, info);
14833     const char *rs = GPR(rs_value, info);
14834     const char *rt = GPR(rt_value, info);
14835 
14836     return img_format("SUBUH_R.QB %s, %s, %s", rd, rs, rt);
14837 }
14838 
14839 
14840 /*
14841  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14842  *
14843  *   3         2         1
14844  *  10987654321098765432109876543210
14845  *  001000               00010001101
14846  *     rt -----
14847  *          rs -----
14848  *               rd -----
14849  */
14850 static char *SW_16_(uint64 instruction, Dis_info *info)
14851 {
14852     uint64 rtz3_value = extract_rtz3_9_8_7(instruction);
14853     uint64 rs3_value = extract_rs3_6_5_4(instruction);
14854     uint64 u_value = extract_u_3_2_1_0__s2(instruction);
14855 
14856     const char *rtz3 = GPR(decode_gpr_gpr3_src_store(rtz3_value, info), info);
14857     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
14858 
14859     return img_format("SW %s, 0x%" PRIx64 "(%s)", rtz3, u_value, rs3);
14860 }
14861 
14862 
14863 /*
14864  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14865  *
14866  *   3         2         1
14867  *  10987654321098765432109876543210
14868  *  001000               00010001101
14869  *     rt -----
14870  *          rs -----
14871  *               rd -----
14872  */
14873 static char *SW_4X4_(uint64 instruction, Dis_info *info)
14874 {
14875     uint64 rtz4_value = extract_rtz4_9_7_6_5(instruction);
14876     uint64 rs4_value = extract_rs4_4_2_1_0(instruction);
14877     uint64 u_value = extract_u_3_8__s2(instruction);
14878 
14879     const char *rtz4 = GPR(decode_gpr_gpr4_zero(rtz4_value, info), info);
14880     const char *rs4 = GPR(decode_gpr_gpr4(rs4_value, info), info);
14881 
14882     return img_format("SW %s, 0x%" PRIx64 "(%s)", rtz4, u_value, rs4);
14883 }
14884 
14885 
14886 /*
14887  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14888  *
14889  *   3         2         1
14890  *  10987654321098765432109876543210
14891  *  001000               00010001101
14892  *     rt -----
14893  *          rs -----
14894  *               rd -----
14895  */
14896 static char *SW_GP16_(uint64 instruction, Dis_info *info)
14897 {
14898     uint64 u_value = extract_u_6_5_4_3_2_1_0__s2(instruction);
14899     uint64 rtz3_value = extract_rtz3_9_8_7(instruction);
14900 
14901     const char *rtz3 = GPR(decode_gpr_gpr3_src_store(rtz3_value, info), info);
14902 
14903     return img_format("SW %s, 0x%" PRIx64 "($%d)", rtz3, u_value, 28);
14904 }
14905 
14906 
14907 /*
14908  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14909  *
14910  *   3         2         1
14911  *  10987654321098765432109876543210
14912  *  001000               00010001101
14913  *     rt -----
14914  *          rs -----
14915  *               rd -----
14916  */
14917 static char *SW_GP_(uint64 instruction, Dis_info *info)
14918 {
14919     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14920     uint64 u_value = extract_u_20_to_2__s2(instruction);
14921 
14922     const char *rt = GPR(rt_value, info);
14923 
14924     return img_format("SW %s, 0x%" PRIx64 "($%d)", rt, u_value, 28);
14925 }
14926 
14927 
14928 /*
14929  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14930  *
14931  *   3         2         1
14932  *  10987654321098765432109876543210
14933  *  001000               00010001101
14934  *     rt -----
14935  *          rs -----
14936  *               rd -----
14937  */
14938 static char *SW_S9_(uint64 instruction, Dis_info *info)
14939 {
14940     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14941     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
14942     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14943 
14944     const char *rt = GPR(rt_value, info);
14945     const char *rs = GPR(rs_value, info);
14946 
14947     return img_format("SW %s, %" PRId64 "(%s)", rt, s_value, rs);
14948 }
14949 
14950 
14951 /*
14952  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14953  *
14954  *   3         2         1
14955  *  10987654321098765432109876543210
14956  *  001000               00010001101
14957  *     rt -----
14958  *          rs -----
14959  *               rd -----
14960  */
14961 static char *SW_SP_(uint64 instruction, Dis_info *info)
14962 {
14963     uint64 rt_value = extract_rt_9_8_7_6_5(instruction);
14964     uint64 u_value = extract_u_4_3_2_1_0__s2(instruction);
14965 
14966     const char *rt = GPR(rt_value, info);
14967 
14968     return img_format("SW %s, 0x%" PRIx64 "($%d)", rt, u_value, 29);
14969 }
14970 
14971 
14972 /*
14973  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14974  *
14975  *   3         2         1
14976  *  10987654321098765432109876543210
14977  *  001000               00010001101
14978  *     rt -----
14979  *          rs -----
14980  *               rd -----
14981  */
14982 static char *SW_U12_(uint64 instruction, Dis_info *info)
14983 {
14984     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
14985     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
14986     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
14987 
14988     const char *rt = GPR(rt_value, info);
14989     const char *rs = GPR(rs_value, info);
14990 
14991     return img_format("SW %s, 0x%" PRIx64 "(%s)", rt, u_value, rs);
14992 }
14993 
14994 
14995 /*
14996  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
14997  *
14998  *   3         2         1
14999  *  10987654321098765432109876543210
15000  *  001000               00010001101
15001  *     rt -----
15002  *          rs -----
15003  *               rd -----
15004  */
15005 static char *SWC1_GP_(uint64 instruction, Dis_info *info)
15006 {
15007     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15008     uint64 u_value = extract_u_17_to_2__s2(instruction);
15009 
15010     const char *ft = FPR(ft_value, info);
15011 
15012     return img_format("SWC1 %s, 0x%" PRIx64 "($%d)", ft, u_value, 28);
15013 }
15014 
15015 
15016 /*
15017  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15018  *
15019  *   3         2         1
15020  *  10987654321098765432109876543210
15021  *  001000               00010001101
15022  *     rt -----
15023  *          rs -----
15024  *               rd -----
15025  */
15026 static char *SWC1_S9_(uint64 instruction, Dis_info *info)
15027 {
15028     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15029     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15030     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15031 
15032     const char *ft = FPR(ft_value, info);
15033     const char *rs = GPR(rs_value, info);
15034 
15035     return img_format("SWC1 %s, %" PRId64 "(%s)", ft, s_value, rs);
15036 }
15037 
15038 
15039 /*
15040  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15041  *
15042  *   3         2         1
15043  *  10987654321098765432109876543210
15044  *  001000               00010001101
15045  *     rt -----
15046  *          rs -----
15047  *               rd -----
15048  */
15049 static char *SWC1_U12_(uint64 instruction, Dis_info *info)
15050 {
15051     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15052     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15053     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
15054 
15055     const char *ft = FPR(ft_value, info);
15056     const char *rs = GPR(rs_value, info);
15057 
15058     return img_format("SWC1 %s, 0x%" PRIx64 "(%s)", ft, u_value, rs);
15059 }
15060 
15061 
15062 /*
15063  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15064  *
15065  *   3         2         1
15066  *  10987654321098765432109876543210
15067  *  001000               00010001101
15068  *     rt -----
15069  *          rs -----
15070  *               rd -----
15071  */
15072 static char *SWC1X(uint64 instruction, Dis_info *info)
15073 {
15074     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15075     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15076     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
15077 
15078     const char *ft = FPR(ft_value, info);
15079     const char *rs = GPR(rs_value, info);
15080     const char *rt = GPR(rt_value, info);
15081 
15082     return img_format("SWC1X %s, %s(%s)", ft, rs, rt);
15083 }
15084 
15085 
15086 /*
15087  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15088  *
15089  *   3         2         1
15090  *  10987654321098765432109876543210
15091  *  001000               00010001101
15092  *     rt -----
15093  *          rs -----
15094  *               rd -----
15095  */
15096 static char *SWC1XS(uint64 instruction, Dis_info *info)
15097 {
15098     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15099     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15100     uint64 ft_value = extract_ft_15_14_13_12_11(instruction);
15101 
15102     const char *ft = FPR(ft_value, info);
15103     const char *rs = GPR(rs_value, info);
15104     const char *rt = GPR(rt_value, info);
15105 
15106     return img_format("SWC1XS %s, %s(%s)", ft, rs, rt);
15107 }
15108 
15109 
15110 /*
15111  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15112  *
15113  *   3         2         1
15114  *  10987654321098765432109876543210
15115  *  001000               00010001101
15116  *     rt -----
15117  *          rs -----
15118  *               rd -----
15119  */
15120 static char *SWC2(uint64 instruction, Dis_info *info)
15121 {
15122     uint64 cs_value = extract_cs_25_24_23_22_21(instruction);
15123     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15124     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15125 
15126     const char *rs = GPR(rs_value, info);
15127 
15128     return img_format("SWC2 CP%" PRIu64 ", %" PRId64 "(%s)",
15129                       cs_value, s_value, rs);
15130 }
15131 
15132 
15133 /*
15134  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15135  *
15136  *   3         2         1
15137  *  10987654321098765432109876543210
15138  *  001000               00010001101
15139  *     rt -----
15140  *          rs -----
15141  *               rd -----
15142  */
15143 static char *SWE(uint64 instruction, Dis_info *info)
15144 {
15145     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15146     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15147     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15148 
15149     const char *rt = GPR(rt_value, info);
15150     const char *rs = GPR(rs_value, info);
15151 
15152     return img_format("SWE %s, %" PRId64 "(%s)", rt, s_value, rs);
15153 }
15154 
15155 
15156 /*
15157  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15158  *
15159  *   3         2         1
15160  *  10987654321098765432109876543210
15161  *  001000               00010001101
15162  *     rt -----
15163  *          rs -----
15164  *               rd -----
15165  */
15166 static char *SWM(uint64 instruction, Dis_info *info)
15167 {
15168     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15169     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15170     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15171     uint64 count3_value = extract_count3_14_13_12(instruction);
15172 
15173     const char *rt = GPR(rt_value, info);
15174     const char *rs = GPR(rs_value, info);
15175     uint64 count3 = encode_count3_from_count(count3_value);
15176 
15177     return img_format("SWM %s, %" PRId64 "(%s), 0x%" PRIx64,
15178                       rt, s_value, rs, count3);
15179 }
15180 
15181 
15182 /*
15183  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15184  *
15185  *   3         2         1
15186  *  10987654321098765432109876543210
15187  *  001000               00010001101
15188  *     rt -----
15189  *          rs -----
15190  *               rd -----
15191  */
15192 static char *SWPC_48_(uint64 instruction, Dis_info *info)
15193 {
15194     uint64 rt_value = extract_rt_41_40_39_38_37(instruction);
15195     int64 s_value = extract_s__se31_15_to_0_31_to_16(instruction);
15196 
15197     const char *rt = GPR(rt_value, info);
15198     g_autofree char *s = ADDRESS(s_value, 6, info);
15199 
15200     return img_format("SWPC %s, %s", rt, s);
15201 }
15202 
15203 
15204 /*
15205  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15206  *
15207  *   3         2         1
15208  *  10987654321098765432109876543210
15209  *  001000               00010001101
15210  *     rt -----
15211  *          rs -----
15212  *               rd -----
15213  */
15214 static char *SWX(uint64 instruction, Dis_info *info)
15215 {
15216     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15217     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15218     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
15219 
15220     const char *rd = GPR(rd_value, info);
15221     const char *rs = GPR(rs_value, info);
15222     const char *rt = GPR(rt_value, info);
15223 
15224     return img_format("SWX %s, %s(%s)", rd, rs, rt);
15225 }
15226 
15227 
15228 /*
15229  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15230  *
15231  *   3         2         1
15232  *  10987654321098765432109876543210
15233  *  001000               00010001101
15234  *     rt -----
15235  *          rs -----
15236  *               rd -----
15237  */
15238 static char *SWXS(uint64 instruction, Dis_info *info)
15239 {
15240     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15241     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15242     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
15243 
15244     const char *rd = GPR(rd_value, info);
15245     const char *rs = GPR(rs_value, info);
15246     const char *rt = GPR(rt_value, info);
15247 
15248     return img_format("SWXS %s, %s(%s)", rd, rs, rt);
15249 }
15250 
15251 
15252 /*
15253  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15254  *
15255  *   3         2         1
15256  *  10987654321098765432109876543210
15257  *  001000               00010001101
15258  *     rt -----
15259  *          rs -----
15260  *               rd -----
15261  */
15262 static char *SYNC(uint64 instruction, Dis_info *info)
15263 {
15264     uint64 stype_value = extract_stype_20_19_18_17_16(instruction);
15265 
15266 
15267     return img_format("SYNC 0x%" PRIx64, stype_value);
15268 }
15269 
15270 
15271 /*
15272  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15273  *
15274  *   3         2         1
15275  *  10987654321098765432109876543210
15276  *  001000               00010001101
15277  *     rt -----
15278  *          rs -----
15279  *               rd -----
15280  */
15281 static char *SYNCI(uint64 instruction, Dis_info *info)
15282 {
15283     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15284     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15285 
15286     const char *rs = GPR(rs_value, info);
15287 
15288     return img_format("SYNCI %" PRId64 "(%s)", s_value, rs);
15289 }
15290 
15291 
15292 /*
15293  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15294  *
15295  *   3         2         1
15296  *  10987654321098765432109876543210
15297  *  001000               00010001101
15298  *     rt -----
15299  *          rs -----
15300  *               rd -----
15301  */
15302 static char *SYNCIE(uint64 instruction, Dis_info *info)
15303 {
15304     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15305     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15306 
15307     const char *rs = GPR(rs_value, info);
15308 
15309     return img_format("SYNCIE %" PRId64 "(%s)", s_value, rs);
15310 }
15311 
15312 
15313 /*
15314  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15315  *
15316  *   3         2         1
15317  *  10987654321098765432109876543210
15318  *  001000               00010001101
15319  *     rt -----
15320  *          rs -----
15321  *               rd -----
15322  */
15323 static char *SYSCALL_16_(uint64 instruction, Dis_info *info)
15324 {
15325     uint64 code_value = extract_code_1_0(instruction);
15326 
15327 
15328     return img_format("SYSCALL 0x%" PRIx64, code_value);
15329 }
15330 
15331 
15332 /*
15333  * SYSCALL code - System Call. Cause a System Call Exception
15334  *
15335  *   3         2         1
15336  *  10987654321098765432109876543210
15337  *  00000000000010
15338  *           code ------------------
15339  */
15340 static char *SYSCALL_32_(uint64 instruction, Dis_info *info)
15341 {
15342     uint64 code_value = extract_code_17_to_0(instruction);
15343 
15344 
15345     return img_format("SYSCALL 0x%" PRIx64, code_value);
15346 }
15347 
15348 
15349 /*
15350  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15351  *
15352  *   3         2         1
15353  *  10987654321098765432109876543210
15354  *  001000               00010001101
15355  *     rt -----
15356  *          rs -----
15357  *               rd -----
15358  */
15359 static char *TEQ(uint64 instruction, Dis_info *info)
15360 {
15361     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15362     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15363 
15364     const char *rs = GPR(rs_value, info);
15365     const char *rt = GPR(rt_value, info);
15366 
15367     return img_format("TEQ %s, %s", rs, rt);
15368 }
15369 
15370 
15371 /*
15372  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15373  *
15374  *   3         2         1
15375  *  10987654321098765432109876543210
15376  *  001000               00010001101
15377  *     rt -----
15378  *          rs -----
15379  *               rd -----
15380  */
15381 static char *TLBGINV(uint64 instruction, Dis_info *info)
15382 {
15383     (void)instruction;
15384 
15385     return g_strdup("TLBGINV ");
15386 }
15387 
15388 
15389 /*
15390  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15391  *
15392  *   3         2         1
15393  *  10987654321098765432109876543210
15394  *  001000               00010001101
15395  *     rt -----
15396  *          rs -----
15397  *               rd -----
15398  */
15399 static char *TLBGINVF(uint64 instruction, Dis_info *info)
15400 {
15401     (void)instruction;
15402 
15403     return g_strdup("TLBGINVF ");
15404 }
15405 
15406 
15407 /*
15408  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15409  *
15410  *   3         2         1
15411  *  10987654321098765432109876543210
15412  *  001000               00010001101
15413  *     rt -----
15414  *          rs -----
15415  *               rd -----
15416  */
15417 static char *TLBGP(uint64 instruction, Dis_info *info)
15418 {
15419     (void)instruction;
15420 
15421     return g_strdup("TLBGP ");
15422 }
15423 
15424 
15425 /*
15426  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15427  *
15428  *   3         2         1
15429  *  10987654321098765432109876543210
15430  *  001000               00010001101
15431  *     rt -----
15432  *          rs -----
15433  *               rd -----
15434  */
15435 static char *TLBGR(uint64 instruction, Dis_info *info)
15436 {
15437     (void)instruction;
15438 
15439     return g_strdup("TLBGR ");
15440 }
15441 
15442 
15443 /*
15444  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15445  *
15446  *   3         2         1
15447  *  10987654321098765432109876543210
15448  *  001000               00010001101
15449  *     rt -----
15450  *          rs -----
15451  *               rd -----
15452  */
15453 static char *TLBGWI(uint64 instruction, Dis_info *info)
15454 {
15455     (void)instruction;
15456 
15457     return g_strdup("TLBGWI ");
15458 }
15459 
15460 
15461 /*
15462  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15463  *
15464  *   3         2         1
15465  *  10987654321098765432109876543210
15466  *  001000               00010001101
15467  *     rt -----
15468  *          rs -----
15469  *               rd -----
15470  */
15471 static char *TLBGWR(uint64 instruction, Dis_info *info)
15472 {
15473     (void)instruction;
15474 
15475     return g_strdup("TLBGWR ");
15476 }
15477 
15478 
15479 /*
15480  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15481  *
15482  *   3         2         1
15483  *  10987654321098765432109876543210
15484  *  001000               00010001101
15485  *     rt -----
15486  *          rs -----
15487  *               rd -----
15488  */
15489 static char *TLBINV(uint64 instruction, Dis_info *info)
15490 {
15491     (void)instruction;
15492 
15493     return g_strdup("TLBINV ");
15494 }
15495 
15496 
15497 /*
15498  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15499  *
15500  *   3         2         1
15501  *  10987654321098765432109876543210
15502  *  001000               00010001101
15503  *     rt -----
15504  *          rs -----
15505  *               rd -----
15506  */
15507 static char *TLBINVF(uint64 instruction, Dis_info *info)
15508 {
15509     (void)instruction;
15510 
15511     return g_strdup("TLBINVF ");
15512 }
15513 
15514 
15515 /*
15516  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15517  *
15518  *   3         2         1
15519  *  10987654321098765432109876543210
15520  *  001000               00010001101
15521  *     rt -----
15522  *          rs -----
15523  *               rd -----
15524  */
15525 static char *TLBP(uint64 instruction, Dis_info *info)
15526 {
15527     (void)instruction;
15528 
15529     return g_strdup("TLBP ");
15530 }
15531 
15532 
15533 /*
15534  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15535  *
15536  *   3         2         1
15537  *  10987654321098765432109876543210
15538  *  001000               00010001101
15539  *     rt -----
15540  *          rs -----
15541  *               rd -----
15542  */
15543 static char *TLBR(uint64 instruction, Dis_info *info)
15544 {
15545     (void)instruction;
15546 
15547     return g_strdup("TLBR ");
15548 }
15549 
15550 
15551 /*
15552  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15553  *
15554  *   3         2         1
15555  *  10987654321098765432109876543210
15556  *  001000               00010001101
15557  *     rt -----
15558  *          rs -----
15559  *               rd -----
15560  */
15561 static char *TLBWI(uint64 instruction, Dis_info *info)
15562 {
15563     (void)instruction;
15564 
15565     return g_strdup("TLBWI ");
15566 }
15567 
15568 
15569 /*
15570  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15571  *
15572  *   3         2         1
15573  *  10987654321098765432109876543210
15574  *  001000               00010001101
15575  *     rt -----
15576  *          rs -----
15577  *               rd -----
15578  */
15579 static char *TLBWR(uint64 instruction, Dis_info *info)
15580 {
15581     (void)instruction;
15582 
15583     return g_strdup("TLBWR ");
15584 }
15585 
15586 
15587 /*
15588  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15589  *
15590  *   3         2         1
15591  *  10987654321098765432109876543210
15592  *  001000               00010001101
15593  *     rt -----
15594  *          rs -----
15595  *               rd -----
15596  */
15597 static char *TNE(uint64 instruction, Dis_info *info)
15598 {
15599     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15600     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15601 
15602     const char *rs = GPR(rs_value, info);
15603     const char *rt = GPR(rt_value, info);
15604 
15605     return img_format("TNE %s, %s", rs, rt);
15606 }
15607 
15608 
15609 /*
15610  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15611  *
15612  *   3         2         1
15613  *  10987654321098765432109876543210
15614  *  001000               00010001101
15615  *     rt -----
15616  *          rs -----
15617  *               rd -----
15618  */
15619 static char *TRUNC_L_D(uint64 instruction, Dis_info *info)
15620 {
15621     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15622     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
15623 
15624     const char *ft = FPR(ft_value, info);
15625     const char *fs = FPR(fs_value, info);
15626 
15627     return img_format("TRUNC.L.D %s, %s", ft, fs);
15628 }
15629 
15630 
15631 /*
15632  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15633  *
15634  *   3         2         1
15635  *  10987654321098765432109876543210
15636  *  001000               00010001101
15637  *     rt -----
15638  *          rs -----
15639  *               rd -----
15640  */
15641 static char *TRUNC_L_S(uint64 instruction, Dis_info *info)
15642 {
15643     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15644     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
15645 
15646     const char *ft = FPR(ft_value, info);
15647     const char *fs = FPR(fs_value, info);
15648 
15649     return img_format("TRUNC.L.S %s, %s", ft, fs);
15650 }
15651 
15652 
15653 /*
15654  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15655  *
15656  *   3         2         1
15657  *  10987654321098765432109876543210
15658  *  001000               00010001101
15659  *     rt -----
15660  *          rs -----
15661  *               rd -----
15662  */
15663 static char *TRUNC_W_D(uint64 instruction, Dis_info *info)
15664 {
15665     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15666     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
15667 
15668     const char *ft = FPR(ft_value, info);
15669     const char *fs = FPR(fs_value, info);
15670 
15671     return img_format("TRUNC.W.D %s, %s", ft, fs);
15672 }
15673 
15674 
15675 /*
15676  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15677  *
15678  *   3         2         1
15679  *  10987654321098765432109876543210
15680  *  001000               00010001101
15681  *     rt -----
15682  *          rs -----
15683  *               rd -----
15684  */
15685 static char *TRUNC_W_S(uint64 instruction, Dis_info *info)
15686 {
15687     uint64 ft_value = extract_ft_25_24_23_22_21(instruction);
15688     uint64 fs_value = extract_fs_20_19_18_17_16(instruction);
15689 
15690     const char *ft = FPR(ft_value, info);
15691     const char *fs = FPR(fs_value, info);
15692 
15693     return img_format("TRUNC.W.S %s, %s", ft, fs);
15694 }
15695 
15696 
15697 /*
15698  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15699  *
15700  *   3         2         1
15701  *  10987654321098765432109876543210
15702  *  001000               00010001101
15703  *     rt -----
15704  *          rs -----
15705  *               rd -----
15706  */
15707 static char *UALDM(uint64 instruction, Dis_info *info)
15708 {
15709     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15710     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15711     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15712     uint64 count3_value = extract_count3_14_13_12(instruction);
15713 
15714     const char *rt = GPR(rt_value, info);
15715     const char *rs = GPR(rs_value, info);
15716     uint64 count3 = encode_count3_from_count(count3_value);
15717 
15718     return img_format("UALDM %s, %" PRId64 "(%s), 0x%" PRIx64,
15719                       rt, s_value, rs, count3);
15720 }
15721 
15722 
15723 /*
15724  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15725  *
15726  *   3         2         1
15727  *  10987654321098765432109876543210
15728  *  001000               00010001101
15729  *     rt -----
15730  *          rs -----
15731  *               rd -----
15732  */
15733 static char *UALH(uint64 instruction, Dis_info *info)
15734 {
15735     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15736     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15737     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15738 
15739     const char *rt = GPR(rt_value, info);
15740     const char *rs = GPR(rs_value, info);
15741 
15742     return img_format("UALH %s, %" PRId64 "(%s)", rt, s_value, rs);
15743 }
15744 
15745 
15746 /*
15747  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15748  *
15749  *   3         2         1
15750  *  10987654321098765432109876543210
15751  *  001000               00010001101
15752  *     rt -----
15753  *          rs -----
15754  *               rd -----
15755  */
15756 static char *UALWM(uint64 instruction, Dis_info *info)
15757 {
15758     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15759     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15760     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15761     uint64 count3_value = extract_count3_14_13_12(instruction);
15762 
15763     const char *rt = GPR(rt_value, info);
15764     const char *rs = GPR(rs_value, info);
15765     uint64 count3 = encode_count3_from_count(count3_value);
15766 
15767     return img_format("UALWM %s, %" PRId64 "(%s), 0x%" PRIx64,
15768                       rt, s_value, rs, count3);
15769 }
15770 
15771 
15772 /*
15773  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15774  *
15775  *   3         2         1
15776  *  10987654321098765432109876543210
15777  *  001000               00010001101
15778  *     rt -----
15779  *          rs -----
15780  *               rd -----
15781  */
15782 static char *UASDM(uint64 instruction, Dis_info *info)
15783 {
15784     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15785     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15786     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15787     uint64 count3_value = extract_count3_14_13_12(instruction);
15788 
15789     const char *rt = GPR(rt_value, info);
15790     const char *rs = GPR(rs_value, info);
15791     uint64 count3 = encode_count3_from_count(count3_value);
15792 
15793     return img_format("UASDM %s, %" PRId64 "(%s), 0x%" PRIx64,
15794                       rt, s_value, rs, count3);
15795 }
15796 
15797 
15798 /*
15799  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15800  *
15801  *   3         2         1
15802  *  10987654321098765432109876543210
15803  *  001000               00010001101
15804  *     rt -----
15805  *          rs -----
15806  *               rd -----
15807  */
15808 static char *UASH(uint64 instruction, Dis_info *info)
15809 {
15810     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15811     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15812     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15813 
15814     const char *rt = GPR(rt_value, info);
15815     const char *rs = GPR(rs_value, info);
15816 
15817     return img_format("UASH %s, %" PRId64 "(%s)", rt, s_value, rs);
15818 }
15819 
15820 
15821 /*
15822  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15823  *
15824  *   3         2         1
15825  *  10987654321098765432109876543210
15826  *  001000               00010001101
15827  *     rt -----
15828  *          rs -----
15829  *               rd -----
15830  */
15831 static char *UASWM(uint64 instruction, Dis_info *info)
15832 {
15833     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15834     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15835     int64 s_value = extract_s__se8_15_7_6_5_4_3_2_1_0(instruction);
15836     uint64 count3_value = extract_count3_14_13_12(instruction);
15837 
15838     const char *rt = GPR(rt_value, info);
15839     const char *rs = GPR(rs_value, info);
15840     uint64 count3 = encode_count3_from_count(count3_value);
15841 
15842     return img_format("UASWM %s, %" PRId64 "(%s), 0x%" PRIx64,
15843                       rt, s_value, rs, count3);
15844 }
15845 
15846 
15847 /*
15848  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15849  *
15850  *   3         2         1
15851  *  10987654321098765432109876543210
15852  *  001000               00010001101
15853  *     rt -----
15854  *          rs -----
15855  *               rd -----
15856  */
15857 static char *UDI(uint64 instruction, Dis_info *info)
15858 {
15859     uint64 op_value = extract_op_25_to_3(instruction);
15860 
15861 
15862     return img_format("UDI 0x%" PRIx64, op_value);
15863 }
15864 
15865 
15866 /*
15867  * WAIT code - Enter Wait State
15868  *
15869  *   3         2         1
15870  *  10987654321098765432109876543210
15871  *  001000          1100001101111111
15872  *   code ----------
15873  */
15874 static char *WAIT(uint64 instruction, Dis_info *info)
15875 {
15876     uint64 code_value = extract_code_25_24_23_22_21_20_19_18_17_16(instruction);
15877 
15878 
15879     return img_format("WAIT 0x%" PRIx64, code_value);
15880 }
15881 
15882 
15883 /*
15884  * [DSP] WRDSP rt, mask - Write selected fields from a GPR to the DSPControl
15885  *         register
15886  *
15887  *   3         2         1
15888  *  10987654321098765432109876543210
15889  *  001000            01011001111111
15890  *     rt -----
15891  *        mask -------
15892  */
15893 static char *WRDSP(uint64 instruction, Dis_info *info)
15894 {
15895     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15896     uint64 mask_value = extract_mask_20_19_18_17_16_15_14(instruction);
15897 
15898     const char *rt = GPR(rt_value, info);
15899 
15900     return img_format("WRDSP %s, 0x%" PRIx64, rt, mask_value);
15901 }
15902 
15903 
15904 /*
15905  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15906  *
15907  *   3         2         1
15908  *  10987654321098765432109876543210
15909  *  001000               00010001101
15910  *     rt -----
15911  *          rs -----
15912  *               rd -----
15913  */
15914 static char *WRPGPR(uint64 instruction, Dis_info *info)
15915 {
15916     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15917     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15918 
15919     const char *rt = GPR(rt_value, info);
15920     const char *rs = GPR(rs_value, info);
15921 
15922     return img_format("WRPGPR %s, %s", rt, rs);
15923 }
15924 
15925 
15926 /*
15927  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15928  *
15929  *   3         2         1
15930  *  10987654321098765432109876543210
15931  *  001000               00010001101
15932  *     rt -----
15933  *          rs -----
15934  *               rd -----
15935  */
15936 static char *XOR_16_(uint64 instruction, Dis_info *info)
15937 {
15938     uint64 rt3_value = extract_rt3_9_8_7(instruction);
15939     uint64 rs3_value = extract_rs3_6_5_4(instruction);
15940 
15941     const char *rs3 = GPR(decode_gpr_gpr3(rs3_value, info), info);
15942     const char *rt3 = GPR(decode_gpr_gpr3(rt3_value, info), info);
15943 
15944     return img_format("XOR %s, %s", rs3, rt3);
15945 }
15946 
15947 
15948 /*
15949  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15950  *
15951  *   3         2         1
15952  *  10987654321098765432109876543210
15953  *  001000               00010001101
15954  *     rt -----
15955  *          rs -----
15956  *               rd -----
15957  */
15958 static char *XOR_32_(uint64 instruction, Dis_info *info)
15959 {
15960     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15961     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15962     uint64 rd_value = extract_rd_15_14_13_12_11(instruction);
15963 
15964     const char *rd = GPR(rd_value, info);
15965     const char *rs = GPR(rs_value, info);
15966     const char *rt = GPR(rt_value, info);
15967 
15968     return img_format("XOR %s, %s, %s", rd, rs, rt);
15969 }
15970 
15971 
15972 /*
15973  * ADDQH_R.W rd, rt, rs - Add Fractional Words And Shift Right to Halve Results
15974  *
15975  *   3         2         1
15976  *  10987654321098765432109876543210
15977  *  001000               00010001101
15978  *     rt -----
15979  *          rs -----
15980  *               rd -----
15981  */
15982 static char *XORI(uint64 instruction, Dis_info *info)
15983 {
15984     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
15985     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
15986     uint64 u_value = extract_u_11_10_9_8_7_6_5_4_3_2_1_0(instruction);
15987 
15988     const char *rt = GPR(rt_value, info);
15989     const char *rs = GPR(rs_value, info);
15990 
15991     return img_format("XORI %s, %s, 0x%" PRIx64, rt, rs, u_value);
15992 }
15993 
15994 
15995 /*
15996  * YIELD rt, rs -
15997  *
15998  *   3         2         1
15999  *  10987654321098765432109876543210
16000  *  001000               00010001101
16001  *     rt -----
16002  *          rs -----
16003  */
16004 static char *YIELD(uint64 instruction, Dis_info *info)
16005 {
16006     uint64 rt_value = extract_rt_25_24_23_22_21(instruction);
16007     uint64 rs_value = extract_rs_20_19_18_17_16(instruction);
16008 
16009     const char *rt = GPR(rt_value, info);
16010     const char *rs = GPR(rs_value, info);
16011 
16012     return img_format("YIELD %s, %s", rt, rs);
16013 }
16014 
16015 
16016 
16017 /*
16018  *                nanoMIPS instruction pool organization
16019  *                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16020  *
16021  *
16022  *                 ┌─ P.ADDIU ─── P.RI ─── P.SYSCALL
16023  *                 │
16024  *                 │                                      ┌─ P.TRAP
16025  *                 │                                      │
16026  *                 │                      ┌─ _POOL32A0_0 ─┼─ P.CMOVE
16027  *                 │                      │               │
16028  *                 │                      │               └─ P.SLTU
16029  *                 │        ┌─ _POOL32A0 ─┤
16030  *                 │        │             │
16031  *                 │        │             │
16032  *                 │        │             └─ _POOL32A0_1 ─── CRC32
16033  *                 │        │
16034  *                 ├─ P32A ─┤
16035  *                 │        │                           ┌─ PP.LSX
16036  *                 │        │             ┌─ P.LSX ─────┤
16037  *                 │        │             │             └─ PP.LSXS
16038  *                 │        └─ _POOL32A7 ─┤
16039  *                 │                      │             ┌─ POOL32Axf_4
16040  *                 │                      └─ POOL32Axf ─┤
16041  *                 │                                    └─ POOL32Axf_5
16042  *                 │
16043  *                 ├─ PBAL
16044  *                 │
16045  *                 ├─ P.GP.W   ┌─ PP.LSX
16046  *         ┌─ P32 ─┤           │
16047  *         │       ├─ P.GP.BH ─┴─ PP.LSXS
16048  *         │       │
16049  *         │       ├─ P.J ─────── PP.BALRSC
16050  *         │       │
16051  *         │       ├─ P48I
16052  *         │       │           ┌─ P.SR
16053  *         │       │           │
16054  *         │       │           ├─ P.SHIFT
16055  *         │       │           │
16056  *         │       ├─ P.U12 ───┼─ P.ROTX
16057  *         │       │           │
16058  *         │       │           ├─ P.INS
16059  *         │       │           │
16060  *         │       │           └─ P.EXT
16061  *         │       │
16062  *         │       ├─ P.LS.U12 ── P.PREF.U12
16063  *         │       │
16064  *         │       ├─ P.BR1 ───── P.BR3A
16065  *         │       │
16066  *         │       │           ┌─ P.LS.S0 ─── P16.SYSCALL
16067  *         │       │           │
16068  *         │       │           │           ┌─ P.LL
16069  *         │       │           ├─ P.LS.S1 ─┤
16070  *         │       │           │           └─ P.SC
16071  *         │       │           │
16072  *         │       │           │           ┌─ P.PREFE
16073  *  MAJOR ─┤       ├─ P.LS.S9 ─┤           │
16074  *         │       │           ├─ P.LS.E0 ─┼─ P.LLE
16075  *         │       │           │           │
16076  *         │       │           │           └─ P.SCE
16077  *         │       │           │
16078  *         │       │           ├─ P.LS.WM
16079  *         │       │           │
16080  *         │       │           └─ P.LS.UAWM
16081  *         │       │
16082  *         │       │
16083  *         │       ├─ P.BR2
16084  *         │       │
16085  *         │       ├─ P.BRI
16086  *         │       │
16087  *         │       └─ P.LUI
16088  *         │
16089  *         │
16090  *         │       ┌─ P16.MV ──── P16.RI ─── P16.SYSCALL
16091  *         │       │
16092  *         │       ├─ P16.SR
16093  *         │       │
16094  *         │       ├─ P16.SHIFT
16095  *         │       │
16096  *         │       ├─ P16.4x4
16097  *         │       │
16098  *         │       ├─ P16C ────── POOL16C_0 ── POOL16C_00
16099  *         │       │
16100  *         └─ P16 ─┼─ P16.LB
16101  *                 │
16102  *                 ├─ P16.A1
16103  *                 │
16104  *                 ├─ P16.LH
16105  *                 │
16106  *                 ├─ P16.A2 ──── P.ADDIU[RS5]
16107  *                 │
16108  *                 ├─ P16.ADDU
16109  *                 │
16110  *                 └─ P16.BR ──┬─ P16.JRC
16111  *                             │
16112  *                             └─ P16.BR1
16113  *
16114  *
16115  *  (FP, DPS, and some minor instruction pools are omitted from the diagram)
16116  *
16117  */
16118 
16119 typedef enum  {
16120     instruction,
16121     call_instruction,
16122     branch_instruction,
16123     return_instruction,
16124     reserved_block,
16125     pool,
16126 } TABLE_ENTRY_TYPE;
16127 
16128 typedef enum {
16129     MIPS64_    = 0x00000001,
16130     XNP_       = 0x00000002,
16131     XMMS_      = 0x00000004,
16132     EVA_       = 0x00000008,
16133     DSP_       = 0x00000010,
16134     MT_        = 0x00000020,
16135     EJTAG_     = 0x00000040,
16136     TLBINV_    = 0x00000080,
16137     CP0_       = 0x00000100,
16138     CP1_       = 0x00000200,
16139     CP2_       = 0x00000400,
16140     UDI_       = 0x00000800,
16141     MCU_       = 0x00001000,
16142     VZ_        = 0x00002000,
16143     TLB_       = 0x00004000,
16144     MVH_       = 0x00008000,
16145     ALL_ATTRIBUTES = 0xffffffffull,
16146 } TABLE_ATTRIBUTE_TYPE;
16147 
16148 typedef bool (*conditional_function)(uint64 instruction);
16149 typedef char * (*disassembly_function)(uint64 instruction,
16150                                             Dis_info *info);
16151 
16152 typedef struct Pool {
16153     TABLE_ENTRY_TYPE     type;
16154     const struct Pool    *next_table;
16155     int                  next_table_size;
16156     int                  instructions_size;
16157     uint64               mask;
16158     uint64               value;
16159     disassembly_function disassembly;
16160     conditional_function condition;
16161     uint64               attributes;
16162 } Pool;
16163 
16164 static const Pool P_SYSCALL[2] = {
16165     { instruction         , 0                   , 0   , 32,
16166        0xfffc0000, 0x00080000, &SYSCALL_32_      , 0,
16167        0x0                 },        /* SYSCALL[32] */
16168     { instruction         , 0                   , 0   , 32,
16169        0xfffc0000, 0x000c0000, &HYPCALL          , 0,
16170        CP0_ | VZ_          },        /* HYPCALL */
16171 };
16172 
16173 
16174 static const Pool P_RI[4] = {
16175     { instruction         , 0                   , 0   , 32,
16176        0xfff80000, 0x00000000, &SIGRIE           , 0,
16177        0x0                 },        /* SIGRIE */
16178     { pool                , P_SYSCALL           , 2   , 32,
16179        0xfff80000, 0x00080000, 0                      , 0,
16180        0x0                 },        /* P.SYSCALL */
16181     { instruction         , 0                   , 0   , 32,
16182        0xfff80000, 0x00100000, &BREAK_32_        , 0,
16183        0x0                 },        /* BREAK[32] */
16184     { instruction         , 0                   , 0   , 32,
16185        0xfff80000, 0x00180000, &SDBBP_32_        , 0,
16186        EJTAG_              },        /* SDBBP[32] */
16187 };
16188 
16189 
16190 static const Pool P_ADDIU[2] = {
16191     { pool                , P_RI                , 4   , 32,
16192        0xffe00000, 0x00000000, 0                      , 0,
16193        0x0                 },        /* P.RI */
16194     { instruction         , 0                   , 0   , 32,
16195        0xfc000000, 0x00000000, &ADDIU_32_        , &ADDIU_32__cond   ,
16196        0x0                 },        /* ADDIU[32] */
16197 };
16198 
16199 
16200 static const Pool P_TRAP[2] = {
16201     { instruction         , 0                   , 0   , 32,
16202        0xfc0007ff, 0x20000000, &TEQ              , 0,
16203        XMMS_               },        /* TEQ */
16204     { instruction         , 0                   , 0   , 32,
16205        0xfc0007ff, 0x20000400, &TNE              , 0,
16206        XMMS_               },        /* TNE */
16207 };
16208 
16209 
16210 static const Pool P_CMOVE[2] = {
16211     { instruction         , 0                   , 0   , 32,
16212        0xfc0007ff, 0x20000210, &MOVZ             , 0,
16213        0x0                 },        /* MOVZ */
16214     { instruction         , 0                   , 0   , 32,
16215        0xfc0007ff, 0x20000610, &MOVN             , 0,
16216        0x0                 },        /* MOVN */
16217 };
16218 
16219 
16220 static const Pool P_D_MT_VPE[2] = {
16221     { instruction         , 0                   , 0   , 32,
16222        0xfc1f3fff, 0x20010ab0, &DMT              , 0,
16223        MT_                 },        /* DMT */
16224     { instruction         , 0                   , 0   , 32,
16225        0xfc1f3fff, 0x20000ab0, &DVPE             , 0,
16226        MT_                 },        /* DVPE */
16227 };
16228 
16229 
16230 static const Pool P_E_MT_VPE[2] = {
16231     { instruction         , 0                   , 0   , 32,
16232        0xfc1f3fff, 0x20010eb0, &EMT              , 0,
16233        MT_                 },        /* EMT */
16234     { instruction         , 0                   , 0   , 32,
16235        0xfc1f3fff, 0x20000eb0, &EVPE             , 0,
16236        MT_                 },        /* EVPE */
16237 };
16238 
16239 
16240 static const Pool _P_MT_VPE[2] = {
16241     { pool                , P_D_MT_VPE          , 2   , 32,
16242        0xfc003fff, 0x20000ab0, 0                      , 0,
16243        0x0                 },        /* P.D_MT_VPE */
16244     { pool                , P_E_MT_VPE          , 2   , 32,
16245        0xfc003fff, 0x20000eb0, 0                      , 0,
16246        0x0                 },        /* P.E_MT_VPE */
16247 };
16248 
16249 
16250 static const Pool P_MT_VPE[8] = {
16251     { reserved_block      , 0                   , 0   , 32,
16252        0xfc003bff, 0x200002b0, 0                      , 0,
16253        0x0                 },        /* P.MT_VPE~*(0) */
16254     { pool                , _P_MT_VPE           , 2   , 32,
16255        0xfc003bff, 0x20000ab0, 0                      , 0,
16256        0x0                 },        /* _P.MT_VPE */
16257     { reserved_block      , 0                   , 0   , 32,
16258        0xfc003bff, 0x200012b0, 0                      , 0,
16259        0x0                 },        /* P.MT_VPE~*(2) */
16260     { reserved_block      , 0                   , 0   , 32,
16261        0xfc003bff, 0x20001ab0, 0                      , 0,
16262        0x0                 },        /* P.MT_VPE~*(3) */
16263     { reserved_block      , 0                   , 0   , 32,
16264        0xfc003bff, 0x200022b0, 0                      , 0,
16265        0x0                 },        /* P.MT_VPE~*(4) */
16266     { reserved_block      , 0                   , 0   , 32,
16267        0xfc003bff, 0x20002ab0, 0                      , 0,
16268        0x0                 },        /* P.MT_VPE~*(5) */
16269     { reserved_block      , 0                   , 0   , 32,
16270        0xfc003bff, 0x200032b0, 0                      , 0,
16271        0x0                 },        /* P.MT_VPE~*(6) */
16272     { reserved_block      , 0                   , 0   , 32,
16273        0xfc003bff, 0x20003ab0, 0                      , 0,
16274        0x0                 },        /* P.MT_VPE~*(7) */
16275 };
16276 
16277 
16278 static const Pool P_DVP[2] = {
16279     { instruction         , 0                   , 0   , 32,
16280        0xfc00ffff, 0x20000390, &DVP              , 0,
16281        0x0                 },        /* DVP */
16282     { instruction         , 0                   , 0   , 32,
16283        0xfc00ffff, 0x20000790, &EVP              , 0,
16284        0x0                 },        /* EVP */
16285 };
16286 
16287 
16288 static const Pool P_SLTU[2] = {
16289     { pool                , P_DVP               , 2   , 32,
16290        0xfc00fbff, 0x20000390, 0                      , 0,
16291        0x0                 },        /* P.DVP */
16292     { instruction         , 0                   , 0   , 32,
16293        0xfc0003ff, 0x20000390, &SLTU             , &SLTU_cond        ,
16294        0x0                 },        /* SLTU */
16295 };
16296 
16297 
16298 static const Pool _POOL32A0[128] = {
16299     { pool                , P_TRAP              , 2   , 32,
16300        0xfc0003ff, 0x20000000, 0                      , 0,
16301        0x0                 },        /* P.TRAP */
16302     { instruction         , 0                   , 0   , 32,
16303        0xfc0003ff, 0x20000008, &SEB              , 0,
16304        XMMS_               },        /* SEB */
16305     { instruction         , 0                   , 0   , 32,
16306        0xfc0003ff, 0x20000010, &SLLV             , 0,
16307        0x0                 },        /* SLLV */
16308     { instruction         , 0                   , 0   , 32,
16309        0xfc0003ff, 0x20000018, &MUL_32_          , 0,
16310        0x0                 },        /* MUL[32] */
16311     { reserved_block      , 0                   , 0   , 32,
16312        0xfc0003ff, 0x20000020, 0                      , 0,
16313        0x0                 },        /* _POOL32A0~*(4) */
16314     { reserved_block      , 0                   , 0   , 32,
16315        0xfc0003ff, 0x20000028, 0                      , 0,
16316        0x0                 },        /* _POOL32A0~*(5) */
16317     { instruction         , 0                   , 0   , 32,
16318        0xfc0003ff, 0x20000030, &MFC0             , 0,
16319        0x0                 },        /* MFC0 */
16320     { instruction         , 0                   , 0   , 32,
16321        0xfc0003ff, 0x20000038, &MFHC0            , 0,
16322        CP0_ | MVH_         },        /* MFHC0 */
16323     { reserved_block      , 0                   , 0   , 32,
16324        0xfc0003ff, 0x20000040, 0                      , 0,
16325        0x0                 },        /* _POOL32A0~*(8) */
16326     { instruction         , 0                   , 0   , 32,
16327        0xfc0003ff, 0x20000048, &SEH              , 0,
16328        0x0                 },        /* SEH */
16329     { instruction         , 0                   , 0   , 32,
16330        0xfc0003ff, 0x20000050, &SRLV             , 0,
16331        0x0                 },        /* SRLV */
16332     { instruction         , 0                   , 0   , 32,
16333        0xfc0003ff, 0x20000058, &MUH              , 0,
16334        0x0                 },        /* MUH */
16335     { reserved_block      , 0                   , 0   , 32,
16336        0xfc0003ff, 0x20000060, 0                      , 0,
16337        0x0                 },        /* _POOL32A0~*(12) */
16338     { reserved_block      , 0                   , 0   , 32,
16339        0xfc0003ff, 0x20000068, 0                      , 0,
16340        0x0                 },        /* _POOL32A0~*(13) */
16341     { instruction         , 0                   , 0   , 32,
16342        0xfc0003ff, 0x20000070, &MTC0             , 0,
16343        CP0_                },        /* MTC0 */
16344     { instruction         , 0                   , 0   , 32,
16345        0xfc0003ff, 0x20000078, &MTHC0            , 0,
16346        CP0_ | MVH_         },        /* MTHC0 */
16347     { reserved_block      , 0                   , 0   , 32,
16348        0xfc0003ff, 0x20000080, 0                      , 0,
16349        0x0                 },        /* _POOL32A0~*(16) */
16350     { reserved_block      , 0                   , 0   , 32,
16351        0xfc0003ff, 0x20000088, 0                      , 0,
16352        0x0                 },        /* _POOL32A0~*(17) */
16353     { instruction         , 0                   , 0   , 32,
16354        0xfc0003ff, 0x20000090, &SRAV             , 0,
16355        0x0                 },        /* SRAV */
16356     { instruction         , 0                   , 0   , 32,
16357        0xfc0003ff, 0x20000098, &MULU             , 0,
16358        0x0                 },        /* MULU */
16359     { reserved_block      , 0                   , 0   , 32,
16360        0xfc0003ff, 0x200000a0, 0                      , 0,
16361        0x0                 },        /* _POOL32A0~*(20) */
16362     { reserved_block      , 0                   , 0   , 32,
16363        0xfc0003ff, 0x200000a8, 0                      , 0,
16364        0x0                 },        /* _POOL32A0~*(21) */
16365     { instruction         , 0                   , 0   , 32,
16366        0xfc0003ff, 0x200000b0, &MFGC0            , 0,
16367        CP0_ | VZ_          },        /* MFGC0 */
16368     { instruction         , 0                   , 0   , 32,
16369        0xfc0003ff, 0x200000b8, &MFHGC0           , 0,
16370        CP0_ | VZ_ | MVH_   },        /* MFHGC0 */
16371     { reserved_block      , 0                   , 0   , 32,
16372        0xfc0003ff, 0x200000c0, 0                      , 0,
16373        0x0                 },        /* _POOL32A0~*(24) */
16374     { reserved_block      , 0                   , 0   , 32,
16375        0xfc0003ff, 0x200000c8, 0                      , 0,
16376        0x0                 },        /* _POOL32A0~*(25) */
16377     { instruction         , 0                   , 0   , 32,
16378        0xfc0003ff, 0x200000d0, &ROTRV            , 0,
16379        0x0                 },        /* ROTRV */
16380     { instruction         , 0                   , 0   , 32,
16381        0xfc0003ff, 0x200000d8, &MUHU             , 0,
16382        0x0                 },        /* MUHU */
16383     { reserved_block      , 0                   , 0   , 32,
16384        0xfc0003ff, 0x200000e0, 0                      , 0,
16385        0x0                 },        /* _POOL32A0~*(28) */
16386     { reserved_block      , 0                   , 0   , 32,
16387        0xfc0003ff, 0x200000e8, 0                      , 0,
16388        0x0                 },        /* _POOL32A0~*(29) */
16389     { instruction         , 0                   , 0   , 32,
16390        0xfc0003ff, 0x200000f0, &MTGC0            , 0,
16391        CP0_ | VZ_          },        /* MTGC0 */
16392     { instruction         , 0                   , 0   , 32,
16393        0xfc0003ff, 0x200000f8, &MTHGC0           , 0,
16394        CP0_ | VZ_ | MVH_   },        /* MTHGC0 */
16395     { reserved_block      , 0                   , 0   , 32,
16396        0xfc0003ff, 0x20000100, 0                      , 0,
16397        0x0                 },        /* _POOL32A0~*(32) */
16398     { reserved_block      , 0                   , 0   , 32,
16399        0xfc0003ff, 0x20000108, 0                      , 0,
16400        0x0                 },        /* _POOL32A0~*(33) */
16401     { instruction         , 0                   , 0   , 32,
16402        0xfc0003ff, 0x20000110, &ADD              , 0,
16403        XMMS_               },        /* ADD */
16404     { instruction         , 0                   , 0   , 32,
16405        0xfc0003ff, 0x20000118, &DIV              , 0,
16406        0x0                 },        /* DIV */
16407     { reserved_block      , 0                   , 0   , 32,
16408        0xfc0003ff, 0x20000120, 0                      , 0,
16409        0x0                 },        /* _POOL32A0~*(36) */
16410     { reserved_block      , 0                   , 0   , 32,
16411        0xfc0003ff, 0x20000128, 0                      , 0,
16412        0x0                 },        /* _POOL32A0~*(37) */
16413     { instruction         , 0                   , 0   , 32,
16414        0xfc0003ff, 0x20000130, &DMFC0            , 0,
16415        CP0_ | MIPS64_      },        /* DMFC0 */
16416     { reserved_block      , 0                   , 0   , 32,
16417        0xfc0003ff, 0x20000138, 0                      , 0,
16418        0x0                 },        /* _POOL32A0~*(39) */
16419     { reserved_block      , 0                   , 0   , 32,
16420        0xfc0003ff, 0x20000140, 0                      , 0,
16421        0x0                 },        /* _POOL32A0~*(40) */
16422     { reserved_block      , 0                   , 0   , 32,
16423        0xfc0003ff, 0x20000148, 0                      , 0,
16424        0x0                 },        /* _POOL32A0~*(41) */
16425     { instruction         , 0                   , 0   , 32,
16426        0xfc0003ff, 0x20000150, &ADDU_32_         , 0,
16427        0x0                 },        /* ADDU[32] */
16428     { instruction         , 0                   , 0   , 32,
16429        0xfc0003ff, 0x20000158, &MOD              , 0,
16430        0x0                 },        /* MOD */
16431     { reserved_block      , 0                   , 0   , 32,
16432        0xfc0003ff, 0x20000160, 0                      , 0,
16433        0x0                 },        /* _POOL32A0~*(44) */
16434     { reserved_block      , 0                   , 0   , 32,
16435        0xfc0003ff, 0x20000168, 0                      , 0,
16436        0x0                 },        /* _POOL32A0~*(45) */
16437     { instruction         , 0                   , 0   , 32,
16438        0xfc0003ff, 0x20000170, &DMTC0            , 0,
16439        CP0_ | MIPS64_      },        /* DMTC0 */
16440     { reserved_block      , 0                   , 0   , 32,
16441        0xfc0003ff, 0x20000178, 0                      , 0,
16442        0x0                 },        /* _POOL32A0~*(47) */
16443     { reserved_block      , 0                   , 0   , 32,
16444        0xfc0003ff, 0x20000180, 0                      , 0,
16445        0x0                 },        /* _POOL32A0~*(48) */
16446     { reserved_block      , 0                   , 0   , 32,
16447        0xfc0003ff, 0x20000188, 0                      , 0,
16448        0x0                 },        /* _POOL32A0~*(49) */
16449     { instruction         , 0                   , 0   , 32,
16450        0xfc0003ff, 0x20000190, &SUB              , 0,
16451        XMMS_               },        /* SUB */
16452     { instruction         , 0                   , 0   , 32,
16453        0xfc0003ff, 0x20000198, &DIVU             , 0,
16454        0x0                 },        /* DIVU */
16455     { reserved_block      , 0                   , 0   , 32,
16456        0xfc0003ff, 0x200001a0, 0                      , 0,
16457        0x0                 },        /* _POOL32A0~*(52) */
16458     { reserved_block      , 0                   , 0   , 32,
16459        0xfc0003ff, 0x200001a8, 0                      , 0,
16460        0x0                 },        /* _POOL32A0~*(53) */
16461     { instruction         , 0                   , 0   , 32,
16462        0xfc0003ff, 0x200001b0, &DMFGC0           , 0,
16463        CP0_ | MIPS64_ | VZ_},        /* DMFGC0 */
16464     { reserved_block      , 0                   , 0   , 32,
16465        0xfc0003ff, 0x200001b8, 0                      , 0,
16466        0x0                 },        /* _POOL32A0~*(55) */
16467     { instruction         , 0                   , 0   , 32,
16468        0xfc0003ff, 0x200001c0, &RDHWR            , 0,
16469        XMMS_               },        /* RDHWR */
16470     { reserved_block      , 0                   , 0   , 32,
16471        0xfc0003ff, 0x200001c8, 0                      , 0,
16472        0x0                 },        /* _POOL32A0~*(57) */
16473     { instruction         , 0                   , 0   , 32,
16474        0xfc0003ff, 0x200001d0, &SUBU_32_         , 0,
16475        0x0                 },        /* SUBU[32] */
16476     { instruction         , 0                   , 0   , 32,
16477        0xfc0003ff, 0x200001d8, &MODU             , 0,
16478        0x0                 },        /* MODU */
16479     { reserved_block      , 0                   , 0   , 32,
16480        0xfc0003ff, 0x200001e0, 0                      , 0,
16481        0x0                 },        /* _POOL32A0~*(60) */
16482     { reserved_block      , 0                   , 0   , 32,
16483        0xfc0003ff, 0x200001e8, 0                      , 0,
16484        0x0                 },        /* _POOL32A0~*(61) */
16485     { instruction         , 0                   , 0   , 32,
16486        0xfc0003ff, 0x200001f0, &DMTGC0           , 0,
16487        CP0_ | MIPS64_ | VZ_},        /* DMTGC0 */
16488     { reserved_block      , 0                   , 0   , 32,
16489        0xfc0003ff, 0x200001f8, 0                      , 0,
16490        0x0                 },        /* _POOL32A0~*(63) */
16491     { reserved_block      , 0                   , 0   , 32,
16492        0xfc0003ff, 0x20000200, 0                      , 0,
16493        0x0                 },        /* _POOL32A0~*(64) */
16494     { reserved_block      , 0                   , 0   , 32,
16495        0xfc0003ff, 0x20000208, 0                      , 0,
16496        0x0                 },        /* _POOL32A0~*(65) */
16497     { pool                , P_CMOVE             , 2   , 32,
16498        0xfc0003ff, 0x20000210, 0                      , 0,
16499        0x0                 },        /* P.CMOVE */
16500     { reserved_block      , 0                   , 0   , 32,
16501        0xfc0003ff, 0x20000218, 0                      , 0,
16502        0x0                 },        /* _POOL32A0~*(67) */
16503     { reserved_block      , 0                   , 0   , 32,
16504        0xfc0003ff, 0x20000220, 0                      , 0,
16505        0x0                 },        /* _POOL32A0~*(68) */
16506     { instruction         , 0                   , 0   , 32,
16507        0xfc0003ff, 0x20000228, &FORK             , 0,
16508        MT_                 },        /* FORK */
16509     { instruction         , 0                   , 0   , 32,
16510        0xfc0003ff, 0x20000230, &MFTR             , 0,
16511        MT_                 },        /* MFTR */
16512     { instruction         , 0                   , 0   , 32,
16513        0xfc0003ff, 0x20000238, &MFHTR            , 0,
16514        MT_                 },        /* MFHTR */
16515     { reserved_block      , 0                   , 0   , 32,
16516        0xfc0003ff, 0x20000240, 0                      , 0,
16517        0x0                 },        /* _POOL32A0~*(72) */
16518     { reserved_block      , 0                   , 0   , 32,
16519        0xfc0003ff, 0x20000248, 0                      , 0,
16520        0x0                 },        /* _POOL32A0~*(73) */
16521     { instruction         , 0                   , 0   , 32,
16522        0xfc0003ff, 0x20000250, &AND_32_          , 0,
16523        0x0                 },        /* AND[32] */
16524     { reserved_block      , 0                   , 0   , 32,
16525        0xfc0003ff, 0x20000258, 0                      , 0,
16526        0x0                 },        /* _POOL32A0~*(75) */
16527     { reserved_block      , 0                   , 0   , 32,
16528        0xfc0003ff, 0x20000260, 0                      , 0,
16529        0x0                 },        /* _POOL32A0~*(76) */
16530     { instruction         , 0                   , 0   , 32,
16531        0xfc0003ff, 0x20000268, &YIELD            , 0,
16532        MT_                 },        /* YIELD */
16533     { instruction         , 0                   , 0   , 32,
16534        0xfc0003ff, 0x20000270, &MTTR             , 0,
16535        MT_                 },        /* MTTR */
16536     { instruction         , 0                   , 0   , 32,
16537        0xfc0003ff, 0x20000278, &MTHTR            , 0,
16538        MT_                 },        /* MTHTR */
16539     { reserved_block      , 0                   , 0   , 32,
16540        0xfc0003ff, 0x20000280, 0                      , 0,
16541        0x0                 },        /* _POOL32A0~*(80) */
16542     { reserved_block      , 0                   , 0   , 32,
16543        0xfc0003ff, 0x20000288, 0                      , 0,
16544        0x0                 },        /* _POOL32A0~*(81) */
16545     { instruction         , 0                   , 0   , 32,
16546        0xfc0003ff, 0x20000290, &OR_32_           , 0,
16547        0x0                 },        /* OR[32] */
16548     { reserved_block      , 0                   , 0   , 32,
16549        0xfc0003ff, 0x20000298, 0                      , 0,
16550        0x0                 },        /* _POOL32A0~*(83) */
16551     { reserved_block      , 0                   , 0   , 32,
16552        0xfc0003ff, 0x200002a0, 0                      , 0,
16553        0x0                 },        /* _POOL32A0~*(84) */
16554     { reserved_block      , 0                   , 0   , 32,
16555        0xfc0003ff, 0x200002a8, 0                      , 0,
16556        0x0                 },        /* _POOL32A0~*(85) */
16557     { pool                , P_MT_VPE            , 8   , 32,
16558        0xfc0003ff, 0x200002b0, 0                      , 0,
16559        0x0                 },        /* P.MT_VPE */
16560     { reserved_block      , 0                   , 0   , 32,
16561        0xfc0003ff, 0x200002b8, 0                      , 0,
16562        0x0                 },        /* _POOL32A0~*(87) */
16563     { reserved_block      , 0                   , 0   , 32,
16564        0xfc0003ff, 0x200002c0, 0                      , 0,
16565        0x0                 },        /* _POOL32A0~*(88) */
16566     { reserved_block      , 0                   , 0   , 32,
16567        0xfc0003ff, 0x200002c8, 0                      , 0,
16568        0x0                 },        /* _POOL32A0~*(89) */
16569     { instruction         , 0                   , 0   , 32,
16570        0xfc0003ff, 0x200002d0, &NOR              , 0,
16571        0x0                 },        /* NOR */
16572     { reserved_block      , 0                   , 0   , 32,
16573        0xfc0003ff, 0x200002d8, 0                      , 0,
16574        0x0                 },        /* _POOL32A0~*(91) */
16575     { reserved_block      , 0                   , 0   , 32,
16576        0xfc0003ff, 0x200002e0, 0                      , 0,
16577        0x0                 },        /* _POOL32A0~*(92) */
16578     { reserved_block      , 0                   , 0   , 32,
16579        0xfc0003ff, 0x200002e8, 0                      , 0,
16580        0x0                 },        /* _POOL32A0~*(93) */
16581     { reserved_block      , 0                   , 0   , 32,
16582        0xfc0003ff, 0x200002f0, 0                      , 0,
16583        0x0                 },        /* _POOL32A0~*(94) */
16584     { reserved_block      , 0                   , 0   , 32,
16585        0xfc0003ff, 0x200002f8, 0                      , 0,
16586        0x0                 },        /* _POOL32A0~*(95) */
16587     { reserved_block      , 0                   , 0   , 32,
16588        0xfc0003ff, 0x20000300, 0                      , 0,
16589        0x0                 },        /* _POOL32A0~*(96) */
16590     { reserved_block      , 0                   , 0   , 32,
16591        0xfc0003ff, 0x20000308, 0                      , 0,
16592        0x0                 },        /* _POOL32A0~*(97) */
16593     { instruction         , 0                   , 0   , 32,
16594        0xfc0003ff, 0x20000310, &XOR_32_          , 0,
16595        0x0                 },        /* XOR[32] */
16596     { reserved_block      , 0                   , 0   , 32,
16597        0xfc0003ff, 0x20000318, 0                      , 0,
16598        0x0                 },        /* _POOL32A0~*(99) */
16599     { reserved_block      , 0                   , 0   , 32,
16600        0xfc0003ff, 0x20000320, 0                      , 0,
16601        0x0                 },        /* _POOL32A0~*(100) */
16602     { reserved_block      , 0                   , 0   , 32,
16603        0xfc0003ff, 0x20000328, 0                      , 0,
16604        0x0                 },        /* _POOL32A0~*(101) */
16605     { reserved_block      , 0                   , 0   , 32,
16606        0xfc0003ff, 0x20000330, 0                      , 0,
16607        0x0                 },        /* _POOL32A0~*(102) */
16608     { reserved_block      , 0                   , 0   , 32,
16609        0xfc0003ff, 0x20000338, 0                      , 0,
16610        0x0                 },        /* _POOL32A0~*(103) */
16611     { reserved_block      , 0                   , 0   , 32,
16612        0xfc0003ff, 0x20000340, 0                      , 0,
16613        0x0                 },        /* _POOL32A0~*(104) */
16614     { reserved_block      , 0                   , 0   , 32,
16615        0xfc0003ff, 0x20000348, 0                      , 0,
16616        0x0                 },        /* _POOL32A0~*(105) */
16617     { instruction         , 0                   , 0   , 32,
16618        0xfc0003ff, 0x20000350, &SLT              , 0,
16619        0x0                 },        /* SLT */
16620     { reserved_block      , 0                   , 0   , 32,
16621        0xfc0003ff, 0x20000358, 0                      , 0,
16622        0x0                 },        /* _POOL32A0~*(107) */
16623     { reserved_block      , 0                   , 0   , 32,
16624        0xfc0003ff, 0x20000360, 0                      , 0,
16625        0x0                 },        /* _POOL32A0~*(108) */
16626     { reserved_block      , 0                   , 0   , 32,
16627        0xfc0003ff, 0x20000368, 0                      , 0,
16628        0x0                 },        /* _POOL32A0~*(109) */
16629     { reserved_block      , 0                   , 0   , 32,
16630        0xfc0003ff, 0x20000370, 0                      , 0,
16631        0x0                 },        /* _POOL32A0~*(110) */
16632     { reserved_block      , 0                   , 0   , 32,
16633        0xfc0003ff, 0x20000378, 0                      , 0,
16634        0x0                 },        /* _POOL32A0~*(111) */
16635     { reserved_block      , 0                   , 0   , 32,
16636        0xfc0003ff, 0x20000380, 0                      , 0,
16637        0x0                 },        /* _POOL32A0~*(112) */
16638     { reserved_block      , 0                   , 0   , 32,
16639        0xfc0003ff, 0x20000388, 0                      , 0,
16640        0x0                 },        /* _POOL32A0~*(113) */
16641     { pool                , P_SLTU              , 2   , 32,
16642        0xfc0003ff, 0x20000390, 0                      , 0,
16643        0x0                 },        /* P.SLTU */
16644     { reserved_block      , 0                   , 0   , 32,
16645        0xfc0003ff, 0x20000398, 0                      , 0,
16646        0x0                 },        /* _POOL32A0~*(115) */
16647     { reserved_block      , 0                   , 0   , 32,
16648        0xfc0003ff, 0x200003a0, 0                      , 0,
16649        0x0                 },        /* _POOL32A0~*(116) */
16650     { reserved_block      , 0                   , 0   , 32,
16651        0xfc0003ff, 0x200003a8, 0                      , 0,
16652        0x0                 },        /* _POOL32A0~*(117) */
16653     { reserved_block      , 0                   , 0   , 32,
16654        0xfc0003ff, 0x200003b0, 0                      , 0,
16655        0x0                 },        /* _POOL32A0~*(118) */
16656     { reserved_block      , 0                   , 0   , 32,
16657        0xfc0003ff, 0x200003b8, 0                      , 0,
16658        0x0                 },        /* _POOL32A0~*(119) */
16659     { reserved_block      , 0                   , 0   , 32,
16660        0xfc0003ff, 0x200003c0, 0                      , 0,
16661        0x0                 },        /* _POOL32A0~*(120) */
16662     { reserved_block      , 0                   , 0   , 32,
16663        0xfc0003ff, 0x200003c8, 0                      , 0,
16664        0x0                 },        /* _POOL32A0~*(121) */
16665     { instruction         , 0                   , 0   , 32,
16666        0xfc0003ff, 0x200003d0, &SOV              , 0,
16667        0x0                 },        /* SOV */
16668     { reserved_block      , 0                   , 0   , 32,
16669        0xfc0003ff, 0x200003d8, 0                      , 0,
16670        0x0                 },        /* _POOL32A0~*(123) */
16671     { reserved_block      , 0                   , 0   , 32,
16672        0xfc0003ff, 0x200003e0, 0                      , 0,
16673        0x0                 },        /* _POOL32A0~*(124) */
16674     { reserved_block      , 0                   , 0   , 32,
16675        0xfc0003ff, 0x200003e8, 0                      , 0,
16676        0x0                 },        /* _POOL32A0~*(125) */
16677     { reserved_block      , 0                   , 0   , 32,
16678        0xfc0003ff, 0x200003f0, 0                      , 0,
16679        0x0                 },        /* _POOL32A0~*(126) */
16680     { reserved_block      , 0                   , 0   , 32,
16681        0xfc0003ff, 0x200003f8, 0                      , 0,
16682        0x0                 },        /* _POOL32A0~*(127) */
16683 };
16684 
16685 
16686 static const Pool ADDQ__S__PH[2] = {
16687     { instruction         , 0                   , 0   , 32,
16688        0xfc0007ff, 0x2000000d, &ADDQ_PH          , 0,
16689        DSP_                },        /* ADDQ.PH */
16690     { instruction         , 0                   , 0   , 32,
16691        0xfc0007ff, 0x2000040d, &ADDQ_S_PH        , 0,
16692        DSP_                },        /* ADDQ_S.PH */
16693 };
16694 
16695 
16696 static const Pool MUL__S__PH[2] = {
16697     { instruction         , 0                   , 0   , 32,
16698        0xfc0007ff, 0x2000002d, &MUL_PH           , 0,
16699        DSP_                },        /* MUL.PH */
16700     { instruction         , 0                   , 0   , 32,
16701        0xfc0007ff, 0x2000042d, &MUL_S_PH         , 0,
16702        DSP_                },        /* MUL_S.PH */
16703 };
16704 
16705 
16706 static const Pool ADDQH__R__PH[2] = {
16707     { instruction         , 0                   , 0   , 32,
16708        0xfc0007ff, 0x2000004d, &ADDQH_PH         , 0,
16709        DSP_                },        /* ADDQH.PH */
16710     { instruction         , 0                   , 0   , 32,
16711        0xfc0007ff, 0x2000044d, &ADDQH_R_PH       , 0,
16712        DSP_                },        /* ADDQH_R.PH */
16713 };
16714 
16715 
16716 static const Pool ADDQH__R__W[2] = {
16717     { instruction         , 0                   , 0   , 32,
16718        0xfc0007ff, 0x2000008d, &ADDQH_W          , 0,
16719        DSP_                },        /* ADDQH.W */
16720     { instruction         , 0                   , 0   , 32,
16721        0xfc0007ff, 0x2000048d, &ADDQH_R_W        , 0,
16722        DSP_                },        /* ADDQH_R.W */
16723 };
16724 
16725 
16726 static const Pool ADDU__S__QB[2] = {
16727     { instruction         , 0                   , 0   , 32,
16728        0xfc0007ff, 0x200000cd, &ADDU_QB          , 0,
16729        DSP_                },        /* ADDU.QB */
16730     { instruction         , 0                   , 0   , 32,
16731        0xfc0007ff, 0x200004cd, &ADDU_S_QB        , 0,
16732        DSP_                },        /* ADDU_S.QB */
16733 };
16734 
16735 
16736 static const Pool ADDU__S__PH[2] = {
16737     { instruction         , 0                   , 0   , 32,
16738        0xfc0007ff, 0x2000010d, &ADDU_PH          , 0,
16739        DSP_                },        /* ADDU.PH */
16740     { instruction         , 0                   , 0   , 32,
16741        0xfc0007ff, 0x2000050d, &ADDU_S_PH        , 0,
16742        DSP_                },        /* ADDU_S.PH */
16743 };
16744 
16745 
16746 static const Pool ADDUH__R__QB[2] = {
16747     { instruction         , 0                   , 0   , 32,
16748        0xfc0007ff, 0x2000014d, &ADDUH_QB         , 0,
16749        DSP_                },        /* ADDUH.QB */
16750     { instruction         , 0                   , 0   , 32,
16751        0xfc0007ff, 0x2000054d, &ADDUH_R_QB       , 0,
16752        DSP_                },        /* ADDUH_R.QB */
16753 };
16754 
16755 
16756 static const Pool SHRAV__R__PH[2] = {
16757     { instruction         , 0                   , 0   , 32,
16758        0xfc0007ff, 0x2000018d, &SHRAV_PH         , 0,
16759        DSP_                },        /* SHRAV.PH */
16760     { instruction         , 0                   , 0   , 32,
16761        0xfc0007ff, 0x2000058d, &SHRAV_R_PH       , 0,
16762        DSP_                },        /* SHRAV_R.PH */
16763 };
16764 
16765 
16766 static const Pool SHRAV__R__QB[2] = {
16767     { instruction         , 0                   , 0   , 32,
16768        0xfc0007ff, 0x200001cd, &SHRAV_QB         , 0,
16769        DSP_                },        /* SHRAV.QB */
16770     { instruction         , 0                   , 0   , 32,
16771        0xfc0007ff, 0x200005cd, &SHRAV_R_QB       , 0,
16772        DSP_                },        /* SHRAV_R.QB */
16773 };
16774 
16775 
16776 static const Pool SUBQ__S__PH[2] = {
16777     { instruction         , 0                   , 0   , 32,
16778        0xfc0007ff, 0x2000020d, &SUBQ_PH          , 0,
16779        DSP_                },        /* SUBQ.PH */
16780     { instruction         , 0                   , 0   , 32,
16781        0xfc0007ff, 0x2000060d, &SUBQ_S_PH        , 0,
16782        DSP_                },        /* SUBQ_S.PH */
16783 };
16784 
16785 
16786 static const Pool SUBQH__R__PH[2] = {
16787     { instruction         , 0                   , 0   , 32,
16788        0xfc0007ff, 0x2000024d, &SUBQH_PH         , 0,
16789        DSP_                },        /* SUBQH.PH */
16790     { instruction         , 0                   , 0   , 32,
16791        0xfc0007ff, 0x2000064d, &SUBQH_R_PH       , 0,
16792        DSP_                },        /* SUBQH_R.PH */
16793 };
16794 
16795 
16796 static const Pool SUBQH__R__W[2] = {
16797     { instruction         , 0                   , 0   , 32,
16798        0xfc0007ff, 0x2000028d, &SUBQH_W          , 0,
16799        DSP_                },        /* SUBQH.W */
16800     { instruction         , 0                   , 0   , 32,
16801        0xfc0007ff, 0x2000068d, &SUBQH_R_W        , 0,
16802        DSP_                },        /* SUBQH_R.W */
16803 };
16804 
16805 
16806 static const Pool SUBU__S__QB[2] = {
16807     { instruction         , 0                   , 0   , 32,
16808        0xfc0007ff, 0x200002cd, &SUBU_QB          , 0,
16809        DSP_                },        /* SUBU.QB */
16810     { instruction         , 0                   , 0   , 32,
16811        0xfc0007ff, 0x200006cd, &SUBU_S_QB        , 0,
16812        DSP_                },        /* SUBU_S.QB */
16813 };
16814 
16815 
16816 static const Pool SUBU__S__PH[2] = {
16817     { instruction         , 0                   , 0   , 32,
16818        0xfc0007ff, 0x2000030d, &SUBU_PH          , 0,
16819        DSP_                },        /* SUBU.PH */
16820     { instruction         , 0                   , 0   , 32,
16821        0xfc0007ff, 0x2000070d, &SUBU_S_PH        , 0,
16822        DSP_                },        /* SUBU_S.PH */
16823 };
16824 
16825 
16826 static const Pool SHRA__R__PH[2] = {
16827     { instruction         , 0                   , 0   , 32,
16828        0xfc0007ff, 0x20000335, &SHRA_PH          , 0,
16829        DSP_                },        /* SHRA.PH */
16830     { instruction         , 0                   , 0   , 32,
16831        0xfc0007ff, 0x20000735, &SHRA_R_PH        , 0,
16832        DSP_                },        /* SHRA_R.PH */
16833 };
16834 
16835 
16836 static const Pool SUBUH__R__QB[2] = {
16837     { instruction         , 0                   , 0   , 32,
16838        0xfc0007ff, 0x2000034d, &SUBUH_QB         , 0,
16839        DSP_                },        /* SUBUH.QB */
16840     { instruction         , 0                   , 0   , 32,
16841        0xfc0007ff, 0x2000074d, &SUBUH_R_QB       , 0,
16842        DSP_                },        /* SUBUH_R.QB */
16843 };
16844 
16845 
16846 static const Pool SHLLV__S__PH[2] = {
16847     { instruction         , 0                   , 0   , 32,
16848        0xfc0007ff, 0x2000038d, &SHLLV_PH         , 0,
16849        DSP_                },        /* SHLLV.PH */
16850     { instruction         , 0                   , 0   , 32,
16851        0xfc0007ff, 0x2000078d, &SHLLV_S_PH       , 0,
16852        DSP_                },        /* SHLLV_S.PH */
16853 };
16854 
16855 
16856 static const Pool SHLL__S__PH[4] = {
16857     { instruction         , 0                   , 0   , 32,
16858        0xfc000fff, 0x200003b5, &SHLL_PH          , 0,
16859        DSP_                },        /* SHLL.PH */
16860     { reserved_block      , 0                   , 0   , 32,
16861        0xfc000fff, 0x200007b5, 0                      , 0,
16862        0x0                 },        /* SHLL[_S].PH~*(1) */
16863     { instruction         , 0                   , 0   , 32,
16864        0xfc000fff, 0x20000bb5, &SHLL_S_PH        , 0,
16865        DSP_                },        /* SHLL_S.PH */
16866     { reserved_block      , 0                   , 0   , 32,
16867        0xfc000fff, 0x20000fb5, 0                      , 0,
16868        0x0                 },        /* SHLL[_S].PH~*(3) */
16869 };
16870 
16871 
16872 static const Pool PRECR_SRA__R__PH_W[2] = {
16873     { instruction         , 0                   , 0   , 32,
16874        0xfc0007ff, 0x200003cd, &PRECR_SRA_PH_W   , 0,
16875        DSP_                },        /* PRECR_SRA.PH.W */
16876     { instruction         , 0                   , 0   , 32,
16877        0xfc0007ff, 0x200007cd, &PRECR_SRA_R_PH_W , 0,
16878        DSP_                },        /* PRECR_SRA_R.PH.W */
16879 };
16880 
16881 
16882 static const Pool _POOL32A5[128] = {
16883     { instruction         , 0                   , 0   , 32,
16884        0xfc0003ff, 0x20000005, &CMP_EQ_PH        , 0,
16885        DSP_                },        /* CMP.EQ.PH */
16886     { pool                , ADDQ__S__PH         , 2   , 32,
16887        0xfc0003ff, 0x2000000d, 0                      , 0,
16888        0x0                 },        /* ADDQ[_S].PH */
16889     { reserved_block      , 0                   , 0   , 32,
16890        0xfc0003ff, 0x20000015, 0                      , 0,
16891        0x0                 },        /* _POOL32A5~*(2) */
16892     { instruction         , 0                   , 0   , 32,
16893        0xfc0003ff, 0x2000001d, &SHILO            , 0,
16894        DSP_                },        /* SHILO */
16895     { instruction         , 0                   , 0   , 32,
16896        0xfc0003ff, 0x20000025, &MULEQ_S_W_PHL    , 0,
16897        DSP_                },        /* MULEQ_S.W.PHL */
16898     { pool                , MUL__S__PH          , 2   , 32,
16899        0xfc0003ff, 0x2000002d, 0                      , 0,
16900        0x0                 },        /* MUL[_S].PH */
16901     { reserved_block      , 0                   , 0   , 32,
16902        0xfc0003ff, 0x20000035, 0                      , 0,
16903        0x0                 },        /* _POOL32A5~*(6) */
16904     { instruction         , 0                   , 0   , 32,
16905        0xfc0003ff, 0x2000003d, &REPL_PH          , 0,
16906        DSP_                },        /* REPL.PH */
16907     { instruction         , 0                   , 0   , 32,
16908        0xfc0003ff, 0x20000045, &CMP_LT_PH        , 0,
16909        DSP_                },        /* CMP.LT.PH */
16910     { pool                , ADDQH__R__PH        , 2   , 32,
16911        0xfc0003ff, 0x2000004d, 0                      , 0,
16912        0x0                 },        /* ADDQH[_R].PH */
16913     { reserved_block      , 0                   , 0   , 32,
16914        0xfc0003ff, 0x20000055, 0                      , 0,
16915        0x0                 },        /* _POOL32A5~*(10) */
16916     { reserved_block      , 0                   , 0   , 32,
16917        0xfc0003ff, 0x2000005d, 0                      , 0,
16918        0x0                 },        /* _POOL32A5~*(11) */
16919     { instruction         , 0                   , 0   , 32,
16920        0xfc0003ff, 0x20000065, &MULEQ_S_W_PHR    , 0,
16921        DSP_                },        /* MULEQ_S.W.PHR */
16922     { instruction         , 0                   , 0   , 32,
16923        0xfc0003ff, 0x2000006d, &PRECR_QB_PH      , 0,
16924        DSP_                },        /* PRECR.QB.PH */
16925     { reserved_block      , 0                   , 0   , 32,
16926        0xfc0003ff, 0x20000075, 0                      , 0,
16927        0x0                 },        /* _POOL32A5~*(14) */
16928     { reserved_block      , 0                   , 0   , 32,
16929        0xfc0003ff, 0x2000007d, 0                      , 0,
16930        0x0                 },        /* _POOL32A5~*(15) */
16931     { instruction         , 0                   , 0   , 32,
16932        0xfc0003ff, 0x20000085, &CMP_LE_PH        , 0,
16933        DSP_                },        /* CMP.LE.PH */
16934     { pool                , ADDQH__R__W         , 2   , 32,
16935        0xfc0003ff, 0x2000008d, 0                      , 0,
16936        0x0                 },        /* ADDQH[_R].W */
16937     { instruction         , 0                   , 0   , 32,
16938        0xfc0003ff, 0x20000095, &MULEU_S_PH_QBL   , 0,
16939        DSP_                },        /* MULEU_S.PH.QBL */
16940     { reserved_block      , 0                   , 0   , 32,
16941        0xfc0003ff, 0x2000009d, 0                      , 0,
16942        0x0                 },        /* _POOL32A5~*(19) */
16943     { reserved_block      , 0                   , 0   , 32,
16944        0xfc0003ff, 0x200000a5, 0                      , 0,
16945        0x0                 },        /* _POOL32A5~*(20) */
16946     { instruction         , 0                   , 0   , 32,
16947        0xfc0003ff, 0x200000ad, &PRECRQ_QB_PH     , 0,
16948        DSP_                },        /* PRECRQ.QB.PH */
16949     { reserved_block      , 0                   , 0   , 32,
16950        0xfc0003ff, 0x200000b5, 0                      , 0,
16951        0x0                 },        /* _POOL32A5~*(22) */
16952     { reserved_block      , 0                   , 0   , 32,
16953        0xfc0003ff, 0x200000bd, 0                      , 0,
16954        0x0                 },        /* _POOL32A5~*(23) */
16955     { instruction         , 0                   , 0   , 32,
16956        0xfc0003ff, 0x200000c5, &CMPGU_EQ_QB      , 0,
16957        DSP_                },        /* CMPGU.EQ.QB */
16958     { pool                , ADDU__S__QB         , 2   , 32,
16959        0xfc0003ff, 0x200000cd, 0                      , 0,
16960        0x0                 },        /* ADDU[_S].QB */
16961     { instruction         , 0                   , 0   , 32,
16962        0xfc0003ff, 0x200000d5, &MULEU_S_PH_QBR   , 0,
16963        DSP_                },        /* MULEU_S.PH.QBR */
16964     { reserved_block      , 0                   , 0   , 32,
16965        0xfc0003ff, 0x200000dd, 0                      , 0,
16966        0x0                 },        /* _POOL32A5~*(27) */
16967     { reserved_block      , 0                   , 0   , 32,
16968        0xfc0003ff, 0x200000e5, 0                      , 0,
16969        0x0                 },        /* _POOL32A5~*(28) */
16970     { instruction         , 0                   , 0   , 32,
16971        0xfc0003ff, 0x200000ed, &PRECRQ_PH_W      , 0,
16972        DSP_                },        /* PRECRQ.PH.W */
16973     { reserved_block      , 0                   , 0   , 32,
16974        0xfc0003ff, 0x200000f5, 0                      , 0,
16975        0x0                 },        /* _POOL32A5~*(30) */
16976     { reserved_block      , 0                   , 0   , 32,
16977        0xfc0003ff, 0x200000fd, 0                      , 0,
16978        0x0                 },        /* _POOL32A5~*(31) */
16979     { instruction         , 0                   , 0   , 32,
16980        0xfc0003ff, 0x20000105, &CMPGU_LT_QB      , 0,
16981        DSP_                },        /* CMPGU.LT.QB */
16982     { pool                , ADDU__S__PH         , 2   , 32,
16983        0xfc0003ff, 0x2000010d, 0                      , 0,
16984        0x0                 },        /* ADDU[_S].PH */
16985     { instruction         , 0                   , 0   , 32,
16986        0xfc0003ff, 0x20000115, &MULQ_RS_PH       , 0,
16987        DSP_                },        /* MULQ_RS.PH */
16988     { reserved_block      , 0                   , 0   , 32,
16989        0xfc0003ff, 0x2000011d, 0                      , 0,
16990        0x0                 },        /* _POOL32A5~*(35) */
16991     { reserved_block      , 0                   , 0   , 32,
16992        0xfc0003ff, 0x20000125, 0                      , 0,
16993        0x0                 },        /* _POOL32A5~*(36) */
16994     { instruction         , 0                   , 0   , 32,
16995        0xfc0003ff, 0x2000012d, &PRECRQ_RS_PH_W   , 0,
16996        DSP_                },        /* PRECRQ_RS.PH.W */
16997     { reserved_block      , 0                   , 0   , 32,
16998        0xfc0003ff, 0x20000135, 0                      , 0,
16999        0x0                 },        /* _POOL32A5~*(38) */
17000     { reserved_block      , 0                   , 0   , 32,
17001        0xfc0003ff, 0x2000013d, 0                      , 0,
17002        0x0                 },        /* _POOL32A5~*(39) */
17003     { instruction         , 0                   , 0   , 32,
17004        0xfc0003ff, 0x20000145, &CMPGU_LE_QB      , 0,
17005        DSP_                },        /* CMPGU.LE.QB */
17006     { pool                , ADDUH__R__QB        , 2   , 32,
17007        0xfc0003ff, 0x2000014d, 0                      , 0,
17008        0x0                 },        /* ADDUH[_R].QB */
17009     { instruction         , 0                   , 0   , 32,
17010        0xfc0003ff, 0x20000155, &MULQ_S_PH        , 0,
17011        DSP_                },        /* MULQ_S.PH */
17012     { reserved_block      , 0                   , 0   , 32,
17013        0xfc0003ff, 0x2000015d, 0                      , 0,
17014        0x0                 },        /* _POOL32A5~*(43) */
17015     { reserved_block      , 0                   , 0   , 32,
17016        0xfc0003ff, 0x20000165, 0                      , 0,
17017        0x0                 },        /* _POOL32A5~*(44) */
17018     { instruction         , 0                   , 0   , 32,
17019        0xfc0003ff, 0x2000016d, &PRECRQU_S_QB_PH  , 0,
17020        DSP_                },        /* PRECRQU_S.QB.PH */
17021     { reserved_block      , 0                   , 0   , 32,
17022        0xfc0003ff, 0x20000175, 0                      , 0,
17023        0x0                 },        /* _POOL32A5~*(46) */
17024     { reserved_block      , 0                   , 0   , 32,
17025        0xfc0003ff, 0x2000017d, 0                      , 0,
17026        0x0                 },        /* _POOL32A5~*(47) */
17027     { instruction         , 0                   , 0   , 32,
17028        0xfc0003ff, 0x20000185, &CMPGDU_EQ_QB     , 0,
17029        DSP_                },        /* CMPGDU.EQ.QB */
17030     { pool                , SHRAV__R__PH        , 2   , 32,
17031        0xfc0003ff, 0x2000018d, 0                      , 0,
17032        0x0                 },        /* SHRAV[_R].PH */
17033     { instruction         , 0                   , 0   , 32,
17034        0xfc0003ff, 0x20000195, &MULQ_RS_W        , 0,
17035        DSP_                },        /* MULQ_RS.W */
17036     { reserved_block      , 0                   , 0   , 32,
17037        0xfc0003ff, 0x2000019d, 0                      , 0,
17038        0x0                 },        /* _POOL32A5~*(51) */
17039     { reserved_block      , 0                   , 0   , 32,
17040        0xfc0003ff, 0x200001a5, 0                      , 0,
17041        0x0                 },        /* _POOL32A5~*(52) */
17042     { instruction         , 0                   , 0   , 32,
17043        0xfc0003ff, 0x200001ad, &PACKRL_PH        , 0,
17044        DSP_                },        /* PACKRL.PH */
17045     { reserved_block      , 0                   , 0   , 32,
17046        0xfc0003ff, 0x200001b5, 0                      , 0,
17047        0x0                 },        /* _POOL32A5~*(54) */
17048     { reserved_block      , 0                   , 0   , 32,
17049        0xfc0003ff, 0x200001bd, 0                      , 0,
17050        0x0                 },        /* _POOL32A5~*(55) */
17051     { instruction         , 0                   , 0   , 32,
17052        0xfc0003ff, 0x200001c5, &CMPGDU_LT_QB     , 0,
17053        DSP_                },        /* CMPGDU.LT.QB */
17054     { pool                , SHRAV__R__QB        , 2   , 32,
17055        0xfc0003ff, 0x200001cd, 0                      , 0,
17056        0x0                 },        /* SHRAV[_R].QB */
17057     { instruction         , 0                   , 0   , 32,
17058        0xfc0003ff, 0x200001d5, &MULQ_S_W         , 0,
17059        DSP_                },        /* MULQ_S.W */
17060     { reserved_block      , 0                   , 0   , 32,
17061        0xfc0003ff, 0x200001dd, 0                      , 0,
17062        0x0                 },        /* _POOL32A5~*(59) */
17063     { reserved_block      , 0                   , 0   , 32,
17064        0xfc0003ff, 0x200001e5, 0                      , 0,
17065        0x0                 },        /* _POOL32A5~*(60) */
17066     { instruction         , 0                   , 0   , 32,
17067        0xfc0003ff, 0x200001ed, &PICK_QB          , 0,
17068        DSP_                },        /* PICK.QB */
17069     { reserved_block      , 0                   , 0   , 32,
17070        0xfc0003ff, 0x200001f5, 0                      , 0,
17071        0x0                 },        /* _POOL32A5~*(62) */
17072     { reserved_block      , 0                   , 0   , 32,
17073        0xfc0003ff, 0x200001fd, 0                      , 0,
17074        0x0                 },        /* _POOL32A5~*(63) */
17075     { instruction         , 0                   , 0   , 32,
17076        0xfc0003ff, 0x20000205, &CMPGDU_LE_QB     , 0,
17077        DSP_                },        /* CMPGDU.LE.QB */
17078     { pool                , SUBQ__S__PH         , 2   , 32,
17079        0xfc0003ff, 0x2000020d, 0                      , 0,
17080        0x0                 },        /* SUBQ[_S].PH */
17081     { instruction         , 0                   , 0   , 32,
17082        0xfc0003ff, 0x20000215, &APPEND           , 0,
17083        DSP_                },        /* APPEND */
17084     { reserved_block      , 0                   , 0   , 32,
17085        0xfc0003ff, 0x2000021d, 0                      , 0,
17086        0x0                 },        /* _POOL32A5~*(67) */
17087     { reserved_block      , 0                   , 0   , 32,
17088        0xfc0003ff, 0x20000225, 0                      , 0,
17089        0x0                 },        /* _POOL32A5~*(68) */
17090     { instruction         , 0                   , 0   , 32,
17091        0xfc0003ff, 0x2000022d, &PICK_PH          , 0,
17092        DSP_                },        /* PICK.PH */
17093     { reserved_block      , 0                   , 0   , 32,
17094        0xfc0003ff, 0x20000235, 0                      , 0,
17095        0x0                 },        /* _POOL32A5~*(70) */
17096     { reserved_block      , 0                   , 0   , 32,
17097        0xfc0003ff, 0x2000023d, 0                      , 0,
17098        0x0                 },        /* _POOL32A5~*(71) */
17099     { instruction         , 0                   , 0   , 32,
17100        0xfc0003ff, 0x20000245, &CMPU_EQ_QB       , 0,
17101        DSP_                },        /* CMPU.EQ.QB */
17102     { pool                , SUBQH__R__PH        , 2   , 32,
17103        0xfc0003ff, 0x2000024d, 0                      , 0,
17104        0x0                 },        /* SUBQH[_R].PH */
17105     { instruction         , 0                   , 0   , 32,
17106        0xfc0003ff, 0x20000255, &PREPEND          , 0,
17107        DSP_                },        /* PREPEND */
17108     { reserved_block      , 0                   , 0   , 32,
17109        0xfc0003ff, 0x2000025d, 0                      , 0,
17110        0x0                 },        /* _POOL32A5~*(75) */
17111     { reserved_block      , 0                   , 0   , 32,
17112        0xfc0003ff, 0x20000265, 0                      , 0,
17113        0x0                 },        /* _POOL32A5~*(76) */
17114     { reserved_block      , 0                   , 0   , 32,
17115        0xfc0003ff, 0x2000026d, 0                      , 0,
17116        0x0                 },        /* _POOL32A5~*(77) */
17117     { reserved_block      , 0                   , 0   , 32,
17118        0xfc0003ff, 0x20000275, 0                      , 0,
17119        0x0                 },        /* _POOL32A5~*(78) */
17120     { reserved_block      , 0                   , 0   , 32,
17121        0xfc0003ff, 0x2000027d, 0                      , 0,
17122        0x0                 },        /* _POOL32A5~*(79) */
17123     { instruction         , 0                   , 0   , 32,
17124        0xfc0003ff, 0x20000285, &CMPU_LT_QB       , 0,
17125        DSP_                },        /* CMPU.LT.QB */
17126     { pool                , SUBQH__R__W         , 2   , 32,
17127        0xfc0003ff, 0x2000028d, 0                      , 0,
17128        0x0                 },        /* SUBQH[_R].W */
17129     { instruction         , 0                   , 0   , 32,
17130        0xfc0003ff, 0x20000295, &MODSUB           , 0,
17131        DSP_                },        /* MODSUB */
17132     { reserved_block      , 0                   , 0   , 32,
17133        0xfc0003ff, 0x2000029d, 0                      , 0,
17134        0x0                 },        /* _POOL32A5~*(83) */
17135     { reserved_block      , 0                   , 0   , 32,
17136        0xfc0003ff, 0x200002a5, 0                      , 0,
17137        0x0                 },        /* _POOL32A5~*(84) */
17138     { reserved_block      , 0                   , 0   , 32,
17139        0xfc0003ff, 0x200002ad, 0                      , 0,
17140        0x0                 },        /* _POOL32A5~*(85) */
17141     { reserved_block      , 0                   , 0   , 32,
17142        0xfc0003ff, 0x200002b5, 0                      , 0,
17143        0x0                 },        /* _POOL32A5~*(86) */
17144     { reserved_block      , 0                   , 0   , 32,
17145        0xfc0003ff, 0x200002bd, 0                      , 0,
17146        0x0                 },        /* _POOL32A5~*(87) */
17147     { instruction         , 0                   , 0   , 32,
17148        0xfc0003ff, 0x200002c5, &CMPU_LE_QB       , 0,
17149        DSP_                },        /* CMPU.LE.QB */
17150     { pool                , SUBU__S__QB         , 2   , 32,
17151        0xfc0003ff, 0x200002cd, 0                      , 0,
17152        0x0                 },        /* SUBU[_S].QB */
17153     { instruction         , 0                   , 0   , 32,
17154        0xfc0003ff, 0x200002d5, &SHRAV_R_W        , 0,
17155        DSP_                },        /* SHRAV_R.W */
17156     { reserved_block      , 0                   , 0   , 32,
17157        0xfc0003ff, 0x200002dd, 0                      , 0,
17158        0x0                 },        /* _POOL32A5~*(91) */
17159     { reserved_block      , 0                   , 0   , 32,
17160        0xfc0003ff, 0x200002e5, 0                      , 0,
17161        0x0                 },        /* _POOL32A5~*(92) */
17162     { reserved_block      , 0                   , 0   , 32,
17163        0xfc0003ff, 0x200002ed, 0                      , 0,
17164        0x0                 },        /* _POOL32A5~*(93) */
17165     { instruction         , 0                   , 0   , 32,
17166        0xfc0003ff, 0x200002f5, &SHRA_R_W         , 0,
17167        DSP_                },        /* SHRA_R.W */
17168     { reserved_block      , 0                   , 0   , 32,
17169        0xfc0003ff, 0x200002fd, 0                      , 0,
17170        0x0                 },        /* _POOL32A5~*(95) */
17171     { instruction         , 0                   , 0   , 32,
17172        0xfc0003ff, 0x20000305, &ADDQ_S_W         , 0,
17173        DSP_                },        /* ADDQ_S.W */
17174     { pool                , SUBU__S__PH         , 2   , 32,
17175        0xfc0003ff, 0x2000030d, 0                      , 0,
17176        0x0                 },        /* SUBU[_S].PH */
17177     { instruction         , 0                   , 0   , 32,
17178        0xfc0003ff, 0x20000315, &SHRLV_PH         , 0,
17179        DSP_                },        /* SHRLV.PH */
17180     { reserved_block      , 0                   , 0   , 32,
17181        0xfc0003ff, 0x2000031d, 0                      , 0,
17182        0x0                 },        /* _POOL32A5~*(99) */
17183     { reserved_block      , 0                   , 0   , 32,
17184        0xfc0003ff, 0x20000325, 0                      , 0,
17185        0x0                 },        /* _POOL32A5~*(100) */
17186     { reserved_block      , 0                   , 0   , 32,
17187        0xfc0003ff, 0x2000032d, 0                      , 0,
17188        0x0                 },        /* _POOL32A5~*(101) */
17189     { pool                , SHRA__R__PH         , 2   , 32,
17190        0xfc0003ff, 0x20000335, 0                      , 0,
17191        0x0                 },        /* SHRA[_R].PH */
17192     { reserved_block      , 0                   , 0   , 32,
17193        0xfc0003ff, 0x2000033d, 0                      , 0,
17194        0x0                 },        /* _POOL32A5~*(103) */
17195     { instruction         , 0                   , 0   , 32,
17196        0xfc0003ff, 0x20000345, &SUBQ_S_W         , 0,
17197        DSP_                },        /* SUBQ_S.W */
17198     { pool                , SUBUH__R__QB        , 2   , 32,
17199        0xfc0003ff, 0x2000034d, 0                      , 0,
17200        0x0                 },        /* SUBUH[_R].QB */
17201     { instruction         , 0                   , 0   , 32,
17202        0xfc0003ff, 0x20000355, &SHRLV_QB         , 0,
17203        DSP_                },        /* SHRLV.QB */
17204     { reserved_block      , 0                   , 0   , 32,
17205        0xfc0003ff, 0x2000035d, 0                      , 0,
17206        0x0                 },        /* _POOL32A5~*(107) */
17207     { reserved_block      , 0                   , 0   , 32,
17208        0xfc0003ff, 0x20000365, 0                      , 0,
17209        0x0                 },        /* _POOL32A5~*(108) */
17210     { reserved_block      , 0                   , 0   , 32,
17211        0xfc0003ff, 0x2000036d, 0                      , 0,
17212        0x0                 },        /* _POOL32A5~*(109) */
17213     { reserved_block      , 0                   , 0   , 32,
17214        0xfc0003ff, 0x20000375, 0                      , 0,
17215        0x0                 },        /* _POOL32A5~*(110) */
17216     { reserved_block      , 0                   , 0   , 32,
17217        0xfc0003ff, 0x2000037d, 0                      , 0,
17218        0x0                 },        /* _POOL32A5~*(111) */
17219     { instruction         , 0                   , 0   , 32,
17220        0xfc0003ff, 0x20000385, &ADDSC            , 0,
17221        DSP_                },        /* ADDSC */
17222     { pool                , SHLLV__S__PH        , 2   , 32,
17223        0xfc0003ff, 0x2000038d, 0                      , 0,
17224        0x0                 },        /* SHLLV[_S].PH */
17225     { instruction         , 0                   , 0   , 32,
17226        0xfc0003ff, 0x20000395, &SHLLV_QB         , 0,
17227        DSP_                },        /* SHLLV.QB */
17228     { reserved_block      , 0                   , 0   , 32,
17229        0xfc0003ff, 0x2000039d, 0                      , 0,
17230        0x0                 },        /* _POOL32A5~*(115) */
17231     { reserved_block      , 0                   , 0   , 32,
17232        0xfc0003ff, 0x200003a5, 0                      , 0,
17233        0x0                 },        /* _POOL32A5~*(116) */
17234     { reserved_block      , 0                   , 0   , 32,
17235        0xfc0003ff, 0x200003ad, 0                      , 0,
17236        0x0                 },        /* _POOL32A5~*(117) */
17237     { pool                , SHLL__S__PH         , 4   , 32,
17238        0xfc0003ff, 0x200003b5, 0                      , 0,
17239        0x0                 },        /* SHLL[_S].PH */
17240     { reserved_block      , 0                   , 0   , 32,
17241        0xfc0003ff, 0x200003bd, 0                      , 0,
17242        0x0                 },        /* _POOL32A5~*(119) */
17243     { instruction         , 0                   , 0   , 32,
17244        0xfc0003ff, 0x200003c5, &ADDWC            , 0,
17245        DSP_                },        /* ADDWC */
17246     { pool                , PRECR_SRA__R__PH_W  , 2   , 32,
17247        0xfc0003ff, 0x200003cd, 0                      , 0,
17248        0x0                 },        /* PRECR_SRA[_R].PH.W */
17249     { instruction         , 0                   , 0   , 32,
17250        0xfc0003ff, 0x200003d5, &SHLLV_S_W        , 0,
17251        DSP_                },        /* SHLLV_S.W */
17252     { reserved_block      , 0                   , 0   , 32,
17253        0xfc0003ff, 0x200003dd, 0                      , 0,
17254        0x0                 },        /* _POOL32A5~*(123) */
17255     { reserved_block      , 0                   , 0   , 32,
17256        0xfc0003ff, 0x200003e5, 0                      , 0,
17257        0x0                 },        /* _POOL32A5~*(124) */
17258     { reserved_block      , 0                   , 0   , 32,
17259        0xfc0003ff, 0x200003ed, 0                      , 0,
17260        0x0                 },        /* _POOL32A5~*(125) */
17261     { instruction         , 0                   , 0   , 32,
17262        0xfc0003ff, 0x200003f5, &SHLL_S_W         , 0,
17263        DSP_                },        /* SHLL_S.W */
17264     { reserved_block      , 0                   , 0   , 32,
17265        0xfc0003ff, 0x200003fd, 0                      , 0,
17266        0x0                 },        /* _POOL32A5~*(127) */
17267 };
17268 
17269 
17270 static const Pool PP_LSX[16] = {
17271     { instruction         , 0                   , 0   , 32,
17272        0xfc0007ff, 0x20000007, &LBX              , 0,
17273        0x0                 },        /* LBX */
17274     { instruction         , 0                   , 0   , 32,
17275        0xfc0007ff, 0x20000087, &SBX              , 0,
17276        XMMS_               },        /* SBX */
17277     { instruction         , 0                   , 0   , 32,
17278        0xfc0007ff, 0x20000107, &LBUX             , 0,
17279        0x0                 },        /* LBUX */
17280     { reserved_block      , 0                   , 0   , 32,
17281        0xfc0007ff, 0x20000187, 0                      , 0,
17282        0x0                 },        /* PP.LSX~*(3) */
17283     { instruction         , 0                   , 0   , 32,
17284        0xfc0007ff, 0x20000207, &LHX              , 0,
17285        0x0                 },        /* LHX */
17286     { instruction         , 0                   , 0   , 32,
17287        0xfc0007ff, 0x20000287, &SHX              , 0,
17288        XMMS_               },        /* SHX */
17289     { instruction         , 0                   , 0   , 32,
17290        0xfc0007ff, 0x20000307, &LHUX             , 0,
17291        0x0                 },        /* LHUX */
17292     { instruction         , 0                   , 0   , 32,
17293        0xfc0007ff, 0x20000387, &LWUX             , 0,
17294        MIPS64_             },        /* LWUX */
17295     { instruction         , 0                   , 0   , 32,
17296        0xfc0007ff, 0x20000407, &LWX              , 0,
17297        0x0                 },        /* LWX */
17298     { instruction         , 0                   , 0   , 32,
17299        0xfc0007ff, 0x20000487, &SWX              , 0,
17300        XMMS_               },        /* SWX */
17301     { instruction         , 0                   , 0   , 32,
17302        0xfc0007ff, 0x20000507, &LWC1X            , 0,
17303        CP1_                },        /* LWC1X */
17304     { instruction         , 0                   , 0   , 32,
17305        0xfc0007ff, 0x20000587, &SWC1X            , 0,
17306        CP1_                },        /* SWC1X */
17307     { instruction         , 0                   , 0   , 32,
17308        0xfc0007ff, 0x20000607, &LDX              , 0,
17309        MIPS64_             },        /* LDX */
17310     { instruction         , 0                   , 0   , 32,
17311        0xfc0007ff, 0x20000687, &SDX              , 0,
17312        MIPS64_             },        /* SDX */
17313     { instruction         , 0                   , 0   , 32,
17314        0xfc0007ff, 0x20000707, &LDC1X            , 0,
17315        CP1_                },        /* LDC1X */
17316     { instruction         , 0                   , 0   , 32,
17317        0xfc0007ff, 0x20000787, &SDC1X            , 0,
17318        CP1_                },        /* SDC1X */
17319 };
17320 
17321 
17322 static const Pool PP_LSXS[16] = {
17323     { reserved_block      , 0                   , 0   , 32,
17324        0xfc0007ff, 0x20000047, 0                      , 0,
17325        0x0                 },        /* PP.LSXS~*(0) */
17326     { reserved_block      , 0                   , 0   , 32,
17327        0xfc0007ff, 0x200000c7, 0                      , 0,
17328        0x0                 },        /* PP.LSXS~*(1) */
17329     { reserved_block      , 0                   , 0   , 32,
17330        0xfc0007ff, 0x20000147, 0                      , 0,
17331        0x0                 },        /* PP.LSXS~*(2) */
17332     { reserved_block      , 0                   , 0   , 32,
17333        0xfc0007ff, 0x200001c7, 0                      , 0,
17334        0x0                 },        /* PP.LSXS~*(3) */
17335     { instruction         , 0                   , 0   , 32,
17336        0xfc0007ff, 0x20000247, &LHXS             , 0,
17337        0x0                 },        /* LHXS */
17338     { instruction         , 0                   , 0   , 32,
17339        0xfc0007ff, 0x200002c7, &SHXS             , 0,
17340        XMMS_               },        /* SHXS */
17341     { instruction         , 0                   , 0   , 32,
17342        0xfc0007ff, 0x20000347, &LHUXS            , 0,
17343        0x0                 },        /* LHUXS */
17344     { instruction         , 0                   , 0   , 32,
17345        0xfc0007ff, 0x200003c7, &LWUXS            , 0,
17346        MIPS64_             },        /* LWUXS */
17347     { instruction         , 0                   , 0   , 32,
17348        0xfc0007ff, 0x20000447, &LWXS_32_         , 0,
17349        0x0                 },        /* LWXS[32] */
17350     { instruction         , 0                   , 0   , 32,
17351        0xfc0007ff, 0x200004c7, &SWXS             , 0,
17352        XMMS_               },        /* SWXS */
17353     { instruction         , 0                   , 0   , 32,
17354        0xfc0007ff, 0x20000547, &LWC1XS           , 0,
17355        CP1_                },        /* LWC1XS */
17356     { instruction         , 0                   , 0   , 32,
17357        0xfc0007ff, 0x200005c7, &SWC1XS           , 0,
17358        CP1_                },        /* SWC1XS */
17359     { instruction         , 0                   , 0   , 32,
17360        0xfc0007ff, 0x20000647, &LDXS             , 0,
17361        MIPS64_             },        /* LDXS */
17362     { instruction         , 0                   , 0   , 32,
17363        0xfc0007ff, 0x200006c7, &SDXS             , 0,
17364        MIPS64_             },        /* SDXS */
17365     { instruction         , 0                   , 0   , 32,
17366        0xfc0007ff, 0x20000747, &LDC1XS           , 0,
17367        CP1_                },        /* LDC1XS */
17368     { instruction         , 0                   , 0   , 32,
17369        0xfc0007ff, 0x200007c7, &SDC1XS           , 0,
17370        CP1_                },        /* SDC1XS */
17371 };
17372 
17373 
17374 static const Pool P_LSX[2] = {
17375     { pool                , PP_LSX              , 16  , 32,
17376        0xfc00007f, 0x20000007, 0                      , 0,
17377        0x0                 },        /* PP.LSX */
17378     { pool                , PP_LSXS             , 16  , 32,
17379        0xfc00007f, 0x20000047, 0                      , 0,
17380        0x0                 },        /* PP.LSXS */
17381 };
17382 
17383 
17384 static const Pool POOL32Axf_1_0[4] = {
17385     { instruction         , 0                   , 0   , 32,
17386        0xfc003fff, 0x2000007f, &MFHI_DSP_        , 0,
17387        DSP_                },        /* MFHI[DSP] */
17388     { instruction         , 0                   , 0   , 32,
17389        0xfc003fff, 0x2000107f, &MFLO_DSP_        , 0,
17390        DSP_                },        /* MFLO[DSP] */
17391     { instruction         , 0                   , 0   , 32,
17392        0xfc003fff, 0x2000207f, &MTHI_DSP_        , 0,
17393        DSP_                },        /* MTHI[DSP] */
17394     { instruction         , 0                   , 0   , 32,
17395        0xfc003fff, 0x2000307f, &MTLO_DSP_        , 0,
17396        DSP_                },        /* MTLO[DSP] */
17397 };
17398 
17399 
17400 static const Pool POOL32Axf_1_1[4] = {
17401     { instruction         , 0                   , 0   , 32,
17402        0xfc003fff, 0x2000027f, &MTHLIP           , 0,
17403        DSP_                },        /* MTHLIP */
17404     { instruction         , 0                   , 0   , 32,
17405        0xfc003fff, 0x2000127f, &SHILOV           , 0,
17406        DSP_                },        /* SHILOV */
17407     { reserved_block      , 0                   , 0   , 32,
17408        0xfc003fff, 0x2000227f, 0                      , 0,
17409        0x0                 },        /* POOL32Axf_1_1~*(2) */
17410     { reserved_block      , 0                   , 0   , 32,
17411        0xfc003fff, 0x2000327f, 0                      , 0,
17412        0x0                 },        /* POOL32Axf_1_1~*(3) */
17413 };
17414 
17415 
17416 static const Pool POOL32Axf_1_3[4] = {
17417     { instruction         , 0                   , 0   , 32,
17418        0xfc003fff, 0x2000067f, &RDDSP            , 0,
17419        DSP_                },        /* RDDSP */
17420     { instruction         , 0                   , 0   , 32,
17421        0xfc003fff, 0x2000167f, &WRDSP            , 0,
17422        DSP_                },        /* WRDSP */
17423     { instruction         , 0                   , 0   , 32,
17424        0xfc003fff, 0x2000267f, &EXTP             , 0,
17425        DSP_                },        /* EXTP */
17426     { instruction         , 0                   , 0   , 32,
17427        0xfc003fff, 0x2000367f, &EXTPDP           , 0,
17428        DSP_                },        /* EXTPDP */
17429 };
17430 
17431 
17432 static const Pool POOL32Axf_1_4[2] = {
17433     { instruction         , 0                   , 0   , 32,
17434        0xfc001fff, 0x2000087f, &SHLL_QB          , 0,
17435        DSP_                },        /* SHLL.QB */
17436     { instruction         , 0                   , 0   , 32,
17437        0xfc001fff, 0x2000187f, &SHRL_QB          , 0,
17438        DSP_                },        /* SHRL.QB */
17439 };
17440 
17441 
17442 static const Pool MAQ_S_A__W_PHR[2] = {
17443     { instruction         , 0                   , 0   , 32,
17444        0xfc003fff, 0x20000a7f, &MAQ_S_W_PHR      , 0,
17445        DSP_                },        /* MAQ_S.W.PHR */
17446     { instruction         , 0                   , 0   , 32,
17447        0xfc003fff, 0x20002a7f, &MAQ_SA_W_PHR     , 0,
17448        DSP_                },        /* MAQ_SA.W.PHR */
17449 };
17450 
17451 
17452 static const Pool MAQ_S_A__W_PHL[2] = {
17453     { instruction         , 0                   , 0   , 32,
17454        0xfc003fff, 0x20001a7f, &MAQ_S_W_PHL      , 0,
17455        DSP_                },        /* MAQ_S.W.PHL */
17456     { instruction         , 0                   , 0   , 32,
17457        0xfc003fff, 0x20003a7f, &MAQ_SA_W_PHL     , 0,
17458        DSP_                },        /* MAQ_SA.W.PHL */
17459 };
17460 
17461 
17462 static const Pool POOL32Axf_1_5[2] = {
17463     { pool                , MAQ_S_A__W_PHR      , 2   , 32,
17464        0xfc001fff, 0x20000a7f, 0                      , 0,
17465        0x0                 },        /* MAQ_S[A].W.PHR */
17466     { pool                , MAQ_S_A__W_PHL      , 2   , 32,
17467        0xfc001fff, 0x20001a7f, 0                      , 0,
17468        0x0                 },        /* MAQ_S[A].W.PHL */
17469 };
17470 
17471 
17472 static const Pool POOL32Axf_1_7[4] = {
17473     { instruction         , 0                   , 0   , 32,
17474        0xfc003fff, 0x20000e7f, &EXTR_W           , 0,
17475        DSP_                },        /* EXTR.W */
17476     { instruction         , 0                   , 0   , 32,
17477        0xfc003fff, 0x20001e7f, &EXTR_R_W         , 0,
17478        DSP_                },        /* EXTR_R.W */
17479     { instruction         , 0                   , 0   , 32,
17480        0xfc003fff, 0x20002e7f, &EXTR_RS_W        , 0,
17481        DSP_                },        /* EXTR_RS.W */
17482     { instruction         , 0                   , 0   , 32,
17483        0xfc003fff, 0x20003e7f, &EXTR_S_H         , 0,
17484        DSP_                },        /* EXTR_S.H */
17485 };
17486 
17487 
17488 static const Pool POOL32Axf_1[8] = {
17489     { pool                , POOL32Axf_1_0       , 4   , 32,
17490        0xfc000fff, 0x2000007f, 0                      , 0,
17491        0x0                 },        /* POOL32Axf_1_0 */
17492     { pool                , POOL32Axf_1_1       , 4   , 32,
17493        0xfc000fff, 0x2000027f, 0                      , 0,
17494        0x0                 },        /* POOL32Axf_1_1 */
17495     { reserved_block      , 0                   , 0   , 32,
17496        0xfc000fff, 0x2000047f, 0                      , 0,
17497        0x0                 },        /* POOL32Axf_1~*(2) */
17498     { pool                , POOL32Axf_1_3       , 4   , 32,
17499        0xfc000fff, 0x2000067f, 0                      , 0,
17500        0x0                 },        /* POOL32Axf_1_3 */
17501     { pool                , POOL32Axf_1_4       , 2   , 32,
17502        0xfc000fff, 0x2000087f, 0                      , 0,
17503        0x0                 },        /* POOL32Axf_1_4 */
17504     { pool                , POOL32Axf_1_5       , 2   , 32,
17505        0xfc000fff, 0x20000a7f, 0                      , 0,
17506        0x0                 },        /* POOL32Axf_1_5 */
17507     { reserved_block      , 0                   , 0   , 32,
17508        0xfc000fff, 0x20000c7f, 0                      , 0,
17509        0x0                 },        /* POOL32Axf_1~*(6) */
17510     { pool                , POOL32Axf_1_7       , 4   , 32,
17511        0xfc000fff, 0x20000e7f, 0                      , 0,
17512        0x0                 },        /* POOL32Axf_1_7 */
17513 };
17514 
17515 
17516 static const Pool POOL32Axf_2_DSP__0_7[8] = {
17517     { instruction         , 0                   , 0   , 32,
17518        0xfc003fff, 0x200000bf, &DPA_W_PH         , 0,
17519        DSP_                },        /* DPA.W.PH */
17520     { instruction         , 0                   , 0   , 32,
17521        0xfc003fff, 0x200002bf, &DPAQ_S_W_PH      , 0,
17522        DSP_                },        /* DPAQ_S.W.PH */
17523     { instruction         , 0                   , 0   , 32,
17524        0xfc003fff, 0x200004bf, &DPS_W_PH         , 0,
17525        DSP_                },        /* DPS.W.PH */
17526     { instruction         , 0                   , 0   , 32,
17527        0xfc003fff, 0x200006bf, &DPSQ_S_W_PH      , 0,
17528        DSP_                },        /* DPSQ_S.W.PH */
17529     { reserved_block      , 0                   , 0   , 32,
17530        0xfc003fff, 0x200008bf, 0                      , 0,
17531        0x0                 },        /* POOL32Axf_2(DSP)_0_7~*(4) */
17532     { instruction         , 0                   , 0   , 32,
17533        0xfc003fff, 0x20000abf, &MADD_DSP_        , 0,
17534        DSP_                },        /* MADD[DSP] */
17535     { instruction         , 0                   , 0   , 32,
17536        0xfc003fff, 0x20000cbf, &MULT_DSP_        , 0,
17537        DSP_                },        /* MULT[DSP] */
17538     { instruction         , 0                   , 0   , 32,
17539        0xfc003fff, 0x20000ebf, &EXTRV_W          , 0,
17540        DSP_                },        /* EXTRV.W */
17541 };
17542 
17543 
17544 static const Pool POOL32Axf_2_DSP__8_15[8] = {
17545     { instruction         , 0                   , 0   , 32,
17546        0xfc003fff, 0x200010bf, &DPAX_W_PH        , 0,
17547        DSP_                },        /* DPAX.W.PH */
17548     { instruction         , 0                   , 0   , 32,
17549        0xfc003fff, 0x200012bf, &DPAQ_SA_L_W      , 0,
17550        DSP_                },        /* DPAQ_SA.L.W */
17551     { instruction         , 0                   , 0   , 32,
17552        0xfc003fff, 0x200014bf, &DPSX_W_PH        , 0,
17553        DSP_                },        /* DPSX.W.PH */
17554     { instruction         , 0                   , 0   , 32,
17555        0xfc003fff, 0x200016bf, &DPSQ_SA_L_W      , 0,
17556        DSP_                },        /* DPSQ_SA.L.W */
17557     { reserved_block      , 0                   , 0   , 32,
17558        0xfc003fff, 0x200018bf, 0                      , 0,
17559        0x0                 },        /* POOL32Axf_2(DSP)_8_15~*(4) */
17560     { instruction         , 0                   , 0   , 32,
17561        0xfc003fff, 0x20001abf, &MADDU_DSP_       , 0,
17562        DSP_                },        /* MADDU[DSP] */
17563     { instruction         , 0                   , 0   , 32,
17564        0xfc003fff, 0x20001cbf, &MULTU_DSP_       , 0,
17565        DSP_                },        /* MULTU[DSP] */
17566     { instruction         , 0                   , 0   , 32,
17567        0xfc003fff, 0x20001ebf, &EXTRV_R_W        , 0,
17568        DSP_                },        /* EXTRV_R.W */
17569 };
17570 
17571 
17572 static const Pool POOL32Axf_2_DSP__16_23[8] = {
17573     { instruction         , 0                   , 0   , 32,
17574        0xfc003fff, 0x200020bf, &DPAU_H_QBL       , 0,
17575        DSP_                },        /* DPAU.H.QBL */
17576     { instruction         , 0                   , 0   , 32,
17577        0xfc003fff, 0x200022bf, &DPAQX_S_W_PH     , 0,
17578        DSP_                },        /* DPAQX_S.W.PH */
17579     { instruction         , 0                   , 0   , 32,
17580        0xfc003fff, 0x200024bf, &DPSU_H_QBL       , 0,
17581        DSP_                },        /* DPSU.H.QBL */
17582     { instruction         , 0                   , 0   , 32,
17583        0xfc003fff, 0x200026bf, &DPSQX_S_W_PH     , 0,
17584        DSP_                },        /* DPSQX_S.W.PH */
17585     { instruction         , 0                   , 0   , 32,
17586        0xfc003fff, 0x200028bf, &EXTPV            , 0,
17587        DSP_                },        /* EXTPV */
17588     { instruction         , 0                   , 0   , 32,
17589        0xfc003fff, 0x20002abf, &MSUB_DSP_        , 0,
17590        DSP_                },        /* MSUB[DSP] */
17591     { instruction         , 0                   , 0   , 32,
17592        0xfc003fff, 0x20002cbf, &MULSA_W_PH       , 0,
17593        DSP_                },        /* MULSA.W.PH */
17594     { instruction         , 0                   , 0   , 32,
17595        0xfc003fff, 0x20002ebf, &EXTRV_RS_W       , 0,
17596        DSP_                },        /* EXTRV_RS.W */
17597 };
17598 
17599 
17600 static const Pool POOL32Axf_2_DSP__24_31[8] = {
17601     { instruction         , 0                   , 0   , 32,
17602        0xfc003fff, 0x200030bf, &DPAU_H_QBR       , 0,
17603        DSP_                },        /* DPAU.H.QBR */
17604     { instruction         , 0                   , 0   , 32,
17605        0xfc003fff, 0x200032bf, &DPAQX_SA_W_PH    , 0,
17606        DSP_                },        /* DPAQX_SA.W.PH */
17607     { instruction         , 0                   , 0   , 32,
17608        0xfc003fff, 0x200034bf, &DPSU_H_QBR       , 0,
17609        DSP_                },        /* DPSU.H.QBR */
17610     { instruction         , 0                   , 0   , 32,
17611        0xfc003fff, 0x200036bf, &DPSQX_SA_W_PH    , 0,
17612        DSP_                },        /* DPSQX_SA.W.PH */
17613     { instruction         , 0                   , 0   , 32,
17614        0xfc003fff, 0x200038bf, &EXTPDPV          , 0,
17615        DSP_                },        /* EXTPDPV */
17616     { instruction         , 0                   , 0   , 32,
17617        0xfc003fff, 0x20003abf, &MSUBU_DSP_       , 0,
17618        DSP_                },        /* MSUBU[DSP] */
17619     { instruction         , 0                   , 0   , 32,
17620        0xfc003fff, 0x20003cbf, &MULSAQ_S_W_PH    , 0,
17621        DSP_                },        /* MULSAQ_S.W.PH */
17622     { instruction         , 0                   , 0   , 32,
17623        0xfc003fff, 0x20003ebf, &EXTRV_S_H        , 0,
17624        DSP_                },        /* EXTRV_S.H */
17625 };
17626 
17627 
17628 static const Pool POOL32Axf_2[4] = {
17629     { pool                , POOL32Axf_2_DSP__0_7, 8   , 32,
17630        0xfc0031ff, 0x200000bf, 0                      , 0,
17631        0x0                 },        /* POOL32Axf_2(DSP)_0_7 */
17632     { pool                , POOL32Axf_2_DSP__8_15, 8   , 32,
17633        0xfc0031ff, 0x200010bf, 0                      , 0,
17634        0x0                 },        /* POOL32Axf_2(DSP)_8_15 */
17635     { pool                , POOL32Axf_2_DSP__16_23, 8   , 32,
17636        0xfc0031ff, 0x200020bf, 0                      , 0,
17637        0x0                 },        /* POOL32Axf_2(DSP)_16_23 */
17638     { pool                , POOL32Axf_2_DSP__24_31, 8   , 32,
17639        0xfc0031ff, 0x200030bf, 0                      , 0,
17640        0x0                 },        /* POOL32Axf_2(DSP)_24_31 */
17641 };
17642 
17643 
17644 static const Pool POOL32Axf_4[128] = {
17645     { instruction         , 0                   , 0   , 32,
17646        0xfc00ffff, 0x2000013f, &ABSQ_S_QB        , 0,
17647        DSP_                },        /* ABSQ_S.QB */
17648     { instruction         , 0                   , 0   , 32,
17649        0xfc00ffff, 0x2000033f, &REPLV_PH         , 0,
17650        DSP_                },        /* REPLV.PH */
17651     { reserved_block      , 0                   , 0   , 32,
17652        0xfc00ffff, 0x2000053f, 0                      , 0,
17653        0x0                 },        /* POOL32Axf_4~*(2) */
17654     { reserved_block      , 0                   , 0   , 32,
17655        0xfc00ffff, 0x2000073f, 0                      , 0,
17656        0x0                 },        /* POOL32Axf_4~*(3) */
17657     { reserved_block      , 0                   , 0   , 32,
17658        0xfc00ffff, 0x2000093f, 0                      , 0,
17659        0x0                 },        /* POOL32Axf_4~*(4) */
17660     { reserved_block      , 0                   , 0   , 32,
17661        0xfc00ffff, 0x20000b3f, 0                      , 0,
17662        0x0                 },        /* POOL32Axf_4~*(5) */
17663     { reserved_block      , 0                   , 0   , 32,
17664        0xfc00ffff, 0x20000d3f, 0                      , 0,
17665        0x0                 },        /* POOL32Axf_4~*(6) */
17666     { reserved_block      , 0                   , 0   , 32,
17667        0xfc00ffff, 0x20000f3f, 0                      , 0,
17668        0x0                 },        /* POOL32Axf_4~*(7) */
17669     { instruction         , 0                   , 0   , 32,
17670        0xfc00ffff, 0x2000113f, &ABSQ_S_PH        , 0,
17671        DSP_                },        /* ABSQ_S.PH */
17672     { instruction         , 0                   , 0   , 32,
17673        0xfc00ffff, 0x2000133f, &REPLV_QB         , 0,
17674        DSP_                },        /* REPLV.QB */
17675     { reserved_block      , 0                   , 0   , 32,
17676        0xfc00ffff, 0x2000153f, 0                      , 0,
17677        0x0                 },        /* POOL32Axf_4~*(10) */
17678     { reserved_block      , 0                   , 0   , 32,
17679        0xfc00ffff, 0x2000173f, 0                      , 0,
17680        0x0                 },        /* POOL32Axf_4~*(11) */
17681     { reserved_block      , 0                   , 0   , 32,
17682        0xfc00ffff, 0x2000193f, 0                      , 0,
17683        0x0                 },        /* POOL32Axf_4~*(12) */
17684     { reserved_block      , 0                   , 0   , 32,
17685        0xfc00ffff, 0x20001b3f, 0                      , 0,
17686        0x0                 },        /* POOL32Axf_4~*(13) */
17687     { reserved_block      , 0                   , 0   , 32,
17688        0xfc00ffff, 0x20001d3f, 0                      , 0,
17689        0x0                 },        /* POOL32Axf_4~*(14) */
17690     { reserved_block      , 0                   , 0   , 32,
17691        0xfc00ffff, 0x20001f3f, 0                      , 0,
17692        0x0                 },        /* POOL32Axf_4~*(15) */
17693     { instruction         , 0                   , 0   , 32,
17694        0xfc00ffff, 0x2000213f, &ABSQ_S_W         , 0,
17695        DSP_                },        /* ABSQ_S.W */
17696     { reserved_block      , 0                   , 0   , 32,
17697        0xfc00ffff, 0x2000233f, 0                      , 0,
17698        0x0                 },        /* POOL32Axf_4~*(17) */
17699     { reserved_block      , 0                   , 0   , 32,
17700        0xfc00ffff, 0x2000253f, 0                      , 0,
17701        0x0                 },        /* POOL32Axf_4~*(18) */
17702     { reserved_block      , 0                   , 0   , 32,
17703        0xfc00ffff, 0x2000273f, 0                      , 0,
17704        0x0                 },        /* POOL32Axf_4~*(19) */
17705     { reserved_block      , 0                   , 0   , 32,
17706        0xfc00ffff, 0x2000293f, 0                      , 0,
17707        0x0                 },        /* POOL32Axf_4~*(20) */
17708     { reserved_block      , 0                   , 0   , 32,
17709        0xfc00ffff, 0x20002b3f, 0                      , 0,
17710        0x0                 },        /* POOL32Axf_4~*(21) */
17711     { reserved_block      , 0                   , 0   , 32,
17712        0xfc00ffff, 0x20002d3f, 0                      , 0,
17713        0x0                 },        /* POOL32Axf_4~*(22) */
17714     { reserved_block      , 0                   , 0   , 32,
17715        0xfc00ffff, 0x20002f3f, 0                      , 0,
17716        0x0                 },        /* POOL32Axf_4~*(23) */
17717     { reserved_block      , 0                   , 0   , 32,
17718        0xfc00ffff, 0x2000313f, 0                      , 0,
17719        0x0                 },        /* POOL32Axf_4~*(24) */
17720     { reserved_block      , 0                   , 0   , 32,
17721        0xfc00ffff, 0x2000333f, 0                      , 0,
17722        0x0                 },        /* POOL32Axf_4~*(25) */
17723     { reserved_block      , 0                   , 0   , 32,
17724        0xfc00ffff, 0x2000353f, 0                      , 0,
17725        0x0                 },        /* POOL32Axf_4~*(26) */
17726     { reserved_block      , 0                   , 0   , 32,
17727        0xfc00ffff, 0x2000373f, 0                      , 0,
17728        0x0                 },        /* POOL32Axf_4~*(27) */
17729     { reserved_block      , 0                   , 0   , 32,
17730        0xfc00ffff, 0x2000393f, 0                      , 0,
17731        0x0                 },        /* POOL32Axf_4~*(28) */
17732     { reserved_block      , 0                   , 0   , 32,
17733        0xfc00ffff, 0x20003b3f, 0                      , 0,
17734        0x0                 },        /* POOL32Axf_4~*(29) */
17735     { reserved_block      , 0                   , 0   , 32,
17736        0xfc00ffff, 0x20003d3f, 0                      , 0,
17737        0x0                 },        /* POOL32Axf_4~*(30) */
17738     { reserved_block      , 0                   , 0   , 32,
17739        0xfc00ffff, 0x20003f3f, 0                      , 0,
17740        0x0                 },        /* POOL32Axf_4~*(31) */
17741     { instruction         , 0                   , 0   , 32,
17742        0xfc00ffff, 0x2000413f, &INSV             , 0,
17743        DSP_                },        /* INSV */
17744     { reserved_block      , 0                   , 0   , 32,
17745        0xfc00ffff, 0x2000433f, 0                      , 0,
17746        0x0                 },        /* POOL32Axf_4~*(33) */
17747     { reserved_block      , 0                   , 0   , 32,
17748        0xfc00ffff, 0x2000453f, 0                      , 0,
17749        0x0                 },        /* POOL32Axf_4~*(34) */
17750     { reserved_block      , 0                   , 0   , 32,
17751        0xfc00ffff, 0x2000473f, 0                      , 0,
17752        0x0                 },        /* POOL32Axf_4~*(35) */
17753     { reserved_block      , 0                   , 0   , 32,
17754        0xfc00ffff, 0x2000493f, 0                      , 0,
17755        0x0                 },        /* POOL32Axf_4~*(36) */
17756     { instruction         , 0                   , 0   , 32,
17757        0xfc00ffff, 0x20004b3f, &CLO              , 0,
17758        XMMS_               },        /* CLO */
17759     { instruction         , 0                   , 0   , 32,
17760        0xfc00ffff, 0x20004d3f, &MFC2             , 0,
17761        CP2_                },        /* MFC2 */
17762     { reserved_block      , 0                   , 0   , 32,
17763        0xfc00ffff, 0x20004f3f, 0                      , 0,
17764        0x0                 },        /* POOL32Axf_4~*(39) */
17765     { instruction         , 0                   , 0   , 32,
17766        0xfc00ffff, 0x2000513f, &PRECEQ_W_PHL     , 0,
17767        DSP_                },        /* PRECEQ.W.PHL */
17768     { reserved_block      , 0                   , 0   , 32,
17769        0xfc00ffff, 0x2000533f, 0                      , 0,
17770        0x0                 },        /* POOL32Axf_4~*(41) */
17771     { reserved_block      , 0                   , 0   , 32,
17772        0xfc00ffff, 0x2000553f, 0                      , 0,
17773        0x0                 },        /* POOL32Axf_4~*(42) */
17774     { reserved_block      , 0                   , 0   , 32,
17775        0xfc00ffff, 0x2000573f, 0                      , 0,
17776        0x0                 },        /* POOL32Axf_4~*(43) */
17777     { reserved_block      , 0                   , 0   , 32,
17778        0xfc00ffff, 0x2000593f, 0                      , 0,
17779        0x0                 },        /* POOL32Axf_4~*(44) */
17780     { instruction         , 0                   , 0   , 32,
17781        0xfc00ffff, 0x20005b3f, &CLZ              , 0,
17782        XMMS_               },        /* CLZ */
17783     { instruction         , 0                   , 0   , 32,
17784        0xfc00ffff, 0x20005d3f, &MTC2             , 0,
17785        CP2_                },        /* MTC2 */
17786     { reserved_block      , 0                   , 0   , 32,
17787        0xfc00ffff, 0x20005f3f, 0                      , 0,
17788        0x0                 },        /* POOL32Axf_4~*(47) */
17789     { instruction         , 0                   , 0   , 32,
17790        0xfc00ffff, 0x2000613f, &PRECEQ_W_PHR     , 0,
17791        DSP_                },        /* PRECEQ.W.PHR */
17792     { reserved_block      , 0                   , 0   , 32,
17793        0xfc00ffff, 0x2000633f, 0                      , 0,
17794        0x0                 },        /* POOL32Axf_4~*(49) */
17795     { reserved_block      , 0                   , 0   , 32,
17796        0xfc00ffff, 0x2000653f, 0                      , 0,
17797        0x0                 },        /* POOL32Axf_4~*(50) */
17798     { reserved_block      , 0                   , 0   , 32,
17799        0xfc00ffff, 0x2000673f, 0                      , 0,
17800        0x0                 },        /* POOL32Axf_4~*(51) */
17801     { reserved_block      , 0                   , 0   , 32,
17802        0xfc00ffff, 0x2000693f, 0                      , 0,
17803        0x0                 },        /* POOL32Axf_4~*(52) */
17804     { reserved_block      , 0                   , 0   , 32,
17805        0xfc00ffff, 0x20006b3f, 0                      , 0,
17806        0x0                 },        /* POOL32Axf_4~*(53) */
17807     { instruction         , 0                   , 0   , 32,
17808        0xfc00ffff, 0x20006d3f, &DMFC2            , 0,
17809        CP2_                },        /* DMFC2 */
17810     { reserved_block      , 0                   , 0   , 32,
17811        0xfc00ffff, 0x20006f3f, 0                      , 0,
17812        0x0                 },        /* POOL32Axf_4~*(55) */
17813     { instruction         , 0                   , 0   , 32,
17814        0xfc00ffff, 0x2000713f, &PRECEQU_PH_QBL   , 0,
17815        DSP_                },        /* PRECEQU.PH.QBL */
17816     { instruction         , 0                   , 0   , 32,
17817        0xfc00ffff, 0x2000733f, &PRECEQU_PH_QBLA  , 0,
17818        DSP_                },        /* PRECEQU.PH.QBLA */
17819     { reserved_block      , 0                   , 0   , 32,
17820        0xfc00ffff, 0x2000753f, 0                      , 0,
17821        0x0                 },        /* POOL32Axf_4~*(58) */
17822     { reserved_block      , 0                   , 0   , 32,
17823        0xfc00ffff, 0x2000773f, 0                      , 0,
17824        0x0                 },        /* POOL32Axf_4~*(59) */
17825     { reserved_block      , 0                   , 0   , 32,
17826        0xfc00ffff, 0x2000793f, 0                      , 0,
17827        0x0                 },        /* POOL32Axf_4~*(60) */
17828     { reserved_block      , 0                   , 0   , 32,
17829        0xfc00ffff, 0x20007b3f, 0                      , 0,
17830        0x0                 },        /* POOL32Axf_4~*(61) */
17831     { instruction         , 0                   , 0   , 32,
17832        0xfc00ffff, 0x20007d3f, &DMTC2            , 0,
17833        CP2_                },        /* DMTC2 */
17834     { reserved_block      , 0                   , 0   , 32,
17835        0xfc00ffff, 0x20007f3f, 0                      , 0,
17836        0x0                 },        /* POOL32Axf_4~*(63) */
17837     { reserved_block      , 0                   , 0   , 32,
17838        0xfc00ffff, 0x2000813f, 0                      , 0,
17839        0x0                 },        /* POOL32Axf_4~*(64) */
17840     { reserved_block      , 0                   , 0   , 32,
17841        0xfc00ffff, 0x2000833f, 0                      , 0,
17842        0x0                 },        /* POOL32Axf_4~*(65) */
17843     { reserved_block      , 0                   , 0   , 32,
17844        0xfc00ffff, 0x2000853f, 0                      , 0,
17845        0x0                 },        /* POOL32Axf_4~*(66) */
17846     { reserved_block      , 0                   , 0   , 32,
17847        0xfc00ffff, 0x2000873f, 0                      , 0,
17848        0x0                 },        /* POOL32Axf_4~*(67) */
17849     { reserved_block      , 0                   , 0   , 32,
17850        0xfc00ffff, 0x2000893f, 0                      , 0,
17851        0x0                 },        /* POOL32Axf_4~*(68) */
17852     { reserved_block      , 0                   , 0   , 32,
17853        0xfc00ffff, 0x20008b3f, 0                      , 0,
17854        0x0                 },        /* POOL32Axf_4~*(69) */
17855     { instruction         , 0                   , 0   , 32,
17856        0xfc00ffff, 0x20008d3f, &MFHC2            , 0,
17857        CP2_                },        /* MFHC2 */
17858     { reserved_block      , 0                   , 0   , 32,
17859        0xfc00ffff, 0x20008f3f, 0                      , 0,
17860        0x0                 },        /* POOL32Axf_4~*(71) */
17861     { instruction         , 0                   , 0   , 32,
17862        0xfc00ffff, 0x2000913f, &PRECEQU_PH_QBR   , 0,
17863        DSP_                },        /* PRECEQU.PH.QBR */
17864     { instruction         , 0                   , 0   , 32,
17865        0xfc00ffff, 0x2000933f, &PRECEQU_PH_QBRA  , 0,
17866        DSP_                },        /* PRECEQU.PH.QBRA */
17867     { reserved_block      , 0                   , 0   , 32,
17868        0xfc00ffff, 0x2000953f, 0                      , 0,
17869        0x0                 },        /* POOL32Axf_4~*(74) */
17870     { reserved_block      , 0                   , 0   , 32,
17871        0xfc00ffff, 0x2000973f, 0                      , 0,
17872        0x0                 },        /* POOL32Axf_4~*(75) */
17873     { reserved_block      , 0                   , 0   , 32,
17874        0xfc00ffff, 0x2000993f, 0                      , 0,
17875        0x0                 },        /* POOL32Axf_4~*(76) */
17876     { reserved_block      , 0                   , 0   , 32,
17877        0xfc00ffff, 0x20009b3f, 0                      , 0,
17878        0x0                 },        /* POOL32Axf_4~*(77) */
17879     { instruction         , 0                   , 0   , 32,
17880        0xfc00ffff, 0x20009d3f, &MTHC2            , 0,
17881        CP2_                },        /* MTHC2 */
17882     { reserved_block      , 0                   , 0   , 32,
17883        0xfc00ffff, 0x20009f3f, 0                      , 0,
17884        0x0                 },        /* POOL32Axf_4~*(79) */
17885     { reserved_block      , 0                   , 0   , 32,
17886        0xfc00ffff, 0x2000a13f, 0                      , 0,
17887        0x0                 },        /* POOL32Axf_4~*(80) */
17888     { reserved_block      , 0                   , 0   , 32,
17889        0xfc00ffff, 0x2000a33f, 0                      , 0,
17890        0x0                 },        /* POOL32Axf_4~*(81) */
17891     { reserved_block      , 0                   , 0   , 32,
17892        0xfc00ffff, 0x2000a53f, 0                      , 0,
17893        0x0                 },        /* POOL32Axf_4~*(82) */
17894     { reserved_block      , 0                   , 0   , 32,
17895        0xfc00ffff, 0x2000a73f, 0                      , 0,
17896        0x0                 },        /* POOL32Axf_4~*(83) */
17897     { reserved_block      , 0                   , 0   , 32,
17898        0xfc00ffff, 0x2000a93f, 0                      , 0,
17899        0x0                 },        /* POOL32Axf_4~*(84) */
17900     { reserved_block      , 0                   , 0   , 32,
17901        0xfc00ffff, 0x2000ab3f, 0                      , 0,
17902        0x0                 },        /* POOL32Axf_4~*(85) */
17903     { reserved_block      , 0                   , 0   , 32,
17904        0xfc00ffff, 0x2000ad3f, 0                      , 0,
17905        0x0                 },        /* POOL32Axf_4~*(86) */
17906     { reserved_block      , 0                   , 0   , 32,
17907        0xfc00ffff, 0x2000af3f, 0                      , 0,
17908        0x0                 },        /* POOL32Axf_4~*(87) */
17909     { instruction         , 0                   , 0   , 32,
17910        0xfc00ffff, 0x2000b13f, &PRECEU_PH_QBL    , 0,
17911        DSP_                },        /* PRECEU.PH.QBL */
17912     { instruction         , 0                   , 0   , 32,
17913        0xfc00ffff, 0x2000b33f, &PRECEU_PH_QBLA   , 0,
17914        DSP_                },        /* PRECEU.PH.QBLA */
17915     { reserved_block      , 0                   , 0   , 32,
17916        0xfc00ffff, 0x2000b53f, 0                      , 0,
17917        0x0                 },        /* POOL32Axf_4~*(90) */
17918     { reserved_block      , 0                   , 0   , 32,
17919        0xfc00ffff, 0x2000b73f, 0                      , 0,
17920        0x0                 },        /* POOL32Axf_4~*(91) */
17921     { reserved_block      , 0                   , 0   , 32,
17922        0xfc00ffff, 0x2000b93f, 0                      , 0,
17923        0x0                 },        /* POOL32Axf_4~*(92) */
17924     { reserved_block      , 0                   , 0   , 32,
17925        0xfc00ffff, 0x2000bb3f, 0                      , 0,
17926        0x0                 },        /* POOL32Axf_4~*(93) */
17927     { reserved_block      , 0                   , 0   , 32,
17928        0xfc00ffff, 0x2000bd3f, 0                      , 0,
17929        0x0                 },        /* POOL32Axf_4~*(94) */
17930     { reserved_block      , 0                   , 0   , 32,
17931        0xfc00ffff, 0x2000bf3f, 0                      , 0,
17932        0x0                 },        /* POOL32Axf_4~*(95) */
17933     { reserved_block      , 0                   , 0   , 32,
17934        0xfc00ffff, 0x2000c13f, 0                      , 0,
17935        0x0                 },        /* POOL32Axf_4~*(96) */
17936     { reserved_block      , 0                   , 0   , 32,
17937        0xfc00ffff, 0x2000c33f, 0                      , 0,
17938        0x0                 },        /* POOL32Axf_4~*(97) */
17939     { reserved_block      , 0                   , 0   , 32,
17940        0xfc00ffff, 0x2000c53f, 0                      , 0,
17941        0x0                 },        /* POOL32Axf_4~*(98) */
17942     { reserved_block      , 0                   , 0   , 32,
17943        0xfc00ffff, 0x2000c73f, 0                      , 0,
17944        0x0                 },        /* POOL32Axf_4~*(99) */
17945     { reserved_block      , 0                   , 0   , 32,
17946        0xfc00ffff, 0x2000c93f, 0                      , 0,
17947        0x0                 },        /* POOL32Axf_4~*(100) */
17948     { reserved_block      , 0                   , 0   , 32,
17949        0xfc00ffff, 0x2000cb3f, 0                      , 0,
17950        0x0                 },        /* POOL32Axf_4~*(101) */
17951     { instruction         , 0                   , 0   , 32,
17952        0xfc00ffff, 0x2000cd3f, &CFC2             , 0,
17953        CP2_                },        /* CFC2 */
17954     { reserved_block      , 0                   , 0   , 32,
17955        0xfc00ffff, 0x2000cf3f, 0                      , 0,
17956        0x0                 },        /* POOL32Axf_4~*(103) */
17957     { instruction         , 0                   , 0   , 32,
17958        0xfc00ffff, 0x2000d13f, &PRECEU_PH_QBR    , 0,
17959        DSP_                },        /* PRECEU.PH.QBR */
17960     { instruction         , 0                   , 0   , 32,
17961        0xfc00ffff, 0x2000d33f, &PRECEU_PH_QBRA   , 0,
17962        DSP_                },        /* PRECEU.PH.QBRA */
17963     { reserved_block      , 0                   , 0   , 32,
17964        0xfc00ffff, 0x2000d53f, 0                      , 0,
17965        0x0                 },        /* POOL32Axf_4~*(106) */
17966     { reserved_block      , 0                   , 0   , 32,
17967        0xfc00ffff, 0x2000d73f, 0                      , 0,
17968        0x0                 },        /* POOL32Axf_4~*(107) */
17969     { reserved_block      , 0                   , 0   , 32,
17970        0xfc00ffff, 0x2000d93f, 0                      , 0,
17971        0x0                 },        /* POOL32Axf_4~*(108) */
17972     { reserved_block      , 0                   , 0   , 32,
17973        0xfc00ffff, 0x2000db3f, 0                      , 0,
17974        0x0                 },        /* POOL32Axf_4~*(109) */
17975     { instruction         , 0                   , 0   , 32,
17976        0xfc00ffff, 0x2000dd3f, &CTC2             , 0,
17977        CP2_                },        /* CTC2 */
17978     { reserved_block      , 0                   , 0   , 32,
17979        0xfc00ffff, 0x2000df3f, 0                      , 0,
17980        0x0                 },        /* POOL32Axf_4~*(111) */
17981     { reserved_block      , 0                   , 0   , 32,
17982        0xfc00ffff, 0x2000e13f, 0                      , 0,
17983        0x0                 },        /* POOL32Axf_4~*(112) */
17984     { reserved_block      , 0                   , 0   , 32,
17985        0xfc00ffff, 0x2000e33f, 0                      , 0,
17986        0x0                 },        /* POOL32Axf_4~*(113) */
17987     { reserved_block      , 0                   , 0   , 32,
17988        0xfc00ffff, 0x2000e53f, 0                      , 0,
17989        0x0                 },        /* POOL32Axf_4~*(114) */
17990     { reserved_block      , 0                   , 0   , 32,
17991        0xfc00ffff, 0x2000e73f, 0                      , 0,
17992        0x0                 },        /* POOL32Axf_4~*(115) */
17993     { reserved_block      , 0                   , 0   , 32,
17994        0xfc00ffff, 0x2000e93f, 0                      , 0,
17995        0x0                 },        /* POOL32Axf_4~*(116) */
17996     { reserved_block      , 0                   , 0   , 32,
17997        0xfc00ffff, 0x2000eb3f, 0                      , 0,
17998        0x0                 },        /* POOL32Axf_4~*(117) */
17999     { reserved_block      , 0                   , 0   , 32,
18000        0xfc00ffff, 0x2000ed3f, 0                      , 0,
18001        0x0                 },        /* POOL32Axf_4~*(118) */
18002     { reserved_block      , 0                   , 0   , 32,
18003        0xfc00ffff, 0x2000ef3f, 0                      , 0,
18004        0x0                 },        /* POOL32Axf_4~*(119) */
18005     { instruction         , 0                   , 0   , 32,
18006        0xfc00ffff, 0x2000f13f, &RADDU_W_QB       , 0,
18007        DSP_                },        /* RADDU.W.QB */
18008     { reserved_block      , 0                   , 0   , 32,
18009        0xfc00ffff, 0x2000f33f, 0                      , 0,
18010        0x0                 },        /* POOL32Axf_4~*(121) */
18011     { reserved_block      , 0                   , 0   , 32,
18012        0xfc00ffff, 0x2000f53f, 0                      , 0,
18013        0x0                 },        /* POOL32Axf_4~*(122) */
18014     { reserved_block      , 0                   , 0   , 32,
18015        0xfc00ffff, 0x2000f73f, 0                      , 0,
18016        0x0                 },        /* POOL32Axf_4~*(123) */
18017     { reserved_block      , 0                   , 0   , 32,
18018        0xfc00ffff, 0x2000f93f, 0                      , 0,
18019        0x0                 },        /* POOL32Axf_4~*(124) */
18020     { reserved_block      , 0                   , 0   , 32,
18021        0xfc00ffff, 0x2000fb3f, 0                      , 0,
18022        0x0                 },        /* POOL32Axf_4~*(125) */
18023     { reserved_block      , 0                   , 0   , 32,
18024        0xfc00ffff, 0x2000fd3f, 0                      , 0,
18025        0x0                 },        /* POOL32Axf_4~*(126) */
18026     { reserved_block      , 0                   , 0   , 32,
18027        0xfc00ffff, 0x2000ff3f, 0                      , 0,
18028        0x0                 },        /* POOL32Axf_4~*(127) */
18029 };
18030 
18031 
18032 static const Pool POOL32Axf_5_group0[32] = {
18033     { instruction         , 0                   , 0   , 32,
18034        0xfc00ffff, 0x2000017f, &TLBGP            , 0,
18035        CP0_ | VZ_ | TLB_   },        /* TLBGP */
18036     { instruction         , 0                   , 0   , 32,
18037        0xfc00ffff, 0x2000037f, &TLBP             , 0,
18038        CP0_ | TLB_         },        /* TLBP */
18039     { instruction         , 0                   , 0   , 32,
18040        0xfc00ffff, 0x2000057f, &TLBGINV          , 0,
18041        CP0_ | VZ_ | TLB_ | TLBINV_},        /* TLBGINV */
18042     { instruction         , 0                   , 0   , 32,
18043        0xfc00ffff, 0x2000077f, &TLBINV           , 0,
18044        CP0_ | TLB_ | TLBINV_},        /* TLBINV */
18045     { reserved_block      , 0                   , 0   , 32,
18046        0xfc00ffff, 0x2000097f, 0                      , 0,
18047        0x0                 },        /* POOL32Axf_5_group0~*(4) */
18048     { reserved_block      , 0                   , 0   , 32,
18049        0xfc00ffff, 0x20000b7f, 0                      , 0,
18050        0x0                 },        /* POOL32Axf_5_group0~*(5) */
18051     { reserved_block      , 0                   , 0   , 32,
18052        0xfc00ffff, 0x20000d7f, 0                      , 0,
18053        0x0                 },        /* POOL32Axf_5_group0~*(6) */
18054     { reserved_block      , 0                   , 0   , 32,
18055        0xfc00ffff, 0x20000f7f, 0                      , 0,
18056        0x0                 },        /* POOL32Axf_5_group0~*(7) */
18057     { instruction         , 0                   , 0   , 32,
18058        0xfc00ffff, 0x2000117f, &TLBGR            , 0,
18059        CP0_ | VZ_ | TLB_   },        /* TLBGR */
18060     { instruction         , 0                   , 0   , 32,
18061        0xfc00ffff, 0x2000137f, &TLBR             , 0,
18062        CP0_ | TLB_         },        /* TLBR */
18063     { instruction         , 0                   , 0   , 32,
18064        0xfc00ffff, 0x2000157f, &TLBGINVF         , 0,
18065        CP0_ | VZ_ | TLB_ | TLBINV_},        /* TLBGINVF */
18066     { instruction         , 0                   , 0   , 32,
18067        0xfc00ffff, 0x2000177f, &TLBINVF          , 0,
18068        CP0_ | TLB_ | TLBINV_},        /* TLBINVF */
18069     { reserved_block      , 0                   , 0   , 32,
18070        0xfc00ffff, 0x2000197f, 0                      , 0,
18071        0x0                 },        /* POOL32Axf_5_group0~*(12) */
18072     { reserved_block      , 0                   , 0   , 32,
18073        0xfc00ffff, 0x20001b7f, 0                      , 0,
18074        0x0                 },        /* POOL32Axf_5_group0~*(13) */
18075     { reserved_block      , 0                   , 0   , 32,
18076        0xfc00ffff, 0x20001d7f, 0                      , 0,
18077        0x0                 },        /* POOL32Axf_5_group0~*(14) */
18078     { reserved_block      , 0                   , 0   , 32,
18079        0xfc00ffff, 0x20001f7f, 0                      , 0,
18080        0x0                 },        /* POOL32Axf_5_group0~*(15) */
18081     { instruction         , 0                   , 0   , 32,
18082        0xfc00ffff, 0x2000217f, &TLBGWI           , 0,
18083        CP0_ | VZ_ | TLB_   },        /* TLBGWI */
18084     { instruction         , 0                   , 0   , 32,
18085        0xfc00ffff, 0x2000237f, &TLBWI            , 0,
18086        CP0_ | TLB_         },        /* TLBWI */
18087     { reserved_block      , 0                   , 0   , 32,
18088        0xfc00ffff, 0x2000257f, 0                      , 0,
18089        0x0                 },        /* POOL32Axf_5_group0~*(18) */
18090     { reserved_block      , 0                   , 0   , 32,
18091        0xfc00ffff, 0x2000277f, 0                      , 0,
18092        0x0                 },        /* POOL32Axf_5_group0~*(19) */
18093     { reserved_block      , 0                   , 0   , 32,
18094        0xfc00ffff, 0x2000297f, 0                      , 0,
18095        0x0                 },        /* POOL32Axf_5_group0~*(20) */
18096     { reserved_block      , 0                   , 0   , 32,
18097        0xfc00ffff, 0x20002b7f, 0                      , 0,
18098        0x0                 },        /* POOL32Axf_5_group0~*(21) */
18099     { reserved_block      , 0                   , 0   , 32,
18100        0xfc00ffff, 0x20002d7f, 0                      , 0,
18101        0x0                 },        /* POOL32Axf_5_group0~*(22) */
18102     { reserved_block      , 0                   , 0   , 32,
18103        0xfc00ffff, 0x20002f7f, 0                      , 0,
18104        0x0                 },        /* POOL32Axf_5_group0~*(23) */
18105     { instruction         , 0                   , 0   , 32,
18106        0xfc00ffff, 0x2000317f, &TLBGWR           , 0,
18107        CP0_ | VZ_ | TLB_   },        /* TLBGWR */
18108     { instruction         , 0                   , 0   , 32,
18109        0xfc00ffff, 0x2000337f, &TLBWR            , 0,
18110        CP0_ | TLB_         },        /* TLBWR */
18111     { reserved_block      , 0                   , 0   , 32,
18112        0xfc00ffff, 0x2000357f, 0                      , 0,
18113        0x0                 },        /* POOL32Axf_5_group0~*(26) */
18114     { reserved_block      , 0                   , 0   , 32,
18115        0xfc00ffff, 0x2000377f, 0                      , 0,
18116        0x0                 },        /* POOL32Axf_5_group0~*(27) */
18117     { reserved_block      , 0                   , 0   , 32,
18118        0xfc00ffff, 0x2000397f, 0                      , 0,
18119        0x0                 },        /* POOL32Axf_5_group0~*(28) */
18120     { reserved_block      , 0                   , 0   , 32,
18121        0xfc00ffff, 0x20003b7f, 0                      , 0,
18122        0x0                 },        /* POOL32Axf_5_group0~*(29) */
18123     { reserved_block      , 0                   , 0   , 32,
18124        0xfc00ffff, 0x20003d7f, 0                      , 0,
18125        0x0                 },        /* POOL32Axf_5_group0~*(30) */
18126     { reserved_block      , 0                   , 0   , 32,
18127        0xfc00ffff, 0x20003f7f, 0                      , 0,
18128        0x0                 },        /* POOL32Axf_5_group0~*(31) */
18129 };
18130 
18131 
18132 static const Pool POOL32Axf_5_group1[32] = {
18133     { reserved_block      , 0                   , 0   , 32,
18134        0xfc00ffff, 0x2000417f, 0                      , 0,
18135        0x0                 },        /* POOL32Axf_5_group1~*(0) */
18136     { reserved_block      , 0                   , 0   , 32,
18137        0xfc00ffff, 0x2000437f, 0                      , 0,
18138        0x0                 },        /* POOL32Axf_5_group1~*(1) */
18139     { reserved_block      , 0                   , 0   , 32,
18140        0xfc00ffff, 0x2000457f, 0                      , 0,
18141        0x0                 },        /* POOL32Axf_5_group1~*(2) */
18142     { instruction         , 0                   , 0   , 32,
18143        0xfc00ffff, 0x2000477f, &DI               , 0,
18144        0x0                 },        /* DI */
18145     { reserved_block      , 0                   , 0   , 32,
18146        0xfc00ffff, 0x2000497f, 0                      , 0,
18147        0x0                 },        /* POOL32Axf_5_group1~*(4) */
18148     { reserved_block      , 0                   , 0   , 32,
18149        0xfc00ffff, 0x20004b7f, 0                      , 0,
18150        0x0                 },        /* POOL32Axf_5_group1~*(5) */
18151     { reserved_block      , 0                   , 0   , 32,
18152        0xfc00ffff, 0x20004d7f, 0                      , 0,
18153        0x0                 },        /* POOL32Axf_5_group1~*(6) */
18154     { reserved_block      , 0                   , 0   , 32,
18155        0xfc00ffff, 0x20004f7f, 0                      , 0,
18156        0x0                 },        /* POOL32Axf_5_group1~*(7) */
18157     { reserved_block      , 0                   , 0   , 32,
18158        0xfc00ffff, 0x2000517f, 0                      , 0,
18159        0x0                 },        /* POOL32Axf_5_group1~*(8) */
18160     { reserved_block      , 0                   , 0   , 32,
18161        0xfc00ffff, 0x2000537f, 0                      , 0,
18162        0x0                 },        /* POOL32Axf_5_group1~*(9) */
18163     { reserved_block      , 0                   , 0   , 32,
18164        0xfc00ffff, 0x2000557f, 0                      , 0,
18165        0x0                 },        /* POOL32Axf_5_group1~*(10) */
18166     { instruction         , 0                   , 0   , 32,
18167        0xfc00ffff, 0x2000577f, &EI               , 0,
18168        0x0                 },        /* EI */
18169     { reserved_block      , 0                   , 0   , 32,
18170        0xfc00ffff, 0x2000597f, 0                      , 0,
18171        0x0                 },        /* POOL32Axf_5_group1~*(12) */
18172     { reserved_block      , 0                   , 0   , 32,
18173        0xfc00ffff, 0x20005b7f, 0                      , 0,
18174        0x0                 },        /* POOL32Axf_5_group1~*(13) */
18175     { reserved_block      , 0                   , 0   , 32,
18176        0xfc00ffff, 0x20005d7f, 0                      , 0,
18177        0x0                 },        /* POOL32Axf_5_group1~*(14) */
18178     { reserved_block      , 0                   , 0   , 32,
18179        0xfc00ffff, 0x20005f7f, 0                      , 0,
18180        0x0                 },        /* POOL32Axf_5_group1~*(15) */
18181     { reserved_block      , 0                   , 0   , 32,
18182        0xfc00ffff, 0x2000617f, 0                      , 0,
18183        0x0                 },        /* POOL32Axf_5_group1~*(16) */
18184     { reserved_block      , 0                   , 0   , 32,
18185        0xfc00ffff, 0x2000637f, 0                      , 0,
18186        0x0                 },        /* POOL32Axf_5_group1~*(17) */
18187     { reserved_block      , 0                   , 0   , 32,
18188        0xfc00ffff, 0x2000657f, 0                      , 0,
18189        0x0                 },        /* POOL32Axf_5_group1~*(18) */
18190     { reserved_block      , 0                   , 0   , 32,
18191        0xfc00ffff, 0x2000677f, 0                      , 0,
18192        0x0                 },        /* POOL32Axf_5_group1~*(19) */
18193     { reserved_block      , 0                   , 0   , 32,
18194        0xfc00ffff, 0x2000697f, 0                      , 0,
18195        0x0                 },        /* POOL32Axf_5_group1~*(20) */
18196     { reserved_block      , 0                   , 0   , 32,
18197        0xfc00ffff, 0x20006b7f, 0                      , 0,
18198        0x0                 },        /* POOL32Axf_5_group1~*(21) */
18199     { reserved_block      , 0                   , 0   , 32,
18200        0xfc00ffff, 0x20006d7f, 0                      , 0,
18201        0x0                 },        /* POOL32Axf_5_group1~*(22) */
18202     { reserved_block      , 0                   , 0   , 32,
18203        0xfc00ffff, 0x20006f7f, 0                      , 0,
18204        0x0                 },        /* POOL32Axf_5_group1~*(23) */
18205     { reserved_block      , 0                   , 0   , 32,
18206        0xfc00ffff, 0x2000717f, 0                      , 0,
18207        0x0                 },        /* POOL32Axf_5_group1~*(24) */
18208     { reserved_block      , 0                   , 0   , 32,
18209        0xfc00ffff, 0x2000737f, 0                      , 0,
18210        0x0                 },        /* POOL32Axf_5_group1~*(25) */
18211     { reserved_block      , 0                   , 0   , 32,
18212        0xfc00ffff, 0x2000757f, 0                      , 0,
18213        0x0                 },        /* POOL32Axf_5_group1~*(26) */
18214     { reserved_block      , 0                   , 0   , 32,
18215        0xfc00ffff, 0x2000777f, 0                      , 0,
18216        0x0                 },        /* POOL32Axf_5_group1~*(27) */
18217     { reserved_block      , 0                   , 0   , 32,
18218        0xfc00ffff, 0x2000797f, 0                      , 0,
18219        0x0                 },        /* POOL32Axf_5_group1~*(28) */
18220     { reserved_block      , 0                   , 0   , 32,
18221        0xfc00ffff, 0x20007b7f, 0                      , 0,
18222        0x0                 },        /* POOL32Axf_5_group1~*(29) */
18223     { reserved_block      , 0                   , 0   , 32,
18224        0xfc00ffff, 0x20007d7f, 0                      , 0,
18225        0x0                 },        /* POOL32Axf_5_group1~*(30) */
18226     { reserved_block      , 0                   , 0   , 32,
18227        0xfc00ffff, 0x20007f7f, 0                      , 0,
18228        0x0                 },        /* POOL32Axf_5_group1~*(31) */
18229 };
18230 
18231 
18232 static const Pool ERETx[2] = {
18233     { instruction         , 0                   , 0   , 32,
18234        0xfc01ffff, 0x2000f37f, &ERET             , 0,
18235        0x0                 },        /* ERET */
18236     { instruction         , 0                   , 0   , 32,
18237        0xfc01ffff, 0x2001f37f, &ERETNC           , 0,
18238        0x0                 },        /* ERETNC */
18239 };
18240 
18241 
18242 static const Pool POOL32Axf_5_group3[32] = {
18243     { reserved_block      , 0                   , 0   , 32,
18244        0xfc00ffff, 0x2000c17f, 0                      , 0,
18245        0x0                 },        /* POOL32Axf_5_group3~*(0) */
18246     { instruction         , 0                   , 0   , 32,
18247        0xfc00ffff, 0x2000c37f, &WAIT             , 0,
18248        0x0                 },        /* WAIT */
18249     { reserved_block      , 0                   , 0   , 32,
18250        0xfc00ffff, 0x2000c57f, 0                      , 0,
18251        0x0                 },        /* POOL32Axf_5_group3~*(2) */
18252     { reserved_block      , 0                   , 0   , 32,
18253        0xfc00ffff, 0x2000c77f, 0                      , 0,
18254        0x0                 },        /* POOL32Axf_5_group3~*(3) */
18255     { reserved_block      , 0                   , 0   , 32,
18256        0xfc00ffff, 0x2000c97f, 0                      , 0,
18257        0x0                 },        /* POOL32Axf_5_group3~*(4) */
18258     { reserved_block      , 0                   , 0   , 32,
18259        0xfc00ffff, 0x2000cb7f, 0                      , 0,
18260        0x0                 },        /* POOL32Axf_5_group3~*(5) */
18261     { reserved_block      , 0                   , 0   , 32,
18262        0xfc00ffff, 0x2000cd7f, 0                      , 0,
18263        0x0                 },        /* POOL32Axf_5_group3~*(6) */
18264     { reserved_block      , 0                   , 0   , 32,
18265        0xfc00ffff, 0x2000cf7f, 0                      , 0,
18266        0x0                 },        /* POOL32Axf_5_group3~*(7) */
18267     { reserved_block      , 0                   , 0   , 32,
18268        0xfc00ffff, 0x2000d17f, 0                      , 0,
18269        0x0                 },        /* POOL32Axf_5_group3~*(8) */
18270     { instruction         , 0                   , 0   , 32,
18271        0xfc00ffff, 0x2000d37f, &IRET             , 0,
18272        MCU_                },        /* IRET */
18273     { reserved_block      , 0                   , 0   , 32,
18274        0xfc00ffff, 0x2000d57f, 0                      , 0,
18275        0x0                 },        /* POOL32Axf_5_group3~*(10) */
18276     { reserved_block      , 0                   , 0   , 32,
18277        0xfc00ffff, 0x2000d77f, 0                      , 0,
18278        0x0                 },        /* POOL32Axf_5_group3~*(11) */
18279     { reserved_block      , 0                   , 0   , 32,
18280        0xfc00ffff, 0x2000d97f, 0                      , 0,
18281        0x0                 },        /* POOL32Axf_5_group3~*(12) */
18282     { reserved_block      , 0                   , 0   , 32,
18283        0xfc00ffff, 0x2000db7f, 0                      , 0,
18284        0x0                 },        /* POOL32Axf_5_group3~*(13) */
18285     { reserved_block      , 0                   , 0   , 32,
18286        0xfc00ffff, 0x2000dd7f, 0                      , 0,
18287        0x0                 },        /* POOL32Axf_5_group3~*(14) */
18288     { reserved_block      , 0                   , 0   , 32,
18289        0xfc00ffff, 0x2000df7f, 0                      , 0,
18290        0x0                 },        /* POOL32Axf_5_group3~*(15) */
18291     { instruction         , 0                   , 0   , 32,
18292        0xfc00ffff, 0x2000e17f, &RDPGPR           , 0,
18293        CP0_                },        /* RDPGPR */
18294     { instruction         , 0                   , 0   , 32,
18295        0xfc00ffff, 0x2000e37f, &DERET            , 0,
18296        EJTAG_              },        /* DERET */
18297     { reserved_block      , 0                   , 0   , 32,
18298        0xfc00ffff, 0x2000e57f, 0                      , 0,
18299        0x0                 },        /* POOL32Axf_5_group3~*(18) */
18300     { reserved_block      , 0                   , 0   , 32,
18301        0xfc00ffff, 0x2000e77f, 0                      , 0,
18302        0x0                 },        /* POOL32Axf_5_group3~*(19) */
18303     { reserved_block      , 0                   , 0   , 32,
18304        0xfc00ffff, 0x2000e97f, 0                      , 0,
18305        0x0                 },        /* POOL32Axf_5_group3~*(20) */
18306     { reserved_block      , 0                   , 0   , 32,
18307        0xfc00ffff, 0x2000eb7f, 0                      , 0,
18308        0x0                 },        /* POOL32Axf_5_group3~*(21) */
18309     { reserved_block      , 0                   , 0   , 32,
18310        0xfc00ffff, 0x2000ed7f, 0                      , 0,
18311        0x0                 },        /* POOL32Axf_5_group3~*(22) */
18312     { reserved_block      , 0                   , 0   , 32,
18313        0xfc00ffff, 0x2000ef7f, 0                      , 0,
18314        0x0                 },        /* POOL32Axf_5_group3~*(23) */
18315     { instruction         , 0                   , 0   , 32,
18316        0xfc00ffff, 0x2000f17f, &WRPGPR           , 0,
18317        CP0_                },        /* WRPGPR */
18318     { pool                , ERETx               , 2   , 32,
18319        0xfc00ffff, 0x2000f37f, 0                      , 0,
18320        0x0                 },        /* ERETx */
18321     { reserved_block      , 0                   , 0   , 32,
18322        0xfc00ffff, 0x2000f57f, 0                      , 0,
18323        0x0                 },        /* POOL32Axf_5_group3~*(26) */
18324     { reserved_block      , 0                   , 0   , 32,
18325        0xfc00ffff, 0x2000f77f, 0                      , 0,
18326        0x0                 },        /* POOL32Axf_5_group3~*(27) */
18327     { reserved_block      , 0                   , 0   , 32,
18328        0xfc00ffff, 0x2000f97f, 0                      , 0,
18329        0x0                 },        /* POOL32Axf_5_group3~*(28) */
18330     { reserved_block      , 0                   , 0   , 32,
18331        0xfc00ffff, 0x2000fb7f, 0                      , 0,
18332        0x0                 },        /* POOL32Axf_5_group3~*(29) */
18333     { reserved_block      , 0                   , 0   , 32,
18334        0xfc00ffff, 0x2000fd7f, 0                      , 0,
18335        0x0                 },        /* POOL32Axf_5_group3~*(30) */
18336     { reserved_block      , 0                   , 0   , 32,
18337        0xfc00ffff, 0x2000ff7f, 0                      , 0,
18338        0x0                 },        /* POOL32Axf_5_group3~*(31) */
18339 };
18340 
18341 
18342 static const Pool POOL32Axf_5[4] = {
18343     { pool                , POOL32Axf_5_group0  , 32  , 32,
18344        0xfc00c1ff, 0x2000017f, 0                      , 0,
18345        0x0                 },        /* POOL32Axf_5_group0 */
18346     { pool                , POOL32Axf_5_group1  , 32  , 32,
18347        0xfc00c1ff, 0x2000417f, 0                      , 0,
18348        0x0                 },        /* POOL32Axf_5_group1 */
18349     { reserved_block      , 0                   , 0   , 32,
18350        0xfc00c1ff, 0x2000817f, 0                      , 0,
18351        0x0                 },        /* POOL32Axf_5~*(2) */
18352     { pool                , POOL32Axf_5_group3  , 32  , 32,
18353        0xfc00c1ff, 0x2000c17f, 0                      , 0,
18354        0x0                 },        /* POOL32Axf_5_group3 */
18355 };
18356 
18357 
18358 static const Pool SHRA__R__QB[2] = {
18359     { instruction         , 0                   , 0   , 32,
18360        0xfc001fff, 0x200001ff, &SHRA_QB          , 0,
18361        DSP_                },        /* SHRA.QB */
18362     { instruction         , 0                   , 0   , 32,
18363        0xfc001fff, 0x200011ff, &SHRA_R_QB        , 0,
18364        DSP_                },        /* SHRA_R.QB */
18365 };
18366 
18367 
18368 static const Pool POOL32Axf_7[8] = {
18369     { pool                , SHRA__R__QB         , 2   , 32,
18370        0xfc000fff, 0x200001ff, 0                      , 0,
18371        0x0                 },        /* SHRA[_R].QB */
18372     { instruction         , 0                   , 0   , 32,
18373        0xfc000fff, 0x200003ff, &SHRL_PH          , 0,
18374        DSP_                },        /* SHRL.PH */
18375     { instruction         , 0                   , 0   , 32,
18376        0xfc000fff, 0x200005ff, &REPL_QB          , 0,
18377        DSP_                },        /* REPL.QB */
18378     { reserved_block      , 0                   , 0   , 32,
18379        0xfc000fff, 0x200007ff, 0                      , 0,
18380        0x0                 },        /* POOL32Axf_7~*(3) */
18381     { reserved_block      , 0                   , 0   , 32,
18382        0xfc000fff, 0x200009ff, 0                      , 0,
18383        0x0                 },        /* POOL32Axf_7~*(4) */
18384     { reserved_block      , 0                   , 0   , 32,
18385        0xfc000fff, 0x20000bff, 0                      , 0,
18386        0x0                 },        /* POOL32Axf_7~*(5) */
18387     { reserved_block      , 0                   , 0   , 32,
18388        0xfc000fff, 0x20000dff, 0                      , 0,
18389        0x0                 },        /* POOL32Axf_7~*(6) */
18390     { reserved_block      , 0                   , 0   , 32,
18391        0xfc000fff, 0x20000fff, 0                      , 0,
18392        0x0                 },        /* POOL32Axf_7~*(7) */
18393 };
18394 
18395 
18396 static const Pool POOL32Axf[8] = {
18397     { reserved_block      , 0                   , 0   , 32,
18398        0xfc0001ff, 0x2000003f, 0                      , 0,
18399        0x0                 },        /* POOL32Axf~*(0) */
18400     { pool                , POOL32Axf_1         , 8   , 32,
18401        0xfc0001ff, 0x2000007f, 0                      , 0,
18402        0x0                 },        /* POOL32Axf_1 */
18403     { pool                , POOL32Axf_2         , 4   , 32,
18404        0xfc0001ff, 0x200000bf, 0                      , 0,
18405        0x0                 },        /* POOL32Axf_2 */
18406     { reserved_block      , 0                   , 0   , 32,
18407        0xfc0001ff, 0x200000ff, 0                      , 0,
18408        0x0                 },        /* POOL32Axf~*(3) */
18409     { pool                , POOL32Axf_4         , 128 , 32,
18410        0xfc0001ff, 0x2000013f, 0                      , 0,
18411        0x0                 },        /* POOL32Axf_4 */
18412     { pool                , POOL32Axf_5         , 4   , 32,
18413        0xfc0001ff, 0x2000017f, 0                      , 0,
18414        0x0                 },        /* POOL32Axf_5 */
18415     { reserved_block      , 0                   , 0   , 32,
18416        0xfc0001ff, 0x200001bf, 0                      , 0,
18417        0x0                 },        /* POOL32Axf~*(6) */
18418     { pool                , POOL32Axf_7         , 8   , 32,
18419        0xfc0001ff, 0x200001ff, 0                      , 0,
18420        0x0                 },        /* POOL32Axf_7 */
18421 };
18422 
18423 
18424 static const Pool _POOL32A7[8] = {
18425     { pool                , P_LSX               , 2   , 32,
18426        0xfc00003f, 0x20000007, 0                      , 0,
18427        0x0                 },        /* P.LSX */
18428     { instruction         , 0                   , 0   , 32,
18429        0xfc00003f, 0x2000000f, &LSA              , 0,
18430        0x0                 },        /* LSA */
18431     { reserved_block      , 0                   , 0   , 32,
18432        0xfc00003f, 0x20000017, 0                      , 0,
18433        0x0                 },        /* _POOL32A7~*(2) */
18434     { instruction         , 0                   , 0   , 32,
18435        0xfc00003f, 0x2000001f, &EXTW             , 0,
18436        0x0                 },        /* EXTW */
18437     { reserved_block      , 0                   , 0   , 32,
18438        0xfc00003f, 0x20000027, 0                      , 0,
18439        0x0                 },        /* _POOL32A7~*(4) */
18440     { reserved_block      , 0                   , 0   , 32,
18441        0xfc00003f, 0x2000002f, 0                      , 0,
18442        0x0                 },        /* _POOL32A7~*(5) */
18443     { reserved_block      , 0                   , 0   , 32,
18444        0xfc00003f, 0x20000037, 0                      , 0,
18445        0x0                 },        /* _POOL32A7~*(6) */
18446     { pool                , POOL32Axf           , 8   , 32,
18447        0xfc00003f, 0x2000003f, 0                      , 0,
18448        0x0                 },        /* POOL32Axf */
18449 };
18450 
18451 
18452 static const Pool P32A[8] = {
18453     { pool                , _POOL32A0           , 128 , 32,
18454        0xfc000007, 0x20000000, 0                      , 0,
18455        0x0                 },        /* _POOL32A0 */
18456     { instruction         , 0                   , 0   , 32,
18457        0xfc000007, 0x20000001, &SPECIAL2         , 0,
18458        UDI_                },        /* SPECIAL2 */
18459     { instruction         , 0                   , 0   , 32,
18460        0xfc000007, 0x20000002, &COP2_1           , 0,
18461        CP2_                },        /* COP2_1 */
18462     { instruction         , 0                   , 0   , 32,
18463        0xfc000007, 0x20000003, &UDI              , 0,
18464        UDI_                },        /* UDI */
18465     { reserved_block      , 0                   , 0   , 32,
18466        0xfc000007, 0x20000004, 0                      , 0,
18467        0x0                 },        /* P32A~*(4) */
18468     { pool                , _POOL32A5           , 128 , 32,
18469        0xfc000007, 0x20000005, 0                      , 0,
18470        0x0                 },        /* _POOL32A5 */
18471     { reserved_block      , 0                   , 0   , 32,
18472        0xfc000007, 0x20000006, 0                      , 0,
18473        0x0                 },        /* P32A~*(6) */
18474     { pool                , _POOL32A7           , 8   , 32,
18475        0xfc000007, 0x20000007, 0                      , 0,
18476        0x0                 },        /* _POOL32A7 */
18477 };
18478 
18479 
18480 static const Pool P_GP_D[2] = {
18481     { instruction         , 0                   , 0   , 32,
18482        0xfc000007, 0x40000001, &LD_GP_           , 0,
18483        MIPS64_             },        /* LD[GP] */
18484     { instruction         , 0                   , 0   , 32,
18485        0xfc000007, 0x40000005, &SD_GP_           , 0,
18486        MIPS64_             },        /* SD[GP] */
18487 };
18488 
18489 
18490 static const Pool P_GP_W[4] = {
18491     { instruction         , 0                   , 0   , 32,
18492        0xfc000003, 0x40000000, &ADDIU_GP_W_      , 0,
18493        0x0                 },        /* ADDIU[GP.W] */
18494     { pool                , P_GP_D              , 2   , 32,
18495        0xfc000003, 0x40000001, 0                      , 0,
18496        0x0                 },        /* P.GP.D */
18497     { instruction         , 0                   , 0   , 32,
18498        0xfc000003, 0x40000002, &LW_GP_           , 0,
18499        0x0                 },        /* LW[GP] */
18500     { instruction         , 0                   , 0   , 32,
18501        0xfc000003, 0x40000003, &SW_GP_           , 0,
18502        0x0                 },        /* SW[GP] */
18503 };
18504 
18505 
18506 static const Pool POOL48I[32] = {
18507     { instruction         , 0                   , 0   , 48,
18508        0xfc1f00000000ull, 0x600000000000ull, &LI_48_           , 0,
18509        XMMS_               },        /* LI[48] */
18510     { instruction         , 0                   , 0   , 48,
18511        0xfc1f00000000ull, 0x600100000000ull, &ADDIU_48_        , 0,
18512        XMMS_               },        /* ADDIU[48] */
18513     { instruction         , 0                   , 0   , 48,
18514        0xfc1f00000000ull, 0x600200000000ull, &ADDIU_GP48_      , 0,
18515        XMMS_               },        /* ADDIU[GP48] */
18516     { instruction         , 0                   , 0   , 48,
18517        0xfc1f00000000ull, 0x600300000000ull, &ADDIUPC_48_      , 0,
18518        XMMS_               },        /* ADDIUPC[48] */
18519     { reserved_block      , 0                   , 0   , 48,
18520        0xfc1f00000000ull, 0x600400000000ull, 0                      , 0,
18521        0x0                 },        /* POOL48I~*(4) */
18522     { reserved_block      , 0                   , 0   , 48,
18523        0xfc1f00000000ull, 0x600500000000ull, 0                      , 0,
18524        0x0                 },        /* POOL48I~*(5) */
18525     { reserved_block      , 0                   , 0   , 48,
18526        0xfc1f00000000ull, 0x600600000000ull, 0                      , 0,
18527        0x0                 },        /* POOL48I~*(6) */
18528     { reserved_block      , 0                   , 0   , 48,
18529        0xfc1f00000000ull, 0x600700000000ull, 0                      , 0,
18530        0x0                 },        /* POOL48I~*(7) */
18531     { reserved_block      , 0                   , 0   , 48,
18532        0xfc1f00000000ull, 0x600800000000ull, 0                      , 0,
18533        0x0                 },        /* POOL48I~*(8) */
18534     { reserved_block      , 0                   , 0   , 48,
18535        0xfc1f00000000ull, 0x600900000000ull, 0                      , 0,
18536        0x0                 },        /* POOL48I~*(9) */
18537     { reserved_block      , 0                   , 0   , 48,
18538        0xfc1f00000000ull, 0x600a00000000ull, 0                      , 0,
18539        0x0                 },        /* POOL48I~*(10) */
18540     { instruction         , 0                   , 0   , 48,
18541        0xfc1f00000000ull, 0x600b00000000ull, &LWPC_48_         , 0,
18542        XMMS_               },        /* LWPC[48] */
18543     { reserved_block      , 0                   , 0   , 48,
18544        0xfc1f00000000ull, 0x600c00000000ull, 0                      , 0,
18545        0x0                 },        /* POOL48I~*(12) */
18546     { reserved_block      , 0                   , 0   , 48,
18547        0xfc1f00000000ull, 0x600d00000000ull, 0                      , 0,
18548        0x0                 },        /* POOL48I~*(13) */
18549     { reserved_block      , 0                   , 0   , 48,
18550        0xfc1f00000000ull, 0x600e00000000ull, 0                      , 0,
18551        0x0                 },        /* POOL48I~*(14) */
18552     { instruction         , 0                   , 0   , 48,
18553        0xfc1f00000000ull, 0x600f00000000ull, &SWPC_48_         , 0,
18554        XMMS_               },        /* SWPC[48] */
18555     { reserved_block      , 0                   , 0   , 48,
18556        0xfc1f00000000ull, 0x601000000000ull, 0                      , 0,
18557        0x0                 },        /* POOL48I~*(16) */
18558     { instruction         , 0                   , 0   , 48,
18559        0xfc1f00000000ull, 0x601100000000ull, &DADDIU_48_       , 0,
18560        MIPS64_             },        /* DADDIU[48] */
18561     { reserved_block      , 0                   , 0   , 48,
18562        0xfc1f00000000ull, 0x601200000000ull, 0                      , 0,
18563        0x0                 },        /* POOL48I~*(18) */
18564     { reserved_block      , 0                   , 0   , 48,
18565        0xfc1f00000000ull, 0x601300000000ull, 0                      , 0,
18566        0x0                 },        /* POOL48I~*(19) */
18567     { instruction         , 0                   , 0   , 48,
18568        0xfc1f00000000ull, 0x601400000000ull, &DLUI_48_         , 0,
18569        MIPS64_             },        /* DLUI[48] */
18570     { reserved_block      , 0                   , 0   , 48,
18571        0xfc1f00000000ull, 0x601500000000ull, 0                      , 0,
18572        0x0                 },        /* POOL48I~*(21) */
18573     { reserved_block      , 0                   , 0   , 48,
18574        0xfc1f00000000ull, 0x601600000000ull, 0                      , 0,
18575        0x0                 },        /* POOL48I~*(22) */
18576     { reserved_block      , 0                   , 0   , 48,
18577        0xfc1f00000000ull, 0x601700000000ull, 0                      , 0,
18578        0x0                 },        /* POOL48I~*(23) */
18579     { reserved_block      , 0                   , 0   , 48,
18580        0xfc1f00000000ull, 0x601800000000ull, 0                      , 0,
18581        0x0                 },        /* POOL48I~*(24) */
18582     { reserved_block      , 0                   , 0   , 48,
18583        0xfc1f00000000ull, 0x601900000000ull, 0                      , 0,
18584        0x0                 },        /* POOL48I~*(25) */
18585     { reserved_block      , 0                   , 0   , 48,
18586        0xfc1f00000000ull, 0x601a00000000ull, 0                      , 0,
18587        0x0                 },        /* POOL48I~*(26) */
18588     { instruction         , 0                   , 0   , 48,
18589        0xfc1f00000000ull, 0x601b00000000ull, &LDPC_48_         , 0,
18590        MIPS64_             },        /* LDPC[48] */
18591     { reserved_block      , 0                   , 0   , 48,
18592        0xfc1f00000000ull, 0x601c00000000ull, 0                      , 0,
18593        0x0                 },        /* POOL48I~*(28) */
18594     { reserved_block      , 0                   , 0   , 48,
18595        0xfc1f00000000ull, 0x601d00000000ull, 0                      , 0,
18596        0x0                 },        /* POOL48I~*(29) */
18597     { reserved_block      , 0                   , 0   , 48,
18598        0xfc1f00000000ull, 0x601e00000000ull, 0                      , 0,
18599        0x0                 },        /* POOL48I~*(30) */
18600     { instruction         , 0                   , 0   , 48,
18601        0xfc1f00000000ull, 0x601f00000000ull, &SDPC_48_         , 0,
18602        MIPS64_             },        /* SDPC[48] */
18603 };
18604 
18605 
18606 static const Pool PP_SR[4] = {
18607     { instruction         , 0                   , 0   , 32,
18608        0xfc10f003, 0x80003000, &SAVE_32_         , 0,
18609        0x0                 },        /* SAVE[32] */
18610     { reserved_block      , 0                   , 0   , 32,
18611        0xfc10f003, 0x80003001, 0                      , 0,
18612        0x0                 },        /* PP.SR~*(1) */
18613     { instruction         , 0                   , 0   , 32,
18614        0xfc10f003, 0x80003002, &RESTORE_32_      , 0,
18615        0x0                 },        /* RESTORE[32] */
18616     { return_instruction  , 0                   , 0   , 32,
18617        0xfc10f003, 0x80003003, &RESTORE_JRC_32_  , 0,
18618        0x0                 },        /* RESTORE.JRC[32] */
18619 };
18620 
18621 
18622 static const Pool P_SR_F[8] = {
18623     { instruction         , 0                   , 0   , 32,
18624        0xfc10f007, 0x80103000, &SAVEF            , 0,
18625        CP1_                },        /* SAVEF */
18626     { instruction         , 0                   , 0   , 32,
18627        0xfc10f007, 0x80103001, &RESTOREF         , 0,
18628        CP1_                },        /* RESTOREF */
18629     { reserved_block      , 0                   , 0   , 32,
18630        0xfc10f007, 0x80103002, 0                      , 0,
18631        0x0                 },        /* P.SR.F~*(2) */
18632     { reserved_block      , 0                   , 0   , 32,
18633        0xfc10f007, 0x80103003, 0                      , 0,
18634        0x0                 },        /* P.SR.F~*(3) */
18635     { reserved_block      , 0                   , 0   , 32,
18636        0xfc10f007, 0x80103004, 0                      , 0,
18637        0x0                 },        /* P.SR.F~*(4) */
18638     { reserved_block      , 0                   , 0   , 32,
18639        0xfc10f007, 0x80103005, 0                      , 0,
18640        0x0                 },        /* P.SR.F~*(5) */
18641     { reserved_block      , 0                   , 0   , 32,
18642        0xfc10f007, 0x80103006, 0                      , 0,
18643        0x0                 },        /* P.SR.F~*(6) */
18644     { reserved_block      , 0                   , 0   , 32,
18645        0xfc10f007, 0x80103007, 0                      , 0,
18646        0x0                 },        /* P.SR.F~*(7) */
18647 };
18648 
18649 
18650 static const Pool P_SR[2] = {
18651     { pool                , PP_SR               , 4   , 32,
18652        0xfc10f000, 0x80003000, 0                      , 0,
18653        0x0                 },        /* PP.SR */
18654     { pool                , P_SR_F              , 8   , 32,
18655        0xfc10f000, 0x80103000, 0                      , 0,
18656        0x0                 },        /* P.SR.F */
18657 };
18658 
18659 
18660 static const Pool P_SLL[5] = {
18661     { instruction         , 0                   , 0   , 32,
18662        0xffe0f1ff, 0x8000c000, &NOP_32_          , 0,
18663        0x0                 },        /* NOP[32] */
18664     { instruction         , 0                   , 0   , 32,
18665        0xffe0f1ff, 0x8000c003, &EHB              , 0,
18666        0x0                 },        /* EHB */
18667     { instruction         , 0                   , 0   , 32,
18668        0xffe0f1ff, 0x8000c005, &PAUSE            , 0,
18669        0x0                 },        /* PAUSE */
18670     { instruction         , 0                   , 0   , 32,
18671        0xffe0f1ff, 0x8000c006, &SYNC             , 0,
18672        0x0                 },        /* SYNC */
18673     { instruction         , 0                   , 0   , 32,
18674        0xfc00f1e0, 0x8000c000, &SLL_32_          , 0,
18675        0x0                 },        /* SLL[32] */
18676 };
18677 
18678 
18679 static const Pool P_SHIFT[16] = {
18680     { pool                , P_SLL               , 5   , 32,
18681        0xfc00f1e0, 0x8000c000, 0                      , 0,
18682        0x0                 },        /* P.SLL */
18683     { reserved_block      , 0                   , 0   , 32,
18684        0xfc00f1e0, 0x8000c020, 0                      , 0,
18685        0x0                 },        /* P.SHIFT~*(1) */
18686     { instruction         , 0                   , 0   , 32,
18687        0xfc00f1e0, 0x8000c040, &SRL_32_          , 0,
18688        0x0                 },        /* SRL[32] */
18689     { reserved_block      , 0                   , 0   , 32,
18690        0xfc00f1e0, 0x8000c060, 0                      , 0,
18691        0x0                 },        /* P.SHIFT~*(3) */
18692     { instruction         , 0                   , 0   , 32,
18693        0xfc00f1e0, 0x8000c080, &SRA              , 0,
18694        0x0                 },        /* SRA */
18695     { reserved_block      , 0                   , 0   , 32,
18696        0xfc00f1e0, 0x8000c0a0, 0                      , 0,
18697        0x0                 },        /* P.SHIFT~*(5) */
18698     { instruction         , 0                   , 0   , 32,
18699        0xfc00f1e0, 0x8000c0c0, &ROTR             , 0,
18700        0x0                 },        /* ROTR */
18701     { reserved_block      , 0                   , 0   , 32,
18702        0xfc00f1e0, 0x8000c0e0, 0                      , 0,
18703        0x0                 },        /* P.SHIFT~*(7) */
18704     { instruction         , 0                   , 0   , 32,
18705        0xfc00f1e0, 0x8000c100, &DSLL             , 0,
18706        MIPS64_             },        /* DSLL */
18707     { instruction         , 0                   , 0   , 32,
18708        0xfc00f1e0, 0x8000c120, &DSLL32           , 0,
18709        MIPS64_             },        /* DSLL32 */
18710     { instruction         , 0                   , 0   , 32,
18711        0xfc00f1e0, 0x8000c140, &DSRL             , 0,
18712        MIPS64_             },        /* DSRL */
18713     { instruction         , 0                   , 0   , 32,
18714        0xfc00f1e0, 0x8000c160, &DSRL32           , 0,
18715        MIPS64_             },        /* DSRL32 */
18716     { instruction         , 0                   , 0   , 32,
18717        0xfc00f1e0, 0x8000c180, &DSRA             , 0,
18718        MIPS64_             },        /* DSRA */
18719     { instruction         , 0                   , 0   , 32,
18720        0xfc00f1e0, 0x8000c1a0, &DSRA32           , 0,
18721        MIPS64_             },        /* DSRA32 */
18722     { instruction         , 0                   , 0   , 32,
18723        0xfc00f1e0, 0x8000c1c0, &DROTR            , 0,
18724        MIPS64_             },        /* DROTR */
18725     { instruction         , 0                   , 0   , 32,
18726        0xfc00f1e0, 0x8000c1e0, &DROTR32          , 0,
18727        MIPS64_             },        /* DROTR32 */
18728 };
18729 
18730 
18731 static const Pool P_ROTX[4] = {
18732     { instruction         , 0                   , 0   , 32,
18733        0xfc00f820, 0x8000d000, &ROTX             , 0,
18734        XMMS_               },        /* ROTX */
18735     { reserved_block      , 0                   , 0   , 32,
18736        0xfc00f820, 0x8000d020, 0                      , 0,
18737        0x0                 },        /* P.ROTX~*(1) */
18738     { reserved_block      , 0                   , 0   , 32,
18739        0xfc00f820, 0x8000d800, 0                      , 0,
18740        0x0                 },        /* P.ROTX~*(2) */
18741     { reserved_block      , 0                   , 0   , 32,
18742        0xfc00f820, 0x8000d820, 0                      , 0,
18743        0x0                 },        /* P.ROTX~*(3) */
18744 };
18745 
18746 
18747 static const Pool P_INS[4] = {
18748     { instruction         , 0                   , 0   , 32,
18749        0xfc00f820, 0x8000e000, &INS              , 0,
18750        XMMS_               },        /* INS */
18751     { instruction         , 0                   , 0   , 32,
18752        0xfc00f820, 0x8000e020, &DINSU            , 0,
18753        MIPS64_             },        /* DINSU */
18754     { instruction         , 0                   , 0   , 32,
18755        0xfc00f820, 0x8000e800, &DINSM            , 0,
18756        MIPS64_             },        /* DINSM */
18757     { instruction         , 0                   , 0   , 32,
18758        0xfc00f820, 0x8000e820, &DINS             , 0,
18759        MIPS64_             },        /* DINS */
18760 };
18761 
18762 
18763 static const Pool P_EXT[4] = {
18764     { instruction         , 0                   , 0   , 32,
18765        0xfc00f820, 0x8000f000, &EXT              , 0,
18766        XMMS_               },        /* EXT */
18767     { instruction         , 0                   , 0   , 32,
18768        0xfc00f820, 0x8000f020, &DEXTU            , 0,
18769        MIPS64_             },        /* DEXTU */
18770     { instruction         , 0                   , 0   , 32,
18771        0xfc00f820, 0x8000f800, &DEXTM            , 0,
18772        MIPS64_             },        /* DEXTM */
18773     { instruction         , 0                   , 0   , 32,
18774        0xfc00f820, 0x8000f820, &DEXT             , 0,
18775        MIPS64_             },        /* DEXT */
18776 };
18777 
18778 
18779 static const Pool P_U12[16] = {
18780     { instruction         , 0                   , 0   , 32,
18781        0xfc00f000, 0x80000000, &ORI              , 0,
18782        0x0                 },        /* ORI */
18783     { instruction         , 0                   , 0   , 32,
18784        0xfc00f000, 0x80001000, &XORI             , 0,
18785        0x0                 },        /* XORI */
18786     { instruction         , 0                   , 0   , 32,
18787        0xfc00f000, 0x80002000, &ANDI_32_         , 0,
18788        0x0                 },        /* ANDI[32] */
18789     { pool                , P_SR                , 2   , 32,
18790        0xfc00f000, 0x80003000, 0                      , 0,
18791        0x0                 },        /* P.SR */
18792     { instruction         , 0                   , 0   , 32,
18793        0xfc00f000, 0x80004000, &SLTI             , 0,
18794        0x0                 },        /* SLTI */
18795     { instruction         , 0                   , 0   , 32,
18796        0xfc00f000, 0x80005000, &SLTIU            , 0,
18797        0x0                 },        /* SLTIU */
18798     { instruction         , 0                   , 0   , 32,
18799        0xfc00f000, 0x80006000, &SEQI             , 0,
18800        0x0                 },        /* SEQI */
18801     { reserved_block      , 0                   , 0   , 32,
18802        0xfc00f000, 0x80007000, 0                      , 0,
18803        0x0                 },        /* P.U12~*(7) */
18804     { instruction         , 0                   , 0   , 32,
18805        0xfc00f000, 0x80008000, &ADDIU_NEG_       , 0,
18806        0x0                 },        /* ADDIU[NEG] */
18807     { instruction         , 0                   , 0   , 32,
18808        0xfc00f000, 0x80009000, &DADDIU_U12_      , 0,
18809        MIPS64_             },        /* DADDIU[U12] */
18810     { instruction         , 0                   , 0   , 32,
18811        0xfc00f000, 0x8000a000, &DADDIU_NEG_      , 0,
18812        MIPS64_             },        /* DADDIU[NEG] */
18813     { instruction         , 0                   , 0   , 32,
18814        0xfc00f000, 0x8000b000, &DROTX            , 0,
18815        MIPS64_             },        /* DROTX */
18816     { pool                , P_SHIFT             , 16  , 32,
18817        0xfc00f000, 0x8000c000, 0                      , 0,
18818        0x0                 },        /* P.SHIFT */
18819     { pool                , P_ROTX              , 4   , 32,
18820        0xfc00f000, 0x8000d000, 0                      , 0,
18821        0x0                 },        /* P.ROTX */
18822     { pool                , P_INS               , 4   , 32,
18823        0xfc00f000, 0x8000e000, 0                      , 0,
18824        0x0                 },        /* P.INS */
18825     { pool                , P_EXT               , 4   , 32,
18826        0xfc00f000, 0x8000f000, 0                      , 0,
18827        0x0                 },        /* P.EXT */
18828 };
18829 
18830 
18831 static const Pool RINT_fmt[2] = {
18832     { instruction         , 0                   , 0   , 32,
18833        0xfc0003ff, 0xa0000020, &RINT_S           , 0,
18834        CP1_                },        /* RINT.S */
18835     { instruction         , 0                   , 0   , 32,
18836        0xfc0003ff, 0xa0000220, &RINT_D           , 0,
18837        CP1_                },        /* RINT.D */
18838 };
18839 
18840 
18841 static const Pool ADD_fmt0[2] = {
18842     { instruction         , 0                   , 0   , 32,
18843        0xfc0003ff, 0xa0000030, &ADD_S            , 0,
18844        CP1_                },        /* ADD.S */
18845     { reserved_block      , 0                   , 0   , 32,
18846        0xfc0003ff, 0xa0000230, 0                      , 0,
18847        CP1_                },        /* ADD.fmt0~*(1) */
18848 };
18849 
18850 
18851 static const Pool SELEQZ_fmt[2] = {
18852     { instruction         , 0                   , 0   , 32,
18853        0xfc0003ff, 0xa0000038, &SELEQZ_S         , 0,
18854        CP1_                },        /* SELEQZ.S */
18855     { instruction         , 0                   , 0   , 32,
18856        0xfc0003ff, 0xa0000238, &SELEQZ_D         , 0,
18857        CP1_                },        /* SELEQZ.D */
18858 };
18859 
18860 
18861 static const Pool CLASS_fmt[2] = {
18862     { instruction         , 0                   , 0   , 32,
18863        0xfc0003ff, 0xa0000060, &CLASS_S          , 0,
18864        CP1_                },        /* CLASS.S */
18865     { instruction         , 0                   , 0   , 32,
18866        0xfc0003ff, 0xa0000260, &CLASS_D          , 0,
18867        CP1_                },        /* CLASS.D */
18868 };
18869 
18870 
18871 static const Pool SUB_fmt0[2] = {
18872     { instruction         , 0                   , 0   , 32,
18873        0xfc0003ff, 0xa0000070, &SUB_S            , 0,
18874        CP1_                },        /* SUB.S */
18875     { reserved_block      , 0                   , 0   , 32,
18876        0xfc0003ff, 0xa0000270, 0                      , 0,
18877        CP1_                },        /* SUB.fmt0~*(1) */
18878 };
18879 
18880 
18881 static const Pool SELNEZ_fmt[2] = {
18882     { instruction         , 0                   , 0   , 32,
18883        0xfc0003ff, 0xa0000078, &SELNEZ_S         , 0,
18884        CP1_                },        /* SELNEZ.S */
18885     { instruction         , 0                   , 0   , 32,
18886        0xfc0003ff, 0xa0000278, &SELNEZ_D         , 0,
18887        CP1_                },        /* SELNEZ.D */
18888 };
18889 
18890 
18891 static const Pool MUL_fmt0[2] = {
18892     { instruction         , 0                   , 0   , 32,
18893        0xfc0003ff, 0xa00000b0, &MUL_S            , 0,
18894        CP1_                },        /* MUL.S */
18895     { reserved_block      , 0                   , 0   , 32,
18896        0xfc0003ff, 0xa00002b0, 0                      , 0,
18897        CP1_                },        /* MUL.fmt0~*(1) */
18898 };
18899 
18900 
18901 static const Pool SEL_fmt[2] = {
18902     { instruction         , 0                   , 0   , 32,
18903        0xfc0003ff, 0xa00000b8, &SEL_S            , 0,
18904        CP1_                },        /* SEL.S */
18905     { instruction         , 0                   , 0   , 32,
18906        0xfc0003ff, 0xa00002b8, &SEL_D            , 0,
18907        CP1_                },        /* SEL.D */
18908 };
18909 
18910 
18911 static const Pool DIV_fmt0[2] = {
18912     { instruction         , 0                   , 0   , 32,
18913        0xfc0003ff, 0xa00000f0, &DIV_S            , 0,
18914        CP1_                },        /* DIV.S */
18915     { reserved_block      , 0                   , 0   , 32,
18916        0xfc0003ff, 0xa00002f0, 0                      , 0,
18917        CP1_                },        /* DIV.fmt0~*(1) */
18918 };
18919 
18920 
18921 static const Pool ADD_fmt1[2] = {
18922     { instruction         , 0                   , 0   , 32,
18923        0xfc0003ff, 0xa0000130, &ADD_D            , 0,
18924        CP1_                },        /* ADD.D */
18925     { reserved_block      , 0                   , 0   , 32,
18926        0xfc0003ff, 0xa0000330, 0                      , 0,
18927        CP1_                },        /* ADD.fmt1~*(1) */
18928 };
18929 
18930 
18931 static const Pool SUB_fmt1[2] = {
18932     { instruction         , 0                   , 0   , 32,
18933        0xfc0003ff, 0xa0000170, &SUB_D            , 0,
18934        CP1_                },        /* SUB.D */
18935     { reserved_block      , 0                   , 0   , 32,
18936        0xfc0003ff, 0xa0000370, 0                      , 0,
18937        CP1_                },        /* SUB.fmt1~*(1) */
18938 };
18939 
18940 
18941 static const Pool MUL_fmt1[2] = {
18942     { instruction         , 0                   , 0   , 32,
18943        0xfc0003ff, 0xa00001b0, &MUL_D            , 0,
18944        CP1_                },        /* MUL.D */
18945     { reserved_block      , 0                   , 0   , 32,
18946        0xfc0003ff, 0xa00003b0, 0                      , 0,
18947        CP1_                },        /* MUL.fmt1~*(1) */
18948 };
18949 
18950 
18951 static const Pool MADDF_fmt[2] = {
18952     { instruction         , 0                   , 0   , 32,
18953        0xfc0003ff, 0xa00001b8, &MADDF_S          , 0,
18954        CP1_                },        /* MADDF.S */
18955     { instruction         , 0                   , 0   , 32,
18956        0xfc0003ff, 0xa00003b8, &MADDF_D          , 0,
18957        CP1_                },        /* MADDF.D */
18958 };
18959 
18960 
18961 static const Pool DIV_fmt1[2] = {
18962     { instruction         , 0                   , 0   , 32,
18963        0xfc0003ff, 0xa00001f0, &DIV_D            , 0,
18964        CP1_                },        /* DIV.D */
18965     { reserved_block      , 0                   , 0   , 32,
18966        0xfc0003ff, 0xa00003f0, 0                      , 0,
18967        CP1_                },        /* DIV.fmt1~*(1) */
18968 };
18969 
18970 
18971 static const Pool MSUBF_fmt[2] = {
18972     { instruction         , 0                   , 0   , 32,
18973        0xfc0003ff, 0xa00001f8, &MSUBF_S          , 0,
18974        CP1_                },        /* MSUBF.S */
18975     { instruction         , 0                   , 0   , 32,
18976        0xfc0003ff, 0xa00003f8, &MSUBF_D          , 0,
18977        CP1_                },        /* MSUBF.D */
18978 };
18979 
18980 
18981 static const Pool POOL32F_0[64] = {
18982     { reserved_block      , 0                   , 0   , 32,
18983        0xfc0001ff, 0xa0000000, 0                      , 0,
18984        CP1_                },        /* POOL32F_0~*(0) */
18985     { reserved_block      , 0                   , 0   , 32,
18986        0xfc0001ff, 0xa0000008, 0                      , 0,
18987        CP1_                },        /* POOL32F_0~*(1) */
18988     { reserved_block      , 0                   , 0   , 32,
18989        0xfc0001ff, 0xa0000010, 0                      , 0,
18990        CP1_                },        /* POOL32F_0~*(2) */
18991     { reserved_block      , 0                   , 0   , 32,
18992        0xfc0001ff, 0xa0000018, 0                      , 0,
18993        CP1_                },        /* POOL32F_0~*(3) */
18994     { pool                , RINT_fmt            , 2   , 32,
18995        0xfc0001ff, 0xa0000020, 0                      , 0,
18996        CP1_                },        /* RINT.fmt */
18997     { reserved_block      , 0                   , 0   , 32,
18998        0xfc0001ff, 0xa0000028, 0                      , 0,
18999        CP1_                },        /* POOL32F_0~*(5) */
19000     { pool                , ADD_fmt0            , 2   , 32,
19001        0xfc0001ff, 0xa0000030, 0                      , 0,
19002        CP1_                },        /* ADD.fmt0 */
19003     { pool                , SELEQZ_fmt          , 2   , 32,
19004        0xfc0001ff, 0xa0000038, 0                      , 0,
19005        CP1_                },        /* SELEQZ.fmt */
19006     { reserved_block      , 0                   , 0   , 32,
19007        0xfc0001ff, 0xa0000040, 0                      , 0,
19008        CP1_                },        /* POOL32F_0~*(8) */
19009     { reserved_block      , 0                   , 0   , 32,
19010        0xfc0001ff, 0xa0000048, 0                      , 0,
19011        CP1_                },        /* POOL32F_0~*(9) */
19012     { reserved_block      , 0                   , 0   , 32,
19013        0xfc0001ff, 0xa0000050, 0                      , 0,
19014        CP1_                },        /* POOL32F_0~*(10) */
19015     { reserved_block      , 0                   , 0   , 32,
19016        0xfc0001ff, 0xa0000058, 0                      , 0,
19017        CP1_                },        /* POOL32F_0~*(11) */
19018     { pool                , CLASS_fmt           , 2   , 32,
19019        0xfc0001ff, 0xa0000060, 0                      , 0,
19020        CP1_                },        /* CLASS.fmt */
19021     { reserved_block      , 0                   , 0   , 32,
19022        0xfc0001ff, 0xa0000068, 0                      , 0,
19023        CP1_                },        /* POOL32F_0~*(13) */
19024     { pool                , SUB_fmt0            , 2   , 32,
19025        0xfc0001ff, 0xa0000070, 0                      , 0,
19026        CP1_                },        /* SUB.fmt0 */
19027     { pool                , SELNEZ_fmt          , 2   , 32,
19028        0xfc0001ff, 0xa0000078, 0                      , 0,
19029        CP1_                },        /* SELNEZ.fmt */
19030     { reserved_block      , 0                   , 0   , 32,
19031        0xfc0001ff, 0xa0000080, 0                      , 0,
19032        CP1_                },        /* POOL32F_0~*(16) */
19033     { reserved_block      , 0                   , 0   , 32,
19034        0xfc0001ff, 0xa0000088, 0                      , 0,
19035        CP1_                },        /* POOL32F_0~*(17) */
19036     { reserved_block      , 0                   , 0   , 32,
19037        0xfc0001ff, 0xa0000090, 0                      , 0,
19038        CP1_                },        /* POOL32F_0~*(18) */
19039     { reserved_block      , 0                   , 0   , 32,
19040        0xfc0001ff, 0xa0000098, 0                      , 0,
19041        CP1_                },        /* POOL32F_0~*(19) */
19042     { reserved_block      , 0                   , 0   , 32,
19043        0xfc0001ff, 0xa00000a0, 0                      , 0,
19044        CP1_                },        /* POOL32F_0~*(20) */
19045     { reserved_block      , 0                   , 0   , 32,
19046        0xfc0001ff, 0xa00000a8, 0                      , 0,
19047        CP1_                },        /* POOL32F_0~*(21) */
19048     { pool                , MUL_fmt0            , 2   , 32,
19049        0xfc0001ff, 0xa00000b0, 0                      , 0,
19050        CP1_                },        /* MUL.fmt0 */
19051     { pool                , SEL_fmt             , 2   , 32,
19052        0xfc0001ff, 0xa00000b8, 0                      , 0,
19053        CP1_                },        /* SEL.fmt */
19054     { reserved_block      , 0                   , 0   , 32,
19055        0xfc0001ff, 0xa00000c0, 0                      , 0,
19056        CP1_                },        /* POOL32F_0~*(24) */
19057     { reserved_block      , 0                   , 0   , 32,
19058        0xfc0001ff, 0xa00000c8, 0                      , 0,
19059        CP1_                },        /* POOL32F_0~*(25) */
19060     { reserved_block      , 0                   , 0   , 32,
19061        0xfc0001ff, 0xa00000d0, 0                      , 0,
19062        CP1_                },        /* POOL32F_0~*(26) */
19063     { reserved_block      , 0                   , 0   , 32,
19064        0xfc0001ff, 0xa00000d8, 0                      , 0,
19065        CP1_                },        /* POOL32F_0~*(27) */
19066     { reserved_block      , 0                   , 0   , 32,
19067        0xfc0001ff, 0xa00000e0, 0                      , 0,
19068        CP1_                },        /* POOL32F_0~*(28) */
19069     { reserved_block      , 0                   , 0   , 32,
19070        0xfc0001ff, 0xa00000e8, 0                      , 0,
19071        CP1_                },        /* POOL32F_0~*(29) */
19072     { pool                , DIV_fmt0            , 2   , 32,
19073        0xfc0001ff, 0xa00000f0, 0                      , 0,
19074        CP1_                },        /* DIV.fmt0 */
19075     { reserved_block      , 0                   , 0   , 32,
19076        0xfc0001ff, 0xa00000f8, 0                      , 0,
19077        CP1_                },        /* POOL32F_0~*(31) */
19078     { reserved_block      , 0                   , 0   , 32,
19079        0xfc0001ff, 0xa0000100, 0                      , 0,
19080        CP1_                },        /* POOL32F_0~*(32) */
19081     { reserved_block      , 0                   , 0   , 32,
19082        0xfc0001ff, 0xa0000108, 0                      , 0,
19083        CP1_                },        /* POOL32F_0~*(33) */
19084     { reserved_block      , 0                   , 0   , 32,
19085        0xfc0001ff, 0xa0000110, 0                      , 0,
19086        CP1_                },        /* POOL32F_0~*(34) */
19087     { reserved_block      , 0                   , 0   , 32,
19088        0xfc0001ff, 0xa0000118, 0                      , 0,
19089        CP1_                },        /* POOL32F_0~*(35) */
19090     { reserved_block      , 0                   , 0   , 32,
19091        0xfc0001ff, 0xa0000120, 0                      , 0,
19092        CP1_                },        /* POOL32F_0~*(36) */
19093     { reserved_block      , 0                   , 0   , 32,
19094        0xfc0001ff, 0xa0000128, 0                      , 0,
19095        CP1_                },        /* POOL32F_0~*(37) */
19096     { pool                , ADD_fmt1            , 2   , 32,
19097        0xfc0001ff, 0xa0000130, 0                      , 0,
19098        CP1_                },        /* ADD.fmt1 */
19099     { reserved_block      , 0                   , 0   , 32,
19100        0xfc0001ff, 0xa0000138, 0                      , 0,
19101        CP1_                },        /* POOL32F_0~*(39) */
19102     { reserved_block      , 0                   , 0   , 32,
19103        0xfc0001ff, 0xa0000140, 0                      , 0,
19104        CP1_                },        /* POOL32F_0~*(40) */
19105     { reserved_block      , 0                   , 0   , 32,
19106        0xfc0001ff, 0xa0000148, 0                      , 0,
19107        CP1_                },        /* POOL32F_0~*(41) */
19108     { reserved_block      , 0                   , 0   , 32,
19109        0xfc0001ff, 0xa0000150, 0                      , 0,
19110        CP1_                },        /* POOL32F_0~*(42) */
19111     { reserved_block      , 0                   , 0   , 32,
19112        0xfc0001ff, 0xa0000158, 0                      , 0,
19113        CP1_                },        /* POOL32F_0~*(43) */
19114     { reserved_block      , 0                   , 0   , 32,
19115        0xfc0001ff, 0xa0000160, 0                      , 0,
19116        CP1_                },        /* POOL32F_0~*(44) */
19117     { reserved_block      , 0                   , 0   , 32,
19118        0xfc0001ff, 0xa0000168, 0                      , 0,
19119        CP1_                },        /* POOL32F_0~*(45) */
19120     { pool                , SUB_fmt1            , 2   , 32,
19121        0xfc0001ff, 0xa0000170, 0                      , 0,
19122        CP1_                },        /* SUB.fmt1 */
19123     { reserved_block      , 0                   , 0   , 32,
19124        0xfc0001ff, 0xa0000178, 0                      , 0,
19125        CP1_                },        /* POOL32F_0~*(47) */
19126     { reserved_block      , 0                   , 0   , 32,
19127        0xfc0001ff, 0xa0000180, 0                      , 0,
19128        CP1_                },        /* POOL32F_0~*(48) */
19129     { reserved_block      , 0                   , 0   , 32,
19130        0xfc0001ff, 0xa0000188, 0                      , 0,
19131        CP1_                },        /* POOL32F_0~*(49) */
19132     { reserved_block      , 0                   , 0   , 32,
19133        0xfc0001ff, 0xa0000190, 0                      , 0,
19134        CP1_                },        /* POOL32F_0~*(50) */
19135     { reserved_block      , 0                   , 0   , 32,
19136        0xfc0001ff, 0xa0000198, 0                      , 0,
19137        CP1_                },        /* POOL32F_0~*(51) */
19138     { reserved_block      , 0                   , 0   , 32,
19139        0xfc0001ff, 0xa00001a0, 0                      , 0,
19140        CP1_                },        /* POOL32F_0~*(52) */
19141     { reserved_block      , 0                   , 0   , 32,
19142        0xfc0001ff, 0xa00001a8, 0                      , 0,
19143        CP1_                },        /* POOL32F_0~*(53) */
19144     { pool                , MUL_fmt1            , 2   , 32,
19145        0xfc0001ff, 0xa00001b0, 0                      , 0,
19146        CP1_                },        /* MUL.fmt1 */
19147     { pool                , MADDF_fmt           , 2   , 32,
19148        0xfc0001ff, 0xa00001b8, 0                      , 0,
19149        CP1_                },        /* MADDF.fmt */
19150     { reserved_block      , 0                   , 0   , 32,
19151        0xfc0001ff, 0xa00001c0, 0                      , 0,
19152        CP1_                },        /* POOL32F_0~*(56) */
19153     { reserved_block      , 0                   , 0   , 32,
19154        0xfc0001ff, 0xa00001c8, 0                      , 0,
19155        CP1_                },        /* POOL32F_0~*(57) */
19156     { reserved_block      , 0                   , 0   , 32,
19157        0xfc0001ff, 0xa00001d0, 0                      , 0,
19158        CP1_                },        /* POOL32F_0~*(58) */
19159     { reserved_block      , 0                   , 0   , 32,
19160        0xfc0001ff, 0xa00001d8, 0                      , 0,
19161        CP1_                },        /* POOL32F_0~*(59) */
19162     { reserved_block      , 0                   , 0   , 32,
19163        0xfc0001ff, 0xa00001e0, 0                      , 0,
19164        CP1_                },        /* POOL32F_0~*(60) */
19165     { reserved_block      , 0                   , 0   , 32,
19166        0xfc0001ff, 0xa00001e8, 0                      , 0,
19167        CP1_                },        /* POOL32F_0~*(61) */
19168     { pool                , DIV_fmt1            , 2   , 32,
19169        0xfc0001ff, 0xa00001f0, 0                      , 0,
19170        CP1_                },        /* DIV.fmt1 */
19171     { pool                , MSUBF_fmt           , 2   , 32,
19172        0xfc0001ff, 0xa00001f8, 0                      , 0,
19173        CP1_                },        /* MSUBF.fmt */
19174 };
19175 
19176 
19177 static const Pool MIN_fmt[2] = {
19178     { instruction         , 0                   , 0   , 32,
19179        0xfc00023f, 0xa0000003, &MIN_S            , 0,
19180        CP1_                },        /* MIN.S */
19181     { instruction         , 0                   , 0   , 32,
19182        0xfc00023f, 0xa0000203, &MIN_D            , 0,
19183        CP1_                },        /* MIN.D */
19184 };
19185 
19186 
19187 static const Pool MAX_fmt[2] = {
19188     { instruction         , 0                   , 0   , 32,
19189        0xfc00023f, 0xa000000b, &MAX_S            , 0,
19190        CP1_                },        /* MAX.S */
19191     { instruction         , 0                   , 0   , 32,
19192        0xfc00023f, 0xa000020b, &MAX_D            , 0,
19193        CP1_                },        /* MAX.D */
19194 };
19195 
19196 
19197 static const Pool MINA_fmt[2] = {
19198     { instruction         , 0                   , 0   , 32,
19199        0xfc00023f, 0xa0000023, &MINA_S           , 0,
19200        CP1_                },        /* MINA.S */
19201     { instruction         , 0                   , 0   , 32,
19202        0xfc00023f, 0xa0000223, &MINA_D           , 0,
19203        CP1_                },        /* MINA.D */
19204 };
19205 
19206 
19207 static const Pool MAXA_fmt[2] = {
19208     { instruction         , 0                   , 0   , 32,
19209        0xfc00023f, 0xa000002b, &MAXA_S           , 0,
19210        CP1_                },        /* MAXA.S */
19211     { instruction         , 0                   , 0   , 32,
19212        0xfc00023f, 0xa000022b, &MAXA_D           , 0,
19213        CP1_                },        /* MAXA.D */
19214 };
19215 
19216 
19217 static const Pool CVT_L_fmt[2] = {
19218     { instruction         , 0                   , 0   , 32,
19219        0xfc007fff, 0xa000013b, &CVT_L_S          , 0,
19220        CP1_                },        /* CVT.L.S */
19221     { instruction         , 0                   , 0   , 32,
19222        0xfc007fff, 0xa000413b, &CVT_L_D          , 0,
19223        CP1_                },        /* CVT.L.D */
19224 };
19225 
19226 
19227 static const Pool RSQRT_fmt[2] = {
19228     { instruction         , 0                   , 0   , 32,
19229        0xfc007fff, 0xa000023b, &RSQRT_S          , 0,
19230        CP1_                },        /* RSQRT.S */
19231     { instruction         , 0                   , 0   , 32,
19232        0xfc007fff, 0xa000423b, &RSQRT_D          , 0,
19233        CP1_                },        /* RSQRT.D */
19234 };
19235 
19236 
19237 static const Pool FLOOR_L_fmt[2] = {
19238     { instruction         , 0                   , 0   , 32,
19239        0xfc007fff, 0xa000033b, &FLOOR_L_S        , 0,
19240        CP1_                },        /* FLOOR.L.S */
19241     { instruction         , 0                   , 0   , 32,
19242        0xfc007fff, 0xa000433b, &FLOOR_L_D        , 0,
19243        CP1_                },        /* FLOOR.L.D */
19244 };
19245 
19246 
19247 static const Pool CVT_W_fmt[2] = {
19248     { instruction         , 0                   , 0   , 32,
19249        0xfc007fff, 0xa000093b, &CVT_W_S          , 0,
19250        CP1_                },        /* CVT.W.S */
19251     { instruction         , 0                   , 0   , 32,
19252        0xfc007fff, 0xa000493b, &CVT_W_D          , 0,
19253        CP1_                },        /* CVT.W.D */
19254 };
19255 
19256 
19257 static const Pool SQRT_fmt[2] = {
19258     { instruction         , 0                   , 0   , 32,
19259        0xfc007fff, 0xa0000a3b, &SQRT_S           , 0,
19260        CP1_                },        /* SQRT.S */
19261     { instruction         , 0                   , 0   , 32,
19262        0xfc007fff, 0xa0004a3b, &SQRT_D           , 0,
19263        CP1_                },        /* SQRT.D */
19264 };
19265 
19266 
19267 static const Pool FLOOR_W_fmt[2] = {
19268     { instruction         , 0                   , 0   , 32,
19269        0xfc007fff, 0xa0000b3b, &FLOOR_W_S        , 0,
19270        CP1_                },        /* FLOOR.W.S */
19271     { instruction         , 0                   , 0   , 32,
19272        0xfc007fff, 0xa0004b3b, &FLOOR_W_D        , 0,
19273        CP1_                },        /* FLOOR.W.D */
19274 };
19275 
19276 
19277 static const Pool RECIP_fmt[2] = {
19278     { instruction         , 0                   , 0   , 32,
19279        0xfc007fff, 0xa000123b, &RECIP_S          , 0,
19280        CP1_                },        /* RECIP.S */
19281     { instruction         , 0                   , 0   , 32,
19282        0xfc007fff, 0xa000523b, &RECIP_D          , 0,
19283        CP1_                },        /* RECIP.D */
19284 };
19285 
19286 
19287 static const Pool CEIL_L_fmt[2] = {
19288     { instruction         , 0                   , 0   , 32,
19289        0xfc007fff, 0xa000133b, &CEIL_L_S         , 0,
19290        CP1_                },        /* CEIL.L.S */
19291     { instruction         , 0                   , 0   , 32,
19292        0xfc007fff, 0xa000533b, &CEIL_L_D         , 0,
19293        CP1_                },        /* CEIL.L.D */
19294 };
19295 
19296 
19297 static const Pool CEIL_W_fmt[2] = {
19298     { instruction         , 0                   , 0   , 32,
19299        0xfc007fff, 0xa0001b3b, &CEIL_W_S         , 0,
19300        CP1_                },        /* CEIL.W.S */
19301     { instruction         , 0                   , 0   , 32,
19302        0xfc007fff, 0xa0005b3b, &CEIL_W_D         , 0,
19303        CP1_                },        /* CEIL.W.D */
19304 };
19305 
19306 
19307 static const Pool TRUNC_L_fmt[2] = {
19308     { instruction         , 0                   , 0   , 32,
19309        0xfc007fff, 0xa000233b, &TRUNC_L_S        , 0,
19310        CP1_                },        /* TRUNC.L.S */
19311     { instruction         , 0                   , 0   , 32,
19312        0xfc007fff, 0xa000633b, &TRUNC_L_D        , 0,
19313        CP1_                },        /* TRUNC.L.D */
19314 };
19315 
19316 
19317 static const Pool TRUNC_W_fmt[2] = {
19318     { instruction         , 0                   , 0   , 32,
19319        0xfc007fff, 0xa0002b3b, &TRUNC_W_S        , 0,
19320        CP1_                },        /* TRUNC.W.S */
19321     { instruction         , 0                   , 0   , 32,
19322        0xfc007fff, 0xa0006b3b, &TRUNC_W_D        , 0,
19323        CP1_                },        /* TRUNC.W.D */
19324 };
19325 
19326 
19327 static const Pool ROUND_L_fmt[2] = {
19328     { instruction         , 0                   , 0   , 32,
19329        0xfc007fff, 0xa000333b, &ROUND_L_S        , 0,
19330        CP1_                },        /* ROUND.L.S */
19331     { instruction         , 0                   , 0   , 32,
19332        0xfc007fff, 0xa000733b, &ROUND_L_D        , 0,
19333        CP1_                },        /* ROUND.L.D */
19334 };
19335 
19336 
19337 static const Pool ROUND_W_fmt[2] = {
19338     { instruction         , 0                   , 0   , 32,
19339        0xfc007fff, 0xa0003b3b, &ROUND_W_S        , 0,
19340        CP1_                },        /* ROUND.W.S */
19341     { instruction         , 0                   , 0   , 32,
19342        0xfc007fff, 0xa0007b3b, &ROUND_W_D        , 0,
19343        CP1_                },        /* ROUND.W.D */
19344 };
19345 
19346 
19347 static const Pool POOL32Fxf_0[64] = {
19348     { reserved_block      , 0                   , 0   , 32,
19349        0xfc003fff, 0xa000003b, 0                      , 0,
19350        CP1_                },        /* POOL32Fxf_0~*(0) */
19351     { pool                , CVT_L_fmt           , 2   , 32,
19352        0xfc003fff, 0xa000013b, 0                      , 0,
19353        CP1_                },        /* CVT.L.fmt */
19354     { pool                , RSQRT_fmt           , 2   , 32,
19355        0xfc003fff, 0xa000023b, 0                      , 0,
19356        CP1_                },        /* RSQRT.fmt */
19357     { pool                , FLOOR_L_fmt         , 2   , 32,
19358        0xfc003fff, 0xa000033b, 0                      , 0,
19359        CP1_                },        /* FLOOR.L.fmt */
19360     { reserved_block      , 0                   , 0   , 32,
19361        0xfc003fff, 0xa000043b, 0                      , 0,
19362        CP1_                },        /* POOL32Fxf_0~*(4) */
19363     { reserved_block      , 0                   , 0   , 32,
19364        0xfc003fff, 0xa000053b, 0                      , 0,
19365        CP1_                },        /* POOL32Fxf_0~*(5) */
19366     { reserved_block      , 0                   , 0   , 32,
19367        0xfc003fff, 0xa000063b, 0                      , 0,
19368        CP1_                },        /* POOL32Fxf_0~*(6) */
19369     { reserved_block      , 0                   , 0   , 32,
19370        0xfc003fff, 0xa000073b, 0                      , 0,
19371        CP1_                },        /* POOL32Fxf_0~*(7) */
19372     { reserved_block      , 0                   , 0   , 32,
19373        0xfc003fff, 0xa000083b, 0                      , 0,
19374        CP1_                },        /* POOL32Fxf_0~*(8) */
19375     { pool                , CVT_W_fmt           , 2   , 32,
19376        0xfc003fff, 0xa000093b, 0                      , 0,
19377        CP1_                },        /* CVT.W.fmt */
19378     { pool                , SQRT_fmt            , 2   , 32,
19379        0xfc003fff, 0xa0000a3b, 0                      , 0,
19380        CP1_                },        /* SQRT.fmt */
19381     { pool                , FLOOR_W_fmt         , 2   , 32,
19382        0xfc003fff, 0xa0000b3b, 0                      , 0,
19383        CP1_                },        /* FLOOR.W.fmt */
19384     { reserved_block      , 0                   , 0   , 32,
19385        0xfc003fff, 0xa0000c3b, 0                      , 0,
19386        CP1_                },        /* POOL32Fxf_0~*(12) */
19387     { reserved_block      , 0                   , 0   , 32,
19388        0xfc003fff, 0xa0000d3b, 0                      , 0,
19389        CP1_                },        /* POOL32Fxf_0~*(13) */
19390     { reserved_block      , 0                   , 0   , 32,
19391        0xfc003fff, 0xa0000e3b, 0                      , 0,
19392        CP1_                },        /* POOL32Fxf_0~*(14) */
19393     { reserved_block      , 0                   , 0   , 32,
19394        0xfc003fff, 0xa0000f3b, 0                      , 0,
19395        CP1_                },        /* POOL32Fxf_0~*(15) */
19396     { instruction         , 0                   , 0   , 32,
19397        0xfc003fff, 0xa000103b, &CFC1             , 0,
19398        CP1_                },        /* CFC1 */
19399     { reserved_block      , 0                   , 0   , 32,
19400        0xfc003fff, 0xa000113b, 0                      , 0,
19401        CP1_                },        /* POOL32Fxf_0~*(17) */
19402     { pool                , RECIP_fmt           , 2   , 32,
19403        0xfc003fff, 0xa000123b, 0                      , 0,
19404        CP1_                },        /* RECIP.fmt */
19405     { pool                , CEIL_L_fmt          , 2   , 32,
19406        0xfc003fff, 0xa000133b, 0                      , 0,
19407        CP1_                },        /* CEIL.L.fmt */
19408     { reserved_block      , 0                   , 0   , 32,
19409        0xfc003fff, 0xa000143b, 0                      , 0,
19410        CP1_                },        /* POOL32Fxf_0~*(20) */
19411     { reserved_block      , 0                   , 0   , 32,
19412        0xfc003fff, 0xa000153b, 0                      , 0,
19413        CP1_                },        /* POOL32Fxf_0~*(21) */
19414     { reserved_block      , 0                   , 0   , 32,
19415        0xfc003fff, 0xa000163b, 0                      , 0,
19416        CP1_                },        /* POOL32Fxf_0~*(22) */
19417     { reserved_block      , 0                   , 0   , 32,
19418        0xfc003fff, 0xa000173b, 0                      , 0,
19419        CP1_                },        /* POOL32Fxf_0~*(23) */
19420     { instruction         , 0                   , 0   , 32,
19421        0xfc003fff, 0xa000183b, &CTC1             , 0,
19422        CP1_                },        /* CTC1 */
19423     { reserved_block      , 0                   , 0   , 32,
19424        0xfc003fff, 0xa000193b, 0                      , 0,
19425        CP1_                },        /* POOL32Fxf_0~*(25) */
19426     { reserved_block      , 0                   , 0   , 32,
19427        0xfc003fff, 0xa0001a3b, 0                      , 0,
19428        CP1_                },        /* POOL32Fxf_0~*(26) */
19429     { pool                , CEIL_W_fmt          , 2   , 32,
19430        0xfc003fff, 0xa0001b3b, 0                      , 0,
19431        CP1_                },        /* CEIL.W.fmt */
19432     { reserved_block      , 0                   , 0   , 32,
19433        0xfc003fff, 0xa0001c3b, 0                      , 0,
19434        CP1_                },        /* POOL32Fxf_0~*(28) */
19435     { reserved_block      , 0                   , 0   , 32,
19436        0xfc003fff, 0xa0001d3b, 0                      , 0,
19437        CP1_                },        /* POOL32Fxf_0~*(29) */
19438     { reserved_block      , 0                   , 0   , 32,
19439        0xfc003fff, 0xa0001e3b, 0                      , 0,
19440        CP1_                },        /* POOL32Fxf_0~*(30) */
19441     { reserved_block      , 0                   , 0   , 32,
19442        0xfc003fff, 0xa0001f3b, 0                      , 0,
19443        CP1_                },        /* POOL32Fxf_0~*(31) */
19444     { instruction         , 0                   , 0   , 32,
19445        0xfc003fff, 0xa000203b, &MFC1             , 0,
19446        CP1_                },        /* MFC1 */
19447     { instruction         , 0                   , 0   , 32,
19448        0xfc003fff, 0xa000213b, &CVT_S_PL         , 0,
19449        CP1_                },        /* CVT.S.PL */
19450     { reserved_block      , 0                   , 0   , 32,
19451        0xfc003fff, 0xa000223b, 0                      , 0,
19452        CP1_                },        /* POOL32Fxf_0~*(34) */
19453     { pool                , TRUNC_L_fmt         , 2   , 32,
19454        0xfc003fff, 0xa000233b, 0                      , 0,
19455        CP1_                },        /* TRUNC.L.fmt */
19456     { instruction         , 0                   , 0   , 32,
19457        0xfc003fff, 0xa000243b, &DMFC1            , 0,
19458        CP1_ | MIPS64_      },        /* DMFC1 */
19459     { reserved_block      , 0                   , 0   , 32,
19460        0xfc003fff, 0xa000253b, 0                      , 0,
19461        CP1_                },        /* POOL32Fxf_0~*(37) */
19462     { reserved_block      , 0                   , 0   , 32,
19463        0xfc003fff, 0xa000263b, 0                      , 0,
19464        CP1_                },        /* POOL32Fxf_0~*(38) */
19465     { reserved_block      , 0                   , 0   , 32,
19466        0xfc003fff, 0xa000273b, 0                      , 0,
19467        CP1_                },        /* POOL32Fxf_0~*(39) */
19468     { instruction         , 0                   , 0   , 32,
19469        0xfc003fff, 0xa000283b, &MTC1             , 0,
19470        CP1_                },        /* MTC1 */
19471     { instruction         , 0                   , 0   , 32,
19472        0xfc003fff, 0xa000293b, &CVT_S_PU         , 0,
19473        CP1_                },        /* CVT.S.PU */
19474     { reserved_block      , 0                   , 0   , 32,
19475        0xfc003fff, 0xa0002a3b, 0                      , 0,
19476        CP1_                },        /* POOL32Fxf_0~*(42) */
19477     { pool                , TRUNC_W_fmt         , 2   , 32,
19478        0xfc003fff, 0xa0002b3b, 0                      , 0,
19479        CP1_                },        /* TRUNC.W.fmt */
19480     { instruction         , 0                   , 0   , 32,
19481        0xfc003fff, 0xa0002c3b, &DMTC1            , 0,
19482        CP1_ | MIPS64_      },        /* DMTC1 */
19483     { reserved_block      , 0                   , 0   , 32,
19484        0xfc003fff, 0xa0002d3b, 0                      , 0,
19485        CP1_                },        /* POOL32Fxf_0~*(45) */
19486     { reserved_block      , 0                   , 0   , 32,
19487        0xfc003fff, 0xa0002e3b, 0                      , 0,
19488        CP1_                },        /* POOL32Fxf_0~*(46) */
19489     { reserved_block      , 0                   , 0   , 32,
19490        0xfc003fff, 0xa0002f3b, 0                      , 0,
19491        CP1_                },        /* POOL32Fxf_0~*(47) */
19492     { instruction         , 0                   , 0   , 32,
19493        0xfc003fff, 0xa000303b, &MFHC1            , 0,
19494        CP1_                },        /* MFHC1 */
19495     { reserved_block      , 0                   , 0   , 32,
19496        0xfc003fff, 0xa000313b, 0                      , 0,
19497        CP1_                },        /* POOL32Fxf_0~*(49) */
19498     { reserved_block      , 0                   , 0   , 32,
19499        0xfc003fff, 0xa000323b, 0                      , 0,
19500        CP1_                },        /* POOL32Fxf_0~*(50) */
19501     { pool                , ROUND_L_fmt         , 2   , 32,
19502        0xfc003fff, 0xa000333b, 0                      , 0,
19503        CP1_                },        /* ROUND.L.fmt */
19504     { reserved_block      , 0                   , 0   , 32,
19505        0xfc003fff, 0xa000343b, 0                      , 0,
19506        CP1_                },        /* POOL32Fxf_0~*(52) */
19507     { reserved_block      , 0                   , 0   , 32,
19508        0xfc003fff, 0xa000353b, 0                      , 0,
19509        CP1_                },        /* POOL32Fxf_0~*(53) */
19510     { reserved_block      , 0                   , 0   , 32,
19511        0xfc003fff, 0xa000363b, 0                      , 0,
19512        CP1_                },        /* POOL32Fxf_0~*(54) */
19513     { reserved_block      , 0                   , 0   , 32,
19514        0xfc003fff, 0xa000373b, 0                      , 0,
19515        CP1_                },        /* POOL32Fxf_0~*(55) */
19516     { instruction         , 0                   , 0   , 32,
19517        0xfc003fff, 0xa000383b, &MTHC1            , 0,
19518        CP1_                },        /* MTHC1 */
19519     { reserved_block      , 0                   , 0   , 32,
19520        0xfc003fff, 0xa000393b, 0                      , 0,
19521        CP1_                },        /* POOL32Fxf_0~*(57) */
19522     { reserved_block      , 0                   , 0   , 32,
19523        0xfc003fff, 0xa0003a3b, 0                      , 0,
19524        CP1_                },        /* POOL32Fxf_0~*(58) */
19525     { pool                , ROUND_W_fmt         , 2   , 32,
19526        0xfc003fff, 0xa0003b3b, 0                      , 0,
19527        CP1_                },        /* ROUND.W.fmt */
19528     { reserved_block      , 0                   , 0   , 32,
19529        0xfc003fff, 0xa0003c3b, 0                      , 0,
19530        CP1_                },        /* POOL32Fxf_0~*(60) */
19531     { reserved_block      , 0                   , 0   , 32,
19532        0xfc003fff, 0xa0003d3b, 0                      , 0,
19533        CP1_                },        /* POOL32Fxf_0~*(61) */
19534     { reserved_block      , 0                   , 0   , 32,
19535        0xfc003fff, 0xa0003e3b, 0                      , 0,
19536        CP1_                },        /* POOL32Fxf_0~*(62) */
19537     { reserved_block      , 0                   , 0   , 32,
19538        0xfc003fff, 0xa0003f3b, 0                      , 0,
19539        CP1_                },        /* POOL32Fxf_0~*(63) */
19540 };
19541 
19542 
19543 static const Pool MOV_fmt[4] = {
19544     { instruction         , 0                   , 0   , 32,
19545        0xfc007fff, 0xa000007b, &MOV_S            , 0,
19546        CP1_                },        /* MOV.S */
19547     { instruction         , 0                   , 0   , 32,
19548        0xfc007fff, 0xa000207b, &MOV_D            , 0,
19549        CP1_                },        /* MOV.D */
19550     { reserved_block      , 0                   , 0   , 32,
19551        0xfc007fff, 0xa000407b, 0                      , 0,
19552        CP1_                },        /* MOV.fmt~*(2) */
19553     { reserved_block      , 0                   , 0   , 32,
19554        0xfc007fff, 0xa000607b, 0                      , 0,
19555        CP1_                },        /* MOV.fmt~*(3) */
19556 };
19557 
19558 
19559 static const Pool ABS_fmt[4] = {
19560     { instruction         , 0                   , 0   , 32,
19561        0xfc007fff, 0xa000037b, &ABS_S            , 0,
19562        CP1_                },        /* ABS.S */
19563     { instruction         , 0                   , 0   , 32,
19564        0xfc007fff, 0xa000237b, &ABS_D            , 0,
19565        CP1_                },        /* ABS.D */
19566     { reserved_block      , 0                   , 0   , 32,
19567        0xfc007fff, 0xa000437b, 0                      , 0,
19568        CP1_                },        /* ABS.fmt~*(2) */
19569     { reserved_block      , 0                   , 0   , 32,
19570        0xfc007fff, 0xa000637b, 0                      , 0,
19571        CP1_                },        /* ABS.fmt~*(3) */
19572 };
19573 
19574 
19575 static const Pool NEG_fmt[4] = {
19576     { instruction         , 0                   , 0   , 32,
19577        0xfc007fff, 0xa0000b7b, &NEG_S            , 0,
19578        CP1_                },        /* NEG.S */
19579     { instruction         , 0                   , 0   , 32,
19580        0xfc007fff, 0xa0002b7b, &NEG_D            , 0,
19581        CP1_                },        /* NEG.D */
19582     { reserved_block      , 0                   , 0   , 32,
19583        0xfc007fff, 0xa0004b7b, 0                      , 0,
19584        CP1_                },        /* NEG.fmt~*(2) */
19585     { reserved_block      , 0                   , 0   , 32,
19586        0xfc007fff, 0xa0006b7b, 0                      , 0,
19587        CP1_                },        /* NEG.fmt~*(3) */
19588 };
19589 
19590 
19591 static const Pool CVT_D_fmt[4] = {
19592     { instruction         , 0                   , 0   , 32,
19593        0xfc007fff, 0xa000137b, &CVT_D_S          , 0,
19594        CP1_                },        /* CVT.D.S */
19595     { instruction         , 0                   , 0   , 32,
19596        0xfc007fff, 0xa000337b, &CVT_D_W          , 0,
19597        CP1_                },        /* CVT.D.W */
19598     { instruction         , 0                   , 0   , 32,
19599        0xfc007fff, 0xa000537b, &CVT_D_L          , 0,
19600        CP1_                },        /* CVT.D.L */
19601     { reserved_block      , 0                   , 0   , 32,
19602        0xfc007fff, 0xa000737b, 0                      , 0,
19603        CP1_                },        /* CVT.D.fmt~*(3) */
19604 };
19605 
19606 
19607 static const Pool CVT_S_fmt[4] = {
19608     { instruction         , 0                   , 0   , 32,
19609        0xfc007fff, 0xa0001b7b, &CVT_S_D          , 0,
19610        CP1_                },        /* CVT.S.D */
19611     { instruction         , 0                   , 0   , 32,
19612        0xfc007fff, 0xa0003b7b, &CVT_S_W          , 0,
19613        CP1_                },        /* CVT.S.W */
19614     { instruction         , 0                   , 0   , 32,
19615        0xfc007fff, 0xa0005b7b, &CVT_S_L          , 0,
19616        CP1_                },        /* CVT.S.L */
19617     { reserved_block      , 0                   , 0   , 32,
19618        0xfc007fff, 0xa0007b7b, 0                      , 0,
19619        CP1_                },        /* CVT.S.fmt~*(3) */
19620 };
19621 
19622 
19623 static const Pool POOL32Fxf_1[32] = {
19624     { pool                , MOV_fmt             , 4   , 32,
19625        0xfc001fff, 0xa000007b, 0                      , 0,
19626        CP1_                },        /* MOV.fmt */
19627     { reserved_block      , 0                   , 0   , 32,
19628        0xfc001fff, 0xa000017b, 0                      , 0,
19629        CP1_                },        /* POOL32Fxf_1~*(1) */
19630     { reserved_block      , 0                   , 0   , 32,
19631        0xfc001fff, 0xa000027b, 0                      , 0,
19632        CP1_                },        /* POOL32Fxf_1~*(2) */
19633     { pool                , ABS_fmt             , 4   , 32,
19634        0xfc001fff, 0xa000037b, 0                      , 0,
19635        CP1_                },        /* ABS.fmt */
19636     { reserved_block      , 0                   , 0   , 32,
19637        0xfc001fff, 0xa000047b, 0                      , 0,
19638        CP1_                },        /* POOL32Fxf_1~*(4) */
19639     { reserved_block      , 0                   , 0   , 32,
19640        0xfc001fff, 0xa000057b, 0                      , 0,
19641        CP1_                },        /* POOL32Fxf_1~*(5) */
19642     { reserved_block      , 0                   , 0   , 32,
19643        0xfc001fff, 0xa000067b, 0                      , 0,
19644        CP1_                },        /* POOL32Fxf_1~*(6) */
19645     { reserved_block      , 0                   , 0   , 32,
19646        0xfc001fff, 0xa000077b, 0                      , 0,
19647        CP1_                },        /* POOL32Fxf_1~*(7) */
19648     { reserved_block      , 0                   , 0   , 32,
19649        0xfc001fff, 0xa000087b, 0                      , 0,
19650        CP1_                },        /* POOL32Fxf_1~*(8) */
19651     { reserved_block      , 0                   , 0   , 32,
19652        0xfc001fff, 0xa000097b, 0                      , 0,
19653        CP1_                },        /* POOL32Fxf_1~*(9) */
19654     { reserved_block      , 0                   , 0   , 32,
19655        0xfc001fff, 0xa0000a7b, 0                      , 0,
19656        CP1_                },        /* POOL32Fxf_1~*(10) */
19657     { pool                , NEG_fmt             , 4   , 32,
19658        0xfc001fff, 0xa0000b7b, 0                      , 0,
19659        CP1_                },        /* NEG.fmt */
19660     { reserved_block      , 0                   , 0   , 32,
19661        0xfc001fff, 0xa0000c7b, 0                      , 0,
19662        CP1_                },        /* POOL32Fxf_1~*(12) */
19663     { reserved_block      , 0                   , 0   , 32,
19664        0xfc001fff, 0xa0000d7b, 0                      , 0,
19665        CP1_                },        /* POOL32Fxf_1~*(13) */
19666     { reserved_block      , 0                   , 0   , 32,
19667        0xfc001fff, 0xa0000e7b, 0                      , 0,
19668        CP1_                },        /* POOL32Fxf_1~*(14) */
19669     { reserved_block      , 0                   , 0   , 32,
19670        0xfc001fff, 0xa0000f7b, 0                      , 0,
19671        CP1_                },        /* POOL32Fxf_1~*(15) */
19672     { reserved_block      , 0                   , 0   , 32,
19673        0xfc001fff, 0xa000107b, 0                      , 0,
19674        CP1_                },        /* POOL32Fxf_1~*(16) */
19675     { reserved_block      , 0                   , 0   , 32,
19676        0xfc001fff, 0xa000117b, 0                      , 0,
19677        CP1_                },        /* POOL32Fxf_1~*(17) */
19678     { reserved_block      , 0                   , 0   , 32,
19679        0xfc001fff, 0xa000127b, 0                      , 0,
19680        CP1_                },        /* POOL32Fxf_1~*(18) */
19681     { pool                , CVT_D_fmt           , 4   , 32,
19682        0xfc001fff, 0xa000137b, 0                      , 0,
19683        CP1_                },        /* CVT.D.fmt */
19684     { reserved_block      , 0                   , 0   , 32,
19685        0xfc001fff, 0xa000147b, 0                      , 0,
19686        CP1_                },        /* POOL32Fxf_1~*(20) */
19687     { reserved_block      , 0                   , 0   , 32,
19688        0xfc001fff, 0xa000157b, 0                      , 0,
19689        CP1_                },        /* POOL32Fxf_1~*(21) */
19690     { reserved_block      , 0                   , 0   , 32,
19691        0xfc001fff, 0xa000167b, 0                      , 0,
19692        CP1_                },        /* POOL32Fxf_1~*(22) */
19693     { reserved_block      , 0                   , 0   , 32,
19694        0xfc001fff, 0xa000177b, 0                      , 0,
19695        CP1_                },        /* POOL32Fxf_1~*(23) */
19696     { reserved_block      , 0                   , 0   , 32,
19697        0xfc001fff, 0xa000187b, 0                      , 0,
19698        CP1_                },        /* POOL32Fxf_1~*(24) */
19699     { reserved_block      , 0                   , 0   , 32,
19700        0xfc001fff, 0xa000197b, 0                      , 0,
19701        CP1_                },        /* POOL32Fxf_1~*(25) */
19702     { reserved_block      , 0                   , 0   , 32,
19703        0xfc001fff, 0xa0001a7b, 0                      , 0,
19704        CP1_                },        /* POOL32Fxf_1~*(26) */
19705     { pool                , CVT_S_fmt           , 4   , 32,
19706        0xfc001fff, 0xa0001b7b, 0                      , 0,
19707        CP1_                },        /* CVT.S.fmt */
19708     { reserved_block      , 0                   , 0   , 32,
19709        0xfc001fff, 0xa0001c7b, 0                      , 0,
19710        CP1_                },        /* POOL32Fxf_1~*(28) */
19711     { reserved_block      , 0                   , 0   , 32,
19712        0xfc001fff, 0xa0001d7b, 0                      , 0,
19713        CP1_                },        /* POOL32Fxf_1~*(29) */
19714     { reserved_block      , 0                   , 0   , 32,
19715        0xfc001fff, 0xa0001e7b, 0                      , 0,
19716        CP1_                },        /* POOL32Fxf_1~*(30) */
19717     { reserved_block      , 0                   , 0   , 32,
19718        0xfc001fff, 0xa0001f7b, 0                      , 0,
19719        CP1_                },        /* POOL32Fxf_1~*(31) */
19720 };
19721 
19722 
19723 static const Pool POOL32Fxf[4] = {
19724     { pool                , POOL32Fxf_0         , 64  , 32,
19725        0xfc0000ff, 0xa000003b, 0                      , 0,
19726        CP1_                },        /* POOL32Fxf_0 */
19727     { pool                , POOL32Fxf_1         , 32  , 32,
19728        0xfc0000ff, 0xa000007b, 0                      , 0,
19729        CP1_                },        /* POOL32Fxf_1 */
19730     { reserved_block      , 0                   , 0   , 32,
19731        0xfc0000ff, 0xa00000bb, 0                      , 0,
19732        CP1_                },        /* POOL32Fxf~*(2) */
19733     { reserved_block      , 0                   , 0   , 32,
19734        0xfc0000ff, 0xa00000fb, 0                      , 0,
19735        CP1_                },        /* POOL32Fxf~*(3) */
19736 };
19737 
19738 
19739 static const Pool POOL32F_3[8] = {
19740     { pool                , MIN_fmt             , 2   , 32,
19741        0xfc00003f, 0xa0000003, 0                      , 0,
19742        CP1_                },        /* MIN.fmt */
19743     { pool                , MAX_fmt             , 2   , 32,
19744        0xfc00003f, 0xa000000b, 0                      , 0,
19745        CP1_                },        /* MAX.fmt */
19746     { reserved_block      , 0                   , 0   , 32,
19747        0xfc00003f, 0xa0000013, 0                      , 0,
19748        CP1_                },        /* POOL32F_3~*(2) */
19749     { reserved_block      , 0                   , 0   , 32,
19750        0xfc00003f, 0xa000001b, 0                      , 0,
19751        CP1_                },        /* POOL32F_3~*(3) */
19752     { pool                , MINA_fmt            , 2   , 32,
19753        0xfc00003f, 0xa0000023, 0                      , 0,
19754        CP1_                },        /* MINA.fmt */
19755     { pool                , MAXA_fmt            , 2   , 32,
19756        0xfc00003f, 0xa000002b, 0                      , 0,
19757        CP1_                },        /* MAXA.fmt */
19758     { reserved_block      , 0                   , 0   , 32,
19759        0xfc00003f, 0xa0000033, 0                      , 0,
19760        CP1_                },        /* POOL32F_3~*(6) */
19761     { pool                , POOL32Fxf           , 4   , 32,
19762        0xfc00003f, 0xa000003b, 0                      , 0,
19763        CP1_                },        /* POOL32Fxf */
19764 };
19765 
19766 
19767 static const Pool CMP_condn_S[32] = {
19768     { instruction         , 0                   , 0   , 32,
19769        0xfc0007ff, 0xa0000005, &CMP_AF_S         , 0,
19770        CP1_                },        /* CMP.AF.S */
19771     { instruction         , 0                   , 0   , 32,
19772        0xfc0007ff, 0xa0000045, &CMP_UN_S         , 0,
19773        CP1_                },        /* CMP.UN.S */
19774     { instruction         , 0                   , 0   , 32,
19775        0xfc0007ff, 0xa0000085, &CMP_EQ_S         , 0,
19776        CP1_                },        /* CMP.EQ.S */
19777     { instruction         , 0                   , 0   , 32,
19778        0xfc0007ff, 0xa00000c5, &CMP_UEQ_S        , 0,
19779        CP1_                },        /* CMP.UEQ.S */
19780     { instruction         , 0                   , 0   , 32,
19781        0xfc0007ff, 0xa0000105, &CMP_LT_S         , 0,
19782        CP1_                },        /* CMP.LT.S */
19783     { instruction         , 0                   , 0   , 32,
19784        0xfc0007ff, 0xa0000145, &CMP_ULT_S        , 0,
19785        CP1_                },        /* CMP.ULT.S */
19786     { instruction         , 0                   , 0   , 32,
19787        0xfc0007ff, 0xa0000185, &CMP_LE_S         , 0,
19788        CP1_                },        /* CMP.LE.S */
19789     { instruction         , 0                   , 0   , 32,
19790        0xfc0007ff, 0xa00001c5, &CMP_ULE_S        , 0,
19791        CP1_                },        /* CMP.ULE.S */
19792     { instruction         , 0                   , 0   , 32,
19793        0xfc0007ff, 0xa0000205, &CMP_SAF_S        , 0,
19794        CP1_                },        /* CMP.SAF.S */
19795     { instruction         , 0                   , 0   , 32,
19796        0xfc0007ff, 0xa0000245, &CMP_SUN_S        , 0,
19797        CP1_                },        /* CMP.SUN.S */
19798     { instruction         , 0                   , 0   , 32,
19799        0xfc0007ff, 0xa0000285, &CMP_SEQ_S        , 0,
19800        CP1_                },        /* CMP.SEQ.S */
19801     { instruction         , 0                   , 0   , 32,
19802        0xfc0007ff, 0xa00002c5, &CMP_SUEQ_S       , 0,
19803        CP1_                },        /* CMP.SUEQ.S */
19804     { instruction         , 0                   , 0   , 32,
19805        0xfc0007ff, 0xa0000305, &CMP_SLT_S        , 0,
19806        CP1_                },        /* CMP.SLT.S */
19807     { instruction         , 0                   , 0   , 32,
19808        0xfc0007ff, 0xa0000345, &CMP_SULT_S       , 0,
19809        CP1_                },        /* CMP.SULT.S */
19810     { instruction         , 0                   , 0   , 32,
19811        0xfc0007ff, 0xa0000385, &CMP_SLE_S        , 0,
19812        CP1_                },        /* CMP.SLE.S */
19813     { instruction         , 0                   , 0   , 32,
19814        0xfc0007ff, 0xa00003c5, &CMP_SULE_S       , 0,
19815        CP1_                },        /* CMP.SULE.S */
19816     { reserved_block      , 0                   , 0   , 32,
19817        0xfc0007ff, 0xa0000405, 0                      , 0,
19818        CP1_                },        /* CMP.condn.S~*(16) */
19819     { instruction         , 0                   , 0   , 32,
19820        0xfc0007ff, 0xa0000445, &CMP_OR_S         , 0,
19821        CP1_                },        /* CMP.OR.S */
19822     { instruction         , 0                   , 0   , 32,
19823        0xfc0007ff, 0xa0000485, &CMP_UNE_S        , 0,
19824        CP1_                },        /* CMP.UNE.S */
19825     { instruction         , 0                   , 0   , 32,
19826        0xfc0007ff, 0xa00004c5, &CMP_NE_S         , 0,
19827        CP1_                },        /* CMP.NE.S */
19828     { reserved_block      , 0                   , 0   , 32,
19829        0xfc0007ff, 0xa0000505, 0                      , 0,
19830        CP1_                },        /* CMP.condn.S~*(20) */
19831     { reserved_block      , 0                   , 0   , 32,
19832        0xfc0007ff, 0xa0000545, 0                      , 0,
19833        CP1_                },        /* CMP.condn.S~*(21) */
19834     { reserved_block      , 0                   , 0   , 32,
19835        0xfc0007ff, 0xa0000585, 0                      , 0,
19836        CP1_                },        /* CMP.condn.S~*(22) */
19837     { reserved_block      , 0                   , 0   , 32,
19838        0xfc0007ff, 0xa00005c5, 0                      , 0,
19839        CP1_                },        /* CMP.condn.S~*(23) */
19840     { reserved_block      , 0                   , 0   , 32,
19841        0xfc0007ff, 0xa0000605, 0                      , 0,
19842        CP1_                },        /* CMP.condn.S~*(24) */
19843     { instruction         , 0                   , 0   , 32,
19844        0xfc0007ff, 0xa0000645, &CMP_SOR_S        , 0,
19845        CP1_                },        /* CMP.SOR.S */
19846     { instruction         , 0                   , 0   , 32,
19847        0xfc0007ff, 0xa0000685, &CMP_SUNE_S       , 0,
19848        CP1_                },        /* CMP.SUNE.S */
19849     { instruction         , 0                   , 0   , 32,
19850        0xfc0007ff, 0xa00006c5, &CMP_SNE_S        , 0,
19851        CP1_                },        /* CMP.SNE.S */
19852     { reserved_block      , 0                   , 0   , 32,
19853        0xfc0007ff, 0xa0000705, 0                      , 0,
19854        CP1_                },        /* CMP.condn.S~*(28) */
19855     { reserved_block      , 0                   , 0   , 32,
19856        0xfc0007ff, 0xa0000745, 0                      , 0,
19857        CP1_                },        /* CMP.condn.S~*(29) */
19858     { reserved_block      , 0                   , 0   , 32,
19859        0xfc0007ff, 0xa0000785, 0                      , 0,
19860        CP1_                },        /* CMP.condn.S~*(30) */
19861     { reserved_block      , 0                   , 0   , 32,
19862        0xfc0007ff, 0xa00007c5, 0                      , 0,
19863        CP1_                },        /* CMP.condn.S~*(31) */
19864 };
19865 
19866 
19867 static const Pool CMP_condn_D[32] = {
19868     { instruction         , 0                   , 0   , 32,
19869        0xfc0007ff, 0xa0000015, &CMP_AF_D         , 0,
19870        CP1_                },        /* CMP.AF.D */
19871     { instruction         , 0                   , 0   , 32,
19872        0xfc0007ff, 0xa0000055, &CMP_UN_D         , 0,
19873        CP1_                },        /* CMP.UN.D */
19874     { instruction         , 0                   , 0   , 32,
19875        0xfc0007ff, 0xa0000095, &CMP_EQ_D         , 0,
19876        CP1_                },        /* CMP.EQ.D */
19877     { instruction         , 0                   , 0   , 32,
19878        0xfc0007ff, 0xa00000d5, &CMP_UEQ_D        , 0,
19879        CP1_                },        /* CMP.UEQ.D */
19880     { instruction         , 0                   , 0   , 32,
19881        0xfc0007ff, 0xa0000115, &CMP_LT_D         , 0,
19882        CP1_                },        /* CMP.LT.D */
19883     { instruction         , 0                   , 0   , 32,
19884        0xfc0007ff, 0xa0000155, &CMP_ULT_D        , 0,
19885        CP1_                },        /* CMP.ULT.D */
19886     { instruction         , 0                   , 0   , 32,
19887        0xfc0007ff, 0xa0000195, &CMP_LE_D         , 0,
19888        CP1_                },        /* CMP.LE.D */
19889     { instruction         , 0                   , 0   , 32,
19890        0xfc0007ff, 0xa00001d5, &CMP_ULE_D        , 0,
19891        CP1_                },        /* CMP.ULE.D */
19892     { instruction         , 0                   , 0   , 32,
19893        0xfc0007ff, 0xa0000215, &CMP_SAF_D        , 0,
19894        CP1_                },        /* CMP.SAF.D */
19895     { instruction         , 0                   , 0   , 32,
19896        0xfc0007ff, 0xa0000255, &CMP_SUN_D        , 0,
19897        CP1_                },        /* CMP.SUN.D */
19898     { instruction         , 0                   , 0   , 32,
19899        0xfc0007ff, 0xa0000295, &CMP_SEQ_D        , 0,
19900        CP1_                },        /* CMP.SEQ.D */
19901     { instruction         , 0                   , 0   , 32,
19902        0xfc0007ff, 0xa00002d5, &CMP_SUEQ_D       , 0,
19903        CP1_                },        /* CMP.SUEQ.D */
19904     { instruction         , 0                   , 0   , 32,
19905        0xfc0007ff, 0xa0000315, &CMP_SLT_D        , 0,
19906        CP1_                },        /* CMP.SLT.D */
19907     { instruction         , 0                   , 0   , 32,
19908        0xfc0007ff, 0xa0000355, &CMP_SULT_D       , 0,
19909        CP1_                },        /* CMP.SULT.D */
19910     { instruction         , 0                   , 0   , 32,
19911        0xfc0007ff, 0xa0000395, &CMP_SLE_D        , 0,
19912        CP1_                },        /* CMP.SLE.D */
19913     { instruction         , 0                   , 0   , 32,
19914        0xfc0007ff, 0xa00003d5, &CMP_SULE_D       , 0,
19915        CP1_                },        /* CMP.SULE.D */
19916     { reserved_block      , 0                   , 0   , 32,
19917        0xfc0007ff, 0xa0000415, 0                      , 0,
19918        CP1_                },        /* CMP.condn.D~*(16) */
19919     { instruction         , 0                   , 0   , 32,
19920        0xfc0007ff, 0xa0000455, &CMP_OR_D         , 0,
19921        CP1_                },        /* CMP.OR.D */
19922     { instruction         , 0                   , 0   , 32,
19923        0xfc0007ff, 0xa0000495, &CMP_UNE_D        , 0,
19924        CP1_                },        /* CMP.UNE.D */
19925     { instruction         , 0                   , 0   , 32,
19926        0xfc0007ff, 0xa00004d5, &CMP_NE_D         , 0,
19927        CP1_                },        /* CMP.NE.D */
19928     { reserved_block      , 0                   , 0   , 32,
19929        0xfc0007ff, 0xa0000515, 0                      , 0,
19930        CP1_                },        /* CMP.condn.D~*(20) */
19931     { reserved_block      , 0                   , 0   , 32,
19932        0xfc0007ff, 0xa0000555, 0                      , 0,
19933        CP1_                },        /* CMP.condn.D~*(21) */
19934     { reserved_block      , 0                   , 0   , 32,
19935        0xfc0007ff, 0xa0000595, 0                      , 0,
19936        CP1_                },        /* CMP.condn.D~*(22) */
19937     { reserved_block      , 0                   , 0   , 32,
19938        0xfc0007ff, 0xa00005d5, 0                      , 0,
19939        CP1_                },        /* CMP.condn.D~*(23) */
19940     { reserved_block      , 0                   , 0   , 32,
19941        0xfc0007ff, 0xa0000615, 0                      , 0,
19942        CP1_                },        /* CMP.condn.D~*(24) */
19943     { instruction         , 0                   , 0   , 32,
19944        0xfc0007ff, 0xa0000655, &CMP_SOR_D        , 0,
19945        CP1_                },        /* CMP.SOR.D */
19946     { instruction         , 0                   , 0   , 32,
19947        0xfc0007ff, 0xa0000695, &CMP_SUNE_D       , 0,
19948        CP1_                },        /* CMP.SUNE.D */
19949     { instruction         , 0                   , 0   , 32,
19950        0xfc0007ff, 0xa00006d5, &CMP_SNE_D        , 0,
19951        CP1_                },        /* CMP.SNE.D */
19952     { reserved_block      , 0                   , 0   , 32,
19953        0xfc0007ff, 0xa0000715, 0                      , 0,
19954        CP1_                },        /* CMP.condn.D~*(28) */
19955     { reserved_block      , 0                   , 0   , 32,
19956        0xfc0007ff, 0xa0000755, 0                      , 0,
19957        CP1_                },        /* CMP.condn.D~*(29) */
19958     { reserved_block      , 0                   , 0   , 32,
19959        0xfc0007ff, 0xa0000795, 0                      , 0,
19960        CP1_                },        /* CMP.condn.D~*(30) */
19961     { reserved_block      , 0                   , 0   , 32,
19962        0xfc0007ff, 0xa00007d5, 0                      , 0,
19963        CP1_                },        /* CMP.condn.D~*(31) */
19964 };
19965 
19966 
19967 static const Pool POOL32F_5[8] = {
19968     { pool                , CMP_condn_S         , 32  , 32,
19969        0xfc00003f, 0xa0000005, 0                      , 0,
19970        CP1_                },        /* CMP.condn.S */
19971     { reserved_block      , 0                   , 0   , 32,
19972        0xfc00003f, 0xa000000d, 0                      , 0,
19973        CP1_                },        /* POOL32F_5~*(1) */
19974     { pool                , CMP_condn_D         , 32  , 32,
19975        0xfc00003f, 0xa0000015, 0                      , 0,
19976        CP1_                },        /* CMP.condn.D */
19977     { reserved_block      , 0                   , 0   , 32,
19978        0xfc00003f, 0xa000001d, 0                      , 0,
19979        CP1_                },        /* POOL32F_5~*(3) */
19980     { reserved_block      , 0                   , 0   , 32,
19981        0xfc00003f, 0xa0000025, 0                      , 0,
19982        CP1_                },        /* POOL32F_5~*(4) */
19983     { reserved_block      , 0                   , 0   , 32,
19984        0xfc00003f, 0xa000002d, 0                      , 0,
19985        CP1_                },        /* POOL32F_5~*(5) */
19986     { reserved_block      , 0                   , 0   , 32,
19987        0xfc00003f, 0xa0000035, 0                      , 0,
19988        CP1_                },        /* POOL32F_5~*(6) */
19989     { reserved_block      , 0                   , 0   , 32,
19990        0xfc00003f, 0xa000003d, 0                      , 0,
19991        CP1_                },        /* POOL32F_5~*(7) */
19992 };
19993 
19994 
19995 static const Pool POOL32F[8] = {
19996     { pool                , POOL32F_0           , 64  , 32,
19997        0xfc000007, 0xa0000000, 0                      , 0,
19998        CP1_                },        /* POOL32F_0 */
19999     { reserved_block      , 0                   , 0   , 32,
20000        0xfc000007, 0xa0000001, 0                      , 0,
20001        CP1_                },        /* POOL32F~*(1) */
20002     { reserved_block      , 0                   , 0   , 32,
20003        0xfc000007, 0xa0000002, 0                      , 0,
20004        CP1_                },        /* POOL32F~*(2) */
20005     { pool                , POOL32F_3           , 8   , 32,
20006        0xfc000007, 0xa0000003, 0                      , 0,
20007        CP1_                },        /* POOL32F_3 */
20008     { reserved_block      , 0                   , 0   , 32,
20009        0xfc000007, 0xa0000004, 0                      , 0,
20010        CP1_                },        /* POOL32F~*(4) */
20011     { pool                , POOL32F_5           , 8   , 32,
20012        0xfc000007, 0xa0000005, 0                      , 0,
20013        CP1_                },        /* POOL32F_5 */
20014     { reserved_block      , 0                   , 0   , 32,
20015        0xfc000007, 0xa0000006, 0                      , 0,
20016        CP1_                },        /* POOL32F~*(6) */
20017     { reserved_block      , 0                   , 0   , 32,
20018        0xfc000007, 0xa0000007, 0                      , 0,
20019        CP1_                },        /* POOL32F~*(7) */
20020 };
20021 
20022 
20023 static const Pool POOL32S_0[64] = {
20024     { reserved_block      , 0                   , 0   , 32,
20025        0xfc0001ff, 0xc0000000, 0                      , 0,
20026        0x0                 },        /* POOL32S_0~*(0) */
20027     { instruction         , 0                   , 0   , 32,
20028        0xfc0001ff, 0xc0000008, &DLSA             , 0,
20029        MIPS64_             },        /* DLSA */
20030     { instruction         , 0                   , 0   , 32,
20031        0xfc0001ff, 0xc0000010, &DSLLV            , 0,
20032        MIPS64_             },        /* DSLLV */
20033     { instruction         , 0                   , 0   , 32,
20034        0xfc0001ff, 0xc0000018, &DMUL             , 0,
20035        MIPS64_             },        /* DMUL */
20036     { reserved_block      , 0                   , 0   , 32,
20037        0xfc0001ff, 0xc0000020, 0                      , 0,
20038        0x0                 },        /* POOL32S_0~*(4) */
20039     { reserved_block      , 0                   , 0   , 32,
20040        0xfc0001ff, 0xc0000028, 0                      , 0,
20041        0x0                 },        /* POOL32S_0~*(5) */
20042     { reserved_block      , 0                   , 0   , 32,
20043        0xfc0001ff, 0xc0000030, 0                      , 0,
20044        0x0                 },        /* POOL32S_0~*(6) */
20045     { reserved_block      , 0                   , 0   , 32,
20046        0xfc0001ff, 0xc0000038, 0                      , 0,
20047        0x0                 },        /* POOL32S_0~*(7) */
20048     { reserved_block      , 0                   , 0   , 32,
20049        0xfc0001ff, 0xc0000040, 0                      , 0,
20050        0x0                 },        /* POOL32S_0~*(8) */
20051     { reserved_block      , 0                   , 0   , 32,
20052        0xfc0001ff, 0xc0000048, 0                      , 0,
20053        0x0                 },        /* POOL32S_0~*(9) */
20054     { instruction         , 0                   , 0   , 32,
20055        0xfc0001ff, 0xc0000050, &DSRLV            , 0,
20056        MIPS64_             },        /* DSRLV */
20057     { instruction         , 0                   , 0   , 32,
20058        0xfc0001ff, 0xc0000058, &DMUH             , 0,
20059        MIPS64_             },        /* DMUH */
20060     { reserved_block      , 0                   , 0   , 32,
20061        0xfc0001ff, 0xc0000060, 0                      , 0,
20062        0x0                 },        /* POOL32S_0~*(12) */
20063     { reserved_block      , 0                   , 0   , 32,
20064        0xfc0001ff, 0xc0000068, 0                      , 0,
20065        0x0                 },        /* POOL32S_0~*(13) */
20066     { reserved_block      , 0                   , 0   , 32,
20067        0xfc0001ff, 0xc0000070, 0                      , 0,
20068        0x0                 },        /* POOL32S_0~*(14) */
20069     { reserved_block      , 0                   , 0   , 32,
20070        0xfc0001ff, 0xc0000078, 0                      , 0,
20071        0x0                 },        /* POOL32S_0~*(15) */
20072     { reserved_block      , 0                   , 0   , 32,
20073        0xfc0001ff, 0xc0000080, 0                      , 0,
20074        0x0                 },        /* POOL32S_0~*(16) */
20075     { reserved_block      , 0                   , 0   , 32,
20076        0xfc0001ff, 0xc0000088, 0                      , 0,
20077        0x0                 },        /* POOL32S_0~*(17) */
20078     { instruction         , 0                   , 0   , 32,
20079        0xfc0001ff, 0xc0000090, &DSRAV            , 0,
20080        MIPS64_             },        /* DSRAV */
20081     { instruction         , 0                   , 0   , 32,
20082        0xfc0001ff, 0xc0000098, &DMULU            , 0,
20083        MIPS64_             },        /* DMULU */
20084     { reserved_block      , 0                   , 0   , 32,
20085        0xfc0001ff, 0xc00000a0, 0                      , 0,
20086        0x0                 },        /* POOL32S_0~*(20) */
20087     { reserved_block      , 0                   , 0   , 32,
20088        0xfc0001ff, 0xc00000a8, 0                      , 0,
20089        0x0                 },        /* POOL32S_0~*(21) */
20090     { reserved_block      , 0                   , 0   , 32,
20091        0xfc0001ff, 0xc00000b0, 0                      , 0,
20092        0x0                 },        /* POOL32S_0~*(22) */
20093     { reserved_block      , 0                   , 0   , 32,
20094        0xfc0001ff, 0xc00000b8, 0                      , 0,
20095        0x0                 },        /* POOL32S_0~*(23) */
20096     { reserved_block      , 0                   , 0   , 32,
20097        0xfc0001ff, 0xc00000c0, 0                      , 0,
20098        0x0                 },        /* POOL32S_0~*(24) */
20099     { reserved_block      , 0                   , 0   , 32,
20100        0xfc0001ff, 0xc00000c8, 0                      , 0,
20101        0x0                 },        /* POOL32S_0~*(25) */
20102     { instruction         , 0                   , 0   , 32,
20103        0xfc0001ff, 0xc00000d0, &DROTRV           , 0,
20104        MIPS64_             },        /* DROTRV */
20105     { instruction         , 0                   , 0   , 32,
20106        0xfc0001ff, 0xc00000d8, &DMUHU            , 0,
20107        MIPS64_             },        /* DMUHU */
20108     { reserved_block      , 0                   , 0   , 32,
20109        0xfc0001ff, 0xc00000e0, 0                      , 0,
20110        0x0                 },        /* POOL32S_0~*(28) */
20111     { reserved_block      , 0                   , 0   , 32,
20112        0xfc0001ff, 0xc00000e8, 0                      , 0,
20113        0x0                 },        /* POOL32S_0~*(29) */
20114     { reserved_block      , 0                   , 0   , 32,
20115        0xfc0001ff, 0xc00000f0, 0                      , 0,
20116        0x0                 },        /* POOL32S_0~*(30) */
20117     { reserved_block      , 0                   , 0   , 32,
20118        0xfc0001ff, 0xc00000f8, 0                      , 0,
20119        0x0                 },        /* POOL32S_0~*(31) */
20120     { reserved_block      , 0                   , 0   , 32,
20121        0xfc0001ff, 0xc0000100, 0                      , 0,
20122        0x0                 },        /* POOL32S_0~*(32) */
20123     { reserved_block      , 0                   , 0   , 32,
20124        0xfc0001ff, 0xc0000108, 0                      , 0,
20125        0x0                 },        /* POOL32S_0~*(33) */
20126     { instruction         , 0                   , 0   , 32,
20127        0xfc0001ff, 0xc0000110, &DADD             , 0,
20128        MIPS64_             },        /* DADD */
20129     { instruction         , 0                   , 0   , 32,
20130        0xfc0001ff, 0xc0000118, &DDIV             , 0,
20131        MIPS64_             },        /* DDIV */
20132     { reserved_block      , 0                   , 0   , 32,
20133        0xfc0001ff, 0xc0000120, 0                      , 0,
20134        0x0                 },        /* POOL32S_0~*(36) */
20135     { reserved_block      , 0                   , 0   , 32,
20136        0xfc0001ff, 0xc0000128, 0                      , 0,
20137        0x0                 },        /* POOL32S_0~*(37) */
20138     { reserved_block      , 0                   , 0   , 32,
20139        0xfc0001ff, 0xc0000130, 0                      , 0,
20140        0x0                 },        /* POOL32S_0~*(38) */
20141     { reserved_block      , 0                   , 0   , 32,
20142        0xfc0001ff, 0xc0000138, 0                      , 0,
20143        0x0                 },        /* POOL32S_0~*(39) */
20144     { reserved_block      , 0                   , 0   , 32,
20145        0xfc0001ff, 0xc0000140, 0                      , 0,
20146        0x0                 },        /* POOL32S_0~*(40) */
20147     { reserved_block      , 0                   , 0   , 32,
20148        0xfc0001ff, 0xc0000148, 0                      , 0,
20149        0x0                 },        /* POOL32S_0~*(41) */
20150     { instruction         , 0                   , 0   , 32,
20151        0xfc0001ff, 0xc0000150, &DADDU            , 0,
20152        MIPS64_             },        /* DADDU */
20153     { instruction         , 0                   , 0   , 32,
20154        0xfc0001ff, 0xc0000158, &DMOD             , 0,
20155        MIPS64_             },        /* DMOD */
20156     { reserved_block      , 0                   , 0   , 32,
20157        0xfc0001ff, 0xc0000160, 0                      , 0,
20158        0x0                 },        /* POOL32S_0~*(44) */
20159     { reserved_block      , 0                   , 0   , 32,
20160        0xfc0001ff, 0xc0000168, 0                      , 0,
20161        0x0                 },        /* POOL32S_0~*(45) */
20162     { reserved_block      , 0                   , 0   , 32,
20163        0xfc0001ff, 0xc0000170, 0                      , 0,
20164        0x0                 },        /* POOL32S_0~*(46) */
20165     { reserved_block      , 0                   , 0   , 32,
20166        0xfc0001ff, 0xc0000178, 0                      , 0,
20167        0x0                 },        /* POOL32S_0~*(47) */
20168     { reserved_block      , 0                   , 0   , 32,
20169        0xfc0001ff, 0xc0000180, 0                      , 0,
20170        0x0                 },        /* POOL32S_0~*(48) */
20171     { reserved_block      , 0                   , 0   , 32,
20172        0xfc0001ff, 0xc0000188, 0                      , 0,
20173        0x0                 },        /* POOL32S_0~*(49) */
20174     { instruction         , 0                   , 0   , 32,
20175        0xfc0001ff, 0xc0000190, &DSUB             , 0,
20176        MIPS64_             },        /* DSUB */
20177     { instruction         , 0                   , 0   , 32,
20178        0xfc0001ff, 0xc0000198, &DDIVU            , 0,
20179        MIPS64_             },        /* DDIVU */
20180     { reserved_block      , 0                   , 0   , 32,
20181        0xfc0001ff, 0xc00001a0, 0                      , 0,
20182        0x0                 },        /* POOL32S_0~*(52) */
20183     { reserved_block      , 0                   , 0   , 32,
20184        0xfc0001ff, 0xc00001a8, 0                      , 0,
20185        0x0                 },        /* POOL32S_0~*(53) */
20186     { reserved_block      , 0                   , 0   , 32,
20187        0xfc0001ff, 0xc00001b0, 0                      , 0,
20188        0x0                 },        /* POOL32S_0~*(54) */
20189     { reserved_block      , 0                   , 0   , 32,
20190        0xfc0001ff, 0xc00001b8, 0                      , 0,
20191        0x0                 },        /* POOL32S_0~*(55) */
20192     { reserved_block      , 0                   , 0   , 32,
20193        0xfc0001ff, 0xc00001c0, 0                      , 0,
20194        0x0                 },        /* POOL32S_0~*(56) */
20195     { reserved_block      , 0                   , 0   , 32,
20196        0xfc0001ff, 0xc00001c8, 0                      , 0,
20197        0x0                 },        /* POOL32S_0~*(57) */
20198     { instruction         , 0                   , 0   , 32,
20199        0xfc0001ff, 0xc00001d0, &DSUBU            , 0,
20200        MIPS64_             },        /* DSUBU */
20201     { instruction         , 0                   , 0   , 32,
20202        0xfc0001ff, 0xc00001d8, &DMODU            , 0,
20203        MIPS64_             },        /* DMODU */
20204     { reserved_block      , 0                   , 0   , 32,
20205        0xfc0001ff, 0xc00001e0, 0                      , 0,
20206        0x0                 },        /* POOL32S_0~*(60) */
20207     { reserved_block      , 0                   , 0   , 32,
20208        0xfc0001ff, 0xc00001e8, 0                      , 0,
20209        0x0                 },        /* POOL32S_0~*(61) */
20210     { reserved_block      , 0                   , 0   , 32,
20211        0xfc0001ff, 0xc00001f0, 0                      , 0,
20212        0x0                 },        /* POOL32S_0~*(62) */
20213     { reserved_block      , 0                   , 0   , 32,
20214        0xfc0001ff, 0xc00001f8, 0                      , 0,
20215        0x0                 },        /* POOL32S_0~*(63) */
20216 };
20217 
20218 
20219 static const Pool POOL32Sxf_4[128] = {
20220     { reserved_block      , 0                   , 0   , 32,
20221        0xfc00ffff, 0xc000013c, 0                      , 0,
20222        0x0                 },        /* POOL32Sxf_4~*(0) */
20223     { reserved_block      , 0                   , 0   , 32,
20224        0xfc00ffff, 0xc000033c, 0                      , 0,
20225        0x0                 },        /* POOL32Sxf_4~*(1) */
20226     { reserved_block      , 0                   , 0   , 32,
20227        0xfc00ffff, 0xc000053c, 0                      , 0,
20228        0x0                 },        /* POOL32Sxf_4~*(2) */
20229     { reserved_block      , 0                   , 0   , 32,
20230        0xfc00ffff, 0xc000073c, 0                      , 0,
20231        0x0                 },        /* POOL32Sxf_4~*(3) */
20232     { reserved_block      , 0                   , 0   , 32,
20233        0xfc00ffff, 0xc000093c, 0                      , 0,
20234        0x0                 },        /* POOL32Sxf_4~*(4) */
20235     { reserved_block      , 0                   , 0   , 32,
20236        0xfc00ffff, 0xc0000b3c, 0                      , 0,
20237        0x0                 },        /* POOL32Sxf_4~*(5) */
20238     { reserved_block      , 0                   , 0   , 32,
20239        0xfc00ffff, 0xc0000d3c, 0                      , 0,
20240        0x0                 },        /* POOL32Sxf_4~*(6) */
20241     { reserved_block      , 0                   , 0   , 32,
20242        0xfc00ffff, 0xc0000f3c, 0                      , 0,
20243        0x0                 },        /* POOL32Sxf_4~*(7) */
20244     { reserved_block      , 0                   , 0   , 32,
20245        0xfc00ffff, 0xc000113c, 0                      , 0,
20246        0x0                 },        /* POOL32Sxf_4~*(8) */
20247     { reserved_block      , 0                   , 0   , 32,
20248        0xfc00ffff, 0xc000133c, 0                      , 0,
20249        0x0                 },        /* POOL32Sxf_4~*(9) */
20250     { reserved_block      , 0                   , 0   , 32,
20251        0xfc00ffff, 0xc000153c, 0                      , 0,
20252        0x0                 },        /* POOL32Sxf_4~*(10) */
20253     { reserved_block      , 0                   , 0   , 32,
20254        0xfc00ffff, 0xc000173c, 0                      , 0,
20255        0x0                 },        /* POOL32Sxf_4~*(11) */
20256     { reserved_block      , 0                   , 0   , 32,
20257        0xfc00ffff, 0xc000193c, 0                      , 0,
20258        0x0                 },        /* POOL32Sxf_4~*(12) */
20259     { reserved_block      , 0                   , 0   , 32,
20260        0xfc00ffff, 0xc0001b3c, 0                      , 0,
20261        0x0                 },        /* POOL32Sxf_4~*(13) */
20262     { reserved_block      , 0                   , 0   , 32,
20263        0xfc00ffff, 0xc0001d3c, 0                      , 0,
20264        0x0                 },        /* POOL32Sxf_4~*(14) */
20265     { reserved_block      , 0                   , 0   , 32,
20266        0xfc00ffff, 0xc0001f3c, 0                      , 0,
20267        0x0                 },        /* POOL32Sxf_4~*(15) */
20268     { reserved_block      , 0                   , 0   , 32,
20269        0xfc00ffff, 0xc000213c, 0                      , 0,
20270        0x0                 },        /* POOL32Sxf_4~*(16) */
20271     { reserved_block      , 0                   , 0   , 32,
20272        0xfc00ffff, 0xc000233c, 0                      , 0,
20273        0x0                 },        /* POOL32Sxf_4~*(17) */
20274     { reserved_block      , 0                   , 0   , 32,
20275        0xfc00ffff, 0xc000253c, 0                      , 0,
20276        0x0                 },        /* POOL32Sxf_4~*(18) */
20277     { reserved_block      , 0                   , 0   , 32,
20278        0xfc00ffff, 0xc000273c, 0                      , 0,
20279        0x0                 },        /* POOL32Sxf_4~*(19) */
20280     { reserved_block      , 0                   , 0   , 32,
20281        0xfc00ffff, 0xc000293c, 0                      , 0,
20282        0x0                 },        /* POOL32Sxf_4~*(20) */
20283     { reserved_block      , 0                   , 0   , 32,
20284        0xfc00ffff, 0xc0002b3c, 0                      , 0,
20285        0x0                 },        /* POOL32Sxf_4~*(21) */
20286     { reserved_block      , 0                   , 0   , 32,
20287        0xfc00ffff, 0xc0002d3c, 0                      , 0,
20288        0x0                 },        /* POOL32Sxf_4~*(22) */
20289     { reserved_block      , 0                   , 0   , 32,
20290        0xfc00ffff, 0xc0002f3c, 0                      , 0,
20291        0x0                 },        /* POOL32Sxf_4~*(23) */
20292     { reserved_block      , 0                   , 0   , 32,
20293        0xfc00ffff, 0xc000313c, 0                      , 0,
20294        0x0                 },        /* POOL32Sxf_4~*(24) */
20295     { reserved_block      , 0                   , 0   , 32,
20296        0xfc00ffff, 0xc000333c, 0                      , 0,
20297        0x0                 },        /* POOL32Sxf_4~*(25) */
20298     { reserved_block      , 0                   , 0   , 32,
20299        0xfc00ffff, 0xc000353c, 0                      , 0,
20300        0x0                 },        /* POOL32Sxf_4~*(26) */
20301     { reserved_block      , 0                   , 0   , 32,
20302        0xfc00ffff, 0xc000373c, 0                      , 0,
20303        0x0                 },        /* POOL32Sxf_4~*(27) */
20304     { reserved_block      , 0                   , 0   , 32,
20305        0xfc00ffff, 0xc000393c, 0                      , 0,
20306        0x0                 },        /* POOL32Sxf_4~*(28) */
20307     { reserved_block      , 0                   , 0   , 32,
20308        0xfc00ffff, 0xc0003b3c, 0                      , 0,
20309        0x0                 },        /* POOL32Sxf_4~*(29) */
20310     { reserved_block      , 0                   , 0   , 32,
20311        0xfc00ffff, 0xc0003d3c, 0                      , 0,
20312        0x0                 },        /* POOL32Sxf_4~*(30) */
20313     { reserved_block      , 0                   , 0   , 32,
20314        0xfc00ffff, 0xc0003f3c, 0                      , 0,
20315        0x0                 },        /* POOL32Sxf_4~*(31) */
20316     { reserved_block      , 0                   , 0   , 32,
20317        0xfc00ffff, 0xc000413c, 0                      , 0,
20318        0x0                 },        /* POOL32Sxf_4~*(32) */
20319     { reserved_block      , 0                   , 0   , 32,
20320        0xfc00ffff, 0xc000433c, 0                      , 0,
20321        0x0                 },        /* POOL32Sxf_4~*(33) */
20322     { reserved_block      , 0                   , 0   , 32,
20323        0xfc00ffff, 0xc000453c, 0                      , 0,
20324        0x0                 },        /* POOL32Sxf_4~*(34) */
20325     { reserved_block      , 0                   , 0   , 32,
20326        0xfc00ffff, 0xc000473c, 0                      , 0,
20327        0x0                 },        /* POOL32Sxf_4~*(35) */
20328     { reserved_block      , 0                   , 0   , 32,
20329        0xfc00ffff, 0xc000493c, 0                      , 0,
20330        0x0                 },        /* POOL32Sxf_4~*(36) */
20331     { instruction         , 0                   , 0   , 32,
20332        0xfc00ffff, 0xc0004b3c, &DCLO             , 0,
20333        MIPS64_             },        /* DCLO */
20334     { reserved_block      , 0                   , 0   , 32,
20335        0xfc00ffff, 0xc0004d3c, 0                      , 0,
20336        0x0                 },        /* POOL32Sxf_4~*(38) */
20337     { reserved_block      , 0                   , 0   , 32,
20338        0xfc00ffff, 0xc0004f3c, 0                      , 0,
20339        0x0                 },        /* POOL32Sxf_4~*(39) */
20340     { reserved_block      , 0                   , 0   , 32,
20341        0xfc00ffff, 0xc000513c, 0                      , 0,
20342        0x0                 },        /* POOL32Sxf_4~*(40) */
20343     { reserved_block      , 0                   , 0   , 32,
20344        0xfc00ffff, 0xc000533c, 0                      , 0,
20345        0x0                 },        /* POOL32Sxf_4~*(41) */
20346     { reserved_block      , 0                   , 0   , 32,
20347        0xfc00ffff, 0xc000553c, 0                      , 0,
20348        0x0                 },        /* POOL32Sxf_4~*(42) */
20349     { reserved_block      , 0                   , 0   , 32,
20350        0xfc00ffff, 0xc000573c, 0                      , 0,
20351        0x0                 },        /* POOL32Sxf_4~*(43) */
20352     { reserved_block      , 0                   , 0   , 32,
20353        0xfc00ffff, 0xc000593c, 0                      , 0,
20354        0x0                 },        /* POOL32Sxf_4~*(44) */
20355     { instruction         , 0                   , 0   , 32,
20356        0xfc00ffff, 0xc0005b3c, &DCLZ             , 0,
20357        MIPS64_             },        /* DCLZ */
20358     { reserved_block      , 0                   , 0   , 32,
20359        0xfc00ffff, 0xc0005d3c, 0                      , 0,
20360        0x0                 },        /* POOL32Sxf_4~*(46) */
20361     { reserved_block      , 0                   , 0   , 32,
20362        0xfc00ffff, 0xc0005f3c, 0                      , 0,
20363        0x0                 },        /* POOL32Sxf_4~*(47) */
20364     { reserved_block      , 0                   , 0   , 32,
20365        0xfc00ffff, 0xc000613c, 0                      , 0,
20366        0x0                 },        /* POOL32Sxf_4~*(48) */
20367     { reserved_block      , 0                   , 0   , 32,
20368        0xfc00ffff, 0xc000633c, 0                      , 0,
20369        0x0                 },        /* POOL32Sxf_4~*(49) */
20370     { reserved_block      , 0                   , 0   , 32,
20371        0xfc00ffff, 0xc000653c, 0                      , 0,
20372        0x0                 },        /* POOL32Sxf_4~*(50) */
20373     { reserved_block      , 0                   , 0   , 32,
20374        0xfc00ffff, 0xc000673c, 0                      , 0,
20375        0x0                 },        /* POOL32Sxf_4~*(51) */
20376     { reserved_block      , 0                   , 0   , 32,
20377        0xfc00ffff, 0xc000693c, 0                      , 0,
20378        0x0                 },        /* POOL32Sxf_4~*(52) */
20379     { reserved_block      , 0                   , 0   , 32,
20380        0xfc00ffff, 0xc0006b3c, 0                      , 0,
20381        0x0                 },        /* POOL32Sxf_4~*(53) */
20382     { reserved_block      , 0                   , 0   , 32,
20383        0xfc00ffff, 0xc0006d3c, 0                      , 0,
20384        0x0                 },        /* POOL32Sxf_4~*(54) */
20385     { reserved_block      , 0                   , 0   , 32,
20386        0xfc00ffff, 0xc0006f3c, 0                      , 0,
20387        0x0                 },        /* POOL32Sxf_4~*(55) */
20388     { reserved_block      , 0                   , 0   , 32,
20389        0xfc00ffff, 0xc000713c, 0                      , 0,
20390        0x0                 },        /* POOL32Sxf_4~*(56) */
20391     { reserved_block      , 0                   , 0   , 32,
20392        0xfc00ffff, 0xc000733c, 0                      , 0,
20393        0x0                 },        /* POOL32Sxf_4~*(57) */
20394     { reserved_block      , 0                   , 0   , 32,
20395        0xfc00ffff, 0xc000753c, 0                      , 0,
20396        0x0                 },        /* POOL32Sxf_4~*(58) */
20397     { reserved_block      , 0                   , 0   , 32,
20398        0xfc00ffff, 0xc000773c, 0                      , 0,
20399        0x0                 },        /* POOL32Sxf_4~*(59) */
20400     { reserved_block      , 0                   , 0   , 32,
20401        0xfc00ffff, 0xc000793c, 0                      , 0,
20402        0x0                 },        /* POOL32Sxf_4~*(60) */
20403     { reserved_block      , 0                   , 0   , 32,
20404        0xfc00ffff, 0xc0007b3c, 0                      , 0,
20405        0x0                 },        /* POOL32Sxf_4~*(61) */
20406     { reserved_block      , 0                   , 0   , 32,
20407        0xfc00ffff, 0xc0007d3c, 0                      , 0,
20408        0x0                 },        /* POOL32Sxf_4~*(62) */
20409     { reserved_block      , 0                   , 0   , 32,
20410        0xfc00ffff, 0xc0007f3c, 0                      , 0,
20411        0x0                 },        /* POOL32Sxf_4~*(63) */
20412     { reserved_block      , 0                   , 0   , 32,
20413        0xfc00ffff, 0xc000813c, 0                      , 0,
20414        0x0                 },        /* POOL32Sxf_4~*(64) */
20415     { reserved_block      , 0                   , 0   , 32,
20416        0xfc00ffff, 0xc000833c, 0                      , 0,
20417        0x0                 },        /* POOL32Sxf_4~*(65) */
20418     { reserved_block      , 0                   , 0   , 32,
20419        0xfc00ffff, 0xc000853c, 0                      , 0,
20420        0x0                 },        /* POOL32Sxf_4~*(66) */
20421     { reserved_block      , 0                   , 0   , 32,
20422        0xfc00ffff, 0xc000873c, 0                      , 0,
20423        0x0                 },        /* POOL32Sxf_4~*(67) */
20424     { reserved_block      , 0                   , 0   , 32,
20425        0xfc00ffff, 0xc000893c, 0                      , 0,
20426        0x0                 },        /* POOL32Sxf_4~*(68) */
20427     { reserved_block      , 0                   , 0   , 32,
20428        0xfc00ffff, 0xc0008b3c, 0                      , 0,
20429        0x0                 },        /* POOL32Sxf_4~*(69) */
20430     { reserved_block      , 0                   , 0   , 32,
20431        0xfc00ffff, 0xc0008d3c, 0                      , 0,
20432        0x0                 },        /* POOL32Sxf_4~*(70) */
20433     { reserved_block      , 0                   , 0   , 32,
20434        0xfc00ffff, 0xc0008f3c, 0                      , 0,
20435        0x0                 },        /* POOL32Sxf_4~*(71) */
20436     { reserved_block      , 0                   , 0   , 32,
20437        0xfc00ffff, 0xc000913c, 0                      , 0,
20438        0x0                 },        /* POOL32Sxf_4~*(72) */
20439     { reserved_block      , 0                   , 0   , 32,
20440        0xfc00ffff, 0xc000933c, 0                      , 0,
20441        0x0                 },        /* POOL32Sxf_4~*(73) */
20442     { reserved_block      , 0                   , 0   , 32,
20443        0xfc00ffff, 0xc000953c, 0                      , 0,
20444        0x0                 },        /* POOL32Sxf_4~*(74) */
20445     { reserved_block      , 0                   , 0   , 32,
20446        0xfc00ffff, 0xc000973c, 0                      , 0,
20447        0x0                 },        /* POOL32Sxf_4~*(75) */
20448     { reserved_block      , 0                   , 0   , 32,
20449        0xfc00ffff, 0xc000993c, 0                      , 0,
20450        0x0                 },        /* POOL32Sxf_4~*(76) */
20451     { reserved_block      , 0                   , 0   , 32,
20452        0xfc00ffff, 0xc0009b3c, 0                      , 0,
20453        0x0                 },        /* POOL32Sxf_4~*(77) */
20454     { reserved_block      , 0                   , 0   , 32,
20455        0xfc00ffff, 0xc0009d3c, 0                      , 0,
20456        0x0                 },        /* POOL32Sxf_4~*(78) */
20457     { reserved_block      , 0                   , 0   , 32,
20458        0xfc00ffff, 0xc0009f3c, 0                      , 0,
20459        0x0                 },        /* POOL32Sxf_4~*(79) */
20460     { reserved_block      , 0                   , 0   , 32,
20461        0xfc00ffff, 0xc000a13c, 0                      , 0,
20462        0x0                 },        /* POOL32Sxf_4~*(80) */
20463     { reserved_block      , 0                   , 0   , 32,
20464        0xfc00ffff, 0xc000a33c, 0                      , 0,
20465        0x0                 },        /* POOL32Sxf_4~*(81) */
20466     { reserved_block      , 0                   , 0   , 32,
20467        0xfc00ffff, 0xc000a53c, 0                      , 0,
20468        0x0                 },        /* POOL32Sxf_4~*(82) */
20469     { reserved_block      , 0                   , 0   , 32,
20470        0xfc00ffff, 0xc000a73c, 0                      , 0,
20471        0x0                 },        /* POOL32Sxf_4~*(83) */
20472     { reserved_block      , 0                   , 0   , 32,
20473        0xfc00ffff, 0xc000a93c, 0                      , 0,
20474        0x0                 },        /* POOL32Sxf_4~*(84) */
20475     { reserved_block      , 0                   , 0   , 32,
20476        0xfc00ffff, 0xc000ab3c, 0                      , 0,
20477        0x0                 },        /* POOL32Sxf_4~*(85) */
20478     { reserved_block      , 0                   , 0   , 32,
20479        0xfc00ffff, 0xc000ad3c, 0                      , 0,
20480        0x0                 },        /* POOL32Sxf_4~*(86) */
20481     { reserved_block      , 0                   , 0   , 32,
20482        0xfc00ffff, 0xc000af3c, 0                      , 0,
20483        0x0                 },        /* POOL32Sxf_4~*(87) */
20484     { reserved_block      , 0                   , 0   , 32,
20485        0xfc00ffff, 0xc000b13c, 0                      , 0,
20486        0x0                 },        /* POOL32Sxf_4~*(88) */
20487     { reserved_block      , 0                   , 0   , 32,
20488        0xfc00ffff, 0xc000b33c, 0                      , 0,
20489        0x0                 },        /* POOL32Sxf_4~*(89) */
20490     { reserved_block      , 0                   , 0   , 32,
20491        0xfc00ffff, 0xc000b53c, 0                      , 0,
20492        0x0                 },        /* POOL32Sxf_4~*(90) */
20493     { reserved_block      , 0                   , 0   , 32,
20494        0xfc00ffff, 0xc000b73c, 0                      , 0,
20495        0x0                 },        /* POOL32Sxf_4~*(91) */
20496     { reserved_block      , 0                   , 0   , 32,
20497        0xfc00ffff, 0xc000b93c, 0                      , 0,
20498        0x0                 },        /* POOL32Sxf_4~*(92) */
20499     { reserved_block      , 0                   , 0   , 32,
20500        0xfc00ffff, 0xc000bb3c, 0                      , 0,
20501        0x0                 },        /* POOL32Sxf_4~*(93) */
20502     { reserved_block      , 0                   , 0   , 32,
20503        0xfc00ffff, 0xc000bd3c, 0                      , 0,
20504        0x0                 },        /* POOL32Sxf_4~*(94) */
20505     { reserved_block      , 0                   , 0   , 32,
20506        0xfc00ffff, 0xc000bf3c, 0                      , 0,
20507        0x0                 },        /* POOL32Sxf_4~*(95) */
20508     { reserved_block      , 0                   , 0   , 32,
20509        0xfc00ffff, 0xc000c13c, 0                      , 0,
20510        0x0                 },        /* POOL32Sxf_4~*(96) */
20511     { reserved_block      , 0                   , 0   , 32,
20512        0xfc00ffff, 0xc000c33c, 0                      , 0,
20513        0x0                 },        /* POOL32Sxf_4~*(97) */
20514     { reserved_block      , 0                   , 0   , 32,
20515        0xfc00ffff, 0xc000c53c, 0                      , 0,
20516        0x0                 },        /* POOL32Sxf_4~*(98) */
20517     { reserved_block      , 0                   , 0   , 32,
20518        0xfc00ffff, 0xc000c73c, 0                      , 0,
20519        0x0                 },        /* POOL32Sxf_4~*(99) */
20520     { reserved_block      , 0                   , 0   , 32,
20521        0xfc00ffff, 0xc000c93c, 0                      , 0,
20522        0x0                 },        /* POOL32Sxf_4~*(100) */
20523     { reserved_block      , 0                   , 0   , 32,
20524        0xfc00ffff, 0xc000cb3c, 0                      , 0,
20525        0x0                 },        /* POOL32Sxf_4~*(101) */
20526     { reserved_block      , 0                   , 0   , 32,
20527        0xfc00ffff, 0xc000cd3c, 0                      , 0,
20528        0x0                 },        /* POOL32Sxf_4~*(102) */
20529     { reserved_block      , 0                   , 0   , 32,
20530        0xfc00ffff, 0xc000cf3c, 0                      , 0,
20531        0x0                 },        /* POOL32Sxf_4~*(103) */
20532     { reserved_block      , 0                   , 0   , 32,
20533        0xfc00ffff, 0xc000d13c, 0                      , 0,
20534        0x0                 },        /* POOL32Sxf_4~*(104) */
20535     { reserved_block      , 0                   , 0   , 32,
20536        0xfc00ffff, 0xc000d33c, 0                      , 0,
20537        0x0                 },        /* POOL32Sxf_4~*(105) */
20538     { reserved_block      , 0                   , 0   , 32,
20539        0xfc00ffff, 0xc000d53c, 0                      , 0,
20540        0x0                 },        /* POOL32Sxf_4~*(106) */
20541     { reserved_block      , 0                   , 0   , 32,
20542        0xfc00ffff, 0xc000d73c, 0                      , 0,
20543        0x0                 },        /* POOL32Sxf_4~*(107) */
20544     { reserved_block      , 0                   , 0   , 32,
20545        0xfc00ffff, 0xc000d93c, 0                      , 0,
20546        0x0                 },        /* POOL32Sxf_4~*(108) */
20547     { reserved_block      , 0                   , 0   , 32,
20548        0xfc00ffff, 0xc000db3c, 0                      , 0,
20549        0x0                 },        /* POOL32Sxf_4~*(109) */
20550     { reserved_block      , 0                   , 0   , 32,
20551        0xfc00ffff, 0xc000dd3c, 0                      , 0,
20552        0x0                 },        /* POOL32Sxf_4~*(110) */
20553     { reserved_block      , 0                   , 0   , 32,
20554        0xfc00ffff, 0xc000df3c, 0                      , 0,
20555        0x0                 },        /* POOL32Sxf_4~*(111) */
20556     { reserved_block      , 0                   , 0   , 32,
20557        0xfc00ffff, 0xc000e13c, 0                      , 0,
20558        0x0                 },        /* POOL32Sxf_4~*(112) */
20559     { reserved_block      , 0                   , 0   , 32,
20560        0xfc00ffff, 0xc000e33c, 0                      , 0,
20561        0x0                 },        /* POOL32Sxf_4~*(113) */
20562     { reserved_block      , 0                   , 0   , 32,
20563        0xfc00ffff, 0xc000e53c, 0                      , 0,
20564        0x0                 },        /* POOL32Sxf_4~*(114) */
20565     { reserved_block      , 0                   , 0   , 32,
20566        0xfc00ffff, 0xc000e73c, 0                      , 0,
20567        0x0                 },        /* POOL32Sxf_4~*(115) */
20568     { reserved_block      , 0                   , 0   , 32,
20569        0xfc00ffff, 0xc000e93c, 0                      , 0,
20570        0x0                 },        /* POOL32Sxf_4~*(116) */
20571     { reserved_block      , 0                   , 0   , 32,
20572        0xfc00ffff, 0xc000eb3c, 0                      , 0,
20573        0x0                 },        /* POOL32Sxf_4~*(117) */
20574     { reserved_block      , 0                   , 0   , 32,
20575        0xfc00ffff, 0xc000ed3c, 0                      , 0,
20576        0x0                 },        /* POOL32Sxf_4~*(118) */
20577     { reserved_block      , 0                   , 0   , 32,
20578        0xfc00ffff, 0xc000ef3c, 0                      , 0,
20579        0x0                 },        /* POOL32Sxf_4~*(119) */
20580     { reserved_block      , 0                   , 0   , 32,
20581        0xfc00ffff, 0xc000f13c, 0                      , 0,
20582        0x0                 },        /* POOL32Sxf_4~*(120) */
20583     { reserved_block      , 0                   , 0   , 32,
20584        0xfc00ffff, 0xc000f33c, 0                      , 0,
20585        0x0                 },        /* POOL32Sxf_4~*(121) */
20586     { reserved_block      , 0                   , 0   , 32,
20587        0xfc00ffff, 0xc000f53c, 0                      , 0,
20588        0x0                 },        /* POOL32Sxf_4~*(122) */
20589     { reserved_block      , 0                   , 0   , 32,
20590        0xfc00ffff, 0xc000f73c, 0                      , 0,
20591        0x0                 },        /* POOL32Sxf_4~*(123) */
20592     { reserved_block      , 0                   , 0   , 32,
20593        0xfc00ffff, 0xc000f93c, 0                      , 0,
20594        0x0                 },        /* POOL32Sxf_4~*(124) */
20595     { reserved_block      , 0                   , 0   , 32,
20596        0xfc00ffff, 0xc000fb3c, 0                      , 0,
20597        0x0                 },        /* POOL32Sxf_4~*(125) */
20598     { reserved_block      , 0                   , 0   , 32,
20599        0xfc00ffff, 0xc000fd3c, 0                      , 0,
20600        0x0                 },        /* POOL32Sxf_4~*(126) */
20601     { reserved_block      , 0                   , 0   , 32,
20602        0xfc00ffff, 0xc000ff3c, 0                      , 0,
20603        0x0                 },        /* POOL32Sxf_4~*(127) */
20604 };
20605 
20606 
20607 static const Pool POOL32Sxf[8] = {
20608     { reserved_block      , 0                   , 0   , 32,
20609        0xfc0001ff, 0xc000003c, 0                      , 0,
20610        0x0                 },        /* POOL32Sxf~*(0) */
20611     { reserved_block      , 0                   , 0   , 32,
20612        0xfc0001ff, 0xc000007c, 0                      , 0,
20613        0x0                 },        /* POOL32Sxf~*(1) */
20614     { reserved_block      , 0                   , 0   , 32,
20615        0xfc0001ff, 0xc00000bc, 0                      , 0,
20616        0x0                 },        /* POOL32Sxf~*(2) */
20617     { reserved_block      , 0                   , 0   , 32,
20618        0xfc0001ff, 0xc00000fc, 0                      , 0,
20619        0x0                 },        /* POOL32Sxf~*(3) */
20620     { pool                , POOL32Sxf_4         , 128 , 32,
20621        0xfc0001ff, 0xc000013c, 0                      , 0,
20622        0x0                 },        /* POOL32Sxf_4 */
20623     { reserved_block      , 0                   , 0   , 32,
20624        0xfc0001ff, 0xc000017c, 0                      , 0,
20625        0x0                 },        /* POOL32Sxf~*(5) */
20626     { reserved_block      , 0                   , 0   , 32,
20627        0xfc0001ff, 0xc00001bc, 0                      , 0,
20628        0x0                 },        /* POOL32Sxf~*(6) */
20629     { reserved_block      , 0                   , 0   , 32,
20630        0xfc0001ff, 0xc00001fc, 0                      , 0,
20631        0x0                 },        /* POOL32Sxf~*(7) */
20632 };
20633 
20634 
20635 static const Pool POOL32S_4[8] = {
20636     { instruction         , 0                   , 0   , 32,
20637        0xfc00003f, 0xc0000004, &EXTD             , 0,
20638        MIPS64_             },        /* EXTD */
20639     { instruction         , 0                   , 0   , 32,
20640        0xfc00003f, 0xc000000c, &EXTD32           , 0,
20641        MIPS64_             },        /* EXTD32 */
20642     { reserved_block      , 0                   , 0   , 32,
20643        0xfc00003f, 0xc0000014, 0                      , 0,
20644        0x0                 },        /* POOL32S_4~*(2) */
20645     { reserved_block      , 0                   , 0   , 32,
20646        0xfc00003f, 0xc000001c, 0                      , 0,
20647        0x0                 },        /* POOL32S_4~*(3) */
20648     { reserved_block      , 0                   , 0   , 32,
20649        0xfc00003f, 0xc0000024, 0                      , 0,
20650        0x0                 },        /* POOL32S_4~*(4) */
20651     { reserved_block      , 0                   , 0   , 32,
20652        0xfc00003f, 0xc000002c, 0                      , 0,
20653        0x0                 },        /* POOL32S_4~*(5) */
20654     { reserved_block      , 0                   , 0   , 32,
20655        0xfc00003f, 0xc0000034, 0                      , 0,
20656        0x0                 },        /* POOL32S_4~*(6) */
20657     { pool                , POOL32Sxf           , 8   , 32,
20658        0xfc00003f, 0xc000003c, 0                      , 0,
20659        0x0                 },        /* POOL32Sxf */
20660 };
20661 
20662 
20663 static const Pool POOL32S[8] = {
20664     { pool                , POOL32S_0           , 64  , 32,
20665        0xfc000007, 0xc0000000, 0                      , 0,
20666        0x0                 },        /* POOL32S_0 */
20667     { reserved_block      , 0                   , 0   , 32,
20668        0xfc000007, 0xc0000001, 0                      , 0,
20669        0x0                 },        /* POOL32S~*(1) */
20670     { reserved_block      , 0                   , 0   , 32,
20671        0xfc000007, 0xc0000002, 0                      , 0,
20672        0x0                 },        /* POOL32S~*(2) */
20673     { reserved_block      , 0                   , 0   , 32,
20674        0xfc000007, 0xc0000003, 0                      , 0,
20675        0x0                 },        /* POOL32S~*(3) */
20676     { pool                , POOL32S_4           , 8   , 32,
20677        0xfc000007, 0xc0000004, 0                      , 0,
20678        0x0                 },        /* POOL32S_4 */
20679     { reserved_block      , 0                   , 0   , 32,
20680        0xfc000007, 0xc0000005, 0                      , 0,
20681        0x0                 },        /* POOL32S~*(5) */
20682     { reserved_block      , 0                   , 0   , 32,
20683        0xfc000007, 0xc0000006, 0                      , 0,
20684        0x0                 },        /* POOL32S~*(6) */
20685     { reserved_block      , 0                   , 0   , 32,
20686        0xfc000007, 0xc0000007, 0                      , 0,
20687        0x0                 },        /* POOL32S~*(7) */
20688 };
20689 
20690 
20691 static const Pool P_LUI[2] = {
20692     { instruction         , 0                   , 0   , 32,
20693        0xfc000002, 0xe0000000, &LUI              , 0,
20694        0x0                 },        /* LUI */
20695     { instruction         , 0                   , 0   , 32,
20696        0xfc000002, 0xe0000002, &ALUIPC           , 0,
20697        0x0                 },        /* ALUIPC */
20698 };
20699 
20700 
20701 static const Pool P_GP_LH[2] = {
20702     { instruction         , 0                   , 0   , 32,
20703        0xfc1c0001, 0x44100000, &LH_GP_           , 0,
20704        0x0                 },        /* LH[GP] */
20705     { instruction         , 0                   , 0   , 32,
20706        0xfc1c0001, 0x44100001, &LHU_GP_          , 0,
20707        0x0                 },        /* LHU[GP] */
20708 };
20709 
20710 
20711 static const Pool P_GP_SH[2] = {
20712     { instruction         , 0                   , 0   , 32,
20713        0xfc1c0001, 0x44140000, &SH_GP_           , 0,
20714        0x0                 },        /* SH[GP] */
20715     { reserved_block      , 0                   , 0   , 32,
20716        0xfc1c0001, 0x44140001, 0                      , 0,
20717        0x0                 },        /* P.GP.SH~*(1) */
20718 };
20719 
20720 
20721 static const Pool P_GP_CP1[4] = {
20722     { instruction         , 0                   , 0   , 32,
20723        0xfc1c0003, 0x44180000, &LWC1_GP_         , 0,
20724        CP1_                },        /* LWC1[GP] */
20725     { instruction         , 0                   , 0   , 32,
20726        0xfc1c0003, 0x44180001, &SWC1_GP_         , 0,
20727        CP1_                },        /* SWC1[GP] */
20728     { instruction         , 0                   , 0   , 32,
20729        0xfc1c0003, 0x44180002, &LDC1_GP_         , 0,
20730        CP1_                },        /* LDC1[GP] */
20731     { instruction         , 0                   , 0   , 32,
20732        0xfc1c0003, 0x44180003, &SDC1_GP_         , 0,
20733        CP1_                },        /* SDC1[GP] */
20734 };
20735 
20736 
20737 static const Pool P_GP_M64[4] = {
20738     { instruction         , 0                   , 0   , 32,
20739        0xfc1c0003, 0x441c0000, &LWU_GP_          , 0,
20740        MIPS64_             },        /* LWU[GP] */
20741     { reserved_block      , 0                   , 0   , 32,
20742        0xfc1c0003, 0x441c0001, 0                      , 0,
20743        0x0                 },        /* P.GP.M64~*(1) */
20744     { reserved_block      , 0                   , 0   , 32,
20745        0xfc1c0003, 0x441c0002, 0                      , 0,
20746        0x0                 },        /* P.GP.M64~*(2) */
20747     { reserved_block      , 0                   , 0   , 32,
20748        0xfc1c0003, 0x441c0003, 0                      , 0,
20749        0x0                 },        /* P.GP.M64~*(3) */
20750 };
20751 
20752 
20753 static const Pool P_GP_BH[8] = {
20754     { instruction         , 0                   , 0   , 32,
20755        0xfc1c0000, 0x44000000, &LB_GP_           , 0,
20756        0x0                 },        /* LB[GP] */
20757     { instruction         , 0                   , 0   , 32,
20758        0xfc1c0000, 0x44040000, &SB_GP_           , 0,
20759        0x0                 },        /* SB[GP] */
20760     { instruction         , 0                   , 0   , 32,
20761        0xfc1c0000, 0x44080000, &LBU_GP_          , 0,
20762        0x0                 },        /* LBU[GP] */
20763     { instruction         , 0                   , 0   , 32,
20764        0xfc1c0000, 0x440c0000, &ADDIU_GP_B_      , 0,
20765        0x0                 },        /* ADDIU[GP.B] */
20766     { pool                , P_GP_LH             , 2   , 32,
20767        0xfc1c0000, 0x44100000, 0                      , 0,
20768        0x0                 },        /* P.GP.LH */
20769     { pool                , P_GP_SH             , 2   , 32,
20770        0xfc1c0000, 0x44140000, 0                      , 0,
20771        0x0                 },        /* P.GP.SH */
20772     { pool                , P_GP_CP1            , 4   , 32,
20773        0xfc1c0000, 0x44180000, 0                      , 0,
20774        0x0                 },        /* P.GP.CP1 */
20775     { pool                , P_GP_M64            , 4   , 32,
20776        0xfc1c0000, 0x441c0000, 0                      , 0,
20777        0x0                 },        /* P.GP.M64 */
20778 };
20779 
20780 
20781 static const Pool P_LS_U12[16] = {
20782     { instruction         , 0                   , 0   , 32,
20783        0xfc00f000, 0x84000000, &LB_U12_          , 0,
20784        0x0                 },        /* LB[U12] */
20785     { instruction         , 0                   , 0   , 32,
20786        0xfc00f000, 0x84001000, &SB_U12_          , 0,
20787        0x0                 },        /* SB[U12] */
20788     { instruction         , 0                   , 0   , 32,
20789        0xfc00f000, 0x84002000, &LBU_U12_         , 0,
20790        0x0                 },        /* LBU[U12] */
20791     { instruction         , 0                   , 0   , 32,
20792        0xfc00f000, 0x84003000, &PREF_U12_        , 0,
20793        0x0                 },        /* PREF[U12] */
20794     { instruction         , 0                   , 0   , 32,
20795        0xfc00f000, 0x84004000, &LH_U12_          , 0,
20796        0x0                 },        /* LH[U12] */
20797     { instruction         , 0                   , 0   , 32,
20798        0xfc00f000, 0x84005000, &SH_U12_          , 0,
20799        0x0                 },        /* SH[U12] */
20800     { instruction         , 0                   , 0   , 32,
20801        0xfc00f000, 0x84006000, &LHU_U12_         , 0,
20802        0x0                 },        /* LHU[U12] */
20803     { instruction         , 0                   , 0   , 32,
20804        0xfc00f000, 0x84007000, &LWU_U12_         , 0,
20805        MIPS64_             },        /* LWU[U12] */
20806     { instruction         , 0                   , 0   , 32,
20807        0xfc00f000, 0x84008000, &LW_U12_          , 0,
20808        0x0                 },        /* LW[U12] */
20809     { instruction         , 0                   , 0   , 32,
20810        0xfc00f000, 0x84009000, &SW_U12_          , 0,
20811        0x0                 },        /* SW[U12] */
20812     { instruction         , 0                   , 0   , 32,
20813        0xfc00f000, 0x8400a000, &LWC1_U12_        , 0,
20814        CP1_                },        /* LWC1[U12] */
20815     { instruction         , 0                   , 0   , 32,
20816        0xfc00f000, 0x8400b000, &SWC1_U12_        , 0,
20817        CP1_                },        /* SWC1[U12] */
20818     { instruction         , 0                   , 0   , 32,
20819        0xfc00f000, 0x8400c000, &LD_U12_          , 0,
20820        MIPS64_             },        /* LD[U12] */
20821     { instruction         , 0                   , 0   , 32,
20822        0xfc00f000, 0x8400d000, &SD_U12_          , 0,
20823        MIPS64_             },        /* SD[U12] */
20824     { instruction         , 0                   , 0   , 32,
20825        0xfc00f000, 0x8400e000, &LDC1_U12_        , 0,
20826        CP1_                },        /* LDC1[U12] */
20827     { instruction         , 0                   , 0   , 32,
20828        0xfc00f000, 0x8400f000, &SDC1_U12_        , 0,
20829        CP1_                },        /* SDC1[U12] */
20830 };
20831 
20832 
20833 static const Pool P_PREF_S9_[2] = {
20834     { instruction         , 0                   , 0   , 32,
20835        0xffe07f00, 0xa7e01800, &SYNCI            , 0,
20836        0x0                 },        /* SYNCI */
20837     { instruction         , 0                   , 0   , 32,
20838        0xfc007f00, 0xa4001800, &PREF_S9_         , &PREF_S9__cond    ,
20839        0x0                 },        /* PREF[S9] */
20840 };
20841 
20842 
20843 static const Pool P_LS_S0[16] = {
20844     { instruction         , 0                   , 0   , 32,
20845        0xfc007f00, 0xa4000000, &LB_S9_           , 0,
20846        0x0                 },        /* LB[S9] */
20847     { instruction         , 0                   , 0   , 32,
20848        0xfc007f00, 0xa4000800, &SB_S9_           , 0,
20849        0x0                 },        /* SB[S9] */
20850     { instruction         , 0                   , 0   , 32,
20851        0xfc007f00, 0xa4001000, &LBU_S9_          , 0,
20852        0x0                 },        /* LBU[S9] */
20853     { pool                , P_PREF_S9_          , 2   , 32,
20854        0xfc007f00, 0xa4001800, 0                      , 0,
20855        0x0                 },        /* P.PREF[S9] */
20856     { instruction         , 0                   , 0   , 32,
20857        0xfc007f00, 0xa4002000, &LH_S9_           , 0,
20858        0x0                 },        /* LH[S9] */
20859     { instruction         , 0                   , 0   , 32,
20860        0xfc007f00, 0xa4002800, &SH_S9_           , 0,
20861        0x0                 },        /* SH[S9] */
20862     { instruction         , 0                   , 0   , 32,
20863        0xfc007f00, 0xa4003000, &LHU_S9_          , 0,
20864        0x0                 },        /* LHU[S9] */
20865     { instruction         , 0                   , 0   , 32,
20866        0xfc007f00, 0xa4003800, &LWU_S9_          , 0,
20867        MIPS64_             },        /* LWU[S9] */
20868     { instruction         , 0                   , 0   , 32,
20869        0xfc007f00, 0xa4004000, &LW_S9_           , 0,
20870        0x0                 },        /* LW[S9] */
20871     { instruction         , 0                   , 0   , 32,
20872        0xfc007f00, 0xa4004800, &SW_S9_           , 0,
20873        0x0                 },        /* SW[S9] */
20874     { instruction         , 0                   , 0   , 32,
20875        0xfc007f00, 0xa4005000, &LWC1_S9_         , 0,
20876        CP1_                },        /* LWC1[S9] */
20877     { instruction         , 0                   , 0   , 32,
20878        0xfc007f00, 0xa4005800, &SWC1_S9_         , 0,
20879        CP1_                },        /* SWC1[S9] */
20880     { instruction         , 0                   , 0   , 32,
20881        0xfc007f00, 0xa4006000, &LD_S9_           , 0,
20882        MIPS64_             },        /* LD[S9] */
20883     { instruction         , 0                   , 0   , 32,
20884        0xfc007f00, 0xa4006800, &SD_S9_           , 0,
20885        MIPS64_             },        /* SD[S9] */
20886     { instruction         , 0                   , 0   , 32,
20887        0xfc007f00, 0xa4007000, &LDC1_S9_         , 0,
20888        CP1_                },        /* LDC1[S9] */
20889     { instruction         , 0                   , 0   , 32,
20890        0xfc007f00, 0xa4007800, &SDC1_S9_         , 0,
20891        CP1_                },        /* SDC1[S9] */
20892 };
20893 
20894 
20895 static const Pool ASET_ACLR[2] = {
20896     { instruction         , 0                   , 0   , 32,
20897        0xfe007f00, 0xa4001100, &ASET             , 0,
20898        MCU_                },        /* ASET */
20899     { instruction         , 0                   , 0   , 32,
20900        0xfe007f00, 0xa6001100, &ACLR             , 0,
20901        MCU_                },        /* ACLR */
20902 };
20903 
20904 
20905 static const Pool P_LL[4] = {
20906     { instruction         , 0                   , 0   , 32,
20907        0xfc007f03, 0xa4005100, &LL               , 0,
20908        0x0                 },        /* LL */
20909     { instruction         , 0                   , 0   , 32,
20910        0xfc007f03, 0xa4005101, &LLWP             , 0,
20911        XNP_                },        /* LLWP */
20912     { reserved_block      , 0                   , 0   , 32,
20913        0xfc007f03, 0xa4005102, 0                      , 0,
20914        0x0                 },        /* P.LL~*(2) */
20915     { reserved_block      , 0                   , 0   , 32,
20916        0xfc007f03, 0xa4005103, 0                      , 0,
20917        0x0                 },        /* P.LL~*(3) */
20918 };
20919 
20920 
20921 static const Pool P_SC[4] = {
20922     { instruction         , 0                   , 0   , 32,
20923        0xfc007f03, 0xa4005900, &SC               , 0,
20924        0x0                 },        /* SC */
20925     { instruction         , 0                   , 0   , 32,
20926        0xfc007f03, 0xa4005901, &SCWP             , 0,
20927        XNP_                },        /* SCWP */
20928     { reserved_block      , 0                   , 0   , 32,
20929        0xfc007f03, 0xa4005902, 0                      , 0,
20930        0x0                 },        /* P.SC~*(2) */
20931     { reserved_block      , 0                   , 0   , 32,
20932        0xfc007f03, 0xa4005903, 0                      , 0,
20933        0x0                 },        /* P.SC~*(3) */
20934 };
20935 
20936 
20937 static const Pool P_LLD[8] = {
20938     { instruction         , 0                   , 0   , 32,
20939        0xfc007f07, 0xa4007100, &LLD              , 0,
20940        MIPS64_             },        /* LLD */
20941     { instruction         , 0                   , 0   , 32,
20942        0xfc007f07, 0xa4007101, &LLDP             , 0,
20943        MIPS64_             },        /* LLDP */
20944     { reserved_block      , 0                   , 0   , 32,
20945        0xfc007f07, 0xa4007102, 0                      , 0,
20946        0x0                 },        /* P.LLD~*(2) */
20947     { reserved_block      , 0                   , 0   , 32,
20948        0xfc007f07, 0xa4007103, 0                      , 0,
20949        0x0                 },        /* P.LLD~*(3) */
20950     { reserved_block      , 0                   , 0   , 32,
20951        0xfc007f07, 0xa4007104, 0                      , 0,
20952        0x0                 },        /* P.LLD~*(4) */
20953     { reserved_block      , 0                   , 0   , 32,
20954        0xfc007f07, 0xa4007105, 0                      , 0,
20955        0x0                 },        /* P.LLD~*(5) */
20956     { reserved_block      , 0                   , 0   , 32,
20957        0xfc007f07, 0xa4007106, 0                      , 0,
20958        0x0                 },        /* P.LLD~*(6) */
20959     { reserved_block      , 0                   , 0   , 32,
20960        0xfc007f07, 0xa4007107, 0                      , 0,
20961        0x0                 },        /* P.LLD~*(7) */
20962 };
20963 
20964 
20965 static const Pool P_SCD[8] = {
20966     { instruction         , 0                   , 0   , 32,
20967        0xfc007f07, 0xa4007900, &SCD              , 0,
20968        MIPS64_             },        /* SCD */
20969     { instruction         , 0                   , 0   , 32,
20970        0xfc007f07, 0xa4007901, &SCDP             , 0,
20971        MIPS64_             },        /* SCDP */
20972     { reserved_block      , 0                   , 0   , 32,
20973        0xfc007f07, 0xa4007902, 0                      , 0,
20974        0x0                 },        /* P.SCD~*(2) */
20975     { reserved_block      , 0                   , 0   , 32,
20976        0xfc007f07, 0xa4007903, 0                      , 0,
20977        0x0                 },        /* P.SCD~*(3) */
20978     { reserved_block      , 0                   , 0   , 32,
20979        0xfc007f07, 0xa4007904, 0                      , 0,
20980        0x0                 },        /* P.SCD~*(4) */
20981     { reserved_block      , 0                   , 0   , 32,
20982        0xfc007f07, 0xa4007905, 0                      , 0,
20983        0x0                 },        /* P.SCD~*(5) */
20984     { reserved_block      , 0                   , 0   , 32,
20985        0xfc007f07, 0xa4007906, 0                      , 0,
20986        0x0                 },        /* P.SCD~*(6) */
20987     { reserved_block      , 0                   , 0   , 32,
20988        0xfc007f07, 0xa4007907, 0                      , 0,
20989        0x0                 },        /* P.SCD~*(7) */
20990 };
20991 
20992 
20993 static const Pool P_LS_S1[16] = {
20994     { reserved_block      , 0                   , 0   , 32,
20995        0xfc007f00, 0xa4000100, 0                      , 0,
20996        0x0                 },        /* P.LS.S1~*(0) */
20997     { reserved_block      , 0                   , 0   , 32,
20998        0xfc007f00, 0xa4000900, 0                      , 0,
20999        0x0                 },        /* P.LS.S1~*(1) */
21000     { pool                , ASET_ACLR           , 2   , 32,
21001        0xfc007f00, 0xa4001100, 0                      , 0,
21002        0x0                 },        /* ASET_ACLR */
21003     { reserved_block      , 0                   , 0   , 32,
21004        0xfc007f00, 0xa4001900, 0                      , 0,
21005        0x0                 },        /* P.LS.S1~*(3) */
21006     { instruction         , 0                   , 0   , 32,
21007        0xfc007f00, 0xa4002100, &UALH             , 0,
21008        XMMS_               },        /* UALH */
21009     { instruction         , 0                   , 0   , 32,
21010        0xfc007f00, 0xa4002900, &UASH             , 0,
21011        XMMS_               },        /* UASH */
21012     { reserved_block      , 0                   , 0   , 32,
21013        0xfc007f00, 0xa4003100, 0                      , 0,
21014        0x0                 },        /* P.LS.S1~*(6) */
21015     { instruction         , 0                   , 0   , 32,
21016        0xfc007f00, 0xa4003900, &CACHE            , 0,
21017        CP0_                },        /* CACHE */
21018     { instruction         , 0                   , 0   , 32,
21019        0xfc007f00, 0xa4004100, &LWC2             , 0,
21020        CP2_                },        /* LWC2 */
21021     { instruction         , 0                   , 0   , 32,
21022        0xfc007f00, 0xa4004900, &SWC2             , 0,
21023        CP2_                },        /* SWC2 */
21024     { pool                , P_LL                , 4   , 32,
21025        0xfc007f00, 0xa4005100, 0                      , 0,
21026        0x0                 },        /* P.LL */
21027     { pool                , P_SC                , 4   , 32,
21028        0xfc007f00, 0xa4005900, 0                      , 0,
21029        0x0                 },        /* P.SC */
21030     { instruction         , 0                   , 0   , 32,
21031        0xfc007f00, 0xa4006100, &LDC2             , 0,
21032        CP2_                },        /* LDC2 */
21033     { instruction         , 0                   , 0   , 32,
21034        0xfc007f00, 0xa4006900, &SDC2             , 0,
21035        CP2_                },        /* SDC2 */
21036     { pool                , P_LLD               , 8   , 32,
21037        0xfc007f00, 0xa4007100, 0                      , 0,
21038        0x0                 },        /* P.LLD */
21039     { pool                , P_SCD               , 8   , 32,
21040        0xfc007f00, 0xa4007900, 0                      , 0,
21041        0x0                 },        /* P.SCD */
21042 };
21043 
21044 
21045 static const Pool P_PREFE[2] = {
21046     { instruction         , 0                   , 0   , 32,
21047        0xffe07f00, 0xa7e01a00, &SYNCIE           , 0,
21048        CP0_ | EVA_         },        /* SYNCIE */
21049     { instruction         , 0                   , 0   , 32,
21050        0xfc007f00, 0xa4001a00, &PREFE            , &PREFE_cond       ,
21051        CP0_ | EVA_         },        /* PREFE */
21052 };
21053 
21054 
21055 static const Pool P_LLE[4] = {
21056     { instruction         , 0                   , 0   , 32,
21057        0xfc007f03, 0xa4005200, &LLE              , 0,
21058        CP0_ | EVA_         },        /* LLE */
21059     { instruction         , 0                   , 0   , 32,
21060        0xfc007f03, 0xa4005201, &LLWPE            , 0,
21061        CP0_ | EVA_         },        /* LLWPE */
21062     { reserved_block      , 0                   , 0   , 32,
21063        0xfc007f03, 0xa4005202, 0                      , 0,
21064        0x0                 },        /* P.LLE~*(2) */
21065     { reserved_block      , 0                   , 0   , 32,
21066        0xfc007f03, 0xa4005203, 0                      , 0,
21067        0x0                 },        /* P.LLE~*(3) */
21068 };
21069 
21070 
21071 static const Pool P_SCE[4] = {
21072     { instruction         , 0                   , 0   , 32,
21073        0xfc007f03, 0xa4005a00, &SCE              , 0,
21074        CP0_ | EVA_         },        /* SCE */
21075     { instruction         , 0                   , 0   , 32,
21076        0xfc007f03, 0xa4005a01, &SCWPE            , 0,
21077        CP0_ | EVA_         },        /* SCWPE */
21078     { reserved_block      , 0                   , 0   , 32,
21079        0xfc007f03, 0xa4005a02, 0                      , 0,
21080        0x0                 },        /* P.SCE~*(2) */
21081     { reserved_block      , 0                   , 0   , 32,
21082        0xfc007f03, 0xa4005a03, 0                      , 0,
21083        0x0                 },        /* P.SCE~*(3) */
21084 };
21085 
21086 
21087 static const Pool P_LS_E0[16] = {
21088     { instruction         , 0                   , 0   , 32,
21089        0xfc007f00, 0xa4000200, &LBE              , 0,
21090        CP0_ | EVA_         },        /* LBE */
21091     { instruction         , 0                   , 0   , 32,
21092        0xfc007f00, 0xa4000a00, &SBE              , 0,
21093        CP0_ | EVA_         },        /* SBE */
21094     { instruction         , 0                   , 0   , 32,
21095        0xfc007f00, 0xa4001200, &LBUE             , 0,
21096        CP0_ | EVA_         },        /* LBUE */
21097     { pool                , P_PREFE             , 2   , 32,
21098        0xfc007f00, 0xa4001a00, 0                      , 0,
21099        0x0                 },        /* P.PREFE */
21100     { instruction         , 0                   , 0   , 32,
21101        0xfc007f00, 0xa4002200, &LHE              , 0,
21102        CP0_ | EVA_         },        /* LHE */
21103     { instruction         , 0                   , 0   , 32,
21104        0xfc007f00, 0xa4002a00, &SHE              , 0,
21105        CP0_ | EVA_         },        /* SHE */
21106     { instruction         , 0                   , 0   , 32,
21107        0xfc007f00, 0xa4003200, &LHUE             , 0,
21108        CP0_ | EVA_         },        /* LHUE */
21109     { instruction         , 0                   , 0   , 32,
21110        0xfc007f00, 0xa4003a00, &CACHEE           , 0,
21111        CP0_ | EVA_         },        /* CACHEE */
21112     { instruction         , 0                   , 0   , 32,
21113        0xfc007f00, 0xa4004200, &LWE              , 0,
21114        CP0_ | EVA_         },        /* LWE */
21115     { instruction         , 0                   , 0   , 32,
21116        0xfc007f00, 0xa4004a00, &SWE              , 0,
21117        CP0_ | EVA_         },        /* SWE */
21118     { pool                , P_LLE               , 4   , 32,
21119        0xfc007f00, 0xa4005200, 0                      , 0,
21120        0x0                 },        /* P.LLE */
21121     { pool                , P_SCE               , 4   , 32,
21122        0xfc007f00, 0xa4005a00, 0                      , 0,
21123        0x0                 },        /* P.SCE */
21124     { reserved_block      , 0                   , 0   , 32,
21125        0xfc007f00, 0xa4006200, 0                      , 0,
21126        0x0                 },        /* P.LS.E0~*(12) */
21127     { reserved_block      , 0                   , 0   , 32,
21128        0xfc007f00, 0xa4006a00, 0                      , 0,
21129        0x0                 },        /* P.LS.E0~*(13) */
21130     { reserved_block      , 0                   , 0   , 32,
21131        0xfc007f00, 0xa4007200, 0                      , 0,
21132        0x0                 },        /* P.LS.E0~*(14) */
21133     { reserved_block      , 0                   , 0   , 32,
21134        0xfc007f00, 0xa4007a00, 0                      , 0,
21135        0x0                 },        /* P.LS.E0~*(15) */
21136 };
21137 
21138 
21139 static const Pool P_LS_WM[2] = {
21140     { instruction         , 0                   , 0   , 32,
21141        0xfc000f00, 0xa4000400, &LWM              , 0,
21142        XMMS_               },        /* LWM */
21143     { instruction         , 0                   , 0   , 32,
21144        0xfc000f00, 0xa4000c00, &SWM              , 0,
21145        XMMS_               },        /* SWM */
21146 };
21147 
21148 
21149 static const Pool P_LS_UAWM[2] = {
21150     { instruction         , 0                   , 0   , 32,
21151        0xfc000f00, 0xa4000500, &UALWM            , 0,
21152        XMMS_               },        /* UALWM */
21153     { instruction         , 0                   , 0   , 32,
21154        0xfc000f00, 0xa4000d00, &UASWM            , 0,
21155        XMMS_               },        /* UASWM */
21156 };
21157 
21158 
21159 static const Pool P_LS_DM[2] = {
21160     { instruction         , 0                   , 0   , 32,
21161        0xfc000f00, 0xa4000600, &LDM              , 0,
21162        MIPS64_             },        /* LDM */
21163     { instruction         , 0                   , 0   , 32,
21164        0xfc000f00, 0xa4000e00, &SDM              , 0,
21165        MIPS64_             },        /* SDM */
21166 };
21167 
21168 
21169 static const Pool P_LS_UADM[2] = {
21170     { instruction         , 0                   , 0   , 32,
21171        0xfc000f00, 0xa4000700, &UALDM            , 0,
21172        MIPS64_             },        /* UALDM */
21173     { instruction         , 0                   , 0   , 32,
21174        0xfc000f00, 0xa4000f00, &UASDM            , 0,
21175        MIPS64_             },        /* UASDM */
21176 };
21177 
21178 
21179 static const Pool P_LS_S9[8] = {
21180     { pool                , P_LS_S0             , 16  , 32,
21181        0xfc000700, 0xa4000000, 0                      , 0,
21182        0x0                 },        /* P.LS.S0 */
21183     { pool                , P_LS_S1             , 16  , 32,
21184        0xfc000700, 0xa4000100, 0                      , 0,
21185        0x0                 },        /* P.LS.S1 */
21186     { pool                , P_LS_E0             , 16  , 32,
21187        0xfc000700, 0xa4000200, 0                      , 0,
21188        0x0                 },        /* P.LS.E0 */
21189     { reserved_block      , 0                   , 0   , 32,
21190        0xfc000700, 0xa4000300, 0                      , 0,
21191        0x0                 },        /* P.LS.S9~*(3) */
21192     { pool                , P_LS_WM             , 2   , 32,
21193        0xfc000700, 0xa4000400, 0                      , 0,
21194        0x0                 },        /* P.LS.WM */
21195     { pool                , P_LS_UAWM           , 2   , 32,
21196        0xfc000700, 0xa4000500, 0                      , 0,
21197        0x0                 },        /* P.LS.UAWM */
21198     { pool                , P_LS_DM             , 2   , 32,
21199        0xfc000700, 0xa4000600, 0                      , 0,
21200        0x0                 },        /* P.LS.DM */
21201     { pool                , P_LS_UADM           , 2   , 32,
21202        0xfc000700, 0xa4000700, 0                      , 0,
21203        0x0                 },        /* P.LS.UADM */
21204 };
21205 
21206 
21207 static const Pool P_BAL[2] = {
21208     { branch_instruction  , 0                   , 0   , 32,
21209        0xfe000000, 0x28000000, &BC_32_           , 0,
21210        0x0                 },        /* BC[32] */
21211     { call_instruction    , 0                   , 0   , 32,
21212        0xfe000000, 0x2a000000, &BALC_32_         , 0,
21213        0x0                 },        /* BALC[32] */
21214 };
21215 
21216 
21217 static const Pool P_BALRSC[2] = {
21218     { branch_instruction  , 0                   , 0   , 32,
21219        0xffe0f000, 0x48008000, &BRSC             , 0,
21220        0x0                 },        /* BRSC */
21221     { call_instruction    , 0                   , 0   , 32,
21222        0xfc00f000, 0x48008000, &BALRSC           , &BALRSC_cond      ,
21223        0x0                 },        /* BALRSC */
21224 };
21225 
21226 
21227 static const Pool P_J[16] = {
21228     { call_instruction    , 0                   , 0   , 32,
21229        0xfc00f000, 0x48000000, &JALRC_32_        , 0,
21230        0x0                 },        /* JALRC[32] */
21231     { call_instruction    , 0                   , 0   , 32,
21232        0xfc00f000, 0x48001000, &JALRC_HB         , 0,
21233        0x0                 },        /* JALRC.HB */
21234     { reserved_block      , 0                   , 0   , 32,
21235        0xfc00f000, 0x48002000, 0                      , 0,
21236        0x0                 },        /* P.J~*(2) */
21237     { reserved_block      , 0                   , 0   , 32,
21238        0xfc00f000, 0x48003000, 0                      , 0,
21239        0x0                 },        /* P.J~*(3) */
21240     { reserved_block      , 0                   , 0   , 32,
21241        0xfc00f000, 0x48004000, 0                      , 0,
21242        0x0                 },        /* P.J~*(4) */
21243     { reserved_block      , 0                   , 0   , 32,
21244        0xfc00f000, 0x48005000, 0                      , 0,
21245        0x0                 },        /* P.J~*(5) */
21246     { reserved_block      , 0                   , 0   , 32,
21247        0xfc00f000, 0x48006000, 0                      , 0,
21248        0x0                 },        /* P.J~*(6) */
21249     { reserved_block      , 0                   , 0   , 32,
21250        0xfc00f000, 0x48007000, 0                      , 0,
21251        0x0                 },        /* P.J~*(7) */
21252     { pool                , P_BALRSC            , 2   , 32,
21253        0xfc00f000, 0x48008000, 0                      , 0,
21254        0x0                 },        /* P.BALRSC */
21255     { reserved_block      , 0                   , 0   , 32,
21256        0xfc00f000, 0x48009000, 0                      , 0,
21257        0x0                 },        /* P.J~*(9) */
21258     { reserved_block      , 0                   , 0   , 32,
21259        0xfc00f000, 0x4800a000, 0                      , 0,
21260        0x0                 },        /* P.J~*(10) */
21261     { reserved_block      , 0                   , 0   , 32,
21262        0xfc00f000, 0x4800b000, 0                      , 0,
21263        0x0                 },        /* P.J~*(11) */
21264     { reserved_block      , 0                   , 0   , 32,
21265        0xfc00f000, 0x4800c000, 0                      , 0,
21266        0x0                 },        /* P.J~*(12) */
21267     { reserved_block      , 0                   , 0   , 32,
21268        0xfc00f000, 0x4800d000, 0                      , 0,
21269        0x0                 },        /* P.J~*(13) */
21270     { reserved_block      , 0                   , 0   , 32,
21271        0xfc00f000, 0x4800e000, 0                      , 0,
21272        0x0                 },        /* P.J~*(14) */
21273     { reserved_block      , 0                   , 0   , 32,
21274        0xfc00f000, 0x4800f000, 0                      , 0,
21275        0x0                 },        /* P.J~*(15) */
21276 };
21277 
21278 
21279 static const Pool P_BR3A[32] = {
21280     { branch_instruction  , 0                   , 0   , 32,
21281        0xfc1fc000, 0x88004000, &BC1EQZC          , 0,
21282        CP1_                },        /* BC1EQZC */
21283     { branch_instruction  , 0                   , 0   , 32,
21284        0xfc1fc000, 0x88014000, &BC1NEZC          , 0,
21285        CP1_                },        /* BC1NEZC */
21286     { branch_instruction  , 0                   , 0   , 32,
21287        0xfc1fc000, 0x88024000, &BC2EQZC          , 0,
21288        CP2_                },        /* BC2EQZC */
21289     { branch_instruction  , 0                   , 0   , 32,
21290        0xfc1fc000, 0x88034000, &BC2NEZC          , 0,
21291        CP2_                },        /* BC2NEZC */
21292     { branch_instruction  , 0                   , 0   , 32,
21293        0xfc1fc000, 0x88044000, &BPOSGE32C        , 0,
21294        DSP_                },        /* BPOSGE32C */
21295     { reserved_block      , 0                   , 0   , 32,
21296        0xfc1fc000, 0x88054000, 0                      , 0,
21297        0x0                 },        /* P.BR3A~*(5) */
21298     { reserved_block      , 0                   , 0   , 32,
21299        0xfc1fc000, 0x88064000, 0                      , 0,
21300        0x0                 },        /* P.BR3A~*(6) */
21301     { reserved_block      , 0                   , 0   , 32,
21302        0xfc1fc000, 0x88074000, 0                      , 0,
21303        0x0                 },        /* P.BR3A~*(7) */
21304     { reserved_block      , 0                   , 0   , 32,
21305        0xfc1fc000, 0x88084000, 0                      , 0,
21306        0x0                 },        /* P.BR3A~*(8) */
21307     { reserved_block      , 0                   , 0   , 32,
21308        0xfc1fc000, 0x88094000, 0                      , 0,
21309        0x0                 },        /* P.BR3A~*(9) */
21310     { reserved_block      , 0                   , 0   , 32,
21311        0xfc1fc000, 0x880a4000, 0                      , 0,
21312        0x0                 },        /* P.BR3A~*(10) */
21313     { reserved_block      , 0                   , 0   , 32,
21314        0xfc1fc000, 0x880b4000, 0                      , 0,
21315        0x0                 },        /* P.BR3A~*(11) */
21316     { reserved_block      , 0                   , 0   , 32,
21317        0xfc1fc000, 0x880c4000, 0                      , 0,
21318        0x0                 },        /* P.BR3A~*(12) */
21319     { reserved_block      , 0                   , 0   , 32,
21320        0xfc1fc000, 0x880d4000, 0                      , 0,
21321        0x0                 },        /* P.BR3A~*(13) */
21322     { reserved_block      , 0                   , 0   , 32,
21323        0xfc1fc000, 0x880e4000, 0                      , 0,
21324        0x0                 },        /* P.BR3A~*(14) */
21325     { reserved_block      , 0                   , 0   , 32,
21326        0xfc1fc000, 0x880f4000, 0                      , 0,
21327        0x0                 },        /* P.BR3A~*(15) */
21328     { reserved_block      , 0                   , 0   , 32,
21329        0xfc1fc000, 0x88104000, 0                      , 0,
21330        0x0                 },        /* P.BR3A~*(16) */
21331     { reserved_block      , 0                   , 0   , 32,
21332        0xfc1fc000, 0x88114000, 0                      , 0,
21333        0x0                 },        /* P.BR3A~*(17) */
21334     { reserved_block      , 0                   , 0   , 32,
21335        0xfc1fc000, 0x88124000, 0                      , 0,
21336        0x0                 },        /* P.BR3A~*(18) */
21337     { reserved_block      , 0                   , 0   , 32,
21338        0xfc1fc000, 0x88134000, 0                      , 0,
21339        0x0                 },        /* P.BR3A~*(19) */
21340     { reserved_block      , 0                   , 0   , 32,
21341        0xfc1fc000, 0x88144000, 0                      , 0,
21342        0x0                 },        /* P.BR3A~*(20) */
21343     { reserved_block      , 0                   , 0   , 32,
21344        0xfc1fc000, 0x88154000, 0                      , 0,
21345        0x0                 },        /* P.BR3A~*(21) */
21346     { reserved_block      , 0                   , 0   , 32,
21347        0xfc1fc000, 0x88164000, 0                      , 0,
21348        0x0                 },        /* P.BR3A~*(22) */
21349     { reserved_block      , 0                   , 0   , 32,
21350        0xfc1fc000, 0x88174000, 0                      , 0,
21351        0x0                 },        /* P.BR3A~*(23) */
21352     { reserved_block      , 0                   , 0   , 32,
21353        0xfc1fc000, 0x88184000, 0                      , 0,
21354        0x0                 },        /* P.BR3A~*(24) */
21355     { reserved_block      , 0                   , 0   , 32,
21356        0xfc1fc000, 0x88194000, 0                      , 0,
21357        0x0                 },        /* P.BR3A~*(25) */
21358     { reserved_block      , 0                   , 0   , 32,
21359        0xfc1fc000, 0x881a4000, 0                      , 0,
21360        0x0                 },        /* P.BR3A~*(26) */
21361     { reserved_block      , 0                   , 0   , 32,
21362        0xfc1fc000, 0x881b4000, 0                      , 0,
21363        0x0                 },        /* P.BR3A~*(27) */
21364     { reserved_block      , 0                   , 0   , 32,
21365        0xfc1fc000, 0x881c4000, 0                      , 0,
21366        0x0                 },        /* P.BR3A~*(28) */
21367     { reserved_block      , 0                   , 0   , 32,
21368        0xfc1fc000, 0x881d4000, 0                      , 0,
21369        0x0                 },        /* P.BR3A~*(29) */
21370     { reserved_block      , 0                   , 0   , 32,
21371        0xfc1fc000, 0x881e4000, 0                      , 0,
21372        0x0                 },        /* P.BR3A~*(30) */
21373     { reserved_block      , 0                   , 0   , 32,
21374        0xfc1fc000, 0x881f4000, 0                      , 0,
21375        0x0                 },        /* P.BR3A~*(31) */
21376 };
21377 
21378 
21379 static const Pool P_BR1[4] = {
21380     { branch_instruction  , 0                   , 0   , 32,
21381        0xfc00c000, 0x88000000, &BEQC_32_         , 0,
21382        0x0                 },        /* BEQC[32] */
21383     { pool                , P_BR3A              , 32  , 32,
21384        0xfc00c000, 0x88004000, 0                      , 0,
21385        0x0                 },        /* P.BR3A */
21386     { branch_instruction  , 0                   , 0   , 32,
21387        0xfc00c000, 0x88008000, &BGEC             , 0,
21388        0x0                 },        /* BGEC */
21389     { branch_instruction  , 0                   , 0   , 32,
21390        0xfc00c000, 0x8800c000, &BGEUC            , 0,
21391        0x0                 },        /* BGEUC */
21392 };
21393 
21394 
21395 static const Pool P_BR2[4] = {
21396     { branch_instruction  , 0                   , 0   , 32,
21397        0xfc00c000, 0xa8000000, &BNEC_32_         , 0,
21398        0x0                 },        /* BNEC[32] */
21399     { reserved_block      , 0                   , 0   , 32,
21400        0xfc00c000, 0xa8004000, 0                      , 0,
21401        0x0                 },        /* P.BR2~*(1) */
21402     { branch_instruction  , 0                   , 0   , 32,
21403        0xfc00c000, 0xa8008000, &BLTC             , 0,
21404        0x0                 },        /* BLTC */
21405     { branch_instruction  , 0                   , 0   , 32,
21406        0xfc00c000, 0xa800c000, &BLTUC            , 0,
21407        0x0                 },        /* BLTUC */
21408 };
21409 
21410 
21411 static const Pool P_BRI[8] = {
21412     { branch_instruction  , 0                   , 0   , 32,
21413        0xfc1c0000, 0xc8000000, &BEQIC            , 0,
21414        0x0                 },        /* BEQIC */
21415     { branch_instruction  , 0                   , 0   , 32,
21416        0xfc1c0000, 0xc8040000, &BBEQZC           , 0,
21417        XMMS_               },        /* BBEQZC */
21418     { branch_instruction  , 0                   , 0   , 32,
21419        0xfc1c0000, 0xc8080000, &BGEIC            , 0,
21420        0x0                 },        /* BGEIC */
21421     { branch_instruction  , 0                   , 0   , 32,
21422        0xfc1c0000, 0xc80c0000, &BGEIUC           , 0,
21423        0x0                 },        /* BGEIUC */
21424     { branch_instruction  , 0                   , 0   , 32,
21425        0xfc1c0000, 0xc8100000, &BNEIC            , 0,
21426        0x0                 },        /* BNEIC */
21427     { branch_instruction  , 0                   , 0   , 32,
21428        0xfc1c0000, 0xc8140000, &BBNEZC           , 0,
21429        XMMS_               },        /* BBNEZC */
21430     { branch_instruction  , 0                   , 0   , 32,
21431        0xfc1c0000, 0xc8180000, &BLTIC            , 0,
21432        0x0                 },        /* BLTIC */
21433     { branch_instruction  , 0                   , 0   , 32,
21434        0xfc1c0000, 0xc81c0000, &BLTIUC           , 0,
21435        0x0                 },        /* BLTIUC */
21436 };
21437 
21438 
21439 static const Pool P32[32] = {
21440     { pool                , P_ADDIU             , 2   , 32,
21441        0xfc000000, 0x00000000, 0                      , 0,
21442        0x0                 },        /* P.ADDIU */
21443     { pool                , P32A                , 8   , 32,
21444        0xfc000000, 0x20000000, 0                      , 0,
21445        0x0                 },        /* P32A */
21446     { pool                , P_GP_W              , 4   , 32,
21447        0xfc000000, 0x40000000, 0                      , 0,
21448        0x0                 },        /* P.GP.W */
21449     { pool                , POOL48I             , 32  , 48,
21450        0xfc0000000000ull, 0x600000000000ull, 0                      , 0,
21451        0x0                 },        /* POOL48I */
21452     { pool                , P_U12               , 16  , 32,
21453        0xfc000000, 0x80000000, 0                      , 0,
21454        0x0                 },        /* P.U12 */
21455     { pool                , POOL32F             , 8   , 32,
21456        0xfc000000, 0xa0000000, 0                      , 0,
21457        CP1_                },        /* POOL32F */
21458     { pool                , POOL32S             , 8   , 32,
21459        0xfc000000, 0xc0000000, 0                      , 0,
21460        0x0                 },        /* POOL32S */
21461     { pool                , P_LUI               , 2   , 32,
21462        0xfc000000, 0xe0000000, 0                      , 0,
21463        0x0                 },        /* P.LUI */
21464     { instruction         , 0                   , 0   , 32,
21465        0xfc000000, 0x04000000, &ADDIUPC_32_      , 0,
21466        0x0                 },        /* ADDIUPC[32] */
21467     { reserved_block      , 0                   , 0   , 32,
21468        0xfc000000, 0x24000000, 0                      , 0,
21469        0x0                 },        /* P32~*(5) */
21470     { pool                , P_GP_BH             , 8   , 32,
21471        0xfc000000, 0x44000000, 0                      , 0,
21472        0x0                 },        /* P.GP.BH */
21473     { reserved_block      , 0                   , 0   , 32,
21474        0xfc000000, 0x64000000, 0                      , 0,
21475        0x0                 },        /* P32~*(13) */
21476     { pool                , P_LS_U12            , 16  , 32,
21477        0xfc000000, 0x84000000, 0                      , 0,
21478        0x0                 },        /* P.LS.U12 */
21479     { pool                , P_LS_S9             , 8   , 32,
21480        0xfc000000, 0xa4000000, 0                      , 0,
21481        0x0                 },        /* P.LS.S9 */
21482     { reserved_block      , 0                   , 0   , 32,
21483        0xfc000000, 0xc4000000, 0                      , 0,
21484        0x0                 },        /* P32~*(25) */
21485     { reserved_block      , 0                   , 0   , 32,
21486        0xfc000000, 0xe4000000, 0                      , 0,
21487        0x0                 },        /* P32~*(29) */
21488     { call_instruction    , 0                   , 0   , 32,
21489        0xfc000000, 0x08000000, &MOVE_BALC        , 0,
21490        XMMS_               },        /* MOVE.BALC */
21491     { pool                , P_BAL               , 2   , 32,
21492        0xfc000000, 0x28000000, 0                      , 0,
21493        0x0                 },        /* P.BAL */
21494     { pool                , P_J                 , 16  , 32,
21495        0xfc000000, 0x48000000, 0                      , 0,
21496        0x0                 },        /* P.J */
21497     { reserved_block      , 0                   , 0   , 32,
21498        0xfc000000, 0x68000000, 0                      , 0,
21499        0x0                 },        /* P32~*(14) */
21500     { pool                , P_BR1               , 4   , 32,
21501        0xfc000000, 0x88000000, 0                      , 0,
21502        0x0                 },        /* P.BR1 */
21503     { pool                , P_BR2               , 4   , 32,
21504        0xfc000000, 0xa8000000, 0                      , 0,
21505        0x0                 },        /* P.BR2 */
21506     { pool                , P_BRI               , 8   , 32,
21507        0xfc000000, 0xc8000000, 0                      , 0,
21508        0x0                 },        /* P.BRI */
21509     { reserved_block      , 0                   , 0   , 32,
21510        0xfc000000, 0xe8000000, 0                      , 0,
21511        0x0                 },        /* P32~*(30) */
21512     { reserved_block      , 0                   , 0   , 32,
21513        0xfc000000, 0x0c000000, 0                      , 0,
21514        0x0                 },        /* P32~*(3) */
21515     { reserved_block      , 0                   , 0   , 32,
21516        0xfc000000, 0x2c000000, 0                      , 0,
21517        0x0                 },        /* P32~*(7) */
21518     { reserved_block      , 0                   , 0   , 32,
21519        0xfc000000, 0x4c000000, 0                      , 0,
21520        0x0                 },        /* P32~*(11) */
21521     { reserved_block      , 0                   , 0   , 32,
21522        0xfc000000, 0x6c000000, 0                      , 0,
21523        0x0                 },        /* P32~*(15) */
21524     { reserved_block      , 0                   , 0   , 32,
21525        0xfc000000, 0x8c000000, 0                      , 0,
21526        0x0                 },        /* P32~*(19) */
21527     { reserved_block      , 0                   , 0   , 32,
21528        0xfc000000, 0xac000000, 0                      , 0,
21529        0x0                 },        /* P32~*(23) */
21530     { reserved_block      , 0                   , 0   , 32,
21531        0xfc000000, 0xcc000000, 0                      , 0,
21532        0x0                 },        /* P32~*(27) */
21533     { reserved_block      , 0                   , 0   , 32,
21534        0xfc000000, 0xec000000, 0                      , 0,
21535        0x0                 },        /* P32~*(31) */
21536 };
21537 
21538 
21539 static const Pool P16_SYSCALL[2] = {
21540     { instruction         , 0                   , 0   , 16,
21541        0xfffc    , 0x1008    , &SYSCALL_16_      , 0,
21542        0x0                 },        /* SYSCALL[16] */
21543     { instruction         , 0                   , 0   , 16,
21544        0xfffc    , 0x100c    , &HYPCALL_16_      , 0,
21545        CP0_ | VZ_          },        /* HYPCALL[16] */
21546 };
21547 
21548 
21549 static const Pool P16_RI[4] = {
21550     { reserved_block      , 0                   , 0   , 16,
21551        0xfff8    , 0x1000    , 0                      , 0,
21552        0x0                 },        /* P16.RI~*(0) */
21553     { pool                , P16_SYSCALL         , 2   , 16,
21554        0xfff8    , 0x1008    , 0                      , 0,
21555        0x0                 },        /* P16.SYSCALL */
21556     { instruction         , 0                   , 0   , 16,
21557        0xfff8    , 0x1010    , &BREAK_16_        , 0,
21558        0x0                 },        /* BREAK[16] */
21559     { instruction         , 0                   , 0   , 16,
21560        0xfff8    , 0x1018    , &SDBBP_16_        , 0,
21561        EJTAG_              },        /* SDBBP[16] */
21562 };
21563 
21564 
21565 static const Pool P16_MV[2] = {
21566     { pool                , P16_RI              , 4   , 16,
21567        0xffe0    , 0x1000    , 0                      , 0,
21568        0x0                 },        /* P16.RI */
21569     { instruction         , 0                   , 0   , 16,
21570        0xfc00    , 0x1000    , &MOVE             , &MOVE_cond        ,
21571        0x0                 },        /* MOVE */
21572 };
21573 
21574 
21575 static const Pool P16_SHIFT[2] = {
21576     { instruction         , 0                   , 0   , 16,
21577        0xfc08    , 0x3000    , &SLL_16_          , 0,
21578        0x0                 },        /* SLL[16] */
21579     { instruction         , 0                   , 0   , 16,
21580        0xfc08    , 0x3008    , &SRL_16_          , 0,
21581        0x0                 },        /* SRL[16] */
21582 };
21583 
21584 
21585 static const Pool POOL16C_00[4] = {
21586     { instruction         , 0                   , 0   , 16,
21587        0xfc0f    , 0x5000    , &NOT_16_          , 0,
21588        0x0                 },        /* NOT[16] */
21589     { instruction         , 0                   , 0   , 16,
21590        0xfc0f    , 0x5004    , &XOR_16_          , 0,
21591        0x0                 },        /* XOR[16] */
21592     { instruction         , 0                   , 0   , 16,
21593        0xfc0f    , 0x5008    , &AND_16_          , 0,
21594        0x0                 },        /* AND[16] */
21595     { instruction         , 0                   , 0   , 16,
21596        0xfc0f    , 0x500c    , &OR_16_           , 0,
21597        0x0                 },        /* OR[16] */
21598 };
21599 
21600 
21601 static const Pool POOL16C_0[2] = {
21602     { pool                , POOL16C_00          , 4   , 16,
21603        0xfc03    , 0x5000    , 0                      , 0,
21604        0x0                 },        /* POOL16C_00 */
21605     { reserved_block      , 0                   , 0   , 16,
21606        0xfc03    , 0x5002    , 0                      , 0,
21607        0x0                 },        /* POOL16C_0~*(1) */
21608 };
21609 
21610 
21611 static const Pool P16C[2] = {
21612     { pool                , POOL16C_0           , 2   , 16,
21613        0xfc01    , 0x5000    , 0                      , 0,
21614        0x0                 },        /* POOL16C_0 */
21615     { instruction         , 0                   , 0   , 16,
21616        0xfc01    , 0x5001    , &LWXS_16_         , 0,
21617        0x0                 },        /* LWXS[16] */
21618 };
21619 
21620 
21621 static const Pool P16_A1[2] = {
21622     { reserved_block      , 0                   , 0   , 16,
21623        0xfc40    , 0x7000    , 0                      , 0,
21624        0x0                 },        /* P16.A1~*(0) */
21625     { instruction         , 0                   , 0   , 16,
21626        0xfc40    , 0x7040    , &ADDIU_R1_SP_     , 0,
21627        0x0                 },        /* ADDIU[R1.SP] */
21628 };
21629 
21630 
21631 static const Pool P_ADDIU_RS5_[2] = {
21632     { instruction         , 0                   , 0   , 16,
21633        0xffe8    , 0x9008    , &NOP_16_          , 0,
21634        0x0                 },        /* NOP[16] */
21635     { instruction         , 0                   , 0   , 16,
21636        0xfc08    , 0x9008    , &ADDIU_RS5_       , &ADDIU_RS5__cond  ,
21637        0x0                 },        /* ADDIU[RS5] */
21638 };
21639 
21640 
21641 static const Pool P16_A2[2] = {
21642     { instruction         , 0                   , 0   , 16,
21643        0xfc08    , 0x9000    , &ADDIU_R2_        , 0,
21644        0x0                 },        /* ADDIU[R2] */
21645     { pool                , P_ADDIU_RS5_        , 2   , 16,
21646        0xfc08    , 0x9008    , 0                      , 0,
21647        0x0                 },        /* P.ADDIU[RS5] */
21648 };
21649 
21650 
21651 static const Pool P16_ADDU[2] = {
21652     { instruction         , 0                   , 0   , 16,
21653        0xfc01    , 0xb000    , &ADDU_16_         , 0,
21654        0x0                 },        /* ADDU[16] */
21655     { instruction         , 0                   , 0   , 16,
21656        0xfc01    , 0xb001    , &SUBU_16_         , 0,
21657        0x0                 },        /* SUBU[16] */
21658 };
21659 
21660 
21661 static const Pool P16_JRC[2] = {
21662     { branch_instruction  , 0                   , 0   , 16,
21663        0xfc1f    , 0xd800    , &JRC              , 0,
21664        0x0                 },        /* JRC */
21665     { call_instruction    , 0                   , 0   , 16,
21666        0xfc1f    , 0xd810    , &JALRC_16_        , 0,
21667        0x0                 },        /* JALRC[16] */
21668 };
21669 
21670 
21671 static const Pool P16_BR1[2] = {
21672     { branch_instruction  , 0                   , 0   , 16,
21673        0xfc00    , 0xd800    , &BEQC_16_         , &BEQC_16__cond    ,
21674        XMMS_               },        /* BEQC[16] */
21675     { branch_instruction  , 0                   , 0   , 16,
21676        0xfc00    , 0xd800    , &BNEC_16_         , &BNEC_16__cond    ,
21677        XMMS_               },        /* BNEC[16] */
21678 };
21679 
21680 
21681 static const Pool P16_BR[2] = {
21682     { pool                , P16_JRC             , 2   , 16,
21683        0xfc0f    , 0xd800    , 0                      , 0,
21684        0x0                 },        /* P16.JRC */
21685     { pool                , P16_BR1             , 2   , 16,
21686        0xfc00    , 0xd800    , 0                      , &P16_BR1_cond     ,
21687        0x0                 },        /* P16.BR1 */
21688 };
21689 
21690 
21691 static const Pool P16_SR[2] = {
21692     { instruction         , 0                   , 0   , 16,
21693        0xfd00    , 0x1c00    , &SAVE_16_         , 0,
21694        0x0                 },        /* SAVE[16] */
21695     { return_instruction  , 0                   , 0   , 16,
21696        0xfd00    , 0x1d00    , &RESTORE_JRC_16_  , 0,
21697        0x0                 },        /* RESTORE.JRC[16] */
21698 };
21699 
21700 
21701 static const Pool P16_4X4[4] = {
21702     { instruction         , 0                   , 0   , 16,
21703        0xfd08    , 0x3c00    , &ADDU_4X4_        , 0,
21704        XMMS_               },        /* ADDU[4X4] */
21705     { instruction         , 0                   , 0   , 16,
21706        0xfd08    , 0x3c08    , &MUL_4X4_         , 0,
21707        XMMS_               },        /* MUL[4X4] */
21708     { reserved_block      , 0                   , 0   , 16,
21709        0xfd08    , 0x3d00    , 0                      , 0,
21710        0x0                 },        /* P16.4X4~*(2) */
21711     { reserved_block      , 0                   , 0   , 16,
21712        0xfd08    , 0x3d08    , 0                      , 0,
21713        0x0                 },        /* P16.4X4~*(3) */
21714 };
21715 
21716 
21717 static const Pool P16_LB[4] = {
21718     { instruction         , 0                   , 0   , 16,
21719        0xfc0c    , 0x5c00    , &LB_16_           , 0,
21720        0x0                 },        /* LB[16] */
21721     { instruction         , 0                   , 0   , 16,
21722        0xfc0c    , 0x5c04    , &SB_16_           , 0,
21723        0x0                 },        /* SB[16] */
21724     { instruction         , 0                   , 0   , 16,
21725        0xfc0c    , 0x5c08    , &LBU_16_          , 0,
21726        0x0                 },        /* LBU[16] */
21727     { reserved_block      , 0                   , 0   , 16,
21728        0xfc0c    , 0x5c0c    , 0                      , 0,
21729        0x0                 },        /* P16.LB~*(3) */
21730 };
21731 
21732 
21733 static const Pool P16_LH[4] = {
21734     { instruction         , 0                   , 0   , 16,
21735        0xfc09    , 0x7c00    , &LH_16_           , 0,
21736        0x0                 },        /* LH[16] */
21737     { instruction         , 0                   , 0   , 16,
21738        0xfc09    , 0x7c01    , &SH_16_           , 0,
21739        0x0                 },        /* SH[16] */
21740     { instruction         , 0                   , 0   , 16,
21741        0xfc09    , 0x7c08    , &LHU_16_          , 0,
21742        0x0                 },        /* LHU[16] */
21743     { reserved_block      , 0                   , 0   , 16,
21744        0xfc09    , 0x7c09    , 0                      , 0,
21745        0x0                 },        /* P16.LH~*(3) */
21746 };
21747 
21748 
21749 static const Pool P16[32] = {
21750     { pool                , P16_MV              , 2   , 16,
21751        0xfc00    , 0x1000    , 0                      , 0,
21752        0x0                 },        /* P16.MV */
21753     { pool                , P16_SHIFT           , 2   , 16,
21754        0xfc00    , 0x3000    , 0                      , 0,
21755        0x0                 },        /* P16.SHIFT */
21756     { pool                , P16C                , 2   , 16,
21757        0xfc00    , 0x5000    , 0                      , 0,
21758        0x0                 },        /* P16C */
21759     { pool                , P16_A1              , 2   , 16,
21760        0xfc00    , 0x7000    , 0                      , 0,
21761        0x0                 },        /* P16.A1 */
21762     { pool                , P16_A2              , 2   , 16,
21763        0xfc00    , 0x9000    , 0                      , 0,
21764        0x0                 },        /* P16.A2 */
21765     { pool                , P16_ADDU            , 2   , 16,
21766        0xfc00    , 0xb000    , 0                      , 0,
21767        0x0                 },        /* P16.ADDU */
21768     { instruction         , 0                   , 0   , 16,
21769        0xfc00    , 0xd000    , &LI_16_           , 0,
21770        0x0                 },        /* LI[16] */
21771     { instruction         , 0                   , 0   , 16,
21772        0xfc00    , 0xf000    , &ANDI_16_         , 0,
21773        0x0                 },        /* ANDI[16] */
21774     { instruction         , 0                   , 0   , 16,
21775        0xfc00    , 0x1400    , &LW_16_           , 0,
21776        0x0                 },        /* LW[16] */
21777     { instruction         , 0                   , 0   , 16,
21778        0xfc00    , 0x3400    , &LW_SP_           , 0,
21779        0x0                 },        /* LW[SP] */
21780     { instruction         , 0                   , 0   , 16,
21781        0xfc00    , 0x5400    , &LW_GP16_         , 0,
21782        0x0                 },        /* LW[GP16] */
21783     { instruction         , 0                   , 0   , 16,
21784        0xfc00    , 0x7400    , &LW_4X4_          , 0,
21785        XMMS_               },        /* LW[4X4] */
21786     { instruction         , 0                   , 0   , 16,
21787        0xfc00    , 0x9400    , &SW_16_           , 0,
21788        0x0                 },        /* SW[16] */
21789     { instruction         , 0                   , 0   , 16,
21790        0xfc00    , 0xb400    , &SW_SP_           , 0,
21791        0x0                 },        /* SW[SP] */
21792     { instruction         , 0                   , 0   , 16,
21793        0xfc00    , 0xd400    , &SW_GP16_         , 0,
21794        0x0                 },        /* SW[GP16] */
21795     { instruction         , 0                   , 0   , 16,
21796        0xfc00    , 0xf400    , &SW_4X4_          , 0,
21797        XMMS_               },        /* SW[4X4] */
21798     { branch_instruction  , 0                   , 0   , 16,
21799        0xfc00    , 0x1800    , &BC_16_           , 0,
21800        0x0                 },        /* BC[16] */
21801     { call_instruction    , 0                   , 0   , 16,
21802        0xfc00    , 0x3800    , &BALC_16_         , 0,
21803        0x0                 },        /* BALC[16] */
21804     { reserved_block      , 0                   , 0   , 16,
21805        0xfc00    , 0x5800    , 0                      , 0,
21806        0x0                 },        /* P16~*(10) */
21807     { reserved_block      , 0                   , 0   , 16,
21808        0xfc00    , 0x7800    , 0                      , 0,
21809        0x0                 },        /* P16~*(14) */
21810     { branch_instruction  , 0                   , 0   , 16,
21811        0xfc00    , 0x9800    , &BEQZC_16_        , 0,
21812        0x0                 },        /* BEQZC[16] */
21813     { branch_instruction  , 0                   , 0   , 16,
21814        0xfc00    , 0xb800    , &BNEZC_16_        , 0,
21815        0x0                 },        /* BNEZC[16] */
21816     { pool                , P16_BR              , 2   , 16,
21817        0xfc00    , 0xd800    , 0                      , 0,
21818        0x0                 },        /* P16.BR */
21819     { reserved_block      , 0                   , 0   , 16,
21820        0xfc00    , 0xf800    , 0                      , 0,
21821        0x0                 },        /* P16~*(30) */
21822     { pool                , P16_SR              , 2   , 16,
21823        0xfc00    , 0x1c00    , 0                      , 0,
21824        0x0                 },        /* P16.SR */
21825     { pool                , P16_4X4             , 4   , 16,
21826        0xfc00    , 0x3c00    , 0                      , 0,
21827        0x0                 },        /* P16.4X4 */
21828     { pool                , P16_LB              , 4   , 16,
21829        0xfc00    , 0x5c00    , 0                      , 0,
21830        0x0                 },        /* P16.LB */
21831     { pool                , P16_LH              , 4   , 16,
21832        0xfc00    , 0x7c00    , 0                      , 0,
21833        0x0                 },        /* P16.LH */
21834     { reserved_block      , 0                   , 0   , 16,
21835        0xfc00    , 0x9c00    , 0                      , 0,
21836        0x0                 },        /* P16~*(19) */
21837     { instruction         , 0                   , 0   , 16,
21838        0xfc00    , 0xbc00    , &MOVEP            , 0,
21839        XMMS_               },        /* MOVEP */
21840     { reserved_block      , 0                   , 0   , 16,
21841        0xfc00    , 0xdc00    , 0                      , 0,
21842        0x0                 },        /* P16~*(27) */
21843     { instruction         , 0                   , 0   , 16,
21844        0xfc00    , 0xfc00    , &MOVEP_REV_       , 0,
21845        XMMS_               },        /* MOVEP[REV] */
21846 };
21847 
21848 
21849 static const Pool MAJOR[2] = {
21850     { pool                , P32                 , 32  , 32,
21851        0x10000000, 0x00000000, 0                      , 0,
21852        0x0                 },        /* P32 */
21853     { pool                , P16                 , 32  , 16,
21854        0x1000    , 0x1000    , 0                      , 0,
21855        0x0                 },        /* P16 */
21856 };
21857 
21858 /*
21859  * Recurse through tables until the instruction is found then return
21860  * the string and size
21861  *
21862  * inputs:
21863  *      pointer to a word stream,
21864  *      disassember table and size
21865  * returns:
21866  *      instruction size    - negative is error
21867  *      disassembly string  - on error will constain error string
21868  */
21869 static int Disassemble(const uint16 *data, char **dis,
21870                      TABLE_ENTRY_TYPE *type, const Pool *table,
21871                      int table_size, Dis_info *info)
21872 {
21873     for (int i = 0; i < table_size; i++) {
21874         uint64 op_code = extract_op_code_value(data,
21875                              table[i].instructions_size);
21876         if ((op_code & table[i].mask) == table[i].value) {
21877             /* possible match */
21878             conditional_function cond = table[i].condition;
21879             if ((cond == NULL) || cond(op_code)) {
21880                 if (table[i].type == pool) {
21881                     return Disassemble(data, dis, type,
21882                                        table[i].next_table,
21883                                        table[i].next_table_size,
21884                                        info);
21885                 } else if ((table[i].type == instruction) ||
21886                            (table[i].type == call_instruction) ||
21887                            (table[i].type == branch_instruction) ||
21888                            (table[i].type == return_instruction)) {
21889                     disassembly_function dis_fn = table[i].disassembly;
21890                     if (dis_fn == 0) {
21891                         *dis = g_strdup(
21892                             "disassembler failure - bad table entry");
21893                         return -6;
21894                     }
21895                     *type = table[i].type;
21896                     *dis = dis_fn(op_code, info);
21897                     return table[i].instructions_size;
21898                 } else {
21899                     *dis = g_strdup("reserved instruction");
21900                     return -2;
21901                 }
21902             }
21903         }
21904     }
21905     *dis = g_strdup("failed to disassemble");
21906     return -1;      /* failed to disassemble        */
21907 }
21908 
21909 
21910 static bool nanomips_dis(const uint16_t *data, char **buf, Dis_info *info)
21911 {
21912     TABLE_ENTRY_TYPE type;
21913 
21914     /* Handle runtime errors. */
21915     if (unlikely(sigsetjmp(info->buf, 0) != 0)) {
21916         return false;
21917     }
21918     return Disassemble(data, buf, &type, MAJOR, ARRAY_SIZE(MAJOR), info) >= 0;
21919 }
21920 
21921 static bool read_u16(uint16_t *ret, bfd_vma memaddr,
21922                      struct disassemble_info *info)
21923 {
21924     int status = (*info->read_memory_func)(memaddr, (bfd_byte *)ret, 2, info);
21925     if (status != 0) {
21926         (*info->memory_error_func)(status, memaddr, info);
21927         return false;
21928     }
21929 
21930     if ((info->endian == BFD_ENDIAN_BIG) != HOST_BIG_ENDIAN) {
21931         bswap16s(ret);
21932     }
21933     return true;
21934 }
21935 
21936 int print_insn_nanomips(bfd_vma memaddr, struct disassemble_info *info)
21937 {
21938     int length;
21939     uint16_t words[3] = { };
21940     g_autofree char *buf = NULL;
21941 
21942     info->bytes_per_chunk = 2;
21943     info->display_endian = info->endian;
21944     info->insn_info_valid = 1;
21945     info->branch_delay_insns = 0;
21946     info->data_size = 0;
21947     info->insn_type = dis_nonbranch;
21948     info->target = 0;
21949     info->target2 = 0;
21950 
21951     Dis_info disassm_info;
21952     disassm_info.m_pc = memaddr;
21953     disassm_info.fprintf_func = info->fprintf_func;
21954     disassm_info.stream = info->stream;
21955 
21956     if (!read_u16(&words[0], memaddr, info)) {
21957         return -1;
21958     }
21959     length = 2;
21960 
21961     /* Handle 32-bit opcodes.  */
21962     if ((words[0] & 0x1000) == 0) {
21963         if (!read_u16(&words[1], memaddr + 2, info)) {
21964             return -1;
21965         }
21966         length = 4;
21967 
21968         /* Handle 48-bit opcodes.  */
21969         if ((words[0] >> 10) == 0x18) {
21970             if (!read_u16(&words[1], memaddr + 4, info)) {
21971                 return -1;
21972             }
21973             length = 6;
21974         }
21975     }
21976 
21977     for (int i = 0; i < ARRAY_SIZE(words); i++) {
21978         if (i * 2 < length) {
21979             (*info->fprintf_func)(info->stream, "%04x ", words[i]);
21980         } else {
21981             (*info->fprintf_func)(info->stream, "     ");
21982         }
21983     }
21984 
21985     if (nanomips_dis(words, &buf, &disassm_info)) {
21986         (*info->fprintf_func) (info->stream, "%s", buf);
21987     }
21988 
21989     return length;
21990 }
21991