Statistics
| Branch: | Revision:

root / microblaze-dis.c @ b09ea7d5

History | View | Annotate | Download (40 kB)

1 e90e390c Edgar E. Iglesias
/* Disassemble Xilinx microblaze instructions.
2 e90e390c Edgar E. Iglesias
   Copyright (C) 1993, 1999, 2000 Free Software Foundation, Inc.
3 e90e390c Edgar E. Iglesias

4 e90e390c Edgar E. Iglesias
This program is free software; you can redistribute it and/or modify
5 e90e390c Edgar E. Iglesias
it under the terms of the GNU General Public License as published by
6 e90e390c Edgar E. Iglesias
the Free Software Foundation; either version 2 of the License, or
7 e90e390c Edgar E. Iglesias
(at your option) any later version.
8 e90e390c Edgar E. Iglesias

9 e90e390c Edgar E. Iglesias
This program is distributed in the hope that it will be useful,
10 e90e390c Edgar E. Iglesias
but WITHOUT ANY WARRANTY; without even the implied warranty of
11 e90e390c Edgar E. Iglesias
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 e90e390c Edgar E. Iglesias
GNU General Public License for more details.
13 e90e390c Edgar E. Iglesias

14 e90e390c Edgar E. Iglesias
You should have received a copy of the GNU General Public License
15 e90e390c Edgar E. Iglesias
along with this program; if not, write to the Free Software
16 e90e390c Edgar E. Iglesias
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17 e90e390c Edgar E. Iglesias
18 e90e390c Edgar E. Iglesias
/*
19 e90e390c Edgar E. Iglesias
 * Copyright (c) 2001 Xilinx, Inc.  All rights reserved. 
20 e90e390c Edgar E. Iglesias
 *
21 e90e390c Edgar E. Iglesias
 * Redistribution and use in source and binary forms are permitted
22 e90e390c Edgar E. Iglesias
 * provided that the above copyright notice and this paragraph are
23 e90e390c Edgar E. Iglesias
 * duplicated in all such forms and that any documentation,
24 e90e390c Edgar E. Iglesias
 * advertising materials, and other materials related to such
25 e90e390c Edgar E. Iglesias
 * distribution and use acknowledge that the software was developed
26 e90e390c Edgar E. Iglesias
 * by Xilinx, Inc.  The name of the Company may not be used to endorse 
27 e90e390c Edgar E. Iglesias
 * or promote products derived from this software without specific prior 
28 e90e390c Edgar E. Iglesias
 * written permission.
29 e90e390c Edgar E. Iglesias
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
30 e90e390c Edgar E. Iglesias
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
31 e90e390c Edgar E. Iglesias
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
32 e90e390c Edgar E. Iglesias
 *
33 e90e390c Edgar E. Iglesias
 *        Xilinx, Inc.
34 e90e390c Edgar E. Iglesias
 */
35 e90e390c Edgar E. Iglesias
36 e90e390c Edgar E. Iglesias
37 e90e390c Edgar E. Iglesias
#include <stdio.h>
38 e90e390c Edgar E. Iglesias
#define STATIC_TABLE
39 e90e390c Edgar E. Iglesias
#define DEFINE_TABLE
40 e90e390c Edgar E. Iglesias
41 e90e390c Edgar E. Iglesias
#ifndef MICROBLAZE_OPC
42 e90e390c Edgar E. Iglesias
#define MICROBLAZE_OPC
43 e90e390c Edgar E. Iglesias
/* Assembler instructions for Xilinx's microblaze processor
44 e90e390c Edgar E. Iglesias
   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
45 e90e390c Edgar E. Iglesias

46 e90e390c Edgar E. Iglesias
   
47 e90e390c Edgar E. Iglesias
This program is free software; you can redistribute it and/or modify
48 e90e390c Edgar E. Iglesias
it under the terms of the GNU General Public License as published by
49 e90e390c Edgar E. Iglesias
the Free Software Foundation; either version 2 of the License, or
50 e90e390c Edgar E. Iglesias
(at your option) any later version.
51 e90e390c Edgar E. Iglesias

52 e90e390c Edgar E. Iglesias
This program is distributed in the hope that it will be useful,
53 e90e390c Edgar E. Iglesias
but WITHOUT ANY WARRANTY; without even the implied warranty of
54 e90e390c Edgar E. Iglesias
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
55 e90e390c Edgar E. Iglesias
GNU General Public License for more details.
56 e90e390c Edgar E. Iglesias

57 e90e390c Edgar E. Iglesias
You should have received a copy of the GNU General Public License
58 e90e390c Edgar E. Iglesias
along with this program; if not, write to the Free Software
59 e90e390c Edgar E. Iglesias
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
60 e90e390c Edgar E. Iglesias
61 e90e390c Edgar E. Iglesias
/*
62 e90e390c Edgar E. Iglesias
 * Copyright (c) 2001 Xilinx, Inc.  All rights reserved. 
63 e90e390c Edgar E. Iglesias
 *
64 e90e390c Edgar E. Iglesias
 * Redistribution and use in source and binary forms are permitted
65 e90e390c Edgar E. Iglesias
 * provided that the above copyright notice and this paragraph are
66 e90e390c Edgar E. Iglesias
 * duplicated in all such forms and that any documentation,
67 e90e390c Edgar E. Iglesias
 * advertising materials, and other materials related to such
68 e90e390c Edgar E. Iglesias
 * distribution and use acknowledge that the software was developed
69 e90e390c Edgar E. Iglesias
 * by Xilinx, Inc.  The name of the Company may not be used to endorse 
70 e90e390c Edgar E. Iglesias
 * or promote products derived from this software without specific prior 
71 e90e390c Edgar E. Iglesias
 * written permission.
72 e90e390c Edgar E. Iglesias
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
73 e90e390c Edgar E. Iglesias
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
74 e90e390c Edgar E. Iglesias
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
75 e90e390c Edgar E. Iglesias
 *
76 e90e390c Edgar E. Iglesias
 *        Xilinx, Inc.
77 e90e390c Edgar E. Iglesias
 */
78 e90e390c Edgar E. Iglesias
79 e90e390c Edgar E. Iglesias
80 e90e390c Edgar E. Iglesias
#ifndef MICROBLAZE_OPCM
81 e90e390c Edgar E. Iglesias
#define MICROBLAZE_OPCM
82 e90e390c Edgar E. Iglesias
83 e90e390c Edgar E. Iglesias
/*
84 e90e390c Edgar E. Iglesias
 * Copyright (c) 2001 Xilinx, Inc.  All rights reserved. 
85 e90e390c Edgar E. Iglesias
 *
86 e90e390c Edgar E. Iglesias
 * Redistribution and use in source and binary forms are permitted
87 e90e390c Edgar E. Iglesias
 * provided that the above copyright notice and this paragraph are
88 e90e390c Edgar E. Iglesias
 * duplicated in all such forms and that any documentation,
89 e90e390c Edgar E. Iglesias
 * advertising materials, and other materials related to such
90 e90e390c Edgar E. Iglesias
 * distribution and use acknowledge that the software was developed
91 e90e390c Edgar E. Iglesias
 * by Xilinx, Inc.  The name of the Company may not be used to endorse 
92 e90e390c Edgar E. Iglesias
 * or promote products derived from this software without specific prior 
93 e90e390c Edgar E. Iglesias
 * written permission.
94 e90e390c Edgar E. Iglesias
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
95 e90e390c Edgar E. Iglesias
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
96 e90e390c Edgar E. Iglesias
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
97 e90e390c Edgar E. Iglesias
 *
98 e90e390c Edgar E. Iglesias
 *        Xilinx, Inc.
99 e90e390c Edgar E. Iglesias
 * $Header:
100 e90e390c Edgar E. Iglesias
 */
101 e90e390c Edgar E. Iglesias
102 e90e390c Edgar E. Iglesias
enum microblaze_instr {
103 e90e390c Edgar E. Iglesias
   add, rsub, addc, rsubc, addk, rsubk, addkc, rsubkc, cmp, cmpu,
104 e90e390c Edgar E. Iglesias
   addi, rsubi, addic, rsubic, addik, rsubik, addikc, rsubikc, mul,
105 e90e390c Edgar E. Iglesias
   idiv, idivu, bsll, bsra, bsrl, get, put, nget, nput, cget, cput,
106 e90e390c Edgar E. Iglesias
   ncget, ncput, muli, bslli, bsrai, bsrli, mului, or, and, xor,
107 e90e390c Edgar E. Iglesias
   andn, pcmpbf, pcmpbc, pcmpeq, pcmpne, sra, src, srl, sext8, sext16, wic, wdc, mts, mfs, br, brd,
108 e90e390c Edgar E. Iglesias
   brld, bra, brad, brald, microblaze_brk, beq, beqd, bne, bned, blt,
109 e90e390c Edgar E. Iglesias
   bltd, ble, bled, bgt, bgtd, bge, bged, ori, andi, xori, andni,
110 e90e390c Edgar E. Iglesias
   imm, rtsd, rtid, rtbd, rted, bri, brid, brlid, brai, braid, bralid,
111 e90e390c Edgar E. Iglesias
   brki, beqi, beqid, bnei, bneid, blti, bltid, blei, bleid, bgti,
112 e90e390c Edgar E. Iglesias
   bgtid, bgei, bgeid, lbu, lhu, lw, sb, sh, sw, lbui, lhui, lwi,
113 e90e390c Edgar E. Iglesias
   sbi, shi, swi, msrset, msrclr, tuqula, fadd, frsub, fmul, fdiv, 
114 e90e390c Edgar E. Iglesias
   fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, invalid_inst } ;
115 e90e390c Edgar E. Iglesias
116 e90e390c Edgar E. Iglesias
enum microblaze_instr_type {
117 e90e390c Edgar E. Iglesias
   arithmetic_inst, logical_inst, mult_inst, div_inst, branch_inst,
118 e90e390c Edgar E. Iglesias
   return_inst, immediate_inst, special_inst, memory_load_inst,
119 e90e390c Edgar E. Iglesias
   memory_store_inst, barrel_shift_inst, anyware_inst };
120 e90e390c Edgar E. Iglesias
121 e90e390c Edgar E. Iglesias
#define INST_WORD_SIZE 4
122 e90e390c Edgar E. Iglesias
123 e90e390c Edgar E. Iglesias
/* gen purpose regs go from 0 to 31 */
124 e90e390c Edgar E. Iglesias
/* mask is reg num - max_reg_num, ie reg_num - 32 in this case */
125 e90e390c Edgar E. Iglesias
126 e90e390c Edgar E. Iglesias
#define REG_PC_MASK 0x8000
127 e90e390c Edgar E. Iglesias
#define REG_MSR_MASK 0x8001
128 e90e390c Edgar E. Iglesias
#define REG_EAR_MASK 0x8003
129 e90e390c Edgar E. Iglesias
#define REG_ESR_MASK 0x8005
130 e90e390c Edgar E. Iglesias
#define REG_FSR_MASK 0x8007
131 e90e390c Edgar E. Iglesias
132 e90e390c Edgar E. Iglesias
#define MIN_REGNUM 0
133 e90e390c Edgar E. Iglesias
#define MAX_REGNUM 31
134 e90e390c Edgar E. Iglesias
135 e90e390c Edgar E. Iglesias
#define REG_PC  32 /* PC */
136 e90e390c Edgar E. Iglesias
#define REG_MSR 33 /* machine status reg */
137 e90e390c Edgar E. Iglesias
#define REG_EAR 35 /* Exception reg */
138 e90e390c Edgar E. Iglesias
#define REG_ESR 37 /* Exception reg */
139 e90e390c Edgar E. Iglesias
#define REG_FSR 39 /* FPU Status reg */
140 e90e390c Edgar E. Iglesias
141 e90e390c Edgar E. Iglesias
/* alternate names for gen purpose regs */
142 e90e390c Edgar E. Iglesias
#define REG_SP  1 /* stack pointer */
143 e90e390c Edgar E. Iglesias
#define REG_ROSDP 2 /* read-only small data pointer */
144 e90e390c Edgar E. Iglesias
#define REG_RWSDP 13 /* read-write small data pointer */
145 e90e390c Edgar E. Iglesias
146 e90e390c Edgar E. Iglesias
/* Assembler Register - Used in Delay Slot Optimization */
147 e90e390c Edgar E. Iglesias
#define REG_AS    18
148 e90e390c Edgar E. Iglesias
#define REG_ZERO  0
149 e90e390c Edgar E. Iglesias
 
150 e90e390c Edgar E. Iglesias
#define RD_LOW  21 /* low bit for RD */
151 e90e390c Edgar E. Iglesias
#define RA_LOW  16 /* low bit for RA */
152 e90e390c Edgar E. Iglesias
#define RB_LOW  11 /* low bit for RB */
153 e90e390c Edgar E. Iglesias
#define IMM_LOW  0 /* low bit for immediate */
154 e90e390c Edgar E. Iglesias
155 e90e390c Edgar E. Iglesias
#define RD_MASK 0x03E00000
156 e90e390c Edgar E. Iglesias
#define RA_MASK 0x001F0000
157 e90e390c Edgar E. Iglesias
#define RB_MASK 0x0000F800
158 e90e390c Edgar E. Iglesias
#define IMM_MASK 0x0000FFFF
159 e90e390c Edgar E. Iglesias
160 e90e390c Edgar E. Iglesias
// imm mask for barrel shifts
161 e90e390c Edgar E. Iglesias
#define IMM5_MASK 0x0000001F
162 e90e390c Edgar E. Iglesias
163 e90e390c Edgar E. Iglesias
164 e90e390c Edgar E. Iglesias
// imm mask for get, put instructions
165 e90e390c Edgar E. Iglesias
#define  IMM12_MASK 0x00000FFF
166 e90e390c Edgar E. Iglesias
167 e90e390c Edgar E. Iglesias
// imm mask for msrset, msrclr instructions
168 e90e390c Edgar E. Iglesias
#define  IMM14_MASK 0x00003FFF
169 e90e390c Edgar E. Iglesias
170 e90e390c Edgar E. Iglesias
#endif /* MICROBLAZE-OPCM */
171 e90e390c Edgar E. Iglesias
172 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R1_R2 0
173 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R1_IMM 1
174 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R1_UNSIGNED_IMM 2
175 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R1 3
176 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R2 4
177 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_IMM 5
178 e90e390c Edgar E. Iglesias
#define INST_TYPE_R2 6
179 e90e390c Edgar E. Iglesias
#define INST_TYPE_R1_R2 7
180 e90e390c Edgar E. Iglesias
#define INST_TYPE_R1_IMM 8
181 e90e390c Edgar E. Iglesias
#define INST_TYPE_IMM 9
182 e90e390c Edgar E. Iglesias
#define INST_TYPE_SPECIAL_R1 10
183 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_SPECIAL 11
184 e90e390c Edgar E. Iglesias
#define INST_TYPE_R1 12
185 e90e390c Edgar E. Iglesias
  // new instn type for barrel shift imms
186 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R1_IMM5  13
187 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_IMM12    14
188 e90e390c Edgar E. Iglesias
#define INST_TYPE_R1_IMM12    15
189 e90e390c Edgar E. Iglesias
190 e90e390c Edgar E. Iglesias
  // new insn type for insn cache
191 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_R1_SPECIAL 16
192 e90e390c Edgar E. Iglesias
193 e90e390c Edgar E. Iglesias
// new insn type for msrclr, msrset insns.
194 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD_IMM14    17
195 e90e390c Edgar E. Iglesias
196 e90e390c Edgar E. Iglesias
// new insn type for tuqula rd - addik rd, r0, 42
197 e90e390c Edgar E. Iglesias
#define INST_TYPE_RD    18
198 e90e390c Edgar E. Iglesias
199 e90e390c Edgar E. Iglesias
#define INST_TYPE_NONE 25
200 e90e390c Edgar E. Iglesias
201 e90e390c Edgar E. Iglesias
202 e90e390c Edgar E. Iglesias
203 e90e390c Edgar E. Iglesias
#define INST_PC_OFFSET 1 /* instructions where the label address is resolved as a PC offset (for branch label)*/
204 e90e390c Edgar E. Iglesias
#define INST_NO_OFFSET 0 /* instructions where the label address is resolved as an absolute value (for data mem or abs address)*/
205 e90e390c Edgar E. Iglesias
206 e90e390c Edgar E. Iglesias
#define IMMVAL_MASK_NON_SPECIAL 0x0000
207 e90e390c Edgar E. Iglesias
#define IMMVAL_MASK_MTS 0x4000
208 e90e390c Edgar E. Iglesias
#define IMMVAL_MASK_MFS 0x0000
209 e90e390c Edgar E. Iglesias
210 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H   0xFC000000 /* High 6 bits only */
211 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H1  0xFFE00000 /* High 11 bits */
212 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H2  0xFC1F0000 /* High 6 and bits 20-16 */
213 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H12 0xFFFF0000 /* High 16 */
214 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H4  0xFC0007FF /* High 6 and low 11 bits */
215 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H13S 0xFFE0FFF0 /* High 11 and 15:1 bits and last nibble of last byte for spr */
216 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H23S 0xFC1FFFF0 /* High 6, 20-16 and 15:1 bits and last nibble of last byte for spr */
217 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H34 0xFC00FFFF /* High 6 and low 16 bits */
218 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H14 0xFFE007FF /* High 11 and low 11 bits */
219 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H24 0xFC1F07FF /* High 6, bits 20-16 and low 11 bits */
220 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H124  0xFFFF07FF /* High 16, and low 11 bits */
221 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H1234 0xFFFFFFFF /* All 32 bits */
222 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H3  0xFC000600 /* High 6 bits and bits 21, 22 */  
223 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H32 0xFC00F000 /* High 6 bits and bit 16, 17, 18 and 19*/
224 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H34B   0xFC0000FF /* High 6 bits and low 8 bits */
225 e90e390c Edgar E. Iglesias
226 e90e390c Edgar E. Iglesias
// New Mask for msrset, msrclr insns.
227 e90e390c Edgar E. Iglesias
#define OPCODE_MASK_H23N  0xFC1FC000 /* High 6 and bits 12 - 18 */
228 e90e390c Edgar E. Iglesias
229 e90e390c Edgar E. Iglesias
#define DELAY_SLOT 1
230 e90e390c Edgar E. Iglesias
#define NO_DELAY_SLOT 0
231 e90e390c Edgar E. Iglesias
232 e90e390c Edgar E. Iglesias
#define MAX_OPCODES 149
233 e90e390c Edgar E. Iglesias
234 e90e390c Edgar E. Iglesias
struct op_code_struct {
235 e90e390c Edgar E. Iglesias
  const char *name;
236 e90e390c Edgar E. Iglesias
  short inst_type; /* registers and immediate values involved */
237 e90e390c Edgar E. Iglesias
  short inst_offset_type; /* immediate vals offset from PC? (= 1 for branches) */
238 e90e390c Edgar E. Iglesias
  short delay_slots; /* info about delay slots needed after this instr. */
239 e90e390c Edgar E. Iglesias
  short immval_mask;
240 e90e390c Edgar E. Iglesias
  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 */ 
241 e90e390c Edgar E. Iglesias
  unsigned long opcode_mask; /* which bits define the opcode */
242 e90e390c Edgar E. Iglesias
  enum microblaze_instr instr;
243 e90e390c Edgar E. Iglesias
  enum microblaze_instr_type instr_type;
244 e90e390c Edgar E. Iglesias
  /* more info about output format here */
245 e90e390c Edgar E. Iglesias
} opcodes[MAX_OPCODES] = 
246 e90e390c Edgar E. Iglesias
247 e90e390c Edgar E. Iglesias
{ 
248 e90e390c Edgar E. Iglesias
  {"add",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst },
249 e90e390c Edgar E. Iglesias
  {"rsub",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst },
250 e90e390c Edgar E. Iglesias
  {"addc",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst },
251 e90e390c Edgar E. Iglesias
  {"rsubc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x0C000000, OPCODE_MASK_H4, rsubc, arithmetic_inst },
252 e90e390c Edgar E. Iglesias
  {"addk",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x10000000, OPCODE_MASK_H4, addk, arithmetic_inst },
253 e90e390c Edgar E. Iglesias
  {"rsubk", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000000, OPCODE_MASK_H4, rsubk, arithmetic_inst },
254 e90e390c Edgar E. Iglesias
  {"cmp",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000001, OPCODE_MASK_H4, cmp, arithmetic_inst },
255 e90e390c Edgar E. Iglesias
  {"cmpu",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000003, OPCODE_MASK_H4, cmpu, arithmetic_inst },
256 e90e390c Edgar E. Iglesias
  {"addkc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x18000000, OPCODE_MASK_H4, addkc, arithmetic_inst },
257 e90e390c Edgar E. Iglesias
  {"rsubkc",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x1C000000, OPCODE_MASK_H4, rsubkc, arithmetic_inst },
258 e90e390c Edgar E. Iglesias
  {"addi",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x20000000, OPCODE_MASK_H, addi, arithmetic_inst },
259 e90e390c Edgar E. Iglesias
  {"rsubi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x24000000, OPCODE_MASK_H, rsubi, arithmetic_inst },
260 e90e390c Edgar E. Iglesias
  {"addic", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x28000000, OPCODE_MASK_H, addic, arithmetic_inst },
261 e90e390c Edgar E. Iglesias
  {"rsubic",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x2C000000, OPCODE_MASK_H, rsubic, arithmetic_inst },
262 e90e390c Edgar E. Iglesias
  {"addik", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, addik, arithmetic_inst },
263 e90e390c Edgar E. Iglesias
  {"rsubik",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x34000000, OPCODE_MASK_H, rsubik, arithmetic_inst },
264 e90e390c Edgar E. Iglesias
  {"addikc",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x38000000, OPCODE_MASK_H, addikc, arithmetic_inst },
265 e90e390c Edgar E. Iglesias
  {"rsubikc",INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3C000000, OPCODE_MASK_H, rsubikc, arithmetic_inst },
266 e90e390c Edgar E. Iglesias
  {"mul",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000000, OPCODE_MASK_H4, mul, mult_inst },
267 e90e390c Edgar E. Iglesias
  {"idiv",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x48000000, OPCODE_MASK_H4, idiv, div_inst },
268 e90e390c Edgar E. Iglesias
  {"idivu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x48000002, OPCODE_MASK_H4, idivu, div_inst },
269 e90e390c Edgar E. Iglesias
  {"bsll",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000400, OPCODE_MASK_H3, bsll, barrel_shift_inst },
270 e90e390c Edgar E. Iglesias
  {"bsra",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000200, OPCODE_MASK_H3, bsra, barrel_shift_inst },
271 e90e390c Edgar E. Iglesias
  {"bsrl",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000000, OPCODE_MASK_H3, bsrl, barrel_shift_inst },
272 e90e390c Edgar E. Iglesias
  {"get",   INST_TYPE_RD_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C000000, OPCODE_MASK_H32, get, anyware_inst },
273 e90e390c Edgar E. Iglesias
  {"put",   INST_TYPE_R1_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C008000, OPCODE_MASK_H32, put, anyware_inst },
274 e90e390c Edgar E. Iglesias
  {"nget",  INST_TYPE_RD_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C004000, OPCODE_MASK_H32, nget, anyware_inst },
275 e90e390c Edgar E. Iglesias
  {"nput",  INST_TYPE_R1_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00C000, OPCODE_MASK_H32, nput, anyware_inst },
276 e90e390c Edgar E. Iglesias
  {"cget",  INST_TYPE_RD_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C002000, OPCODE_MASK_H32, cget, anyware_inst },
277 e90e390c Edgar E. Iglesias
  {"cput",  INST_TYPE_R1_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00A000, OPCODE_MASK_H32, cput, anyware_inst },
278 e90e390c Edgar E. Iglesias
  {"ncget", INST_TYPE_RD_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst },
279 e90e390c Edgar E. Iglesias
  {"ncput", INST_TYPE_R1_IMM12, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst },
280 e90e390c Edgar E. Iglesias
  {"muli",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst },
281 e90e390c Edgar E. Iglesias
  {"bslli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000400, OPCODE_MASK_H3, bslli, barrel_shift_inst },
282 e90e390c Edgar E. Iglesias
  {"bsrai", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000200, OPCODE_MASK_H3, bsrai, barrel_shift_inst },
283 e90e390c Edgar E. Iglesias
  {"bsrli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000000, OPCODE_MASK_H3, bsrli, barrel_shift_inst },
284 e90e390c Edgar E. Iglesias
  {"or",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, or, logical_inst },
285 e90e390c Edgar E. Iglesias
  {"and",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, and, logical_inst },
286 e90e390c Edgar E. Iglesias
  {"xor",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, xor, logical_inst },
287 e90e390c Edgar E. Iglesias
  {"andn",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x8C000000, OPCODE_MASK_H4, andn, logical_inst },
288 e90e390c Edgar E. Iglesias
  {"pcmpbf",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000400, OPCODE_MASK_H4, pcmpbf, logical_inst },
289 e90e390c Edgar E. Iglesias
  {"pcmpbc",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000400, OPCODE_MASK_H4, pcmpbc, logical_inst },
290 e90e390c Edgar E. Iglesias
  {"pcmpeq",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000400, OPCODE_MASK_H4, pcmpeq, logical_inst },
291 e90e390c Edgar E. Iglesias
  {"pcmpne",INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x8C000400, OPCODE_MASK_H4, pcmpne, logical_inst },
292 e90e390c Edgar E. Iglesias
  {"sra",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000001, OPCODE_MASK_H34, sra, logical_inst },
293 e90e390c Edgar E. Iglesias
  {"src",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000021, OPCODE_MASK_H34, src, logical_inst },
294 e90e390c Edgar E. Iglesias
  {"srl",   INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000041, OPCODE_MASK_H34, srl, logical_inst },
295 e90e390c Edgar E. Iglesias
  {"sext8", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000060, OPCODE_MASK_H34, sext8, logical_inst },
296 e90e390c Edgar E. Iglesias
  {"sext16",INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000061, OPCODE_MASK_H34, sext16, logical_inst },
297 e90e390c Edgar E. Iglesias
  {"wic",   INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000068, OPCODE_MASK_H34B, wic, special_inst },
298 e90e390c Edgar E. Iglesias
  {"wdc",   INST_TYPE_RD_R1_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000064, OPCODE_MASK_H34B, wdc, special_inst },
299 e90e390c Edgar E. Iglesias
  {"mts",   INST_TYPE_SPECIAL_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MTS, 0x9400C000, OPCODE_MASK_H13S, mts, special_inst },
300 e90e390c Edgar E. Iglesias
  {"mfs",   INST_TYPE_RD_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MFS, 0x94008000, OPCODE_MASK_H23S, mfs, special_inst },
301 e90e390c Edgar E. Iglesias
  {"br",    INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst },
302 e90e390c Edgar E. Iglesias
  {"brd",   INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst },
303 e90e390c Edgar E. Iglesias
  {"brld",  INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst },
304 e90e390c Edgar E. Iglesias
  {"bra",   INST_TYPE_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98080000, OPCODE_MASK_H124, bra, branch_inst },
305 e90e390c Edgar E. Iglesias
  {"brad",  INST_TYPE_R2, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98180000, OPCODE_MASK_H124, brad, branch_inst },
306 e90e390c Edgar E. Iglesias
  {"brald", INST_TYPE_RD_R2, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x981C0000, OPCODE_MASK_H24, brald, branch_inst },
307 e90e390c Edgar E. Iglesias
  {"brk",   INST_TYPE_RD_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x980C0000, OPCODE_MASK_H24, microblaze_brk, branch_inst },
308 e90e390c Edgar E. Iglesias
  {"beq",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C000000, OPCODE_MASK_H14, beq, branch_inst },
309 e90e390c Edgar E. Iglesias
  {"beqd",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E000000, OPCODE_MASK_H14, beqd, branch_inst },
310 e90e390c Edgar E. Iglesias
  {"bne",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C200000, OPCODE_MASK_H14, bne, branch_inst },
311 e90e390c Edgar E. Iglesias
  {"bned",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E200000, OPCODE_MASK_H14, bned, branch_inst },
312 e90e390c Edgar E. Iglesias
  {"blt",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C400000, OPCODE_MASK_H14, blt, branch_inst },
313 e90e390c Edgar E. Iglesias
  {"bltd",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E400000, OPCODE_MASK_H14, bltd, branch_inst },
314 e90e390c Edgar E. Iglesias
  {"ble",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C600000, OPCODE_MASK_H14, ble, branch_inst },
315 e90e390c Edgar E. Iglesias
  {"bled",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E600000, OPCODE_MASK_H14, bled, branch_inst },
316 e90e390c Edgar E. Iglesias
  {"bgt",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9C800000, OPCODE_MASK_H14, bgt, branch_inst },
317 e90e390c Edgar E. Iglesias
  {"bgtd",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9E800000, OPCODE_MASK_H14, bgtd, branch_inst },
318 e90e390c Edgar E. Iglesias
  {"bge",   INST_TYPE_R1_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9CA00000, OPCODE_MASK_H14, bge, branch_inst },
319 e90e390c Edgar E. Iglesias
  {"bged",  INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9EA00000, OPCODE_MASK_H14, bged, branch_inst },
320 e90e390c Edgar E. Iglesias
  {"ori",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, ori, logical_inst },
321 e90e390c Edgar E. Iglesias
  {"andi",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA4000000, OPCODE_MASK_H, andi, logical_inst },
322 e90e390c Edgar E. Iglesias
  {"xori",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA8000000, OPCODE_MASK_H, xori, logical_inst },
323 e90e390c Edgar E. Iglesias
  {"andni", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xAC000000, OPCODE_MASK_H, andni, logical_inst },
324 e90e390c Edgar E. Iglesias
  {"imm",   INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB0000000, OPCODE_MASK_H12, imm, immediate_inst },
325 e90e390c Edgar E. Iglesias
  {"rtsd",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6000000, OPCODE_MASK_H1, rtsd, return_inst },
326 e90e390c Edgar E. Iglesias
  {"rtid",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6200000, OPCODE_MASK_H1, rtid, return_inst },
327 e90e390c Edgar E. Iglesias
  {"rtbd",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6400000, OPCODE_MASK_H1, rtbd, return_inst },
328 e90e390c Edgar E. Iglesias
  {"rted",  INST_TYPE_R1_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB6800000, OPCODE_MASK_H1, rted, return_inst },
329 e90e390c Edgar E. Iglesias
  {"bri",   INST_TYPE_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8000000, OPCODE_MASK_H12, bri, branch_inst },
330 e90e390c Edgar E. Iglesias
  {"brid",  INST_TYPE_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8100000, OPCODE_MASK_H12, brid, branch_inst },
331 e90e390c Edgar E. Iglesias
  {"brlid", INST_TYPE_RD_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8140000, OPCODE_MASK_H2, brlid, branch_inst },
332 e90e390c Edgar E. Iglesias
  {"brai",  INST_TYPE_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8080000, OPCODE_MASK_H12, brai, branch_inst },
333 e90e390c Edgar E. Iglesias
  {"braid", INST_TYPE_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8180000, OPCODE_MASK_H12, braid, branch_inst },
334 e90e390c Edgar E. Iglesias
  {"bralid",INST_TYPE_RD_IMM, INST_NO_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB81C0000, OPCODE_MASK_H2, bralid, branch_inst },
335 e90e390c Edgar E. Iglesias
  {"brki",  INST_TYPE_RD_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB80C0000, OPCODE_MASK_H2, brki, branch_inst },
336 e90e390c Edgar E. Iglesias
  {"beqi",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC000000, OPCODE_MASK_H1, beqi, branch_inst },
337 e90e390c Edgar E. Iglesias
  {"beqid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE000000, OPCODE_MASK_H1, beqid, branch_inst },
338 e90e390c Edgar E. Iglesias
  {"bnei",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC200000, OPCODE_MASK_H1, bnei, branch_inst },
339 e90e390c Edgar E. Iglesias
  {"bneid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE200000, OPCODE_MASK_H1, bneid, branch_inst },
340 e90e390c Edgar E. Iglesias
  {"blti",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC400000, OPCODE_MASK_H1, blti, branch_inst },
341 e90e390c Edgar E. Iglesias
  {"bltid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE400000, OPCODE_MASK_H1, bltid, branch_inst },
342 e90e390c Edgar E. Iglesias
  {"blei",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC600000, OPCODE_MASK_H1, blei, branch_inst },
343 e90e390c Edgar E. Iglesias
  {"bleid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE600000, OPCODE_MASK_H1, bleid, branch_inst },
344 e90e390c Edgar E. Iglesias
  {"bgti",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBC800000, OPCODE_MASK_H1, bgti, branch_inst },
345 e90e390c Edgar E. Iglesias
  {"bgtid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBE800000, OPCODE_MASK_H1, bgtid, branch_inst },
346 e90e390c Edgar E. Iglesias
  {"bgei",  INST_TYPE_R1_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBCA00000, OPCODE_MASK_H1, bgei, branch_inst },
347 e90e390c Edgar E. Iglesias
  {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst },
348 e90e390c Edgar E. Iglesias
  {"lbu",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst },
349 e90e390c Edgar E. Iglesias
  {"lhu",   INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC4000000, OPCODE_MASK_H4, lhu, memory_load_inst },
350 e90e390c Edgar E. Iglesias
  {"lw",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000000, OPCODE_MASK_H4, lw, memory_load_inst },
351 e90e390c Edgar E. Iglesias
  {"sb",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD0000000, OPCODE_MASK_H4, sb, memory_store_inst },
352 e90e390c Edgar E. Iglesias
  {"sh",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD4000000, OPCODE_MASK_H4, sh, memory_store_inst },
353 e90e390c Edgar E. Iglesias
  {"sw",    INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000000, OPCODE_MASK_H4, sw, memory_store_inst },
354 e90e390c Edgar E. Iglesias
  {"lbui",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst },
355 e90e390c Edgar E. Iglesias
  {"lhui",  INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst },
356 e90e390c Edgar E. Iglesias
  {"lwi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst },
357 e90e390c Edgar E. Iglesias
  {"sbi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF0000000, OPCODE_MASK_H, sbi, memory_store_inst },
358 e90e390c Edgar E. Iglesias
  {"shi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF4000000, OPCODE_MASK_H, shi, memory_store_inst },
359 e90e390c Edgar E. Iglesias
  {"swi",   INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, swi, memory_store_inst },
360 e90e390c Edgar E. Iglesias
  {"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 */
361 e90e390c Edgar E. Iglesias
  {"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 */
362 e90e390c Edgar E. Iglesias
  {"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 */
363 e90e390c Edgar E. Iglesias
  {"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 */
364 e90e390c Edgar E. Iglesias
  {"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 */
365 e90e390c Edgar E. Iglesias
  {"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 */
366 e90e390c Edgar E. Iglesias
  {"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 */
367 e90e390c Edgar E. Iglesias
  {"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 },
368 e90e390c Edgar E. Iglesias
  {"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 },
369 e90e390c Edgar E. Iglesias
  {"msrset",INST_TYPE_RD_IMM14, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst },
370 e90e390c Edgar E. Iglesias
  {"msrclr",INST_TYPE_RD_IMM14, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94110000, OPCODE_MASK_H23N, msrclr, special_inst },
371 e90e390c Edgar E. Iglesias
  {"fadd",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000000, OPCODE_MASK_H4, fadd, arithmetic_inst },
372 e90e390c Edgar E. Iglesias
  {"frsub",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000080, OPCODE_MASK_H4, frsub, arithmetic_inst },
373 e90e390c Edgar E. Iglesias
  {"fmul",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000100, OPCODE_MASK_H4, fmul, arithmetic_inst },
374 e90e390c Edgar E. Iglesias
  {"fdiv",  INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000180, OPCODE_MASK_H4, fdiv, arithmetic_inst },
375 e90e390c Edgar E. Iglesias
  {"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 },
376 e90e390c Edgar E. Iglesias
  {"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 },
377 e90e390c Edgar E. Iglesias
  {"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 },
378 e90e390c Edgar E. Iglesias
  {"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 },
379 e90e390c Edgar E. Iglesias
  {"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 },
380 e90e390c Edgar E. Iglesias
  {"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 },
381 e90e390c Edgar E. Iglesias
  {"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 },
382 e90e390c Edgar E. Iglesias
  {""}
383 e90e390c Edgar E. Iglesias
};
384 e90e390c Edgar E. Iglesias
385 e90e390c Edgar E. Iglesias
/* prefix for register names */
386 e90e390c Edgar E. Iglesias
char register_prefix[] = "r";
387 e90e390c Edgar E. Iglesias
char special_register_prefix[] = "spr";
388 e90e390c Edgar E. Iglesias
char fsl_register_prefix[] = "rfsl";
389 e90e390c Edgar E. Iglesias
390 e90e390c Edgar E. Iglesias
391 e90e390c Edgar E. Iglesias
/* #defines for valid immediate range */
392 e90e390c Edgar E. Iglesias
#define MIN_IMM  0x80000000
393 e90e390c Edgar E. Iglesias
#define MAX_IMM  0x7fffffff 
394 e90e390c Edgar E. Iglesias
395 e90e390c Edgar E. Iglesias
#define MIN_IMM12  0x000
396 e90e390c Edgar E. Iglesias
#define MAX_IMM12  0x7ff
397 e90e390c Edgar E. Iglesias
398 e90e390c Edgar E. Iglesias
#define MIN_IMM14  0x0000
399 e90e390c Edgar E. Iglesias
#define MAX_IMM14  0x1fff
400 e90e390c Edgar E. Iglesias
401 e90e390c Edgar E. Iglesias
#endif /* MICROBLAZE_OPC */
402 e90e390c Edgar E. Iglesias
403 e90e390c Edgar E. Iglesias
#include "dis-asm.h"
404 e90e390c Edgar E. Iglesias
#include <strings.h>
405 e90e390c Edgar E. Iglesias
406 e90e390c Edgar E. Iglesias
#define get_field_rd(instr) get_field(instr, RD_MASK, RD_LOW)
407 e90e390c Edgar E. Iglesias
#define get_field_r1(instr) get_field(instr, RA_MASK, RA_LOW)
408 e90e390c Edgar E. Iglesias
#define get_field_r2(instr) get_field(instr, RB_MASK, RB_LOW)
409 e90e390c Edgar E. Iglesias
#define get_int_field_imm(instr) ((instr & IMM_MASK) >> IMM_LOW)
410 e90e390c Edgar E. Iglesias
#define get_int_field_r1(instr) ((instr & RA_MASK) >> RA_LOW)
411 e90e390c Edgar E. Iglesias
412 e90e390c Edgar E. Iglesias
static char *
413 e90e390c Edgar E. Iglesias
get_field (long instr, long mask, unsigned short low) 
414 e90e390c Edgar E. Iglesias
{
415 e90e390c Edgar E. Iglesias
  char tmpstr[25];
416 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%s%d", register_prefix, (int)((instr & mask) >> low));
417 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
418 e90e390c Edgar E. Iglesias
}
419 e90e390c Edgar E. Iglesias
420 e90e390c Edgar E. Iglesias
static char *
421 e90e390c Edgar E. Iglesias
get_field_imm (long instr) 
422 e90e390c Edgar E. Iglesias
{
423 e90e390c Edgar E. Iglesias
  char tmpstr[25];
424 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%d", (short)((instr & IMM_MASK) >> IMM_LOW));
425 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
426 e90e390c Edgar E. Iglesias
}
427 e90e390c Edgar E. Iglesias
428 e90e390c Edgar E. Iglesias
static char *
429 e90e390c Edgar E. Iglesias
get_field_imm5 (long instr) 
430 e90e390c Edgar E. Iglesias
{
431 e90e390c Edgar E. Iglesias
  char tmpstr[25];
432 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%d", (short)((instr & IMM5_MASK) >> IMM_LOW));
433 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
434 e90e390c Edgar E. Iglesias
}
435 e90e390c Edgar E. Iglesias
436 e90e390c Edgar E. Iglesias
static char *
437 e90e390c Edgar E. Iglesias
get_field_imm12 (long instr) 
438 e90e390c Edgar E. Iglesias
{
439 e90e390c Edgar E. Iglesias
  char tmpstr[25];
440 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%s%d", fsl_register_prefix, (short)((instr & IMM12_MASK) >> IMM_LOW));
441 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
442 e90e390c Edgar E. Iglesias
}
443 e90e390c Edgar E. Iglesias
444 e90e390c Edgar E. Iglesias
static char *
445 e90e390c Edgar E. Iglesias
get_field_imm14 (long instr) 
446 e90e390c Edgar E. Iglesias
{
447 e90e390c Edgar E. Iglesias
  char tmpstr[25];
448 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%d", (short)((instr & IMM14_MASK) >> IMM_LOW));
449 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
450 e90e390c Edgar E. Iglesias
}
451 e90e390c Edgar E. Iglesias
452 e90e390c Edgar E. Iglesias
#if 0
453 e90e390c Edgar E. Iglesias
static char *
454 e90e390c Edgar E. Iglesias
get_field_unsigned_imm (long instr) 
455 e90e390c Edgar E. Iglesias
{
456 e90e390c Edgar E. Iglesias
  char tmpstr[25];
457 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%d", (int)((instr & IMM_MASK) >> IMM_LOW));
458 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
459 e90e390c Edgar E. Iglesias
}
460 e90e390c Edgar E. Iglesias
#endif
461 e90e390c Edgar E. Iglesias
462 e90e390c Edgar E. Iglesias
/*
463 e90e390c Edgar E. Iglesias
  char *
464 e90e390c Edgar E. Iglesias
  get_field_special (instr) 
465 e90e390c Edgar E. Iglesias
  long instr;
466 e90e390c Edgar E. Iglesias
  {
467 e90e390c Edgar E. Iglesias
  char tmpstr[25];
468 e90e390c Edgar E. Iglesias
  
469 e90e390c Edgar E. Iglesias
  sprintf(tmpstr, "%s%s", register_prefix, (((instr & IMM_MASK) >> IMM_LOW) & REG_MSR_MASK) == 0 ? "pc" : "msr");
470 e90e390c Edgar E. Iglesias
  
471 e90e390c Edgar E. Iglesias
  return(strdup(tmpstr));
472 e90e390c Edgar E. Iglesias
  }
473 e90e390c Edgar E. Iglesias
*/
474 e90e390c Edgar E. Iglesias
475 e90e390c Edgar E. Iglesias
static char *
476 e90e390c Edgar E. Iglesias
get_field_special (long instr, struct op_code_struct * op) 
477 e90e390c Edgar E. Iglesias
{
478 e90e390c Edgar E. Iglesias
   char tmpstr[25];
479 e90e390c Edgar E. Iglesias
   char spr[5];
480 e90e390c Edgar E. Iglesias
481 e90e390c Edgar E. Iglesias
   switch ( (((instr & IMM_MASK) >> IMM_LOW) ^ op->immval_mask) ) {
482 e90e390c Edgar E. Iglesias
   case REG_MSR_MASK :
483 e90e390c Edgar E. Iglesias
      strcpy(spr, "msr");
484 e90e390c Edgar E. Iglesias
      break;
485 e90e390c Edgar E. Iglesias
   case REG_PC_MASK :
486 e90e390c Edgar E. Iglesias
      strcpy(spr, "pc");
487 e90e390c Edgar E. Iglesias
      break;
488 e90e390c Edgar E. Iglesias
   case REG_EAR_MASK :
489 e90e390c Edgar E. Iglesias
      strcpy(spr, "ear");
490 e90e390c Edgar E. Iglesias
      break;
491 e90e390c Edgar E. Iglesias
   case REG_ESR_MASK :
492 e90e390c Edgar E. Iglesias
      strcpy(spr, "esr");
493 e90e390c Edgar E. Iglesias
      break;
494 e90e390c Edgar E. Iglesias
   case REG_FSR_MASK :
495 e90e390c Edgar E. Iglesias
      strcpy(spr, "fsr");
496 e90e390c Edgar E. Iglesias
      break;      
497 e90e390c Edgar E. Iglesias
   default :
498 e90e390c Edgar E. Iglesias
      strcpy(spr, "pc");
499 e90e390c Edgar E. Iglesias
      break;
500 e90e390c Edgar E. Iglesias
   }
501 e90e390c Edgar E. Iglesias
   
502 e90e390c Edgar E. Iglesias
   sprintf(tmpstr, "%s%s", register_prefix, spr);
503 e90e390c Edgar E. Iglesias
   return(strdup(tmpstr));
504 e90e390c Edgar E. Iglesias
}
505 e90e390c Edgar E. Iglesias
506 e90e390c Edgar E. Iglesias
static unsigned long
507 e90e390c Edgar E. Iglesias
read_insn_microblaze(bfd_vma memaddr, struct disassemble_info *info,
508 e90e390c Edgar E. Iglesias
                     struct op_code_struct ** opr)
509 e90e390c Edgar E. Iglesias
{
510 e90e390c Edgar E. Iglesias
  unsigned char       ibytes[4];
511 e90e390c Edgar E. Iglesias
  int                 status;
512 e90e390c Edgar E. Iglesias
  struct op_code_struct * op;
513 e90e390c Edgar E. Iglesias
  unsigned long inst;
514 e90e390c Edgar E. Iglesias
515 e90e390c Edgar E. Iglesias
  status = info->read_memory_func (memaddr, ibytes, 4, info);
516 e90e390c Edgar E. Iglesias
517 e90e390c Edgar E. Iglesias
  if (status != 0) 
518 e90e390c Edgar E. Iglesias
    {
519 e90e390c Edgar E. Iglesias
      info->memory_error_func (status, memaddr, info);
520 e90e390c Edgar E. Iglesias
      return 0;
521 e90e390c Edgar E. Iglesias
    }
522 e90e390c Edgar E. Iglesias
523 e90e390c Edgar E. Iglesias
  if (info->endian == BFD_ENDIAN_BIG)
524 e90e390c Edgar E. Iglesias
    inst = (ibytes[0] << 24) | (ibytes[1] << 16) | (ibytes[2] << 8) | ibytes[3];
525 e90e390c Edgar E. Iglesias
  else if (info->endian == BFD_ENDIAN_LITTLE)
526 e90e390c Edgar E. Iglesias
    inst = (ibytes[3] << 24) | (ibytes[2] << 16) | (ibytes[1] << 8) | ibytes[0];
527 e90e390c Edgar E. Iglesias
  else
528 e90e390c Edgar E. Iglesias
    abort ();
529 e90e390c Edgar E. Iglesias
530 e90e390c Edgar E. Iglesias
  /* Just a linear search of the table.  */
531 e90e390c Edgar E. Iglesias
  for (op = opcodes; op->name != 0; op ++)
532 e90e390c Edgar E. Iglesias
    if (op->bit_sequence == (inst & op->opcode_mask))
533 e90e390c Edgar E. Iglesias
      break;
534 e90e390c Edgar E. Iglesias
535 e90e390c Edgar E. Iglesias
  *opr = op;
536 e90e390c Edgar E. Iglesias
  return inst;
537 e90e390c Edgar E. Iglesias
}
538 e90e390c Edgar E. Iglesias
539 e90e390c Edgar E. Iglesias
540 e90e390c Edgar E. Iglesias
int 
541 e90e390c Edgar E. Iglesias
print_insn_microblaze (bfd_vma memaddr, struct disassemble_info * info)
542 e90e390c Edgar E. Iglesias
{
543 e90e390c Edgar E. Iglesias
  fprintf_ftype       fprintf = info->fprintf_func;
544 e90e390c Edgar E. Iglesias
  void *              stream = info->stream;
545 e90e390c Edgar E. Iglesias
  unsigned long       inst, prev_inst;
546 e90e390c Edgar E. Iglesias
  struct op_code_struct * op, *pop;
547 e90e390c Edgar E. Iglesias
  int                 immval = 0;
548 e90e390c Edgar E. Iglesias
  boolean             immfound = false;
549 e90e390c Edgar E. Iglesias
  static bfd_vma prev_insn_addr = -1; /*init the prev insn addr */
550 e90e390c Edgar E. Iglesias
  static int     prev_insn_vma = -1;  /*init the prev insn vma */
551 e90e390c Edgar E. Iglesias
  int            curr_insn_vma = info->buffer_vma;
552 e90e390c Edgar E. Iglesias
553 e90e390c Edgar E. Iglesias
  info->bytes_per_chunk = 4;
554 e90e390c Edgar E. Iglesias
555 e90e390c Edgar E. Iglesias
  inst = read_insn_microblaze (memaddr, info, &op);
556 e90e390c Edgar E. Iglesias
  if (inst == 0)
557 e90e390c Edgar E. Iglesias
    return -1;
558 e90e390c Edgar E. Iglesias
  
559 e90e390c Edgar E. Iglesias
  if (prev_insn_vma == curr_insn_vma) {
560 e90e390c Edgar E. Iglesias
  if (memaddr-(info->bytes_per_chunk) == prev_insn_addr) {
561 e90e390c Edgar E. Iglesias
    prev_inst = read_insn_microblaze (prev_insn_addr, info, &pop);
562 e90e390c Edgar E. Iglesias
    if (prev_inst == 0)
563 e90e390c Edgar E. Iglesias
      return -1;
564 e90e390c Edgar E. Iglesias
    if (pop->instr == imm) {
565 e90e390c Edgar E. Iglesias
      immval = (get_int_field_imm(prev_inst) << 16) & 0xffff0000;
566 e90e390c Edgar E. Iglesias
      immfound = true;
567 e90e390c Edgar E. Iglesias
    }
568 e90e390c Edgar E. Iglesias
    else {
569 e90e390c Edgar E. Iglesias
      immval = 0;
570 e90e390c Edgar E. Iglesias
      immfound = false;
571 e90e390c Edgar E. Iglesias
    }
572 e90e390c Edgar E. Iglesias
  }
573 e90e390c Edgar E. Iglesias
  }
574 e90e390c Edgar E. Iglesias
  /* make curr insn as prev insn */
575 e90e390c Edgar E. Iglesias
  prev_insn_addr = memaddr;
576 e90e390c Edgar E. Iglesias
  prev_insn_vma = curr_insn_vma;
577 e90e390c Edgar E. Iglesias
578 e90e390c Edgar E. Iglesias
  if (op->name == 0)
579 e90e390c Edgar E. Iglesias
    fprintf (stream, ".short 0x%04x", inst);
580 e90e390c Edgar E. Iglesias
  else
581 e90e390c Edgar E. Iglesias
    {
582 e90e390c Edgar E. Iglesias
      fprintf (stream, "%s", op->name);
583 e90e390c Edgar E. Iglesias
      
584 e90e390c Edgar E. Iglesias
      switch (op->inst_type)
585 e90e390c Edgar E. Iglesias
        {
586 e90e390c Edgar E. Iglesias
  case INST_TYPE_RD_R1_R2:
587 e90e390c Edgar E. Iglesias
     fprintf(stream, "\t%s, %s, %s", get_field_rd(inst), get_field_r1(inst), get_field_r2(inst));
588 e90e390c Edgar E. Iglesias
     break;
589 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_R1_IMM:
590 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s, %s", get_field_rd(inst), get_field_r1(inst), get_field_imm(inst));
591 e90e390c Edgar E. Iglesias
          if (info->print_address_func && get_int_field_r1(inst) == 0 && info->symbol_at_address_func) {
592 e90e390c Edgar E. Iglesias
            if (immfound)
593 e90e390c Edgar E. Iglesias
              immval |= (get_int_field_imm(inst) & 0x0000ffff);
594 e90e390c Edgar E. Iglesias
            else {
595 e90e390c Edgar E. Iglesias
              immval = get_int_field_imm(inst);
596 e90e390c Edgar E. Iglesias
              if (immval & 0x8000)
597 e90e390c Edgar E. Iglesias
                immval |= 0xFFFF0000;
598 e90e390c Edgar E. Iglesias
            }
599 e90e390c Edgar E. Iglesias
            if (immval > 0 && info->symbol_at_address_func(immval, info)) {
600 e90e390c Edgar E. Iglesias
              fprintf (stream, "\t// ");
601 e90e390c Edgar E. Iglesias
              info->print_address_func (immval, info);
602 e90e390c Edgar E. Iglesias
            }
603 e90e390c Edgar E. Iglesias
          }
604 e90e390c Edgar E. Iglesias
          break;
605 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_R1_IMM5:
606 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s, %s", get_field_rd(inst), get_field_r1(inst), get_field_imm5(inst));
607 e90e390c Edgar E. Iglesias
          break;
608 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_IMM12:
609 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_imm12(inst));
610 e90e390c Edgar E. Iglesias
          break;
611 e90e390c Edgar E. Iglesias
        case INST_TYPE_R1_IMM12:
612 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_r1(inst), get_field_imm12(inst));
613 e90e390c Edgar E. Iglesias
          break;
614 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_SPECIAL:
615 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_special(inst, op));
616 e90e390c Edgar E. Iglesias
          break;
617 e90e390c Edgar E. Iglesias
        case INST_TYPE_SPECIAL_R1:
618 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_special(inst, op), get_field_r1(inst));
619 e90e390c Edgar E. Iglesias
          break;
620 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_R1:
621 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_r1(inst));
622 e90e390c Edgar E. Iglesias
          break;
623 e90e390c Edgar E. Iglesias
        case INST_TYPE_R1_R2:
624 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_r1(inst), get_field_r2(inst));
625 e90e390c Edgar E. Iglesias
          break;
626 e90e390c Edgar E. Iglesias
        case INST_TYPE_R1_IMM:
627 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_r1(inst), get_field_imm(inst));
628 e90e390c Edgar E. Iglesias
          /* The non-pc relative instructions are returns, which shouldn't 
629 e90e390c Edgar E. Iglesias
             have a label printed */
630 e90e390c Edgar E. Iglesias
          if (info->print_address_func && op->inst_offset_type == INST_PC_OFFSET && info->symbol_at_address_func) {
631 e90e390c Edgar E. Iglesias
            if (immfound)
632 e90e390c Edgar E. Iglesias
              immval |= (get_int_field_imm(inst) & 0x0000ffff);
633 e90e390c Edgar E. Iglesias
            else {
634 e90e390c Edgar E. Iglesias
              immval = get_int_field_imm(inst);
635 e90e390c Edgar E. Iglesias
              if (immval & 0x8000)
636 e90e390c Edgar E. Iglesias
                immval |= 0xFFFF0000;
637 e90e390c Edgar E. Iglesias
            }
638 e90e390c Edgar E. Iglesias
            immval += memaddr;
639 e90e390c Edgar E. Iglesias
            if (immval > 0 && info->symbol_at_address_func(immval, info)) {
640 e90e390c Edgar E. Iglesias
              fprintf (stream, "\t// ");
641 e90e390c Edgar E. Iglesias
              info->print_address_func (immval, info);
642 e90e390c Edgar E. Iglesias
            } else {
643 e90e390c Edgar E. Iglesias
              fprintf (stream, "\t\t// ");
644 e90e390c Edgar E. Iglesias
              fprintf (stream, "%x", immval);
645 e90e390c Edgar E. Iglesias
            }
646 e90e390c Edgar E. Iglesias
          }
647 e90e390c Edgar E. Iglesias
          break;
648 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_IMM:
649 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_imm(inst));
650 e90e390c Edgar E. Iglesias
          if (info->print_address_func && info->symbol_at_address_func) {
651 e90e390c Edgar E. Iglesias
            if (immfound)
652 e90e390c Edgar E. Iglesias
              immval |= (get_int_field_imm(inst) & 0x0000ffff);
653 e90e390c Edgar E. Iglesias
            else {
654 e90e390c Edgar E. Iglesias
              immval = get_int_field_imm(inst);
655 e90e390c Edgar E. Iglesias
              if (immval & 0x8000)
656 e90e390c Edgar E. Iglesias
                immval |= 0xFFFF0000;
657 e90e390c Edgar E. Iglesias
            }
658 e90e390c Edgar E. Iglesias
            if (op->inst_offset_type == INST_PC_OFFSET)
659 e90e390c Edgar E. Iglesias
              immval += (int) memaddr;
660 e90e390c Edgar E. Iglesias
            if (info->symbol_at_address_func(immval, info)) {
661 e90e390c Edgar E. Iglesias
              fprintf (stream, "\t// ");
662 e90e390c Edgar E. Iglesias
              info->print_address_func (immval, info);
663 e90e390c Edgar E. Iglesias
            } 
664 e90e390c Edgar E. Iglesias
          }
665 e90e390c Edgar E. Iglesias
          break;
666 e90e390c Edgar E. Iglesias
        case INST_TYPE_IMM:
667 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s", get_field_imm(inst));
668 e90e390c Edgar E. Iglesias
          if (info->print_address_func && info->symbol_at_address_func && op->instr != imm) {
669 e90e390c Edgar E. Iglesias
            if (immfound)
670 e90e390c Edgar E. Iglesias
              immval |= (get_int_field_imm(inst) & 0x0000ffff);
671 e90e390c Edgar E. Iglesias
            else {
672 e90e390c Edgar E. Iglesias
              immval = get_int_field_imm(inst);
673 e90e390c Edgar E. Iglesias
              if (immval & 0x8000)
674 e90e390c Edgar E. Iglesias
                immval |= 0xFFFF0000;
675 e90e390c Edgar E. Iglesias
            }
676 e90e390c Edgar E. Iglesias
            if (op->inst_offset_type == INST_PC_OFFSET)
677 e90e390c Edgar E. Iglesias
              immval += (int) memaddr;
678 e90e390c Edgar E. Iglesias
            if (immval > 0 && info->symbol_at_address_func(immval, info)) {
679 e90e390c Edgar E. Iglesias
              fprintf (stream, "\t// ");
680 e90e390c Edgar E. Iglesias
              info->print_address_func (immval, info);
681 e90e390c Edgar E. Iglesias
            } else if (op->inst_offset_type == INST_PC_OFFSET) {
682 e90e390c Edgar E. Iglesias
              fprintf (stream, "\t\t// ");
683 e90e390c Edgar E. Iglesias
              fprintf (stream, "%x", immval);
684 e90e390c Edgar E. Iglesias
            }
685 e90e390c Edgar E. Iglesias
          }
686 e90e390c Edgar E. Iglesias
          break;
687 e90e390c Edgar E. Iglesias
        case INST_TYPE_RD_R2:
688 e90e390c Edgar E. Iglesias
          fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_r2(inst));
689 e90e390c Edgar E. Iglesias
          break;
690 e90e390c Edgar E. Iglesias
  case INST_TYPE_R2:
691 e90e390c Edgar E. Iglesias
     fprintf(stream, "\t%s", get_field_r2(inst));
692 e90e390c Edgar E. Iglesias
     break;
693 e90e390c Edgar E. Iglesias
  case INST_TYPE_R1:
694 e90e390c Edgar E. Iglesias
     fprintf(stream, "\t%s", get_field_r1(inst));
695 e90e390c Edgar E. Iglesias
     break;
696 e90e390c Edgar E. Iglesias
  case INST_TYPE_RD_R1_SPECIAL:
697 e90e390c Edgar E. Iglesias
     fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_r2(inst));
698 e90e390c Edgar E. Iglesias
     break;
699 e90e390c Edgar E. Iglesias
  case INST_TYPE_RD_IMM14:
700 e90e390c Edgar E. Iglesias
     fprintf(stream, "\t%s, %s", get_field_rd(inst), get_field_imm14(inst));
701 e90e390c Edgar E. Iglesias
     break;
702 e90e390c Edgar E. Iglesias
     /* For tuqula instruction */
703 e90e390c Edgar E. Iglesias
  case INST_TYPE_RD:
704 e90e390c Edgar E. Iglesias
     fprintf(stream, "\t%s", get_field_rd(inst));
705 e90e390c Edgar E. Iglesias
     break;
706 e90e390c Edgar E. Iglesias
     
707 e90e390c Edgar E. Iglesias
  default:
708 e90e390c Edgar E. Iglesias
          /* if the disassembler lags the instruction set */
709 e90e390c Edgar E. Iglesias
          fprintf (stream, "\tundecoded operands, inst is 0x%04x", inst);
710 e90e390c Edgar E. Iglesias
          break;
711 e90e390c Edgar E. Iglesias
        }
712 e90e390c Edgar E. Iglesias
    }
713 e90e390c Edgar E. Iglesias
  
714 e90e390c Edgar E. Iglesias
  /* Say how many bytes we consumed? */
715 e90e390c Edgar E. Iglesias
  return 4;
716 e90e390c Edgar E. Iglesias
}
717 e90e390c Edgar E. Iglesias
718 e90e390c Edgar E. Iglesias
#if 0
719 e90e390c Edgar E. Iglesias
static enum microblaze_instr
720 e90e390c Edgar E. Iglesias
get_insn_microblaze (long inst, boolean *isunsignedimm,
721 e90e390c Edgar E. Iglesias
                     enum microblaze_instr_type *insn_type,
722 e90e390c Edgar E. Iglesias
                     short *delay_slots ) 
723 e90e390c Edgar E. Iglesias
{
724 e90e390c Edgar E. Iglesias
  struct op_code_struct * op;
725 e90e390c Edgar E. Iglesias
  *isunsignedimm = false;
726 e90e390c Edgar E. Iglesias

727 e90e390c Edgar E. Iglesias
  /* Just a linear search of the table.  */
728 e90e390c Edgar E. Iglesias
  for (op = opcodes; op->name != 0; op ++)
729 e90e390c Edgar E. Iglesias
    if (op->bit_sequence == (inst & op->opcode_mask))
730 e90e390c Edgar E. Iglesias
      break;
731 e90e390c Edgar E. Iglesias

732 e90e390c Edgar E. Iglesias
  if (op->name == 0)
733 e90e390c Edgar E. Iglesias
    return invalid_inst;
734 e90e390c Edgar E. Iglesias
  else {
735 e90e390c Edgar E. Iglesias
    *isunsignedimm = (op->inst_type == INST_TYPE_RD_R1_UNSIGNED_IMM);
736 e90e390c Edgar E. Iglesias
    *insn_type = op->instr_type;
737 e90e390c Edgar E. Iglesias
    *delay_slots = op->delay_slots;
738 e90e390c Edgar E. Iglesias
    return op->instr;
739 e90e390c Edgar E. Iglesias
  }
740 e90e390c Edgar E. Iglesias
}
741 e90e390c Edgar E. Iglesias
#endif
742 e90e390c Edgar E. Iglesias
743 e90e390c Edgar E. Iglesias
#if 0
744 e90e390c Edgar E. Iglesias
static short
745 e90e390c Edgar E. Iglesias
get_delay_slots_microblaze ( long inst )
746 e90e390c Edgar E. Iglesias
{
747 e90e390c Edgar E. Iglesias
  boolean isunsignedimm;
748 e90e390c Edgar E. Iglesias
  enum microblaze_instr_type insn_type;
749 e90e390c Edgar E. Iglesias
  enum microblaze_instr op;
750 e90e390c Edgar E. Iglesias
  short delay_slots;
751 e90e390c Edgar E. Iglesias

752 e90e390c Edgar E. Iglesias
  op = get_insn_microblaze( inst, &isunsignedimm, &insn_type, &delay_slots);
753 e90e390c Edgar E. Iglesias
  if (op == invalid_inst)
754 e90e390c Edgar E. Iglesias
    return 0;
755 e90e390c Edgar E. Iglesias
  else 
756 e90e390c Edgar E. Iglesias
    return delay_slots;
757 e90e390c Edgar E. Iglesias
}
758 e90e390c Edgar E. Iglesias
#endif
759 e90e390c Edgar E. Iglesias
760 e90e390c Edgar E. Iglesias
#if 0
761 e90e390c Edgar E. Iglesias
static enum microblaze_instr
762 e90e390c Edgar E. Iglesias
microblaze_decode_insn (long insn, int *rd, int *ra, int *rb, int *imm)
763 e90e390c Edgar E. Iglesias
{
764 e90e390c Edgar E. Iglesias
  enum microblaze_instr op;
765 e90e390c Edgar E. Iglesias
  boolean t1;
766 e90e390c Edgar E. Iglesias
  enum microblaze_instr_type t2;
767 e90e390c Edgar E. Iglesias
  short t3;
768 e90e390c Edgar E. Iglesias

769 e90e390c Edgar E. Iglesias
  op = get_insn_microblaze(insn, &t1, &t2, &t3);
770 e90e390c Edgar E. Iglesias
  *rd = (insn & RD_MASK) >> RD_LOW;
771 e90e390c Edgar E. Iglesias
  *ra = (insn & RA_MASK) >> RA_LOW;
772 e90e390c Edgar E. Iglesias
  *rb = (insn & RB_MASK) >> RB_LOW;
773 e90e390c Edgar E. Iglesias
  t3 = (insn & IMM_MASK) >> IMM_LOW;
774 e90e390c Edgar E. Iglesias
  *imm = (int) t3;
775 e90e390c Edgar E. Iglesias
  return (op);
776 e90e390c Edgar E. Iglesias
}
777 e90e390c Edgar E. Iglesias
#endif
778 e90e390c Edgar E. Iglesias
779 e90e390c Edgar E. Iglesias
#if 0
780 e90e390c Edgar E. Iglesias
static unsigned long
781 e90e390c Edgar E. Iglesias
microblaze_get_target_address (long inst, boolean immfound, int immval,
782 e90e390c Edgar E. Iglesias
                               long pcval, long r1val, long r2val,
783 e90e390c Edgar E. Iglesias
                               boolean *targetvalid,
784 e90e390c Edgar E. Iglesias
                               boolean *unconditionalbranch)
785 e90e390c Edgar E. Iglesias
{
786 e90e390c Edgar E. Iglesias
  struct op_code_struct * op;
787 e90e390c Edgar E. Iglesias
  long targetaddr = 0;
788 e90e390c Edgar E. Iglesias

789 e90e390c Edgar E. Iglesias
  *unconditionalbranch = false;
790 e90e390c Edgar E. Iglesias
  /* Just a linear search of the table.  */
791 e90e390c Edgar E. Iglesias
  for (op = opcodes; op->name != 0; op ++)
792 e90e390c Edgar E. Iglesias
    if (op->bit_sequence == (inst & op->opcode_mask))
793 e90e390c Edgar E. Iglesias
      break;
794 e90e390c Edgar E. Iglesias

795 e90e390c Edgar E. Iglesias
  if (op->name == 0) {
796 e90e390c Edgar E. Iglesias
    *targetvalid = false;
797 e90e390c Edgar E. Iglesias
  } else if (op->instr_type == branch_inst) {
798 e90e390c Edgar E. Iglesias
    switch (op->inst_type) {
799 e90e390c Edgar E. Iglesias
    case INST_TYPE_R2:
800 e90e390c Edgar E. Iglesias
      *unconditionalbranch = true;
801 e90e390c Edgar E. Iglesias
      /* fallthru */
802 e90e390c Edgar E. Iglesias
    case INST_TYPE_RD_R2:
803 e90e390c Edgar E. Iglesias
    case INST_TYPE_R1_R2:
804 e90e390c Edgar E. Iglesias
      targetaddr = r2val;
805 e90e390c Edgar E. Iglesias
      *targetvalid = true;
806 e90e390c Edgar E. Iglesias
      if (op->inst_offset_type == INST_PC_OFFSET)
807 e90e390c Edgar E. Iglesias
        targetaddr += pcval;
808 e90e390c Edgar E. Iglesias
      break;
809 e90e390c Edgar E. Iglesias
    case INST_TYPE_IMM:
810 e90e390c Edgar E. Iglesias
      *unconditionalbranch = true;
811 e90e390c Edgar E. Iglesias
      /* fallthru */
812 e90e390c Edgar E. Iglesias
    case INST_TYPE_RD_IMM:
813 e90e390c Edgar E. Iglesias
    case INST_TYPE_R1_IMM:
814 e90e390c Edgar E. Iglesias
      if (immfound) {
815 e90e390c Edgar E. Iglesias
        targetaddr = (immval << 16) & 0xffff0000;
816 e90e390c Edgar E. Iglesias
        targetaddr |= (get_int_field_imm(inst) & 0x0000ffff);
817 e90e390c Edgar E. Iglesias
      } else {
818 e90e390c Edgar E. Iglesias
        targetaddr = get_int_field_imm(inst);
819 e90e390c Edgar E. Iglesias
        if (targetaddr & 0x8000)
820 e90e390c Edgar E. Iglesias
          targetaddr |= 0xFFFF0000;
821 e90e390c Edgar E. Iglesias
      }
822 e90e390c Edgar E. Iglesias
      if (op->inst_offset_type == INST_PC_OFFSET)
823 e90e390c Edgar E. Iglesias
        targetaddr += pcval;
824 e90e390c Edgar E. Iglesias
      *targetvalid = true;
825 e90e390c Edgar E. Iglesias
      break;
826 e90e390c Edgar E. Iglesias
    default:
827 e90e390c Edgar E. Iglesias
      *targetvalid = false;
828 e90e390c Edgar E. Iglesias
      break;
829 e90e390c Edgar E. Iglesias
    }
830 e90e390c Edgar E. Iglesias
  } else if (op->instr_type == return_inst) {
831 e90e390c Edgar E. Iglesias
      if (immfound) {
832 e90e390c Edgar E. Iglesias
        targetaddr = (immval << 16) & 0xffff0000;
833 e90e390c Edgar E. Iglesias
        targetaddr |= (get_int_field_imm(inst) & 0x0000ffff);
834 e90e390c Edgar E. Iglesias
      } else {
835 e90e390c Edgar E. Iglesias
        targetaddr = get_int_field_imm(inst);
836 e90e390c Edgar E. Iglesias
        if (targetaddr & 0x8000)
837 e90e390c Edgar E. Iglesias
          targetaddr |= 0xFFFF0000;
838 e90e390c Edgar E. Iglesias
      }
839 e90e390c Edgar E. Iglesias
      targetaddr += r1val;
840 e90e390c Edgar E. Iglesias
      *targetvalid = true;
841 e90e390c Edgar E. Iglesias
  } else {
842 e90e390c Edgar E. Iglesias
    *targetvalid = false;
843 e90e390c Edgar E. Iglesias
  }
844 e90e390c Edgar E. Iglesias
  return targetaddr;
845 e90e390c Edgar E. Iglesias
}
846 e90e390c Edgar E. Iglesias
#endif