xref: /openbmc/qemu/disas/microblaze.c (revision db2feb2df8d19592c9859efb3f682404e0052957)
176cad711SPaolo Bonzini /* Disassemble Xilinx microblaze instructions.
276cad711SPaolo Bonzini    Copyright (C) 1993, 1999, 2000 Free Software Foundation, Inc.
376cad711SPaolo Bonzini 
476cad711SPaolo Bonzini This program is free software; you can redistribute it and/or modify
576cad711SPaolo Bonzini it under the terms of the GNU General Public License as published by
676cad711SPaolo Bonzini the Free Software Foundation; either version 2 of the License, or
776cad711SPaolo Bonzini (at your option) any later version.
876cad711SPaolo Bonzini 
976cad711SPaolo Bonzini This program is distributed in the hope that it will be useful,
1076cad711SPaolo Bonzini but WITHOUT ANY WARRANTY; without even the implied warranty of
1176cad711SPaolo Bonzini MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1276cad711SPaolo Bonzini GNU General Public License for more details.
1376cad711SPaolo Bonzini 
1476cad711SPaolo Bonzini You should have received a copy of the GNU General Public License
1576cad711SPaolo Bonzini along with this program; if not, see <http://www.gnu.org/licenses/>. */
1676cad711SPaolo Bonzini 
1776cad711SPaolo Bonzini /*
1876cad711SPaolo Bonzini  * Copyright (c) 2001 Xilinx, Inc.  All rights reserved.
1976cad711SPaolo Bonzini  *
2076cad711SPaolo Bonzini  * Redistribution and use in source and binary forms are permitted
2176cad711SPaolo Bonzini  * provided that the above copyright notice and this paragraph are
2276cad711SPaolo Bonzini  * duplicated in all such forms and that any documentation,
2376cad711SPaolo Bonzini  * advertising materials, and other materials related to such
2476cad711SPaolo Bonzini  * distribution and use acknowledge that the software was developed
2576cad711SPaolo Bonzini  * by Xilinx, Inc.  The name of the Company may not be used to endorse
2676cad711SPaolo Bonzini  * or promote products derived from this software without specific prior
2776cad711SPaolo Bonzini  * written permission.
2876cad711SPaolo Bonzini  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
2976cad711SPaolo Bonzini  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
3076cad711SPaolo Bonzini  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
3176cad711SPaolo Bonzini  *
3276cad711SPaolo Bonzini  *	Xilinx, Inc.
3376cad711SPaolo Bonzini  */
3476cad711SPaolo Bonzini 
3576cad711SPaolo Bonzini 
3694616c2aSPeter Maydell #include "qemu/osdep.h"
3776cad711SPaolo Bonzini #define STATIC_TABLE
3876cad711SPaolo Bonzini #define DEFINE_TABLE
3976cad711SPaolo Bonzini 
4076cad711SPaolo Bonzini #ifndef MICROBLAZE_OPC
4176cad711SPaolo Bonzini #define MICROBLAZE_OPC
4276cad711SPaolo Bonzini /* Assembler instructions for Xilinx's microblaze processor
4376cad711SPaolo Bonzini    Copyright (C) 1999, 2000 Free Software Foundation, Inc.
4476cad711SPaolo Bonzini 
4576cad711SPaolo Bonzini 
4676cad711SPaolo Bonzini This program is free software; you can redistribute it and/or modify
4776cad711SPaolo Bonzini it under the terms of the GNU General Public License as published by
4876cad711SPaolo Bonzini the Free Software Foundation; either version 2 of the License, or
4976cad711SPaolo Bonzini (at your option) any later version.
5076cad711SPaolo Bonzini 
5176cad711SPaolo Bonzini This program is distributed in the hope that it will be useful,
5276cad711SPaolo Bonzini but WITHOUT ANY WARRANTY; without even the implied warranty of
5376cad711SPaolo Bonzini MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5476cad711SPaolo Bonzini GNU General Public License for more details.
5576cad711SPaolo Bonzini 
5676cad711SPaolo Bonzini You should have received a copy of the GNU General Public License
5776cad711SPaolo Bonzini along with this program; if not, see <http://www.gnu.org/licenses/>.  */
5876cad711SPaolo Bonzini 
5976cad711SPaolo Bonzini /*
6076cad711SPaolo Bonzini  * Copyright (c) 2001 Xilinx, Inc.  All rights reserved.
6176cad711SPaolo Bonzini  *
6276cad711SPaolo Bonzini  * Redistribution and use in source and binary forms are permitted
6376cad711SPaolo Bonzini  * provided that the above copyright notice and this paragraph are
6476cad711SPaolo Bonzini  * duplicated in all such forms and that any documentation,
6576cad711SPaolo Bonzini  * advertising materials, and other materials related to such
6676cad711SPaolo Bonzini  * distribution and use acknowledge that the software was developed
6776cad711SPaolo Bonzini  * by Xilinx, Inc.  The name of the Company may not be used to endorse
6876cad711SPaolo Bonzini  * or promote products derived from this software without specific prior
6976cad711SPaolo Bonzini  * written permission.
7076cad711SPaolo Bonzini  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
7176cad711SPaolo Bonzini  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
7276cad711SPaolo Bonzini  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
7376cad711SPaolo Bonzini  *
7476cad711SPaolo Bonzini  *	Xilinx, Inc.
7576cad711SPaolo Bonzini  */
7676cad711SPaolo Bonzini 
7776cad711SPaolo Bonzini 
7876cad711SPaolo Bonzini #ifndef MICROBLAZE_OPCM
7976cad711SPaolo Bonzini #define MICROBLAZE_OPCM
8076cad711SPaolo Bonzini 
8176cad711SPaolo Bonzini /*
8276cad711SPaolo Bonzini  * Copyright (c) 2001 Xilinx, Inc.  All rights reserved.
8376cad711SPaolo Bonzini  *
8476cad711SPaolo Bonzini  * Redistribution and use in source and binary forms are permitted
8576cad711SPaolo Bonzini  * provided that the above copyright notice and this paragraph are
8676cad711SPaolo Bonzini  * duplicated in all such forms and that any documentation,
8776cad711SPaolo Bonzini  * advertising materials, and other materials related to such
8876cad711SPaolo Bonzini  * distribution and use acknowledge that the software was developed
8976cad711SPaolo Bonzini  * by Xilinx, Inc.  The name of the Company may not be used to endorse
9076cad711SPaolo Bonzini  * or promote products derived from this software without specific prior
9176cad711SPaolo Bonzini  * written permission.
9276cad711SPaolo Bonzini  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
9376cad711SPaolo Bonzini  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
9476cad711SPaolo Bonzini  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
9576cad711SPaolo Bonzini  *
9676cad711SPaolo Bonzini  *	Xilinx, Inc.
9776cad711SPaolo Bonzini  * $Header:
9876cad711SPaolo Bonzini  */
9976cad711SPaolo Bonzini 
10076cad711SPaolo Bonzini enum microblaze_instr {
10176cad711SPaolo Bonzini    add, rsub, addc, rsubc, addk, rsubk, addkc, rsubkc, cmp, cmpu,
10276cad711SPaolo Bonzini    addi, rsubi, addic, rsubic, addik, rsubik, addikc, rsubikc, mul, mulh, mulhu, mulhsu,
10376cad711SPaolo Bonzini    idiv, idivu, bsll, bsra, bsrl, get, put, nget, nput, cget, cput,
10476cad711SPaolo Bonzini    ncget, ncput, muli, bslli, bsrai, bsrli, mului, or, and, xor,
10576cad711SPaolo Bonzini    andn, pcmpbf, pcmpbc, pcmpeq, pcmpne, sra, src, srl, sext8, sext16, wic, wdc, wdcclear, wdcflush, mts, mfs, br, brd,
10676cad711SPaolo Bonzini    brld, bra, brad, brald, microblaze_brk, beq, beqd, bne, bned, blt,
10776cad711SPaolo Bonzini    bltd, ble, bled, bgt, bgtd, bge, bged, ori, andi, xori, andni,
10876cad711SPaolo Bonzini    imm, rtsd, rtid, rtbd, rted, bri, brid, brlid, brai, braid, bralid,
10976cad711SPaolo Bonzini    brki, beqi, beqid, bnei, bneid, blti, bltid, blei, bleid, bgti,
11076cad711SPaolo Bonzini    bgtid, bgei, bgeid, lbu, lhu, lw, lwx, sb, sh, sw, swx, lbui, lhui, lwi,
11176cad711SPaolo Bonzini    sbi, shi, swi, msrset, msrclr, tuqula, fadd, frsub, fmul, fdiv,
11276cad711SPaolo Bonzini    fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, flt, fint, fsqrt,
11376cad711SPaolo Bonzini    tget, tcget, tnget, tncget, tput, tcput, tnput, tncput,
11476cad711SPaolo Bonzini    eget, ecget, neget, necget, eput, ecput, neput, necput,
11576cad711SPaolo Bonzini    teget, tecget, tneget, tnecget, teput, tecput, tneput, tnecput,
11676cad711SPaolo Bonzini    aget, caget, naget, ncaget, aput, caput, naput, ncaput,
11776cad711SPaolo Bonzini    taget, tcaget, tnaget, tncaget, taput, tcaput, tnaput, tncaput,
11876cad711SPaolo Bonzini    eaget, ecaget, neaget, necaget, eaput, ecaput, neaput, necaput,
11976cad711SPaolo Bonzini    teaget, tecaget, tneaget, tnecaget, teaput, tecaput, tneaput, tnecaput,
12076cad711SPaolo Bonzini    getd, tgetd, cgetd, tcgetd, ngetd, tngetd, ncgetd, tncgetd,
12176cad711SPaolo Bonzini    putd, tputd, cputd, tcputd, nputd, tnputd, ncputd, tncputd,
12276cad711SPaolo Bonzini    egetd, tegetd, ecgetd, tecgetd, negetd, tnegetd, necgetd, tnecgetd,
12376cad711SPaolo Bonzini    eputd, teputd, ecputd, tecputd, neputd, tneputd, necputd, tnecputd,
12476cad711SPaolo Bonzini    agetd, tagetd, cagetd, tcagetd, nagetd, tnagetd, ncagetd, tncagetd,
12576cad711SPaolo Bonzini    aputd, taputd, caputd, tcaputd, naputd, tnaputd, ncaputd, tncaputd,
12676cad711SPaolo Bonzini    eagetd, teagetd, ecagetd, tecagetd, neagetd, tneagetd, necagetd, tnecagetd,
12776cad711SPaolo Bonzini    eaputd, teaputd, ecaputd, tecaputd, neaputd, tneaputd, necaputd, tnecaputd,
12876cad711SPaolo Bonzini    invalid_inst } ;
12976cad711SPaolo Bonzini 
13076cad711SPaolo Bonzini enum microblaze_instr_type {
13176cad711SPaolo Bonzini    arithmetic_inst, logical_inst, mult_inst, div_inst, branch_inst,
13276cad711SPaolo Bonzini    return_inst, immediate_inst, special_inst, memory_load_inst,
13376cad711SPaolo Bonzini    memory_store_inst, barrel_shift_inst, anyware_inst };
13476cad711SPaolo Bonzini 
13576cad711SPaolo Bonzini #define INST_WORD_SIZE 4
13676cad711SPaolo Bonzini 
13776cad711SPaolo Bonzini /* gen purpose regs go from 0 to 31 */
13876cad711SPaolo Bonzini /* mask is reg num - max_reg_num, ie reg_num - 32 in this case */
13976cad711SPaolo Bonzini 
14076cad711SPaolo Bonzini #define REG_PC_MASK 0x8000
14176cad711SPaolo Bonzini #define REG_MSR_MASK 0x8001
14276cad711SPaolo Bonzini #define REG_EAR_MASK 0x8003
14376cad711SPaolo Bonzini #define REG_ESR_MASK 0x8005
14476cad711SPaolo Bonzini #define REG_FSR_MASK 0x8007
14576cad711SPaolo Bonzini #define REG_BTR_MASK 0x800b
14676cad711SPaolo Bonzini #define REG_EDR_MASK 0x800d
14776cad711SPaolo Bonzini #define REG_PVR_MASK 0xa000
14876cad711SPaolo Bonzini 
14976cad711SPaolo Bonzini #define REG_PID_MASK   0x9000
15076cad711SPaolo Bonzini #define REG_ZPR_MASK   0x9001
15176cad711SPaolo Bonzini #define REG_TLBX_MASK  0x9002
15276cad711SPaolo Bonzini #define REG_TLBLO_MASK 0x9003
15376cad711SPaolo Bonzini #define REG_TLBHI_MASK 0x9004
15476cad711SPaolo Bonzini #define REG_TLBSX_MASK 0x9005
15576cad711SPaolo Bonzini 
15676cad711SPaolo Bonzini #define MIN_REGNUM 0
15776cad711SPaolo Bonzini #define MAX_REGNUM 31
15876cad711SPaolo Bonzini 
15976cad711SPaolo Bonzini #define MIN_PVR_REGNUM 0
16076cad711SPaolo Bonzini #define MAX_PVR_REGNUM 15
16176cad711SPaolo Bonzini 
162bd517b43SPeter Maydell /* 32 is REG_PC */
16376cad711SPaolo Bonzini #define REG_MSR 33 /* machine status reg */
16476cad711SPaolo Bonzini #define REG_EAR 35 /* Exception reg */
16576cad711SPaolo Bonzini #define REG_ESR 37 /* Exception reg */
16676cad711SPaolo Bonzini #define REG_FSR 39 /* FPU Status reg */
16776cad711SPaolo Bonzini #define REG_BTR 43 /* Branch Target reg */
16876cad711SPaolo Bonzini #define REG_EDR 45 /* Exception reg */
16976cad711SPaolo Bonzini #define REG_PVR 40960 /* Program Verification reg */
17076cad711SPaolo Bonzini 
17176cad711SPaolo Bonzini #define REG_PID   36864 /* MMU: Process ID reg       */
17276cad711SPaolo Bonzini #define REG_ZPR   36865 /* MMU: Zone Protect reg     */
17376cad711SPaolo Bonzini #define REG_TLBX  36866 /* MMU: TLB Index reg        */
17476cad711SPaolo Bonzini #define REG_TLBLO 36867 /* MMU: TLB Low reg          */
17576cad711SPaolo Bonzini #define REG_TLBHI 36868 /* MMU: TLB High reg         */
17676cad711SPaolo Bonzini #define REG_TLBSX 36869 /* MMU: TLB Search Index reg */
17776cad711SPaolo Bonzini 
17876cad711SPaolo Bonzini /* alternate names for gen purpose regs */
17976cad711SPaolo Bonzini #define REG_ROSDP 2 /* read-only small data pointer */
18076cad711SPaolo Bonzini #define REG_RWSDP 13 /* read-write small data pointer */
18176cad711SPaolo Bonzini 
18276cad711SPaolo Bonzini /* Assembler Register - Used in Delay Slot Optimization */
18376cad711SPaolo Bonzini #define REG_AS    18
18476cad711SPaolo Bonzini #define REG_ZERO  0
18576cad711SPaolo Bonzini 
18676cad711SPaolo Bonzini #define RD_LOW  21 /* low bit for RD */
18776cad711SPaolo Bonzini #define RA_LOW  16 /* low bit for RA */
18876cad711SPaolo Bonzini #define RB_LOW  11 /* low bit for RB */
18976cad711SPaolo Bonzini #define IMM_LOW  0 /* low bit for immediate */
19076cad711SPaolo Bonzini 
19176cad711SPaolo Bonzini #define RD_MASK 0x03E00000
19276cad711SPaolo Bonzini #define RA_MASK 0x001F0000
19376cad711SPaolo Bonzini #define RB_MASK 0x0000F800
19476cad711SPaolo Bonzini #define IMM_MASK 0x0000FFFF
19576cad711SPaolo Bonzini 
19676cad711SPaolo Bonzini // imm mask for barrel shifts
19776cad711SPaolo Bonzini #define IMM5_MASK 0x0000001F
19876cad711SPaolo Bonzini 
19976cad711SPaolo Bonzini 
20076cad711SPaolo Bonzini // FSL imm mask for get, put instructions
20176cad711SPaolo Bonzini #define  RFSL_MASK 0x000000F
20276cad711SPaolo Bonzini 
20376cad711SPaolo Bonzini // imm mask for msrset, msrclr instructions
20476cad711SPaolo Bonzini #define  IMM15_MASK 0x00007FFF
20576cad711SPaolo Bonzini 
20676cad711SPaolo Bonzini #endif /* MICROBLAZE-OPCM */
20776cad711SPaolo Bonzini 
20876cad711SPaolo Bonzini #define INST_TYPE_RD_R1_R2 0
20976cad711SPaolo Bonzini #define INST_TYPE_RD_R1_IMM 1
21076cad711SPaolo Bonzini #define INST_TYPE_RD_R1_UNSIGNED_IMM 2
21176cad711SPaolo Bonzini #define INST_TYPE_RD_R1 3
21276cad711SPaolo Bonzini #define INST_TYPE_RD_R2 4
21376cad711SPaolo Bonzini #define INST_TYPE_RD_IMM 5
21476cad711SPaolo Bonzini #define INST_TYPE_R2 6
21576cad711SPaolo Bonzini #define INST_TYPE_R1_R2 7
21676cad711SPaolo Bonzini #define INST_TYPE_R1_IMM 8
21776cad711SPaolo Bonzini #define INST_TYPE_IMM 9
21876cad711SPaolo Bonzini #define INST_TYPE_SPECIAL_R1 10
21976cad711SPaolo Bonzini #define INST_TYPE_RD_SPECIAL 11
22076cad711SPaolo Bonzini #define INST_TYPE_R1 12
22176cad711SPaolo Bonzini   // new instn type for barrel shift imms
22276cad711SPaolo Bonzini #define INST_TYPE_RD_R1_IMM5  13
22376cad711SPaolo Bonzini #define INST_TYPE_RD_RFSL    14
22476cad711SPaolo Bonzini #define INST_TYPE_R1_RFSL    15
22576cad711SPaolo Bonzini 
22676cad711SPaolo Bonzini   // new insn type for insn cache
22776cad711SPaolo Bonzini #define INST_TYPE_RD_R1_SPECIAL 16
22876cad711SPaolo Bonzini 
22976cad711SPaolo Bonzini // new insn type for msrclr, msrset insns.
23076cad711SPaolo Bonzini #define INST_TYPE_RD_IMM15    17
23176cad711SPaolo Bonzini 
23276cad711SPaolo Bonzini // new insn type for tuqula rd - addik rd, r0, 42
23376cad711SPaolo Bonzini #define INST_TYPE_RD    18
23476cad711SPaolo Bonzini 
23576cad711SPaolo Bonzini // new insn type for t*put
23676cad711SPaolo Bonzini #define INST_TYPE_RFSL  19
23776cad711SPaolo Bonzini 
23876cad711SPaolo Bonzini #define INST_TYPE_NONE 25
23976cad711SPaolo Bonzini 
24076cad711SPaolo Bonzini 
24176cad711SPaolo Bonzini 
24276cad711SPaolo Bonzini #define INST_PC_OFFSET 1 /* instructions where the label address is resolved as a PC offset (for branch label)*/
24376cad711SPaolo Bonzini #define INST_NO_OFFSET 0 /* instructions where the label address is resolved as an absolute value (for data mem or abs address)*/
24476cad711SPaolo Bonzini 
24576cad711SPaolo Bonzini #define IMMVAL_MASK_NON_SPECIAL 0x0000
24676cad711SPaolo Bonzini #define IMMVAL_MASK_MTS 0x4000
24776cad711SPaolo Bonzini #define IMMVAL_MASK_MFS 0x0000
24876cad711SPaolo Bonzini 
24976cad711SPaolo Bonzini #define OPCODE_MASK_H   0xFC000000 /* High 6 bits only */
25076cad711SPaolo Bonzini #define OPCODE_MASK_H1  0xFFE00000 /* High 11 bits */
25176cad711SPaolo Bonzini #define OPCODE_MASK_H2  0xFC1F0000 /* High 6 and bits 20-16 */
25276cad711SPaolo Bonzini #define OPCODE_MASK_H12 0xFFFF0000 /* High 16 */
25376cad711SPaolo Bonzini #define OPCODE_MASK_H4  0xFC0007FF /* High 6 and low 11 bits */
25476cad711SPaolo Bonzini #define OPCODE_MASK_H13S 0xFFE0EFF0 /* High 11 and 15:1 bits and last nibble of last byte for spr */
25576cad711SPaolo Bonzini #define OPCODE_MASK_H23S 0xFC1FC000 /* High 6, 20-16 and 15:1 bits and last nibble of last byte for spr */
25676cad711SPaolo Bonzini #define OPCODE_MASK_H34 0xFC00FFFF /* High 6 and low 16 bits */
25776cad711SPaolo Bonzini #define OPCODE_MASK_H14 0xFFE007FF /* High 11 and low 11 bits */
25876cad711SPaolo Bonzini #define OPCODE_MASK_H24 0xFC1F07FF /* High 6, bits 20-16 and low 11 bits */
25976cad711SPaolo Bonzini #define OPCODE_MASK_H124  0xFFFF07FF /* High 16, and low 11 bits */
26076cad711SPaolo Bonzini #define OPCODE_MASK_H1234 0xFFFFFFFF /* All 32 bits */
26176cad711SPaolo Bonzini #define OPCODE_MASK_H3  0xFC000600 /* High 6 bits and bits 21, 22 */
26276cad711SPaolo Bonzini #define OPCODE_MASK_H32 0xFC00FC00 /* High 6 bits and bit 16-21 */
26376cad711SPaolo Bonzini #define OPCODE_MASK_H34B   0xFC0000FF /* High 6 bits and low 8 bits */
26476cad711SPaolo Bonzini #define OPCODE_MASK_H34C   0xFC0007E0 /* High 6 bits and bits 21-26 */
26576cad711SPaolo Bonzini 
26676cad711SPaolo Bonzini // New Mask for msrset, msrclr insns.
26776cad711SPaolo Bonzini #define OPCODE_MASK_H23N  0xFC1F8000 /* High 6 and bits 11 - 16 */
26876cad711SPaolo Bonzini 
26976cad711SPaolo Bonzini #define DELAY_SLOT 1
27076cad711SPaolo Bonzini #define NO_DELAY_SLOT 0
27176cad711SPaolo Bonzini 
27276cad711SPaolo Bonzini #define MAX_OPCODES 280
27376cad711SPaolo Bonzini 
2749a32e6f3SStefan Weil static const struct op_code_struct {
27576cad711SPaolo Bonzini   const char *name;
27676cad711SPaolo Bonzini   short inst_type; /* registers and immediate values involved */
27776cad711SPaolo Bonzini   short inst_offset_type; /* immediate vals offset from PC? (= 1 for branches) */
27876cad711SPaolo Bonzini   short delay_slots; /* info about delay slots needed after this instr. */
27976cad711SPaolo Bonzini   short immval_mask;
28076cad711SPaolo Bonzini   unsigned long bit_sequence; /* all the fixed bits for the op are set and all the variable bits (reg names, imm vals) are set to 0 */
28176cad711SPaolo Bonzini   unsigned long opcode_mask; /* which bits define the opcode */
28276cad711SPaolo Bonzini   enum microblaze_instr instr;
28376cad711SPaolo Bonzini   enum microblaze_instr_type instr_type;
28476cad711SPaolo Bonzini   /* more info about output format here */
28576cad711SPaolo Bonzini } opcodes[MAX_OPCODES] =
28676cad711SPaolo Bonzini 
28776cad711SPaolo Bonzini {
28876cad711SPaolo Bonzini   {"add",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst },
28976cad711SPaolo Bonzini   {"rsub",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst },
29076cad711SPaolo Bonzini   {"addc",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst },
29176cad711SPaolo Bonzini   {"rsubc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x0C000000, OPCODE_MASK_H4, rsubc, arithmetic_inst },
29276cad711SPaolo Bonzini   {"addk",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x10000000, OPCODE_MASK_H4, addk, arithmetic_inst },
29376cad711SPaolo Bonzini   {"rsubk", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000000, OPCODE_MASK_H4, rsubk, arithmetic_inst },
29476cad711SPaolo Bonzini   {"cmp",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000001, OPCODE_MASK_H4, cmp, arithmetic_inst },
29576cad711SPaolo Bonzini   {"cmpu",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000003, OPCODE_MASK_H4, cmpu, arithmetic_inst },
29676cad711SPaolo Bonzini   {"addkc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x18000000, OPCODE_MASK_H4, addkc, arithmetic_inst },
29776cad711SPaolo Bonzini   {"rsubkc",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x1C000000, OPCODE_MASK_H4, rsubkc, arithmetic_inst },
29876cad711SPaolo Bonzini   {"addi",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x20000000, OPCODE_MASK_H, addi, arithmetic_inst },
29976cad711SPaolo Bonzini   {"rsubi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x24000000, OPCODE_MASK_H, rsubi, arithmetic_inst },
30076cad711SPaolo Bonzini   {"addic", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x28000000, OPCODE_MASK_H, addic, arithmetic_inst },
30176cad711SPaolo Bonzini   {"rsubic",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x2C000000, OPCODE_MASK_H, rsubic, arithmetic_inst },
30276cad711SPaolo Bonzini   {"addik", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, addik, arithmetic_inst },
30376cad711SPaolo Bonzini   {"rsubik",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x34000000, OPCODE_MASK_H, rsubik, arithmetic_inst },
30476cad711SPaolo Bonzini   {"addikc",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x38000000, OPCODE_MASK_H, addikc, arithmetic_inst },
30576cad711SPaolo Bonzini   {"rsubikc",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3C000000, OPCODE_MASK_H, rsubikc, arithmetic_inst },
30676cad711SPaolo Bonzini   {"mul",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000000, OPCODE_MASK_H4, mul, mult_inst },
30776cad711SPaolo Bonzini   {"mulh",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000001, OPCODE_MASK_H4, mulh, mult_inst },
30876cad711SPaolo Bonzini   {"mulhu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000003, OPCODE_MASK_H4, mulhu, mult_inst },
30976cad711SPaolo Bonzini   {"mulhsu",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000002, OPCODE_MASK_H4, mulhsu, mult_inst },
31076cad711SPaolo Bonzini   {"idiv",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x48000000, OPCODE_MASK_H4, idiv, div_inst },
31176cad711SPaolo Bonzini   {"idivu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x48000002, OPCODE_MASK_H4, idivu, div_inst },
31276cad711SPaolo Bonzini   {"bsll",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000400, OPCODE_MASK_H3, bsll, barrel_shift_inst },
31376cad711SPaolo Bonzini   {"bsra",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000200, OPCODE_MASK_H3, bsra, barrel_shift_inst },
31476cad711SPaolo Bonzini   {"bsrl",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000000, OPCODE_MASK_H3, bsrl, barrel_shift_inst },
31576cad711SPaolo Bonzini   {"get",   INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000000, OPCODE_MASK_H32, get, anyware_inst },
31676cad711SPaolo Bonzini   {"put",   INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008000, OPCODE_MASK_H32, put, anyware_inst },
31776cad711SPaolo Bonzini   {"nget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004000, OPCODE_MASK_H32, nget, anyware_inst },
31876cad711SPaolo Bonzini   {"nput",  INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C000, OPCODE_MASK_H32, nput, anyware_inst },
31976cad711SPaolo Bonzini   {"cget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002000, OPCODE_MASK_H32, cget, anyware_inst },
32076cad711SPaolo Bonzini   {"cput",  INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A000, OPCODE_MASK_H32, cput, anyware_inst },
32176cad711SPaolo Bonzini   {"ncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst },
32276cad711SPaolo Bonzini   {"ncput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst },
32376cad711SPaolo Bonzini   {"muli",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst },
32476cad711SPaolo Bonzini   {"bslli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000400, OPCODE_MASK_H3, bslli, barrel_shift_inst },
32576cad711SPaolo Bonzini   {"bsrai", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000200, OPCODE_MASK_H3, bsrai, barrel_shift_inst },
32676cad711SPaolo Bonzini   {"bsrli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000000, OPCODE_MASK_H3, bsrli, barrel_shift_inst },
32776cad711SPaolo Bonzini   {"or",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, or, logical_inst },
32876cad711SPaolo Bonzini   {"and",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, and, logical_inst },
32976cad711SPaolo Bonzini   {"xor",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, xor, logical_inst },
33076cad711SPaolo Bonzini   {"andn",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x8C000000, OPCODE_MASK_H4, andn, logical_inst },
33176cad711SPaolo Bonzini   {"pcmpbf",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000400, OPCODE_MASK_H4, pcmpbf, logical_inst },
33276cad711SPaolo Bonzini   {"pcmpbc",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000400, OPCODE_MASK_H4, pcmpbc, logical_inst },
33376cad711SPaolo Bonzini   {"pcmpeq",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000400, OPCODE_MASK_H4, pcmpeq, logical_inst },
33476cad711SPaolo Bonzini   {"pcmpne",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x8C000400, OPCODE_MASK_H4, pcmpne, logical_inst },
33576cad711SPaolo Bonzini   {"sra",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000001, OPCODE_MASK_H34, sra, logical_inst },
33676cad711SPaolo Bonzini   {"src",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000021, OPCODE_MASK_H34, src, logical_inst },
33776cad711SPaolo Bonzini   {"srl",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000041, OPCODE_MASK_H34, srl, logical_inst },
33876cad711SPaolo Bonzini   {"sext8", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000060, OPCODE_MASK_H34, sext8, logical_inst },
33976cad711SPaolo Bonzini   {"sext16",INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000061, OPCODE_MASK_H34, sext16, logical_inst },
34076cad711SPaolo Bonzini   {"wic",   INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000068, OPCODE_MASK_H34B, wic, special_inst },
34176cad711SPaolo Bonzini   {"wdc",   INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000064, OPCODE_MASK_H34B, wdc, special_inst },
34276cad711SPaolo Bonzini   {"wdc.clear", INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000066, OPCODE_MASK_H34B, wdcclear, special_inst },
34376cad711SPaolo Bonzini   {"wdc.flush", INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000074, OPCODE_MASK_H34B, wdcflush, special_inst },
34476cad711SPaolo Bonzini   {"mts",   INST_TYPE_SPECIAL_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MTS, 0x9400C000, OPCODE_MASK_H13S, mts, special_inst },
34576cad711SPaolo Bonzini   {"mfs",   INST_TYPE_RD_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MFS, 0x94008000, OPCODE_MASK_H23S, mfs, special_inst },
34676cad711SPaolo Bonzini   {"br",    INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst },
34776cad711SPaolo Bonzini   {"brd",   INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst },
34876cad711SPaolo Bonzini   {"brld",  INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst },
34976cad711SPaolo Bonzini   {"bra",   INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98080000, OPCODE_MASK_H124, bra, branch_inst },
35076cad711SPaolo Bonzini   {"brad",  INST_TYPE_R2, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98180000, OPCODE_MASK_H124, brad, branch_inst },
35176cad711SPaolo Bonzini   {"brald", INST_TYPE_RD_R2, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x981C0000, OPCODE_MASK_H24, brald, branch_inst },
35276cad711SPaolo Bonzini   {"brk",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x980C0000, OPCODE_MASK_H24, microblaze_brk, branch_inst },
35376cad711SPaolo Bonzini   {"beq",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C000000, OPCODE_MASK_H14, beq, branch_inst },
35476cad711SPaolo Bonzini   {"beqd",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E000000, OPCODE_MASK_H14, beqd, branch_inst },
35576cad711SPaolo Bonzini   {"bne",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C200000, OPCODE_MASK_H14, bne, branch_inst },
35676cad711SPaolo Bonzini   {"bned",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E200000, OPCODE_MASK_H14, bned, branch_inst },
35776cad711SPaolo Bonzini   {"blt",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C400000, OPCODE_MASK_H14, blt, branch_inst },
35876cad711SPaolo Bonzini   {"bltd",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E400000, OPCODE_MASK_H14, bltd, branch_inst },
35976cad711SPaolo Bonzini   {"ble",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C600000, OPCODE_MASK_H14, ble, branch_inst },
36076cad711SPaolo Bonzini   {"bled",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E600000, OPCODE_MASK_H14, bled, branch_inst },
36176cad711SPaolo Bonzini   {"bgt",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C800000, OPCODE_MASK_H14, bgt, branch_inst },
36276cad711SPaolo Bonzini   {"bgtd",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E800000, OPCODE_MASK_H14, bgtd, branch_inst },
36376cad711SPaolo Bonzini   {"bge",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9CA00000, OPCODE_MASK_H14, bge, branch_inst },
36476cad711SPaolo Bonzini   {"bged",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9EA00000, OPCODE_MASK_H14, bged, branch_inst },
36576cad711SPaolo Bonzini   {"ori",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, ori, logical_inst },
36676cad711SPaolo Bonzini   {"andi",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA4000000, OPCODE_MASK_H, andi, logical_inst },
36776cad711SPaolo Bonzini   {"xori",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA8000000, OPCODE_MASK_H, xori, logical_inst },
36876cad711SPaolo Bonzini   {"andni", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xAC000000, OPCODE_MASK_H, andni, logical_inst },
36976cad711SPaolo Bonzini   {"imm",   INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB0000000, OPCODE_MASK_H12, imm, immediate_inst },
37076cad711SPaolo Bonzini   {"rtsd",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6000000, OPCODE_MASK_H1, rtsd, return_inst },
37176cad711SPaolo Bonzini   {"rtid",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6200000, OPCODE_MASK_H1, rtid, return_inst },
37276cad711SPaolo Bonzini   {"rtbd",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6400000, OPCODE_MASK_H1, rtbd, return_inst },
37376cad711SPaolo Bonzini   {"rted",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6800000, OPCODE_MASK_H1, rted, return_inst },
37476cad711SPaolo Bonzini   {"bri",   INST_TYPE_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8000000, OPCODE_MASK_H12, bri, branch_inst },
37576cad711SPaolo Bonzini   {"brid",  INST_TYPE_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8100000, OPCODE_MASK_H12, brid, branch_inst },
37676cad711SPaolo Bonzini   {"brlid", INST_TYPE_RD_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8140000, OPCODE_MASK_H2, brlid, branch_inst },
37776cad711SPaolo Bonzini   {"brai",  INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8080000, OPCODE_MASK_H12, brai, branch_inst },
37876cad711SPaolo Bonzini   {"braid", INST_TYPE_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8180000, OPCODE_MASK_H12, braid, branch_inst },
37976cad711SPaolo Bonzini   {"bralid",INST_TYPE_RD_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB81C0000, OPCODE_MASK_H2, bralid, branch_inst },
38076cad711SPaolo Bonzini   {"brki",  INST_TYPE_RD_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB80C0000, OPCODE_MASK_H2, brki, branch_inst },
38176cad711SPaolo Bonzini   {"beqi",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC000000, OPCODE_MASK_H1, beqi, branch_inst },
38276cad711SPaolo Bonzini   {"beqid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE000000, OPCODE_MASK_H1, beqid, branch_inst },
38376cad711SPaolo Bonzini   {"bnei",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC200000, OPCODE_MASK_H1, bnei, branch_inst },
38476cad711SPaolo Bonzini   {"bneid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE200000, OPCODE_MASK_H1, bneid, branch_inst },
38576cad711SPaolo Bonzini   {"blti",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC400000, OPCODE_MASK_H1, blti, branch_inst },
38676cad711SPaolo Bonzini   {"bltid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE400000, OPCODE_MASK_H1, bltid, branch_inst },
38776cad711SPaolo Bonzini   {"blei",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC600000, OPCODE_MASK_H1, blei, branch_inst },
38876cad711SPaolo Bonzini   {"bleid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE600000, OPCODE_MASK_H1, bleid, branch_inst },
38976cad711SPaolo Bonzini   {"bgti",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC800000, OPCODE_MASK_H1, bgti, branch_inst },
39076cad711SPaolo Bonzini   {"bgtid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE800000, OPCODE_MASK_H1, bgtid, branch_inst },
39176cad711SPaolo Bonzini   {"bgei",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBCA00000, OPCODE_MASK_H1, bgei, branch_inst },
39276cad711SPaolo Bonzini   {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst },
39376cad711SPaolo Bonzini   {"lbu",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst },
39476cad711SPaolo Bonzini   {"lhu",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC4000000, OPCODE_MASK_H4, lhu, memory_load_inst },
39576cad711SPaolo Bonzini   {"lw",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000000, OPCODE_MASK_H4, lw, memory_load_inst },
39676cad711SPaolo Bonzini   {"lwx",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000400, OPCODE_MASK_H4, lwx, memory_load_inst },
39776cad711SPaolo Bonzini   {"sb",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD0000000, OPCODE_MASK_H4, sb, memory_store_inst },
39876cad711SPaolo Bonzini   {"sh",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD4000000, OPCODE_MASK_H4, sh, memory_store_inst },
39976cad711SPaolo Bonzini   {"sw",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000000, OPCODE_MASK_H4, sw, memory_store_inst },
40076cad711SPaolo Bonzini   {"swx",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000400, OPCODE_MASK_H4, swx, memory_store_inst },
40176cad711SPaolo Bonzini   {"lbui",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst },
40276cad711SPaolo Bonzini   {"lhui",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst },
40376cad711SPaolo Bonzini   {"lwi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst },
40476cad711SPaolo Bonzini   {"sbi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF0000000, OPCODE_MASK_H, sbi, memory_store_inst },
40576cad711SPaolo Bonzini   {"shi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF4000000, OPCODE_MASK_H, shi, memory_store_inst },
40676cad711SPaolo Bonzini   {"swi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, swi, memory_store_inst },
40776cad711SPaolo Bonzini   {"nop",   INST_TYPE_NONE, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H1234, invalid_inst, logical_inst }, /* translates to or r0, r0, r0 */
40876cad711SPaolo Bonzini   {"la",    INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik */
40976cad711SPaolo Bonzini   {"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42 */
41076cad711SPaolo Bonzini   {"not",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA800FFFF, OPCODE_MASK_H34, invalid_inst, logical_inst }, /* not translates to xori rd,ra,-1 */
41176cad711SPaolo Bonzini   {"neg",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* neg translates to rsub rd, ra, r0 */
41276cad711SPaolo Bonzini   {"rtb",   INST_TYPE_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6000004, OPCODE_MASK_H1, invalid_inst, return_inst }, /* rtb translates to rts rd, 4 */
41376cad711SPaolo Bonzini   {"sub",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* sub translates to rsub rd, rb, ra */
41476cad711SPaolo Bonzini   {"lmi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst },
41576cad711SPaolo Bonzini   {"smi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst },
41676cad711SPaolo Bonzini   {"msrset",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst },
41776cad711SPaolo Bonzini   {"msrclr",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94110000, OPCODE_MASK_H23N, msrclr, special_inst },
41876cad711SPaolo Bonzini   {"fadd",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000000, OPCODE_MASK_H4, fadd, arithmetic_inst },
41976cad711SPaolo Bonzini   {"frsub",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000080, OPCODE_MASK_H4, frsub, arithmetic_inst },
42076cad711SPaolo Bonzini   {"fmul",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000100, OPCODE_MASK_H4, fmul, arithmetic_inst },
42176cad711SPaolo Bonzini   {"fdiv",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000180, OPCODE_MASK_H4, fdiv, arithmetic_inst },
42276cad711SPaolo Bonzini   {"fcmp.lt", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000210, OPCODE_MASK_H4, fcmp_lt, arithmetic_inst },
42376cad711SPaolo Bonzini   {"fcmp.eq", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000220, OPCODE_MASK_H4, fcmp_eq, arithmetic_inst },
42476cad711SPaolo Bonzini   {"fcmp.le", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000230, OPCODE_MASK_H4, fcmp_le, arithmetic_inst },
42576cad711SPaolo Bonzini   {"fcmp.gt", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000240, OPCODE_MASK_H4, fcmp_gt, arithmetic_inst },
42676cad711SPaolo Bonzini   {"fcmp.ne", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000250, OPCODE_MASK_H4, fcmp_ne, arithmetic_inst },
42776cad711SPaolo Bonzini   {"fcmp.ge", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000260, OPCODE_MASK_H4, fcmp_ge, arithmetic_inst },
42876cad711SPaolo Bonzini   {"fcmp.un", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000200, OPCODE_MASK_H4, fcmp_un, arithmetic_inst },
42976cad711SPaolo Bonzini   {"flt",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000280, OPCODE_MASK_H4, flt,   arithmetic_inst },
43076cad711SPaolo Bonzini   {"fint",  INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000300, OPCODE_MASK_H4, fint,  arithmetic_inst },
43176cad711SPaolo Bonzini   {"fsqrt", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000380, OPCODE_MASK_H4, fsqrt, arithmetic_inst },
43276cad711SPaolo Bonzini   {"tget",   INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001000, OPCODE_MASK_H32, tget,   anyware_inst },
43376cad711SPaolo Bonzini   {"tcget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003000, OPCODE_MASK_H32, tcget,  anyware_inst },
43476cad711SPaolo Bonzini   {"tnget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005000, OPCODE_MASK_H32, tnget,  anyware_inst },
43576cad711SPaolo Bonzini   {"tncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007000, OPCODE_MASK_H32, tncget, anyware_inst },
43676cad711SPaolo Bonzini   {"tput",   INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009000, OPCODE_MASK_H32, tput,   anyware_inst },
43776cad711SPaolo Bonzini   {"tcput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00B000, OPCODE_MASK_H32, tcput,  anyware_inst },
43876cad711SPaolo Bonzini   {"tnput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00D000, OPCODE_MASK_H32, tnput,  anyware_inst },
43976cad711SPaolo Bonzini   {"tncput", INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00F000, OPCODE_MASK_H32, tncput, anyware_inst },
44076cad711SPaolo Bonzini 
44176cad711SPaolo Bonzini   {"eget",   INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000400, OPCODE_MASK_H32, eget,   anyware_inst },
44276cad711SPaolo Bonzini   {"ecget",  INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002400, OPCODE_MASK_H32, ecget,  anyware_inst },
44376cad711SPaolo Bonzini   {"neget",  INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004400, OPCODE_MASK_H32, neget,  anyware_inst },
44476cad711SPaolo Bonzini   {"necget", INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006400, OPCODE_MASK_H32, necget, anyware_inst },
44576cad711SPaolo Bonzini   {"eput",   INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008400, OPCODE_MASK_H32, eput,   anyware_inst },
44676cad711SPaolo Bonzini   {"ecput",  INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A400, OPCODE_MASK_H32, ecput,  anyware_inst },
44776cad711SPaolo Bonzini   {"neput",  INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C400, OPCODE_MASK_H32, neput,  anyware_inst },
44876cad711SPaolo Bonzini   {"necput", INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E400, OPCODE_MASK_H32, necput, anyware_inst },
44976cad711SPaolo Bonzini 
45076cad711SPaolo Bonzini   {"teget",   INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001400, OPCODE_MASK_H32, teget,   anyware_inst },
45176cad711SPaolo Bonzini   {"tecget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003400, OPCODE_MASK_H32, tecget,  anyware_inst },
45276cad711SPaolo Bonzini   {"tneget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005400, OPCODE_MASK_H32, tneget,  anyware_inst },
45376cad711SPaolo Bonzini   {"tnecget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007400, OPCODE_MASK_H32, tnecget, anyware_inst },
45476cad711SPaolo Bonzini   {"teput",   INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009400, OPCODE_MASK_H32, teput,   anyware_inst },
45576cad711SPaolo Bonzini   {"tecput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00B400, OPCODE_MASK_H32, tecput,  anyware_inst },
45676cad711SPaolo Bonzini   {"tneput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00D400, OPCODE_MASK_H32, tneput,  anyware_inst },
45776cad711SPaolo Bonzini   {"tnecput", INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00F400, OPCODE_MASK_H32, tnecput, anyware_inst },
45876cad711SPaolo Bonzini 
45976cad711SPaolo Bonzini   {"aget",   INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000800, OPCODE_MASK_H32, aget,   anyware_inst },
46076cad711SPaolo Bonzini   {"caget",  INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002800, OPCODE_MASK_H32, caget,  anyware_inst },
46176cad711SPaolo Bonzini   {"naget",  INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004800, OPCODE_MASK_H32, naget,  anyware_inst },
46276cad711SPaolo Bonzini   {"ncaget", INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006800, OPCODE_MASK_H32, ncaget, anyware_inst },
46376cad711SPaolo Bonzini   {"aput",   INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008800, OPCODE_MASK_H32, aput,   anyware_inst },
46476cad711SPaolo Bonzini   {"caput",  INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A800, OPCODE_MASK_H32, caput,  anyware_inst },
46576cad711SPaolo Bonzini   {"naput",  INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C800, OPCODE_MASK_H32, naput,  anyware_inst },
46676cad711SPaolo Bonzini   {"ncaput", INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E800, OPCODE_MASK_H32, ncaput, anyware_inst },
46776cad711SPaolo Bonzini 
46876cad711SPaolo Bonzini   {"taget",   INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001800, OPCODE_MASK_H32, taget,   anyware_inst },
46976cad711SPaolo Bonzini   {"tcaget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003800, OPCODE_MASK_H32, tcaget,  anyware_inst },
47076cad711SPaolo Bonzini   {"tnaget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005800, OPCODE_MASK_H32, tnaget,  anyware_inst },
47176cad711SPaolo Bonzini   {"tncaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007800, OPCODE_MASK_H32, tncaget, anyware_inst },
47276cad711SPaolo Bonzini   {"taput",   INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009800, OPCODE_MASK_H32, taput,   anyware_inst },
47376cad711SPaolo Bonzini   {"tcaput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00B800, OPCODE_MASK_H32, tcaput,  anyware_inst },
47476cad711SPaolo Bonzini   {"tnaput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00D800, OPCODE_MASK_H32, tnaput,  anyware_inst },
47576cad711SPaolo Bonzini   {"tncaput", INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00F800, OPCODE_MASK_H32, tncaput, anyware_inst },
47676cad711SPaolo Bonzini 
47776cad711SPaolo Bonzini   {"eaget",   INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000C00, OPCODE_MASK_H32, eget,   anyware_inst },
47876cad711SPaolo Bonzini   {"ecaget",  INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002C00, OPCODE_MASK_H32, ecget,  anyware_inst },
47976cad711SPaolo Bonzini   {"neaget",  INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004C00, OPCODE_MASK_H32, neget,  anyware_inst },
48076cad711SPaolo Bonzini   {"necaget", INST_TYPE_RD_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006C00, OPCODE_MASK_H32, necget, anyware_inst },
48176cad711SPaolo Bonzini   {"eaput",   INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008C00, OPCODE_MASK_H32, eput,   anyware_inst },
48276cad711SPaolo Bonzini   {"ecaput",  INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00AC00, OPCODE_MASK_H32, ecput,  anyware_inst },
48376cad711SPaolo Bonzini   {"neaput",  INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00CC00, OPCODE_MASK_H32, neput,  anyware_inst },
48476cad711SPaolo Bonzini   {"necaput", INST_TYPE_R1_RFSL,  INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00EC00, OPCODE_MASK_H32, necput, anyware_inst },
48576cad711SPaolo Bonzini 
48676cad711SPaolo Bonzini   {"teaget",   INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C001C00, OPCODE_MASK_H32, teaget,   anyware_inst },
48776cad711SPaolo Bonzini   {"tecaget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C003C00, OPCODE_MASK_H32, tecaget,  anyware_inst },
48876cad711SPaolo Bonzini   {"tneaget",  INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C005C00, OPCODE_MASK_H32, tneaget,  anyware_inst },
48976cad711SPaolo Bonzini   {"tnecaget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C007C00, OPCODE_MASK_H32, tnecaget, anyware_inst },
49076cad711SPaolo Bonzini   {"teaput",   INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C009C00, OPCODE_MASK_H32, teaput,   anyware_inst },
49176cad711SPaolo Bonzini   {"tecaput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00BC00, OPCODE_MASK_H32, tecaput,  anyware_inst },
49276cad711SPaolo Bonzini   {"tneaput",  INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00DC00, OPCODE_MASK_H32, tneaput,  anyware_inst },
49376cad711SPaolo Bonzini   {"tnecaput", INST_TYPE_RFSL,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00FC00, OPCODE_MASK_H32, tnecaput, anyware_inst },
49476cad711SPaolo Bonzini 
49576cad711SPaolo Bonzini   {"getd",    INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000000, OPCODE_MASK_H34C, getd,    anyware_inst },
49676cad711SPaolo Bonzini   {"tgetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000080, OPCODE_MASK_H34C, tgetd,   anyware_inst },
49776cad711SPaolo Bonzini   {"cgetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000100, OPCODE_MASK_H34C, cgetd,   anyware_inst },
49876cad711SPaolo Bonzini   {"tcgetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000180, OPCODE_MASK_H34C, tcgetd,  anyware_inst },
49976cad711SPaolo Bonzini   {"ngetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000200, OPCODE_MASK_H34C, ngetd,   anyware_inst },
50076cad711SPaolo Bonzini   {"tngetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000280, OPCODE_MASK_H34C, tngetd,  anyware_inst },
50176cad711SPaolo Bonzini   {"ncgetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000300, OPCODE_MASK_H34C, ncgetd,  anyware_inst },
50276cad711SPaolo Bonzini   {"tncgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000380, OPCODE_MASK_H34C, tncgetd, anyware_inst },
50376cad711SPaolo Bonzini   {"putd",    INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000400, OPCODE_MASK_H34C, putd,    anyware_inst },
50476cad711SPaolo Bonzini   {"tputd",   INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000480, OPCODE_MASK_H34C, tputd,   anyware_inst },
50576cad711SPaolo Bonzini   {"cputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000500, OPCODE_MASK_H34C, cputd,   anyware_inst },
50676cad711SPaolo Bonzini   {"tcputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000580, OPCODE_MASK_H34C, tcputd,  anyware_inst },
50776cad711SPaolo Bonzini   {"nputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000600, OPCODE_MASK_H34C, nputd,   anyware_inst },
50876cad711SPaolo Bonzini   {"tnputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000680, OPCODE_MASK_H34C, tnputd,  anyware_inst },
50976cad711SPaolo Bonzini   {"ncputd",  INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000700, OPCODE_MASK_H34C, ncputd,  anyware_inst },
51076cad711SPaolo Bonzini   {"tncputd", INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000780, OPCODE_MASK_H34C, tncputd, anyware_inst },
51176cad711SPaolo Bonzini 
51276cad711SPaolo Bonzini   {"egetd",    INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000020, OPCODE_MASK_H34C, egetd,    anyware_inst },
51376cad711SPaolo Bonzini   {"tegetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0000A0, OPCODE_MASK_H34C, tegetd,   anyware_inst },
51476cad711SPaolo Bonzini   {"ecgetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000120, OPCODE_MASK_H34C, ecgetd,   anyware_inst },
51576cad711SPaolo Bonzini   {"tecgetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0001A0, OPCODE_MASK_H34C, tecgetd,  anyware_inst },
51676cad711SPaolo Bonzini   {"negetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000220, OPCODE_MASK_H34C, negetd,   anyware_inst },
51776cad711SPaolo Bonzini   {"tnegetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0002A0, OPCODE_MASK_H34C, tnegetd,  anyware_inst },
51876cad711SPaolo Bonzini   {"necgetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000320, OPCODE_MASK_H34C, necgetd,  anyware_inst },
51976cad711SPaolo Bonzini   {"tnecgetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0003A0, OPCODE_MASK_H34C, tnecgetd, anyware_inst },
52076cad711SPaolo Bonzini   {"eputd",    INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000420, OPCODE_MASK_H34C, eputd,    anyware_inst },
52176cad711SPaolo Bonzini   {"teputd",   INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0004A0, OPCODE_MASK_H34C, teputd,   anyware_inst },
52276cad711SPaolo Bonzini   {"ecputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000520, OPCODE_MASK_H34C, ecputd,   anyware_inst },
52376cad711SPaolo Bonzini   {"tecputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0005A0, OPCODE_MASK_H34C, tecputd,  anyware_inst },
52476cad711SPaolo Bonzini   {"neputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000620, OPCODE_MASK_H34C, neputd,   anyware_inst },
52576cad711SPaolo Bonzini   {"tneputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0006A0, OPCODE_MASK_H34C, tneputd,  anyware_inst },
52676cad711SPaolo Bonzini   {"necputd",  INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000720, OPCODE_MASK_H34C, necputd,  anyware_inst },
52776cad711SPaolo Bonzini   {"tnecputd", INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0007A0, OPCODE_MASK_H34C, tnecputd, anyware_inst },
52876cad711SPaolo Bonzini 
52976cad711SPaolo Bonzini   {"agetd",    INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000040, OPCODE_MASK_H34C, agetd,    anyware_inst },
53076cad711SPaolo Bonzini   {"tagetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0000C0, OPCODE_MASK_H34C, tagetd,   anyware_inst },
53176cad711SPaolo Bonzini   {"cagetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000140, OPCODE_MASK_H34C, cagetd,   anyware_inst },
53276cad711SPaolo Bonzini   {"tcagetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0001C0, OPCODE_MASK_H34C, tcagetd,  anyware_inst },
53376cad711SPaolo Bonzini   {"nagetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000240, OPCODE_MASK_H34C, nagetd,   anyware_inst },
53476cad711SPaolo Bonzini   {"tnagetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0002C0, OPCODE_MASK_H34C, tnagetd,  anyware_inst },
53576cad711SPaolo Bonzini   {"ncagetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000340, OPCODE_MASK_H34C, ncagetd,  anyware_inst },
53676cad711SPaolo Bonzini   {"tncagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0003C0, OPCODE_MASK_H34C, tncagetd, anyware_inst },
53776cad711SPaolo Bonzini   {"aputd",    INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000440, OPCODE_MASK_H34C, aputd,    anyware_inst },
53876cad711SPaolo Bonzini   {"taputd",   INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0004C0, OPCODE_MASK_H34C, taputd,   anyware_inst },
53976cad711SPaolo Bonzini   {"caputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000540, OPCODE_MASK_H34C, caputd,   anyware_inst },
54076cad711SPaolo Bonzini   {"tcaputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0005C0, OPCODE_MASK_H34C, tcaputd,  anyware_inst },
54176cad711SPaolo Bonzini   {"naputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000640, OPCODE_MASK_H34C, naputd,   anyware_inst },
54276cad711SPaolo Bonzini   {"tnaputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0006C0, OPCODE_MASK_H34C, tnaputd,  anyware_inst },
54376cad711SPaolo Bonzini   {"ncaputd",  INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000740, OPCODE_MASK_H34C, ncaputd,  anyware_inst },
54476cad711SPaolo Bonzini   {"tncaputd", INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0007C0, OPCODE_MASK_H34C, tncaputd, anyware_inst },
54576cad711SPaolo Bonzini 
54676cad711SPaolo Bonzini   {"eagetd",    INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000060, OPCODE_MASK_H34C, eagetd,    anyware_inst },
54776cad711SPaolo Bonzini   {"teagetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0000E0, OPCODE_MASK_H34C, teagetd,   anyware_inst },
54876cad711SPaolo Bonzini   {"ecagetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000160, OPCODE_MASK_H34C, ecagetd,   anyware_inst },
54976cad711SPaolo Bonzini   {"tecagetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0001E0, OPCODE_MASK_H34C, tecagetd,  anyware_inst },
55076cad711SPaolo Bonzini   {"neagetd",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000260, OPCODE_MASK_H34C, neagetd,   anyware_inst },
55176cad711SPaolo Bonzini   {"tneagetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0002E0, OPCODE_MASK_H34C, tneagetd,  anyware_inst },
55276cad711SPaolo Bonzini   {"necagetd",  INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000360, OPCODE_MASK_H34C, necagetd,  anyware_inst },
55376cad711SPaolo Bonzini   {"tnecagetd", INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0003E0, OPCODE_MASK_H34C, tnecagetd, anyware_inst },
55476cad711SPaolo Bonzini   {"eaputd",    INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000460, OPCODE_MASK_H34C, eaputd,    anyware_inst },
55576cad711SPaolo Bonzini   {"teaputd",   INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0004E0, OPCODE_MASK_H34C, teaputd,   anyware_inst },
55676cad711SPaolo Bonzini   {"ecaputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000560, OPCODE_MASK_H34C, ecaputd,   anyware_inst },
55776cad711SPaolo Bonzini   {"tecaputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0005E0, OPCODE_MASK_H34C, tecaputd,  anyware_inst },
55876cad711SPaolo Bonzini   {"neaputd",   INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000660, OPCODE_MASK_H34C, neaputd,   anyware_inst },
55976cad711SPaolo Bonzini   {"tneaputd",  INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0006E0, OPCODE_MASK_H34C, tneaputd,  anyware_inst },
56076cad711SPaolo Bonzini   {"necaputd",  INST_TYPE_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C000760, OPCODE_MASK_H34C, necaputd,  anyware_inst },
56176cad711SPaolo Bonzini   {"tnecaputd", INST_TYPE_R2,    INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x4C0007E0, OPCODE_MASK_H34C, tnecaputd, anyware_inst },
56276cad711SPaolo Bonzini   {"", 0, 0, 0, 0, 0, 0, 0, 0},
56376cad711SPaolo Bonzini };
56476cad711SPaolo Bonzini 
56576cad711SPaolo Bonzini /* prefix for register names */
566b0063d83SRichard Henderson #define register_prefix "r"
56776cad711SPaolo Bonzini 
56876cad711SPaolo Bonzini /* #defines for valid immediate range */
56976cad711SPaolo Bonzini #define MIN_IMM  ((int) 0x80000000)
57076cad711SPaolo Bonzini #define MAX_IMM  ((int) 0x7fffffff)
57176cad711SPaolo Bonzini 
57276cad711SPaolo Bonzini #define MIN_IMM15 ((int) 0x0000)
57376cad711SPaolo Bonzini #define MAX_IMM15 ((int) 0x7fff)
57476cad711SPaolo Bonzini 
57576cad711SPaolo Bonzini #endif /* MICROBLAZE_OPC */
57676cad711SPaolo Bonzini 
5773979fca4SMarkus Armbruster #include "disas/dis-asm.h"
57876cad711SPaolo Bonzini 
579b0063d83SRichard Henderson #define PRIreg    register_prefix "%ld"
580b35ab133SRichard Henderson #define PRIrfsl   register_prefix "fsl%ld"
581*a45e0b52SRichard Henderson #define PRIpvr    register_prefix "pvr%d"
582c521e0a3SRichard Henderson #define PRIimm    "%d"
583b0063d83SRichard Henderson 
584b0063d83SRichard Henderson #define get_field_rd(instr)      ((instr & RD_MASK) >> RD_LOW)
585b0063d83SRichard Henderson #define get_field_r1(instr)      ((instr & RA_MASK) >> RA_LOW)
586b0063d83SRichard Henderson #define get_field_r2(instr)      ((instr & RB_MASK) >> RB_LOW)
587b35ab133SRichard Henderson #define get_field_rfsl(instr)    (instr & RFSL_MASK)
588c521e0a3SRichard Henderson #define get_field_imm(instr)     ((int16_t)instr)
589c521e0a3SRichard Henderson #define get_field_imm5(instr)    ((int)instr & IMM5_MASK)
590c521e0a3SRichard Henderson #define get_field_imm15(instr)   ((int)instr & IMM15_MASK)
591c521e0a3SRichard Henderson 
59276cad711SPaolo Bonzini #define get_int_field_imm(instr) ((instr & IMM_MASK) >> IMM_LOW)
59376cad711SPaolo Bonzini #define get_int_field_r1(instr) ((instr & RA_MASK) >> RA_LOW)
59476cad711SPaolo Bonzini 
get_field_special(long instr,const struct op_code_struct * op)595*a45e0b52SRichard Henderson static int get_field_special(long instr, const struct op_code_struct *op)
59676cad711SPaolo Bonzini {
597*a45e0b52SRichard Henderson     return ((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask;
59876cad711SPaolo Bonzini }
59976cad711SPaolo Bonzini 
600*a45e0b52SRichard Henderson /* Returns NULL for PVR registers, which should be rendered differently. */
get_special_name(int special)601*a45e0b52SRichard Henderson static const char *get_special_name(int special)
60276cad711SPaolo Bonzini {
603*a45e0b52SRichard Henderson     switch (special) {
60476cad711SPaolo Bonzini     case REG_MSR_MASK:
605*a45e0b52SRichard Henderson         return register_prefix "msr";
60676cad711SPaolo Bonzini     case REG_PC_MASK:
607*a45e0b52SRichard Henderson         return register_prefix "pc";
60876cad711SPaolo Bonzini     case REG_EAR_MASK:
609*a45e0b52SRichard Henderson         return register_prefix "ear";
61076cad711SPaolo Bonzini     case REG_ESR_MASK:
611*a45e0b52SRichard Henderson         return register_prefix "esr";
61276cad711SPaolo Bonzini     case REG_FSR_MASK:
613*a45e0b52SRichard Henderson         return register_prefix "fsr";
61476cad711SPaolo Bonzini     case REG_BTR_MASK:
615*a45e0b52SRichard Henderson         return register_prefix "btr";
61676cad711SPaolo Bonzini     case REG_EDR_MASK:
617*a45e0b52SRichard Henderson         return register_prefix "edr";
61876cad711SPaolo Bonzini     case REG_PID_MASK:
619*a45e0b52SRichard Henderson         return register_prefix "pid";
62076cad711SPaolo Bonzini     case REG_ZPR_MASK:
621*a45e0b52SRichard Henderson         return register_prefix "zpr";
62276cad711SPaolo Bonzini     case REG_TLBX_MASK:
623*a45e0b52SRichard Henderson         return register_prefix "tlbx";
62476cad711SPaolo Bonzini     case REG_TLBLO_MASK:
625*a45e0b52SRichard Henderson         return register_prefix "tlblo";
62676cad711SPaolo Bonzini     case REG_TLBHI_MASK:
627*a45e0b52SRichard Henderson         return register_prefix "tlbhi";
62876cad711SPaolo Bonzini     case REG_TLBSX_MASK:
629*a45e0b52SRichard Henderson         return register_prefix "tlbsx";
63076cad711SPaolo Bonzini     default:
631*a45e0b52SRichard Henderson         if ((special & 0xE000) == REG_PVR_MASK) {
632*a45e0b52SRichard Henderson             /* pvr register */
633*a45e0b52SRichard Henderson             return NULL;
63476cad711SPaolo Bonzini         }
635*a45e0b52SRichard Henderson         return register_prefix "pc";
63676cad711SPaolo Bonzini     }
63776cad711SPaolo Bonzini }
63876cad711SPaolo Bonzini 
6399a32e6f3SStefan Weil static unsigned long
read_insn_microblaze(bfd_vma memaddr,struct disassemble_info * info,const struct op_code_struct ** opr)64076cad711SPaolo Bonzini read_insn_microblaze (bfd_vma memaddr,
64176cad711SPaolo Bonzini 		      struct disassemble_info *info,
6429a32e6f3SStefan Weil 		      const struct op_code_struct **opr)
64376cad711SPaolo Bonzini {
64476cad711SPaolo Bonzini   unsigned char       ibytes[4];
64576cad711SPaolo Bonzini   int                 status;
6469a32e6f3SStefan Weil   const struct op_code_struct *op;
64776cad711SPaolo Bonzini   unsigned long inst;
64876cad711SPaolo Bonzini 
64976cad711SPaolo Bonzini   status = info->read_memory_func (memaddr, ibytes, 4, info);
65076cad711SPaolo Bonzini 
65176cad711SPaolo Bonzini   if (status != 0)
65276cad711SPaolo Bonzini     {
65376cad711SPaolo Bonzini       info->memory_error_func (status, memaddr, info);
65476cad711SPaolo Bonzini       return 0;
65576cad711SPaolo Bonzini     }
65676cad711SPaolo Bonzini 
65776cad711SPaolo Bonzini   if (info->endian == BFD_ENDIAN_BIG)
6581d153a33SPeter Maydell     inst = ((unsigned)ibytes[0] << 24) | (ibytes[1] << 16)
6591d153a33SPeter Maydell       | (ibytes[2] << 8) | ibytes[3];
66076cad711SPaolo Bonzini   else if (info->endian == BFD_ENDIAN_LITTLE)
6611d153a33SPeter Maydell     inst = ((unsigned)ibytes[3] << 24) | (ibytes[2] << 16)
6621d153a33SPeter Maydell       | (ibytes[1] << 8) | ibytes[0];
66376cad711SPaolo Bonzini   else
66476cad711SPaolo Bonzini     abort ();
66576cad711SPaolo Bonzini 
66676cad711SPaolo Bonzini   /* Just a linear search of the table.  */
66776cad711SPaolo Bonzini   for (op = opcodes; op->name != 0; op ++)
66876cad711SPaolo Bonzini     if (op->bit_sequence == (inst & op->opcode_mask))
66976cad711SPaolo Bonzini       break;
67076cad711SPaolo Bonzini 
67176cad711SPaolo Bonzini   *opr = op;
67276cad711SPaolo Bonzini   return inst;
67376cad711SPaolo Bonzini }
67476cad711SPaolo Bonzini 
print_immval_addr(struct disassemble_info * info,bool immfound,int immval,unsigned inst,int addend)67558e5632cSRichard Henderson static void print_immval_addr(struct disassemble_info *info, bool immfound,
67658e5632cSRichard Henderson                               int immval, unsigned inst, int addend)
67758e5632cSRichard Henderson {
67858e5632cSRichard Henderson     if (info->print_address_func && info->symbol_at_address_func) {
67958e5632cSRichard Henderson         if (immfound) {
68058e5632cSRichard Henderson             immval |= get_int_field_imm(inst) & 0x0000ffff;
68158e5632cSRichard Henderson         } else {
68258e5632cSRichard Henderson             immval = (int16_t)get_int_field_imm(inst);
68358e5632cSRichard Henderson         }
68458e5632cSRichard Henderson         immval += addend;
68558e5632cSRichard Henderson         if (immval != 0 && info->symbol_at_address_func(immval, info)) {
68658e5632cSRichard Henderson             info->fprintf_func(info->stream, "\t// ");
68758e5632cSRichard Henderson             info->print_address_func (immval, info);
68858e5632cSRichard Henderson         } else if (addend) {
68958e5632cSRichard Henderson             info->fprintf_func(info->stream, "\t// %x", immval);
69058e5632cSRichard Henderson         }
69158e5632cSRichard Henderson     }
69258e5632cSRichard Henderson }
69376cad711SPaolo Bonzini 
69476cad711SPaolo Bonzini int
print_insn_microblaze(bfd_vma memaddr,struct disassemble_info * info)69576cad711SPaolo Bonzini print_insn_microblaze(bfd_vma memaddr, struct disassemble_info *info)
69676cad711SPaolo Bonzini {
69776cad711SPaolo Bonzini     fprintf_function fprintf_func = info->fprintf_func;
69876cad711SPaolo Bonzini     void *stream = info->stream;
69976cad711SPaolo Bonzini     unsigned long inst, prev_inst;
7009a32e6f3SStefan Weil     const struct op_code_struct *op, *pop;
70176cad711SPaolo Bonzini     int immval = 0;
702c3c6fed6SRichard Henderson     bool immfound = false;
70376cad711SPaolo Bonzini     static bfd_vma prev_insn_addr = -1; /*init the prev insn addr */
70476cad711SPaolo Bonzini     static int prev_insn_vma = -1;  /*init the prev insn vma */
70576cad711SPaolo Bonzini     int curr_insn_vma = info->buffer_vma;
706*a45e0b52SRichard Henderson     int special;
707*a45e0b52SRichard Henderson     const char *special_name;
70876cad711SPaolo Bonzini 
70976cad711SPaolo Bonzini     info->bytes_per_chunk = 4;
71076cad711SPaolo Bonzini 
71176cad711SPaolo Bonzini     inst = read_insn_microblaze (memaddr, info, &op);
71276cad711SPaolo Bonzini     if (inst == 0) {
71376cad711SPaolo Bonzini         return -1;
71476cad711SPaolo Bonzini     }
71576cad711SPaolo Bonzini 
71676cad711SPaolo Bonzini     if (prev_insn_vma == curr_insn_vma) {
717c3c6fed6SRichard Henderson         if (memaddr - info->bytes_per_chunk == prev_insn_addr) {
71876cad711SPaolo Bonzini             prev_inst = read_insn_microblaze (prev_insn_addr, info, &pop);
71976cad711SPaolo Bonzini             if (prev_inst == 0)
72076cad711SPaolo Bonzini                 return -1;
72176cad711SPaolo Bonzini             if (pop->instr == imm) {
72276cad711SPaolo Bonzini                 immval = (get_int_field_imm(prev_inst) << 16) & 0xffff0000;
72376cad711SPaolo Bonzini                 immfound = TRUE;
72476cad711SPaolo Bonzini             }
72576cad711SPaolo Bonzini             else {
72676cad711SPaolo Bonzini                 immval = 0;
72776cad711SPaolo Bonzini                 immfound = FALSE;
72876cad711SPaolo Bonzini             }
72976cad711SPaolo Bonzini         }
73076cad711SPaolo Bonzini     }
73176cad711SPaolo Bonzini     /* make curr insn as prev insn */
73276cad711SPaolo Bonzini     prev_insn_addr = memaddr;
73376cad711SPaolo Bonzini     prev_insn_vma = curr_insn_vma;
73476cad711SPaolo Bonzini 
73576cad711SPaolo Bonzini     if (op->name == 0) {
73676cad711SPaolo Bonzini         fprintf_func (stream, ".short 0x%04lx", inst);
737c3c6fed6SRichard Henderson         return 4;
73876cad711SPaolo Bonzini     }
739c3c6fed6SRichard Henderson 
740c3c6fed6SRichard Henderson     switch (op->inst_type) {
74176cad711SPaolo Bonzini     case INST_TYPE_RD_R1_R2:
742b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg ", " PRIreg,
743de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_r1(inst),
744c3c6fed6SRichard Henderson                      get_field_r2(inst));
74576cad711SPaolo Bonzini         break;
74676cad711SPaolo Bonzini     case INST_TYPE_RD_R1_IMM:
747c521e0a3SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg ", " PRIimm,
748de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_r1(inst),
749c3c6fed6SRichard Henderson                      get_field_imm(inst));
75058e5632cSRichard Henderson         if (get_int_field_r1(inst) == 0) {
75158e5632cSRichard Henderson             print_immval_addr(info, immfound, immval, inst, 0);
75276cad711SPaolo Bonzini         }
75376cad711SPaolo Bonzini         break;
75476cad711SPaolo Bonzini     case INST_TYPE_RD_R1_IMM5:
755c521e0a3SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg ", " PRIimm,
756de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_r1(inst),
757c3c6fed6SRichard Henderson                      get_field_imm5(inst));
75876cad711SPaolo Bonzini         break;
75976cad711SPaolo Bonzini     case INST_TYPE_RD_RFSL:
760b35ab133SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIrfsl,
761de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_rfsl(inst));
76276cad711SPaolo Bonzini         break;
76376cad711SPaolo Bonzini     case INST_TYPE_R1_RFSL:
764b35ab133SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIrfsl,
765de66f9f7SRichard Henderson                      op->name, get_field_r1(inst), get_field_rfsl(inst));
76676cad711SPaolo Bonzini         break;
76776cad711SPaolo Bonzini     case INST_TYPE_RD_SPECIAL:
768*a45e0b52SRichard Henderson         special = get_field_special(inst, op);
769*a45e0b52SRichard Henderson         special_name = get_special_name(special);
770*a45e0b52SRichard Henderson         if (special_name) {
771b0063d83SRichard Henderson             fprintf_func(stream, "%s\t" PRIreg ", %s",
772*a45e0b52SRichard Henderson                          op->name, get_field_rd(inst), special_name);
773*a45e0b52SRichard Henderson         } else {
774*a45e0b52SRichard Henderson             fprintf_func(stream, "%s\t" PRIreg ", " PRIpvr,
775*a45e0b52SRichard Henderson                          op->name, get_field_rd(inst), special ^ REG_PVR_MASK);
776*a45e0b52SRichard Henderson         }
77776cad711SPaolo Bonzini         break;
77876cad711SPaolo Bonzini     case INST_TYPE_SPECIAL_R1:
779*a45e0b52SRichard Henderson         special = get_field_special(inst, op);
780*a45e0b52SRichard Henderson         special_name = get_special_name(special);
781*a45e0b52SRichard Henderson         if (special_name) {
782b0063d83SRichard Henderson             fprintf_func(stream, "%s\t%s, " PRIreg,
783*a45e0b52SRichard Henderson                          op->name, special_name, get_field_r1(inst));
784*a45e0b52SRichard Henderson         } else {
785*a45e0b52SRichard Henderson             fprintf_func(stream, "%s\t" PRIpvr ", " PRIreg,
786*a45e0b52SRichard Henderson                          op->name, special ^ REG_PVR_MASK, get_field_r1(inst));
787*a45e0b52SRichard Henderson         }
78876cad711SPaolo Bonzini         break;
78976cad711SPaolo Bonzini     case INST_TYPE_RD_R1:
790b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg,
791de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_r1(inst));
79276cad711SPaolo Bonzini         break;
79376cad711SPaolo Bonzini     case INST_TYPE_R1_R2:
794b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg,
795de66f9f7SRichard Henderson                      op->name, get_field_r1(inst), get_field_r2(inst));
79676cad711SPaolo Bonzini         break;
79776cad711SPaolo Bonzini     case INST_TYPE_R1_IMM:
798c521e0a3SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIimm,
799de66f9f7SRichard Henderson                      op->name, get_field_r1(inst), get_field_imm(inst));
800c3c6fed6SRichard Henderson         /*
801c3c6fed6SRichard Henderson          * The non-pc relative instructions are returns,
802c3c6fed6SRichard Henderson          * which shouldn't have a label printed.
803c3c6fed6SRichard Henderson          */
80458e5632cSRichard Henderson         if (op->inst_offset_type == INST_PC_OFFSET) {
80558e5632cSRichard Henderson             print_immval_addr(info, immfound, immval, inst, memaddr);
80676cad711SPaolo Bonzini         }
80776cad711SPaolo Bonzini         break;
80876cad711SPaolo Bonzini     case INST_TYPE_RD_IMM:
809c521e0a3SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIimm,
810de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_imm(inst));
81158e5632cSRichard Henderson         print_immval_addr(info, immfound, immval, inst,
81258e5632cSRichard Henderson                           op->inst_offset_type == INST_PC_OFFSET
81358e5632cSRichard Henderson                           ? memaddr : 0);
81476cad711SPaolo Bonzini         break;
81576cad711SPaolo Bonzini     case INST_TYPE_IMM:
816c521e0a3SRichard Henderson         fprintf_func(stream, "%s\t" PRIimm,
817de66f9f7SRichard Henderson                      op->name, get_field_imm(inst));
81858e5632cSRichard Henderson         if (op->instr != imm) {
81958e5632cSRichard Henderson             print_immval_addr(info, immfound, immval, inst,
82058e5632cSRichard Henderson                               op->inst_offset_type == INST_PC_OFFSET
82158e5632cSRichard Henderson                               ? memaddr : 0);
82276cad711SPaolo Bonzini         }
82376cad711SPaolo Bonzini         break;
82476cad711SPaolo Bonzini     case INST_TYPE_RD_R2:
825b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg,
826de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_r2(inst));
82776cad711SPaolo Bonzini         break;
82876cad711SPaolo Bonzini     case INST_TYPE_R2:
829b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg,
830de66f9f7SRichard Henderson                      op->name, get_field_r2(inst));
83176cad711SPaolo Bonzini         break;
83276cad711SPaolo Bonzini     case INST_TYPE_R1:
833b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg,
834de66f9f7SRichard Henderson                      op->name, get_field_r1(inst));
83576cad711SPaolo Bonzini         break;
83676cad711SPaolo Bonzini     case INST_TYPE_RD_R1_SPECIAL:
837b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIreg,
838de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_r2(inst));
83976cad711SPaolo Bonzini         break;
84076cad711SPaolo Bonzini     case INST_TYPE_RD_IMM15:
841c521e0a3SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg ", " PRIimm,
842de66f9f7SRichard Henderson                      op->name, get_field_rd(inst), get_field_imm15(inst));
84376cad711SPaolo Bonzini         break;
84476cad711SPaolo Bonzini         /* For tuqula instruction */
84576cad711SPaolo Bonzini     case INST_TYPE_RD:
846b0063d83SRichard Henderson         fprintf_func(stream, "%s\t" PRIreg,
847de66f9f7SRichard Henderson                      op->name, get_field_rd(inst));
84876cad711SPaolo Bonzini         break;
84976cad711SPaolo Bonzini     case INST_TYPE_RFSL:
850b35ab133SRichard Henderson         fprintf_func(stream, "%s\t" PRIrfsl,
851de66f9f7SRichard Henderson                      op->name, get_field_rfsl(inst));
85276cad711SPaolo Bonzini         break;
85376cad711SPaolo Bonzini     default:
85476cad711SPaolo Bonzini         /* if the disassembler lags the instruction set */
855de66f9f7SRichard Henderson         fprintf_func(stream, "%s\tundecoded operands, inst is 0x%04lx",
856de66f9f7SRichard Henderson                      op->name, inst);
85776cad711SPaolo Bonzini         break;
85876cad711SPaolo Bonzini     }
85976cad711SPaolo Bonzini     return 4;
86076cad711SPaolo Bonzini }
861