Statistics
| Branch: | Revision:

root / mips-dis.c @ 1247c5f7

History | View | Annotate | Download (157.5 kB)

1 6643d27e bellard
/* Print mips instructions for GDB, the GNU debugger, or for objdump.
2 6643d27e bellard
   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 6643d27e bellard
   2000, 2001, 2002, 2003
4 6643d27e bellard
   Free Software Foundation, Inc.
5 6643d27e bellard
   Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
6 6643d27e bellard

7 6643d27e bellard
This file is part of GDB, GAS, and the GNU binutils.
8 6643d27e bellard

9 6643d27e bellard
This program is free software; you can redistribute it and/or modify
10 6643d27e bellard
it under the terms of the GNU General Public License as published by
11 6643d27e bellard
the Free Software Foundation; either version 2 of the License, or
12 6643d27e bellard
(at your option) any later version.
13 6643d27e bellard

14 6643d27e bellard
This program is distributed in the hope that it will be useful,
15 6643d27e bellard
but WITHOUT ANY WARRANTY; without even the implied warranty of
16 6643d27e bellard
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 6643d27e bellard
GNU General Public License for more details.
18 6643d27e bellard

19 6643d27e bellard
You should have received a copy of the GNU General Public License
20 6643d27e bellard
along with this program; if not, write to the Free Software
21 6643d27e bellard
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22 6643d27e bellard
23 6643d27e bellard
#include "dis-asm.h"
24 6643d27e bellard
25 6643d27e bellard
/* mips.h.  Mips opcode list for GDB, the GNU debugger.
26 6643d27e bellard
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
27 6643d27e bellard
   Free Software Foundation, Inc.
28 6643d27e bellard
   Contributed by Ralph Campbell and OSF
29 6643d27e bellard
   Commented and modified by Ian Lance Taylor, Cygnus Support
30 6643d27e bellard

31 6643d27e bellard
This file is part of GDB, GAS, and the GNU binutils.
32 6643d27e bellard

33 6643d27e bellard
GDB, GAS, and the GNU binutils are free software; you can redistribute
34 6643d27e bellard
them and/or modify them under the terms of the GNU General Public
35 6643d27e bellard
License as published by the Free Software Foundation; either version
36 6643d27e bellard
1, or (at your option) any later version.
37 6643d27e bellard

38 6643d27e bellard
GDB, GAS, and the GNU binutils are distributed in the hope that they
39 6643d27e bellard
will be useful, but WITHOUT ANY WARRANTY; without even the implied
40 6643d27e bellard
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
41 6643d27e bellard
the GNU General Public License for more details.
42 6643d27e bellard

43 6643d27e bellard
You should have received a copy of the GNU General Public License
44 6643d27e bellard
along with this file; see the file COPYING.  If not, write to the Free
45 6643d27e bellard
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
46 6643d27e bellard
47 6643d27e bellard
/* mips.h.  Mips opcode list for GDB, the GNU debugger.
48 6643d27e bellard
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
49 6643d27e bellard
   Free Software Foundation, Inc.
50 6643d27e bellard
   Contributed by Ralph Campbell and OSF
51 6643d27e bellard
   Commented and modified by Ian Lance Taylor, Cygnus Support
52 6643d27e bellard

53 6643d27e bellard
This file is part of GDB, GAS, and the GNU binutils.
54 6643d27e bellard

55 6643d27e bellard
GDB, GAS, and the GNU binutils are free software; you can redistribute
56 6643d27e bellard
them and/or modify them under the terms of the GNU General Public
57 6643d27e bellard
License as published by the Free Software Foundation; either version
58 6643d27e bellard
1, or (at your option) any later version.
59 6643d27e bellard

60 6643d27e bellard
GDB, GAS, and the GNU binutils are distributed in the hope that they
61 6643d27e bellard
will be useful, but WITHOUT ANY WARRANTY; without even the implied
62 6643d27e bellard
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
63 6643d27e bellard
the GNU General Public License for more details.
64 6643d27e bellard

65 6643d27e bellard
You should have received a copy of the GNU General Public License
66 6643d27e bellard
along with this file; see the file COPYING.  If not, write to the Free
67 6643d27e bellard
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
68 6643d27e bellard
69 6643d27e bellard
/* These are bit masks and shift counts to use to access the various
70 6643d27e bellard
   fields of an instruction.  To retrieve the X field of an
71 6643d27e bellard
   instruction, use the expression
72 6643d27e bellard
        (i >> OP_SH_X) & OP_MASK_X
73 6643d27e bellard
   To set the same field (to j), use
74 6643d27e bellard
        i = (i &~ (OP_MASK_X << OP_SH_X)) | (j << OP_SH_X)
75 6643d27e bellard

76 6643d27e bellard
   Make sure you use fields that are appropriate for the instruction,
77 6643d27e bellard
   of course.
78 6643d27e bellard

79 6643d27e bellard
   The 'i' format uses OP, RS, RT and IMMEDIATE.
80 6643d27e bellard

81 6643d27e bellard
   The 'j' format uses OP and TARGET.
82 6643d27e bellard

83 6643d27e bellard
   The 'r' format uses OP, RS, RT, RD, SHAMT and FUNCT.
84 6643d27e bellard

85 6643d27e bellard
   The 'b' format uses OP, RS, RT and DELTA.
86 6643d27e bellard

87 6643d27e bellard
   The floating point 'i' format uses OP, RS, RT and IMMEDIATE.
88 6643d27e bellard

89 6643d27e bellard
   The floating point 'r' format uses OP, FMT, FT, FS, FD and FUNCT.
90 6643d27e bellard

91 6643d27e bellard
   A breakpoint instruction uses OP, CODE and SPEC (10 bits of the
92 6643d27e bellard
   breakpoint instruction are not defined; Kane says the breakpoint
93 6643d27e bellard
   code field in BREAK is 20 bits; yet MIPS assemblers and debuggers
94 6643d27e bellard
   only use ten bits).  An optional two-operand form of break/sdbbp
95 6643d27e bellard
   allows the lower ten bits to be set too, and MIPS32 and later
96 6643d27e bellard
   architectures allow 20 bits to be set with a signal operand
97 6643d27e bellard
   (using CODE20).
98 6643d27e bellard

99 6643d27e bellard
   The syscall instruction uses CODE20.
100 6643d27e bellard

101 6643d27e bellard
   The general coprocessor instructions use COPZ.  */
102 6643d27e bellard
103 6643d27e bellard
#define OP_MASK_OP                0x3f
104 6643d27e bellard
#define OP_SH_OP                26
105 6643d27e bellard
#define OP_MASK_RS                0x1f
106 6643d27e bellard
#define OP_SH_RS                21
107 6643d27e bellard
#define OP_MASK_FR                0x1f
108 6643d27e bellard
#define OP_SH_FR                21
109 6643d27e bellard
#define OP_MASK_FMT                0x1f
110 6643d27e bellard
#define OP_SH_FMT                21
111 6643d27e bellard
#define OP_MASK_BCC                0x7
112 6643d27e bellard
#define OP_SH_BCC                18
113 6643d27e bellard
#define OP_MASK_CODE                0x3ff
114 6643d27e bellard
#define OP_SH_CODE                16
115 6643d27e bellard
#define OP_MASK_CODE2                0x3ff
116 6643d27e bellard
#define OP_SH_CODE2                6
117 6643d27e bellard
#define OP_MASK_RT                0x1f
118 6643d27e bellard
#define OP_SH_RT                16
119 6643d27e bellard
#define OP_MASK_FT                0x1f
120 6643d27e bellard
#define OP_SH_FT                16
121 6643d27e bellard
#define OP_MASK_CACHE                0x1f
122 6643d27e bellard
#define OP_SH_CACHE                16
123 6643d27e bellard
#define OP_MASK_RD                0x1f
124 6643d27e bellard
#define OP_SH_RD                11
125 6643d27e bellard
#define OP_MASK_FS                0x1f
126 6643d27e bellard
#define OP_SH_FS                11
127 6643d27e bellard
#define OP_MASK_PREFX                0x1f
128 6643d27e bellard
#define OP_SH_PREFX                11
129 6643d27e bellard
#define OP_MASK_CCC                0x7
130 6643d27e bellard
#define OP_SH_CCC                8
131 6643d27e bellard
#define OP_MASK_CODE20                0xfffff /* 20 bit syscall/breakpoint code.  */
132 6643d27e bellard
#define OP_SH_CODE20                6
133 6643d27e bellard
#define OP_MASK_SHAMT                0x1f
134 6643d27e bellard
#define OP_SH_SHAMT                6
135 6643d27e bellard
#define OP_MASK_FD                0x1f
136 6643d27e bellard
#define OP_SH_FD                6
137 6643d27e bellard
#define OP_MASK_TARGET                0x3ffffff
138 6643d27e bellard
#define OP_SH_TARGET                0
139 6643d27e bellard
#define OP_MASK_COPZ                0x1ffffff
140 6643d27e bellard
#define OP_SH_COPZ                0
141 6643d27e bellard
#define OP_MASK_IMMEDIATE        0xffff
142 6643d27e bellard
#define OP_SH_IMMEDIATE                0
143 6643d27e bellard
#define OP_MASK_DELTA                0xffff
144 6643d27e bellard
#define OP_SH_DELTA                0
145 6643d27e bellard
#define OP_MASK_FUNCT                0x3f
146 6643d27e bellard
#define OP_SH_FUNCT                0
147 6643d27e bellard
#define OP_MASK_SPEC                0x3f
148 6643d27e bellard
#define OP_SH_SPEC                0
149 6643d27e bellard
#define OP_SH_LOCC              8       /* FP condition code.  */
150 6643d27e bellard
#define OP_SH_HICC              18      /* FP condition code.  */
151 6643d27e bellard
#define OP_MASK_CC              0x7
152 6643d27e bellard
#define OP_SH_COP1NORM          25      /* Normal COP1 encoding.  */
153 6643d27e bellard
#define OP_MASK_COP1NORM        0x1     /* a single bit.  */
154 6643d27e bellard
#define OP_SH_COP1SPEC          21      /* COP1 encodings.  */
155 6643d27e bellard
#define OP_MASK_COP1SPEC        0xf
156 6643d27e bellard
#define OP_MASK_COP1SCLR        0x4
157 6643d27e bellard
#define OP_MASK_COP1CMP         0x3
158 6643d27e bellard
#define OP_SH_COP1CMP           4
159 6643d27e bellard
#define OP_SH_FORMAT            21      /* FP short format field.  */
160 6643d27e bellard
#define OP_MASK_FORMAT          0x7
161 6643d27e bellard
#define OP_SH_TRUE              16
162 6643d27e bellard
#define OP_MASK_TRUE            0x1
163 6643d27e bellard
#define OP_SH_GE                17
164 6643d27e bellard
#define OP_MASK_GE              0x01
165 6643d27e bellard
#define OP_SH_UNSIGNED          16
166 6643d27e bellard
#define OP_MASK_UNSIGNED        0x1
167 6643d27e bellard
#define OP_SH_HINT              16
168 6643d27e bellard
#define OP_MASK_HINT            0x1f
169 6643d27e bellard
#define OP_SH_MMI               0       /* Multimedia (parallel) op.  */
170 6643d27e bellard
#define OP_MASK_MMI             0x3f
171 6643d27e bellard
#define OP_SH_MMISUB            6
172 6643d27e bellard
#define OP_MASK_MMISUB          0x1f
173 6643d27e bellard
#define OP_MASK_PERFREG                0x1f        /* Performance monitoring.  */
174 6643d27e bellard
#define OP_SH_PERFREG                1
175 6643d27e bellard
#define OP_SH_SEL                0        /* Coprocessor select field.  */
176 6643d27e bellard
#define OP_MASK_SEL                0x7        /* The sel field of mfcZ and mtcZ.  */
177 6643d27e bellard
#define OP_SH_CODE19                6       /* 19 bit wait code.  */
178 6643d27e bellard
#define OP_MASK_CODE19                0x7ffff
179 6643d27e bellard
#define OP_SH_ALN                21
180 6643d27e bellard
#define OP_MASK_ALN                0x7
181 6643d27e bellard
#define OP_SH_VSEL                21
182 6643d27e bellard
#define OP_MASK_VSEL                0x1f
183 6643d27e bellard
#define OP_MASK_VECBYTE                0x7        /* Selector field is really 4 bits,
184 6643d27e bellard
                                           but 0x8-0xf don't select bytes.  */
185 6643d27e bellard
#define OP_SH_VECBYTE                22
186 6643d27e bellard
#define OP_MASK_VECALIGN        0x7        /* Vector byte-align (alni.ob) op.  */
187 6643d27e bellard
#define OP_SH_VECALIGN                21
188 6643d27e bellard
#define OP_MASK_INSMSB                0x1f        /* "ins" MSB.  */
189 6643d27e bellard
#define OP_SH_INSMSB                11
190 6643d27e bellard
#define OP_MASK_EXTMSBD                0x1f        /* "ext" MSBD.  */
191 6643d27e bellard
#define OP_SH_EXTMSBD                11
192 6643d27e bellard
193 6643d27e bellard
#define        OP_OP_COP0                0x10
194 6643d27e bellard
#define        OP_OP_COP1                0x11
195 6643d27e bellard
#define        OP_OP_COP2                0x12
196 6643d27e bellard
#define        OP_OP_COP3                0x13
197 6643d27e bellard
#define        OP_OP_LWC1                0x31
198 6643d27e bellard
#define        OP_OP_LWC2                0x32
199 6643d27e bellard
#define        OP_OP_LWC3                0x33        /* a.k.a. pref */
200 6643d27e bellard
#define        OP_OP_LDC1                0x35
201 6643d27e bellard
#define        OP_OP_LDC2                0x36
202 6643d27e bellard
#define        OP_OP_LDC3                0x37        /* a.k.a. ld */
203 6643d27e bellard
#define        OP_OP_SWC1                0x39
204 6643d27e bellard
#define        OP_OP_SWC2                0x3a
205 6643d27e bellard
#define        OP_OP_SWC3                0x3b
206 6643d27e bellard
#define        OP_OP_SDC1                0x3d
207 6643d27e bellard
#define        OP_OP_SDC2                0x3e
208 6643d27e bellard
#define        OP_OP_SDC3                0x3f        /* a.k.a. sd */
209 6643d27e bellard
210 6643d27e bellard
/* Values in the 'VSEL' field.  */
211 6643d27e bellard
#define MDMX_FMTSEL_IMM_QH        0x1d
212 6643d27e bellard
#define MDMX_FMTSEL_IMM_OB        0x1e
213 6643d27e bellard
#define MDMX_FMTSEL_VEC_QH        0x15
214 6643d27e bellard
#define MDMX_FMTSEL_VEC_OB        0x16
215 6643d27e bellard
216 6643d27e bellard
/* This structure holds information for a particular instruction.  */
217 6643d27e bellard
218 6643d27e bellard
struct mips_opcode
219 6643d27e bellard
{
220 6643d27e bellard
  /* The name of the instruction.  */
221 6643d27e bellard
  const char *name;
222 6643d27e bellard
  /* A string describing the arguments for this instruction.  */
223 6643d27e bellard
  const char *args;
224 6643d27e bellard
  /* The basic opcode for the instruction.  When assembling, this
225 6643d27e bellard
     opcode is modified by the arguments to produce the actual opcode
226 6643d27e bellard
     that is used.  If pinfo is INSN_MACRO, then this is 0.  */
227 6643d27e bellard
  unsigned long match;
228 6643d27e bellard
  /* If pinfo is not INSN_MACRO, then this is a bit mask for the
229 6643d27e bellard
     relevant portions of the opcode when disassembling.  If the
230 6643d27e bellard
     actual opcode anded with the match field equals the opcode field,
231 6643d27e bellard
     then we have found the correct instruction.  If pinfo is
232 6643d27e bellard
     INSN_MACRO, then this field is the macro identifier.  */
233 6643d27e bellard
  unsigned long mask;
234 6643d27e bellard
  /* For a macro, this is INSN_MACRO.  Otherwise, it is a collection
235 6643d27e bellard
     of bits describing the instruction, notably any relevant hazard
236 6643d27e bellard
     information.  */
237 6643d27e bellard
  unsigned long pinfo;
238 6643d27e bellard
  /* A collection of bits describing the instruction sets of which this
239 6643d27e bellard
     instruction or macro is a member. */
240 6643d27e bellard
  unsigned long membership;
241 6643d27e bellard
};
242 6643d27e bellard
243 6643d27e bellard
/* These are the characters which may appear in the args field of an
244 6643d27e bellard
   instruction.  They appear in the order in which the fields appear
245 6643d27e bellard
   when the instruction is used.  Commas and parentheses in the args
246 6643d27e bellard
   string are ignored when assembling, and written into the output
247 6643d27e bellard
   when disassembling.
248 6643d27e bellard

249 6643d27e bellard
   Each of these characters corresponds to a mask field defined above.
250 6643d27e bellard

251 6643d27e bellard
   "<" 5 bit shift amount (OP_*_SHAMT)
252 6643d27e bellard
   ">" shift amount between 32 and 63, stored after subtracting 32 (OP_*_SHAMT)
253 6643d27e bellard
   "a" 26 bit target address (OP_*_TARGET)
254 6643d27e bellard
   "b" 5 bit base register (OP_*_RS)
255 6643d27e bellard
   "c" 10 bit breakpoint code (OP_*_CODE)
256 6643d27e bellard
   "d" 5 bit destination register specifier (OP_*_RD)
257 6643d27e bellard
   "h" 5 bit prefx hint (OP_*_PREFX)
258 6643d27e bellard
   "i" 16 bit unsigned immediate (OP_*_IMMEDIATE)
259 6643d27e bellard
   "j" 16 bit signed immediate (OP_*_DELTA)
260 6643d27e bellard
   "k" 5 bit cache opcode in target register position (OP_*_CACHE)
261 6643d27e bellard
       Also used for immediate operands in vr5400 vector insns.
262 6643d27e bellard
   "o" 16 bit signed offset (OP_*_DELTA)
263 6643d27e bellard
   "p" 16 bit PC relative branch target address (OP_*_DELTA)
264 6643d27e bellard
   "q" 10 bit extra breakpoint code (OP_*_CODE2)
265 6643d27e bellard
   "r" 5 bit same register used as both source and target (OP_*_RS)
266 6643d27e bellard
   "s" 5 bit source register specifier (OP_*_RS)
267 6643d27e bellard
   "t" 5 bit target register (OP_*_RT)
268 6643d27e bellard
   "u" 16 bit upper 16 bits of address (OP_*_IMMEDIATE)
269 6643d27e bellard
   "v" 5 bit same register used as both source and destination (OP_*_RS)
270 6643d27e bellard
   "w" 5 bit same register used as both target and destination (OP_*_RT)
271 6643d27e bellard
   "U" 5 bit same destination register in both OP_*_RD and OP_*_RT
272 6643d27e bellard
       (used by clo and clz)
273 6643d27e bellard
   "C" 25 bit coprocessor function code (OP_*_COPZ)
274 6643d27e bellard
   "B" 20 bit syscall/breakpoint function code (OP_*_CODE20)
275 6643d27e bellard
   "J" 19 bit wait function code (OP_*_CODE19)
276 6643d27e bellard
   "x" accept and ignore register name
277 6643d27e bellard
   "z" must be zero register
278 6643d27e bellard
   "K" 5 bit Hardware Register (rdhwr instruction) (OP_*_RD)
279 6643d27e bellard
   "+A" 5 bit ins/ext position, which becomes LSB (OP_*_SHAMT).
280 6643d27e bellard
        Enforces: 0 <= pos < 32.
281 6643d27e bellard
   "+B" 5 bit ins size, which becomes MSB (OP_*_INSMSB).
282 6643d27e bellard
        Requires that "+A" or "+E" occur first to set position.
283 6643d27e bellard
        Enforces: 0 < (pos+size) <= 32.
284 6643d27e bellard
   "+C" 5 bit ext size, which becomes MSBD (OP_*_EXTMSBD).
285 6643d27e bellard
        Requires that "+A" or "+E" occur first to set position.
286 6643d27e bellard
        Enforces: 0 < (pos+size) <= 32.
287 6643d27e bellard
        (Also used by "dext" w/ different limits, but limits for
288 6643d27e bellard
        that are checked by the M_DEXT macro.)
289 6643d27e bellard
   "+E" 5 bit dins/dext position, which becomes LSB-32 (OP_*_SHAMT).
290 6643d27e bellard
        Enforces: 32 <= pos < 64.
291 6643d27e bellard
   "+F" 5 bit "dinsm" size, which becomes MSB-32 (OP_*_INSMSB).
292 6643d27e bellard
        Requires that "+A" or "+E" occur first to set position.
293 6643d27e bellard
        Enforces: 32 < (pos+size) <= 64.
294 6643d27e bellard
   "+G" 5 bit "dextm" size, which becomes MSBD-32 (OP_*_EXTMSBD).
295 6643d27e bellard
        Requires that "+A" or "+E" occur first to set position.
296 6643d27e bellard
        Enforces: 32 < (pos+size) <= 64.
297 6643d27e bellard
   "+H" 5 bit "dextu" size, which becomes MSBD (OP_*_EXTMSBD).
298 6643d27e bellard
        Requires that "+A" or "+E" occur first to set position.
299 6643d27e bellard
        Enforces: 32 < (pos+size) <= 64.
300 6643d27e bellard

301 6643d27e bellard
   Floating point instructions:
302 6643d27e bellard
   "D" 5 bit destination register (OP_*_FD)
303 6643d27e bellard
   "M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up)
304 6643d27e bellard
   "N" 3 bit branch condition code (OP_*_BCC) (only used for mips4 and up)
305 6643d27e bellard
   "S" 5 bit fs source 1 register (OP_*_FS)
306 6643d27e bellard
   "T" 5 bit ft source 2 register (OP_*_FT)
307 6643d27e bellard
   "R" 5 bit fr source 3 register (OP_*_FR)
308 6643d27e bellard
   "V" 5 bit same register used as floating source and destination (OP_*_FS)
309 6643d27e bellard
   "W" 5 bit same register used as floating target and destination (OP_*_FT)
310 6643d27e bellard

311 6643d27e bellard
   Coprocessor instructions:
312 6643d27e bellard
   "E" 5 bit target register (OP_*_RT)
313 6643d27e bellard
   "G" 5 bit destination register (OP_*_RD)
314 6643d27e bellard
   "H" 3 bit sel field for (d)mtc* and (d)mfc* (OP_*_SEL)
315 6643d27e bellard
   "P" 5 bit performance-monitor register (OP_*_PERFREG)
316 6643d27e bellard
   "e" 5 bit vector register byte specifier (OP_*_VECBYTE)
317 6643d27e bellard
   "%" 3 bit immediate vr5400 vector alignment operand (OP_*_VECALIGN)
318 6643d27e bellard
   see also "k" above
319 6643d27e bellard
   "+D" Combined destination register ("G") and sel ("H") for CP0 ops,
320 6643d27e bellard
        for pretty-printing in disassembly only.
321 6643d27e bellard

322 6643d27e bellard
   Macro instructions:
323 6643d27e bellard
   "A" General 32 bit expression
324 6643d27e bellard
   "I" 32 bit immediate (value placed in imm_expr).
325 6643d27e bellard
   "+I" 32 bit immediate (value placed in imm2_expr).
326 6643d27e bellard
   "F" 64 bit floating point constant in .rdata
327 6643d27e bellard
   "L" 64 bit floating point constant in .lit8
328 6643d27e bellard
   "f" 32 bit floating point constant
329 6643d27e bellard
   "l" 32 bit floating point constant in .lit4
330 6643d27e bellard

331 6643d27e bellard
   MDMX instruction operands (note that while these use the FP register
332 6643d27e bellard
   fields, they accept both $fN and $vN names for the registers):  
333 6643d27e bellard
   "O"        MDMX alignment offset (OP_*_ALN)
334 6643d27e bellard
   "Q"        MDMX vector/scalar/immediate source (OP_*_VSEL and OP_*_FT)
335 6643d27e bellard
   "X"        MDMX destination register (OP_*_FD) 
336 6643d27e bellard
   "Y"        MDMX source register (OP_*_FS)
337 6643d27e bellard
   "Z"        MDMX source register (OP_*_FT)
338 6643d27e bellard

339 6643d27e bellard
   Other:
340 6643d27e bellard
   "()" parens surrounding optional value
341 6643d27e bellard
   ","  separates operands
342 6643d27e bellard
   "[]" brackets around index for vector-op scalar operand specifier (vr5400)
343 6643d27e bellard
   "+"  Start of extension sequence.
344 6643d27e bellard

345 6643d27e bellard
   Characters used so far, for quick reference when adding more:
346 6643d27e bellard
   "%[]<>(),+"
347 6643d27e bellard
   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
348 6643d27e bellard
   "abcdefhijklopqrstuvwxz"
349 6643d27e bellard

350 6643d27e bellard
   Extension character sequences used so far ("+" followed by the
351 6643d27e bellard
   following), for quick reference when adding more:
352 6643d27e bellard
   "ABCDEFGHI"
353 6643d27e bellard
*/
354 6643d27e bellard
355 6643d27e bellard
/* These are the bits which may be set in the pinfo field of an
356 6643d27e bellard
   instructions, if it is not equal to INSN_MACRO.  */
357 6643d27e bellard
358 6643d27e bellard
/* Modifies the general purpose register in OP_*_RD.  */
359 6643d27e bellard
#define INSN_WRITE_GPR_D            0x00000001
360 6643d27e bellard
/* Modifies the general purpose register in OP_*_RT.  */
361 6643d27e bellard
#define INSN_WRITE_GPR_T            0x00000002
362 6643d27e bellard
/* Modifies general purpose register 31.  */
363 6643d27e bellard
#define INSN_WRITE_GPR_31           0x00000004
364 6643d27e bellard
/* Modifies the floating point register in OP_*_FD.  */
365 6643d27e bellard
#define INSN_WRITE_FPR_D            0x00000008
366 6643d27e bellard
/* Modifies the floating point register in OP_*_FS.  */
367 6643d27e bellard
#define INSN_WRITE_FPR_S            0x00000010
368 6643d27e bellard
/* Modifies the floating point register in OP_*_FT.  */
369 6643d27e bellard
#define INSN_WRITE_FPR_T            0x00000020
370 6643d27e bellard
/* Reads the general purpose register in OP_*_RS.  */
371 6643d27e bellard
#define INSN_READ_GPR_S             0x00000040
372 6643d27e bellard
/* Reads the general purpose register in OP_*_RT.  */
373 6643d27e bellard
#define INSN_READ_GPR_T             0x00000080
374 6643d27e bellard
/* Reads the floating point register in OP_*_FS.  */
375 6643d27e bellard
#define INSN_READ_FPR_S             0x00000100
376 6643d27e bellard
/* Reads the floating point register in OP_*_FT.  */
377 6643d27e bellard
#define INSN_READ_FPR_T             0x00000200
378 6643d27e bellard
/* Reads the floating point register in OP_*_FR.  */
379 6643d27e bellard
#define INSN_READ_FPR_R                    0x00000400
380 6643d27e bellard
/* Modifies coprocessor condition code.  */
381 6643d27e bellard
#define INSN_WRITE_COND_CODE        0x00000800
382 6643d27e bellard
/* Reads coprocessor condition code.  */
383 6643d27e bellard
#define INSN_READ_COND_CODE         0x00001000
384 6643d27e bellard
/* TLB operation.  */
385 6643d27e bellard
#define INSN_TLB                    0x00002000
386 6643d27e bellard
/* Reads coprocessor register other than floating point register.  */
387 6643d27e bellard
#define INSN_COP                    0x00004000
388 6643d27e bellard
/* Instruction loads value from memory, requiring delay.  */
389 6643d27e bellard
#define INSN_LOAD_MEMORY_DELAY      0x00008000
390 6643d27e bellard
/* Instruction loads value from coprocessor, requiring delay.  */
391 6643d27e bellard
#define INSN_LOAD_COPROC_DELAY            0x00010000
392 6643d27e bellard
/* Instruction has unconditional branch delay slot.  */
393 6643d27e bellard
#define INSN_UNCOND_BRANCH_DELAY    0x00020000
394 6643d27e bellard
/* Instruction has conditional branch delay slot.  */
395 6643d27e bellard
#define INSN_COND_BRANCH_DELAY      0x00040000
396 6643d27e bellard
/* Conditional branch likely: if branch not taken, insn nullified.  */
397 6643d27e bellard
#define INSN_COND_BRANCH_LIKELY            0x00080000
398 6643d27e bellard
/* Moves to coprocessor register, requiring delay.  */
399 6643d27e bellard
#define INSN_COPROC_MOVE_DELAY      0x00100000
400 6643d27e bellard
/* Loads coprocessor register from memory, requiring delay.  */
401 6643d27e bellard
#define INSN_COPROC_MEMORY_DELAY    0x00200000
402 6643d27e bellard
/* Reads the HI register.  */
403 6643d27e bellard
#define INSN_READ_HI                    0x00400000
404 6643d27e bellard
/* Reads the LO register.  */
405 6643d27e bellard
#define INSN_READ_LO                    0x00800000
406 6643d27e bellard
/* Modifies the HI register.  */
407 6643d27e bellard
#define INSN_WRITE_HI                    0x01000000
408 6643d27e bellard
/* Modifies the LO register.  */
409 6643d27e bellard
#define INSN_WRITE_LO                    0x02000000
410 6643d27e bellard
/* Takes a trap (easier to keep out of delay slot).  */
411 6643d27e bellard
#define INSN_TRAP                   0x04000000
412 6643d27e bellard
/* Instruction stores value into memory.  */
413 6643d27e bellard
#define INSN_STORE_MEMORY            0x08000000
414 6643d27e bellard
/* Instruction uses single precision floating point.  */
415 6643d27e bellard
#define FP_S                            0x10000000
416 6643d27e bellard
/* Instruction uses double precision floating point.  */
417 6643d27e bellard
#define FP_D                            0x20000000
418 6643d27e bellard
/* Instruction is part of the tx39's integer multiply family.    */
419 6643d27e bellard
#define INSN_MULT                   0x40000000
420 6643d27e bellard
/* Instruction synchronize shared memory.  */
421 6643d27e bellard
#define INSN_SYNC                    0x80000000
422 6643d27e bellard
/* Instruction reads MDMX accumulator.  XXX FIXME: No bits left!  */
423 6643d27e bellard
#define INSN_READ_MDMX_ACC            0
424 6643d27e bellard
/* Instruction writes MDMX accumulator.  XXX FIXME: No bits left!  */
425 6643d27e bellard
#define INSN_WRITE_MDMX_ACC            0
426 6643d27e bellard
427 6643d27e bellard
/* Instruction is actually a macro.  It should be ignored by the
428 6643d27e bellard
   disassembler, and requires special treatment by the assembler.  */
429 6643d27e bellard
#define INSN_MACRO                  0xffffffff
430 6643d27e bellard
431 6643d27e bellard
/* Masks used to mark instructions to indicate which MIPS ISA level
432 6643d27e bellard
   they were introduced in.  ISAs, as defined below, are logical
433 6643d27e bellard
   ORs of these bits, indicating that they support the instructions
434 6643d27e bellard
   defined at the given level.  */
435 6643d27e bellard
436 6643d27e bellard
#define INSN_ISA_MASK                  0x00000fff
437 6643d27e bellard
#define INSN_ISA1                 0x00000001
438 6643d27e bellard
#define INSN_ISA2                 0x00000002
439 6643d27e bellard
#define INSN_ISA3                 0x00000004
440 6643d27e bellard
#define INSN_ISA4                 0x00000008
441 6643d27e bellard
#define INSN_ISA5                 0x00000010
442 6643d27e bellard
#define INSN_ISA32                0x00000020
443 6643d27e bellard
#define INSN_ISA64                0x00000040
444 6643d27e bellard
#define INSN_ISA32R2              0x00000080
445 6643d27e bellard
#define INSN_ISA64R2              0x00000100
446 6643d27e bellard
447 6643d27e bellard
/* Masks used for MIPS-defined ASEs.  */
448 6643d27e bellard
#define INSN_ASE_MASK                  0x0000f000
449 6643d27e bellard
450 6643d27e bellard
/* MIPS 16 ASE */
451 6643d27e bellard
#define INSN_MIPS16               0x00002000
452 6643d27e bellard
/* MIPS-3D ASE */
453 6643d27e bellard
#define INSN_MIPS3D               0x00004000
454 6643d27e bellard
/* MDMX ASE */ 
455 6643d27e bellard
#define INSN_MDMX                 0x00008000
456 6643d27e bellard
457 6643d27e bellard
/* Chip specific instructions.  These are bitmasks.  */
458 6643d27e bellard
459 6643d27e bellard
/* MIPS R4650 instruction.  */
460 6643d27e bellard
#define INSN_4650                 0x00010000
461 6643d27e bellard
/* LSI R4010 instruction.  */
462 6643d27e bellard
#define INSN_4010                 0x00020000
463 6643d27e bellard
/* NEC VR4100 instruction.  */
464 6643d27e bellard
#define INSN_4100                 0x00040000
465 6643d27e bellard
/* Toshiba R3900 instruction.  */
466 6643d27e bellard
#define INSN_3900                 0x00080000
467 6643d27e bellard
/* MIPS R10000 instruction.  */
468 6643d27e bellard
#define INSN_10000                0x00100000
469 6643d27e bellard
/* Broadcom SB-1 instruction.  */
470 6643d27e bellard
#define INSN_SB1                  0x00200000
471 6643d27e bellard
/* NEC VR4111/VR4181 instruction.  */
472 6643d27e bellard
#define INSN_4111                 0x00400000
473 6643d27e bellard
/* NEC VR4120 instruction.  */
474 6643d27e bellard
#define INSN_4120                 0x00800000
475 6643d27e bellard
/* NEC VR5400 instruction.  */
476 6643d27e bellard
#define INSN_5400                  0x01000000
477 6643d27e bellard
/* NEC VR5500 instruction.  */
478 6643d27e bellard
#define INSN_5500                  0x02000000
479 6643d27e bellard
480 6643d27e bellard
/* MIPS ISA defines, use instead of hardcoding ISA level.  */
481 6643d27e bellard
482 6643d27e bellard
#define       ISA_UNKNOWN     0               /* Gas internal use.  */
483 6643d27e bellard
#define       ISA_MIPS1       (INSN_ISA1)
484 6643d27e bellard
#define       ISA_MIPS2       (ISA_MIPS1 | INSN_ISA2)
485 6643d27e bellard
#define       ISA_MIPS3       (ISA_MIPS2 | INSN_ISA3)
486 6643d27e bellard
#define       ISA_MIPS4       (ISA_MIPS3 | INSN_ISA4)
487 6643d27e bellard
#define       ISA_MIPS5       (ISA_MIPS4 | INSN_ISA5)
488 6643d27e bellard
489 6643d27e bellard
#define       ISA_MIPS32      (ISA_MIPS2 | INSN_ISA32)
490 6643d27e bellard
#define       ISA_MIPS64      (ISA_MIPS5 | INSN_ISA32 | INSN_ISA64)
491 6643d27e bellard
492 6643d27e bellard
#define       ISA_MIPS32R2    (ISA_MIPS32 | INSN_ISA32R2)
493 6643d27e bellard
#define       ISA_MIPS64R2    (ISA_MIPS64 | INSN_ISA32R2 | INSN_ISA64R2)
494 6643d27e bellard
495 6643d27e bellard
496 6643d27e bellard
/* CPU defines, use instead of hardcoding processor number. Keep this
497 6643d27e bellard
   in sync with bfd/archures.c in order for machine selection to work.  */
498 6643d27e bellard
#define CPU_UNKNOWN        0               /* Gas internal use.  */
499 6643d27e bellard
#define CPU_R3000        3000
500 6643d27e bellard
#define CPU_R3900        3900
501 6643d27e bellard
#define CPU_R4000        4000
502 6643d27e bellard
#define CPU_R4010        4010
503 6643d27e bellard
#define CPU_VR4100        4100
504 6643d27e bellard
#define CPU_R4111        4111
505 6643d27e bellard
#define CPU_VR4120        4120
506 6643d27e bellard
#define CPU_R4300        4300
507 6643d27e bellard
#define CPU_R4400        4400
508 6643d27e bellard
#define CPU_R4600        4600
509 6643d27e bellard
#define CPU_R4650        4650
510 6643d27e bellard
#define CPU_R5000        5000
511 6643d27e bellard
#define CPU_VR5400        5400
512 6643d27e bellard
#define CPU_VR5500        5500
513 6643d27e bellard
#define CPU_R6000        6000
514 6643d27e bellard
#define CPU_RM7000        7000
515 6643d27e bellard
#define CPU_R8000        8000
516 6643d27e bellard
#define CPU_R10000        10000
517 6643d27e bellard
#define CPU_R12000        12000
518 6643d27e bellard
#define CPU_MIPS16        16
519 6643d27e bellard
#define CPU_MIPS32        32
520 6643d27e bellard
#define CPU_MIPS32R2        33
521 6643d27e bellard
#define CPU_MIPS5       5
522 6643d27e bellard
#define CPU_MIPS64      64
523 6643d27e bellard
#define CPU_MIPS64R2        65
524 6643d27e bellard
#define CPU_SB1         12310201        /* octal 'SB', 01.  */
525 6643d27e bellard
526 6643d27e bellard
/* Test for membership in an ISA including chip specific ISAs.  INSN
527 6643d27e bellard
   is pointer to an element of the opcode table; ISA is the specified
528 6643d27e bellard
   ISA/ASE bitmask to test against; and CPU is the CPU specific ISA to
529 6643d27e bellard
   test, or zero if no CPU specific ISA test is desired.  */
530 6643d27e bellard
531 6643d27e bellard
#define OPCODE_IS_MEMBER(insn, isa, cpu)                                \
532 6643d27e bellard
    (((insn)->membership & isa) != 0                                        \
533 6643d27e bellard
     || (cpu == CPU_R4650 && ((insn)->membership & INSN_4650) != 0)        \
534 6643d27e bellard
     || (cpu == CPU_RM7000 && ((insn)->membership & INSN_4650) != 0)        \
535 6643d27e bellard
     || (cpu == CPU_R4010 && ((insn)->membership & INSN_4010) != 0)        \
536 6643d27e bellard
     || (cpu == CPU_VR4100 && ((insn)->membership & INSN_4100) != 0)        \
537 6643d27e bellard
     || (cpu == CPU_R3900 && ((insn)->membership & INSN_3900) != 0)        \
538 6643d27e bellard
     || ((cpu == CPU_R10000 || cpu == CPU_R12000)                        \
539 6643d27e bellard
         && ((insn)->membership & INSN_10000) != 0)                        \
540 6643d27e bellard
     || (cpu == CPU_SB1 && ((insn)->membership & INSN_SB1) != 0)        \
541 6643d27e bellard
     || (cpu == CPU_R4111 && ((insn)->membership & INSN_4111) != 0)        \
542 6643d27e bellard
     || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0)        \
543 6643d27e bellard
     || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0)        \
544 6643d27e bellard
     || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0)        \
545 6643d27e bellard
     || 0)        /* Please keep this term for easier source merging.  */
546 6643d27e bellard
547 6643d27e bellard
/* This is a list of macro expanded instructions.
548 6643d27e bellard

549 6643d27e bellard
   _I appended means immediate
550 6643d27e bellard
   _A appended means address
551 6643d27e bellard
   _AB appended means address with base register
552 6643d27e bellard
   _D appended means 64 bit floating point constant
553 6643d27e bellard
   _S appended means 32 bit floating point constant.  */
554 6643d27e bellard
555 6643d27e bellard
enum
556 6643d27e bellard
{
557 6643d27e bellard
  M_ABS,
558 6643d27e bellard
  M_ADD_I,
559 6643d27e bellard
  M_ADDU_I,
560 6643d27e bellard
  M_AND_I,
561 6643d27e bellard
  M_BEQ,
562 6643d27e bellard
  M_BEQ_I,
563 6643d27e bellard
  M_BEQL_I,
564 6643d27e bellard
  M_BGE,
565 6643d27e bellard
  M_BGEL,
566 6643d27e bellard
  M_BGE_I,
567 6643d27e bellard
  M_BGEL_I,
568 6643d27e bellard
  M_BGEU,
569 6643d27e bellard
  M_BGEUL,
570 6643d27e bellard
  M_BGEU_I,
571 6643d27e bellard
  M_BGEUL_I,
572 6643d27e bellard
  M_BGT,
573 6643d27e bellard
  M_BGTL,
574 6643d27e bellard
  M_BGT_I,
575 6643d27e bellard
  M_BGTL_I,
576 6643d27e bellard
  M_BGTU,
577 6643d27e bellard
  M_BGTUL,
578 6643d27e bellard
  M_BGTU_I,
579 6643d27e bellard
  M_BGTUL_I,
580 6643d27e bellard
  M_BLE,
581 6643d27e bellard
  M_BLEL,
582 6643d27e bellard
  M_BLE_I,
583 6643d27e bellard
  M_BLEL_I,
584 6643d27e bellard
  M_BLEU,
585 6643d27e bellard
  M_BLEUL,
586 6643d27e bellard
  M_BLEU_I,
587 6643d27e bellard
  M_BLEUL_I,
588 6643d27e bellard
  M_BLT,
589 6643d27e bellard
  M_BLTL,
590 6643d27e bellard
  M_BLT_I,
591 6643d27e bellard
  M_BLTL_I,
592 6643d27e bellard
  M_BLTU,
593 6643d27e bellard
  M_BLTUL,
594 6643d27e bellard
  M_BLTU_I,
595 6643d27e bellard
  M_BLTUL_I,
596 6643d27e bellard
  M_BNE,
597 6643d27e bellard
  M_BNE_I,
598 6643d27e bellard
  M_BNEL_I,
599 6643d27e bellard
  M_DABS,
600 6643d27e bellard
  M_DADD_I,
601 6643d27e bellard
  M_DADDU_I,
602 6643d27e bellard
  M_DDIV_3,
603 6643d27e bellard
  M_DDIV_3I,
604 6643d27e bellard
  M_DDIVU_3,
605 6643d27e bellard
  M_DDIVU_3I,
606 6643d27e bellard
  M_DEXT,
607 6643d27e bellard
  M_DINS,
608 6643d27e bellard
  M_DIV_3,
609 6643d27e bellard
  M_DIV_3I,
610 6643d27e bellard
  M_DIVU_3,
611 6643d27e bellard
  M_DIVU_3I,
612 6643d27e bellard
  M_DLA_AB,
613 6643d27e bellard
  M_DLCA_AB,
614 6643d27e bellard
  M_DLI,
615 6643d27e bellard
  M_DMUL,
616 6643d27e bellard
  M_DMUL_I,
617 6643d27e bellard
  M_DMULO,
618 6643d27e bellard
  M_DMULO_I,
619 6643d27e bellard
  M_DMULOU,
620 6643d27e bellard
  M_DMULOU_I,
621 6643d27e bellard
  M_DREM_3,
622 6643d27e bellard
  M_DREM_3I,
623 6643d27e bellard
  M_DREMU_3,
624 6643d27e bellard
  M_DREMU_3I,
625 6643d27e bellard
  M_DSUB_I,
626 6643d27e bellard
  M_DSUBU_I,
627 6643d27e bellard
  M_DSUBU_I_2,
628 6643d27e bellard
  M_J_A,
629 6643d27e bellard
  M_JAL_1,
630 6643d27e bellard
  M_JAL_2,
631 6643d27e bellard
  M_JAL_A,
632 6643d27e bellard
  M_L_DOB,
633 6643d27e bellard
  M_L_DAB,
634 6643d27e bellard
  M_LA_AB,
635 6643d27e bellard
  M_LB_A,
636 6643d27e bellard
  M_LB_AB,
637 6643d27e bellard
  M_LBU_A,
638 6643d27e bellard
  M_LBU_AB,
639 6643d27e bellard
  M_LCA_AB,
640 6643d27e bellard
  M_LD_A,
641 6643d27e bellard
  M_LD_OB,
642 6643d27e bellard
  M_LD_AB,
643 6643d27e bellard
  M_LDC1_AB,
644 6643d27e bellard
  M_LDC2_AB,
645 6643d27e bellard
  M_LDC3_AB,
646 6643d27e bellard
  M_LDL_AB,
647 6643d27e bellard
  M_LDR_AB,
648 6643d27e bellard
  M_LH_A,
649 6643d27e bellard
  M_LH_AB,
650 6643d27e bellard
  M_LHU_A,
651 6643d27e bellard
  M_LHU_AB,
652 6643d27e bellard
  M_LI,
653 6643d27e bellard
  M_LI_D,
654 6643d27e bellard
  M_LI_DD,
655 6643d27e bellard
  M_LI_S,
656 6643d27e bellard
  M_LI_SS,
657 6643d27e bellard
  M_LL_AB,
658 6643d27e bellard
  M_LLD_AB,
659 6643d27e bellard
  M_LS_A,
660 6643d27e bellard
  M_LW_A,
661 6643d27e bellard
  M_LW_AB,
662 6643d27e bellard
  M_LWC0_A,
663 6643d27e bellard
  M_LWC0_AB,
664 6643d27e bellard
  M_LWC1_A,
665 6643d27e bellard
  M_LWC1_AB,
666 6643d27e bellard
  M_LWC2_A,
667 6643d27e bellard
  M_LWC2_AB,
668 6643d27e bellard
  M_LWC3_A,
669 6643d27e bellard
  M_LWC3_AB,
670 6643d27e bellard
  M_LWL_A,
671 6643d27e bellard
  M_LWL_AB,
672 6643d27e bellard
  M_LWR_A,
673 6643d27e bellard
  M_LWR_AB,
674 6643d27e bellard
  M_LWU_AB,
675 6643d27e bellard
  M_MOVE,
676 6643d27e bellard
  M_MUL,
677 6643d27e bellard
  M_MUL_I,
678 6643d27e bellard
  M_MULO,
679 6643d27e bellard
  M_MULO_I,
680 6643d27e bellard
  M_MULOU,
681 6643d27e bellard
  M_MULOU_I,
682 6643d27e bellard
  M_NOR_I,
683 6643d27e bellard
  M_OR_I,
684 6643d27e bellard
  M_REM_3,
685 6643d27e bellard
  M_REM_3I,
686 6643d27e bellard
  M_REMU_3,
687 6643d27e bellard
  M_REMU_3I,
688 6643d27e bellard
  M_DROL,
689 6643d27e bellard
  M_ROL,
690 6643d27e bellard
  M_DROL_I,
691 6643d27e bellard
  M_ROL_I,
692 6643d27e bellard
  M_DROR,
693 6643d27e bellard
  M_ROR,
694 6643d27e bellard
  M_DROR_I,
695 6643d27e bellard
  M_ROR_I,
696 6643d27e bellard
  M_S_DA,
697 6643d27e bellard
  M_S_DOB,
698 6643d27e bellard
  M_S_DAB,
699 6643d27e bellard
  M_S_S,
700 6643d27e bellard
  M_SC_AB,
701 6643d27e bellard
  M_SCD_AB,
702 6643d27e bellard
  M_SD_A,
703 6643d27e bellard
  M_SD_OB,
704 6643d27e bellard
  M_SD_AB,
705 6643d27e bellard
  M_SDC1_AB,
706 6643d27e bellard
  M_SDC2_AB,
707 6643d27e bellard
  M_SDC3_AB,
708 6643d27e bellard
  M_SDL_AB,
709 6643d27e bellard
  M_SDR_AB,
710 6643d27e bellard
  M_SEQ,
711 6643d27e bellard
  M_SEQ_I,
712 6643d27e bellard
  M_SGE,
713 6643d27e bellard
  M_SGE_I,
714 6643d27e bellard
  M_SGEU,
715 6643d27e bellard
  M_SGEU_I,
716 6643d27e bellard
  M_SGT,
717 6643d27e bellard
  M_SGT_I,
718 6643d27e bellard
  M_SGTU,
719 6643d27e bellard
  M_SGTU_I,
720 6643d27e bellard
  M_SLE,
721 6643d27e bellard
  M_SLE_I,
722 6643d27e bellard
  M_SLEU,
723 6643d27e bellard
  M_SLEU_I,
724 6643d27e bellard
  M_SLT_I,
725 6643d27e bellard
  M_SLTU_I,
726 6643d27e bellard
  M_SNE,
727 6643d27e bellard
  M_SNE_I,
728 6643d27e bellard
  M_SB_A,
729 6643d27e bellard
  M_SB_AB,
730 6643d27e bellard
  M_SH_A,
731 6643d27e bellard
  M_SH_AB,
732 6643d27e bellard
  M_SW_A,
733 6643d27e bellard
  M_SW_AB,
734 6643d27e bellard
  M_SWC0_A,
735 6643d27e bellard
  M_SWC0_AB,
736 6643d27e bellard
  M_SWC1_A,
737 6643d27e bellard
  M_SWC1_AB,
738 6643d27e bellard
  M_SWC2_A,
739 6643d27e bellard
  M_SWC2_AB,
740 6643d27e bellard
  M_SWC3_A,
741 6643d27e bellard
  M_SWC3_AB,
742 6643d27e bellard
  M_SWL_A,
743 6643d27e bellard
  M_SWL_AB,
744 6643d27e bellard
  M_SWR_A,
745 6643d27e bellard
  M_SWR_AB,
746 6643d27e bellard
  M_SUB_I,
747 6643d27e bellard
  M_SUBU_I,
748 6643d27e bellard
  M_SUBU_I_2,
749 6643d27e bellard
  M_TEQ_I,
750 6643d27e bellard
  M_TGE_I,
751 6643d27e bellard
  M_TGEU_I,
752 6643d27e bellard
  M_TLT_I,
753 6643d27e bellard
  M_TLTU_I,
754 6643d27e bellard
  M_TNE_I,
755 6643d27e bellard
  M_TRUNCWD,
756 6643d27e bellard
  M_TRUNCWS,
757 6643d27e bellard
  M_ULD,
758 6643d27e bellard
  M_ULD_A,
759 6643d27e bellard
  M_ULH,
760 6643d27e bellard
  M_ULH_A,
761 6643d27e bellard
  M_ULHU,
762 6643d27e bellard
  M_ULHU_A,
763 6643d27e bellard
  M_ULW,
764 6643d27e bellard
  M_ULW_A,
765 6643d27e bellard
  M_USH,
766 6643d27e bellard
  M_USH_A,
767 6643d27e bellard
  M_USW,
768 6643d27e bellard
  M_USW_A,
769 6643d27e bellard
  M_USD,
770 6643d27e bellard
  M_USD_A,
771 6643d27e bellard
  M_XOR_I,
772 6643d27e bellard
  M_COP0,
773 6643d27e bellard
  M_COP1,
774 6643d27e bellard
  M_COP2,
775 6643d27e bellard
  M_COP3,
776 6643d27e bellard
  M_NUM_MACROS
777 6643d27e bellard
};
778 6643d27e bellard
779 6643d27e bellard
780 6643d27e bellard
/* The order of overloaded instructions matters.  Label arguments and
781 6643d27e bellard
   register arguments look the same. Instructions that can have either
782 6643d27e bellard
   for arguments must apear in the correct order in this table for the
783 6643d27e bellard
   assembler to pick the right one. In other words, entries with
784 6643d27e bellard
   immediate operands must apear after the same instruction with
785 6643d27e bellard
   registers.
786 6643d27e bellard

787 6643d27e bellard
   Many instructions are short hand for other instructions (i.e., The
788 6643d27e bellard
   jal <register> instruction is short for jalr <register>).  */
789 6643d27e bellard
790 6643d27e bellard
extern const struct mips_opcode mips_builtin_opcodes[];
791 6643d27e bellard
extern const int bfd_mips_num_builtin_opcodes;
792 6643d27e bellard
extern struct mips_opcode *mips_opcodes;
793 6643d27e bellard
extern int bfd_mips_num_opcodes;
794 6643d27e bellard
#define NUMOPCODES bfd_mips_num_opcodes
795 6643d27e bellard
796 6643d27e bellard
 
797 6643d27e bellard
/* The rest of this file adds definitions for the mips16 TinyRISC
798 6643d27e bellard
   processor.  */
799 6643d27e bellard
800 6643d27e bellard
/* These are the bitmasks and shift counts used for the different
801 6643d27e bellard
   fields in the instruction formats.  Other than OP, no masks are
802 6643d27e bellard
   provided for the fixed portions of an instruction, since they are
803 6643d27e bellard
   not needed.
804 6643d27e bellard

805 6643d27e bellard
   The I format uses IMM11.
806 6643d27e bellard

807 6643d27e bellard
   The RI format uses RX and IMM8.
808 6643d27e bellard

809 6643d27e bellard
   The RR format uses RX, and RY.
810 6643d27e bellard

811 6643d27e bellard
   The RRI format uses RX, RY, and IMM5.
812 6643d27e bellard

813 6643d27e bellard
   The RRR format uses RX, RY, and RZ.
814 6643d27e bellard

815 6643d27e bellard
   The RRI_A format uses RX, RY, and IMM4.
816 6643d27e bellard

817 6643d27e bellard
   The SHIFT format uses RX, RY, and SHAMT.
818 6643d27e bellard

819 6643d27e bellard
   The I8 format uses IMM8.
820 6643d27e bellard

821 6643d27e bellard
   The I8_MOVR32 format uses RY and REGR32.
822 6643d27e bellard

823 6643d27e bellard
   The IR_MOV32R format uses REG32R and MOV32Z.
824 6643d27e bellard

825 6643d27e bellard
   The I64 format uses IMM8.
826 6643d27e bellard

827 6643d27e bellard
   The RI64 format uses RY and IMM5.
828 6643d27e bellard
   */
829 6643d27e bellard
830 6643d27e bellard
#define MIPS16OP_MASK_OP        0x1f
831 6643d27e bellard
#define MIPS16OP_SH_OP                11
832 6643d27e bellard
#define MIPS16OP_MASK_IMM11        0x7ff
833 6643d27e bellard
#define MIPS16OP_SH_IMM11        0
834 6643d27e bellard
#define MIPS16OP_MASK_RX        0x7
835 6643d27e bellard
#define MIPS16OP_SH_RX                8
836 6643d27e bellard
#define MIPS16OP_MASK_IMM8        0xff
837 6643d27e bellard
#define MIPS16OP_SH_IMM8        0
838 6643d27e bellard
#define MIPS16OP_MASK_RY        0x7
839 6643d27e bellard
#define MIPS16OP_SH_RY                5
840 6643d27e bellard
#define MIPS16OP_MASK_IMM5        0x1f
841 6643d27e bellard
#define MIPS16OP_SH_IMM5        0
842 6643d27e bellard
#define MIPS16OP_MASK_RZ        0x7
843 6643d27e bellard
#define MIPS16OP_SH_RZ                2
844 6643d27e bellard
#define MIPS16OP_MASK_IMM4        0xf
845 6643d27e bellard
#define MIPS16OP_SH_IMM4        0
846 6643d27e bellard
#define MIPS16OP_MASK_REGR32        0x1f
847 6643d27e bellard
#define MIPS16OP_SH_REGR32        0
848 6643d27e bellard
#define MIPS16OP_MASK_REG32R        0x1f
849 6643d27e bellard
#define MIPS16OP_SH_REG32R        3
850 6643d27e bellard
#define MIPS16OP_EXTRACT_REG32R(i) ((((i) >> 5) & 7) | ((i) & 0x18))
851 6643d27e bellard
#define MIPS16OP_MASK_MOVE32Z        0x7
852 6643d27e bellard
#define MIPS16OP_SH_MOVE32Z        0
853 6643d27e bellard
#define MIPS16OP_MASK_IMM6        0x3f
854 6643d27e bellard
#define MIPS16OP_SH_IMM6        5
855 6643d27e bellard
856 6643d27e bellard
/* These are the characters which may appears in the args field of an
857 6643d27e bellard
   instruction.  They appear in the order in which the fields appear
858 6643d27e bellard
   when the instruction is used.  Commas and parentheses in the args
859 6643d27e bellard
   string are ignored when assembling, and written into the output
860 6643d27e bellard
   when disassembling.
861 6643d27e bellard

862 6643d27e bellard
   "y" 3 bit register (MIPS16OP_*_RY)
863 6643d27e bellard
   "x" 3 bit register (MIPS16OP_*_RX)
864 6643d27e bellard
   "z" 3 bit register (MIPS16OP_*_RZ)
865 6643d27e bellard
   "Z" 3 bit register (MIPS16OP_*_MOVE32Z)
866 6643d27e bellard
   "v" 3 bit same register as source and destination (MIPS16OP_*_RX)
867 6643d27e bellard
   "w" 3 bit same register as source and destination (MIPS16OP_*_RY)
868 6643d27e bellard
   "0" zero register ($0)
869 6643d27e bellard
   "S" stack pointer ($sp or $29)
870 6643d27e bellard
   "P" program counter
871 6643d27e bellard
   "R" return address register ($ra or $31)
872 6643d27e bellard
   "X" 5 bit MIPS register (MIPS16OP_*_REGR32)
873 6643d27e bellard
   "Y" 5 bit MIPS register (MIPS16OP_*_REG32R)
874 6643d27e bellard
   "6" 6 bit unsigned break code (MIPS16OP_*_IMM6)
875 6643d27e bellard
   "a" 26 bit jump address
876 6643d27e bellard
   "e" 11 bit extension value
877 6643d27e bellard
   "l" register list for entry instruction
878 6643d27e bellard
   "L" register list for exit instruction
879 6643d27e bellard

880 6643d27e bellard
   The remaining codes may be extended.  Except as otherwise noted,
881 6643d27e bellard
   the full extended operand is a 16 bit signed value.
882 6643d27e bellard
   "<" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 5 bit unsigned)
883 6643d27e bellard
   ">" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 5 bit unsigned)
884 6643d27e bellard
   "[" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 6 bit unsigned)
885 6643d27e bellard
   "]" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 6 bit unsigned)
886 6643d27e bellard
   "4" 4 bit signed immediate * 0 (MIPS16OP_*_IMM4) (full 15 bit signed)
887 6643d27e bellard
   "5" 5 bit unsigned immediate * 0 (MIPS16OP_*_IMM5)
888 6643d27e bellard
   "H" 5 bit unsigned immediate * 2 (MIPS16OP_*_IMM5)
889 6643d27e bellard
   "W" 5 bit unsigned immediate * 4 (MIPS16OP_*_IMM5)
890 6643d27e bellard
   "D" 5 bit unsigned immediate * 8 (MIPS16OP_*_IMM5)
891 6643d27e bellard
   "j" 5 bit signed immediate * 0 (MIPS16OP_*_IMM5)
892 6643d27e bellard
   "8" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8)
893 6643d27e bellard
   "V" 8 bit unsigned immediate * 4 (MIPS16OP_*_IMM8)
894 6643d27e bellard
   "C" 8 bit unsigned immediate * 8 (MIPS16OP_*_IMM8)
895 6643d27e bellard
   "U" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) (full 16 bit unsigned)
896 6643d27e bellard
   "k" 8 bit signed immediate * 0 (MIPS16OP_*_IMM8)
897 6643d27e bellard
   "K" 8 bit signed immediate * 8 (MIPS16OP_*_IMM8)
898 6643d27e bellard
   "p" 8 bit conditional branch address (MIPS16OP_*_IMM8)
899 6643d27e bellard
   "q" 11 bit branch address (MIPS16OP_*_IMM11)
900 6643d27e bellard
   "A" 8 bit PC relative address * 4 (MIPS16OP_*_IMM8)
901 6643d27e bellard
   "B" 5 bit PC relative address * 8 (MIPS16OP_*_IMM5)
902 6643d27e bellard
   "E" 5 bit PC relative address * 4 (MIPS16OP_*_IMM5)
903 6643d27e bellard
   */
904 6643d27e bellard
905 6643d27e bellard
/* For the mips16, we use the same opcode table format and a few of
906 6643d27e bellard
   the same flags.  However, most of the flags are different.  */
907 6643d27e bellard
908 6643d27e bellard
/* Modifies the register in MIPS16OP_*_RX.  */
909 6643d27e bellard
#define MIPS16_INSN_WRITE_X                    0x00000001
910 6643d27e bellard
/* Modifies the register in MIPS16OP_*_RY.  */
911 6643d27e bellard
#define MIPS16_INSN_WRITE_Y                    0x00000002
912 6643d27e bellard
/* Modifies the register in MIPS16OP_*_RZ.  */
913 6643d27e bellard
#define MIPS16_INSN_WRITE_Z                    0x00000004
914 6643d27e bellard
/* Modifies the T ($24) register.  */
915 6643d27e bellard
#define MIPS16_INSN_WRITE_T                    0x00000008
916 6643d27e bellard
/* Modifies the SP ($29) register.  */
917 6643d27e bellard
#define MIPS16_INSN_WRITE_SP                    0x00000010
918 6643d27e bellard
/* Modifies the RA ($31) register.  */
919 6643d27e bellard
#define MIPS16_INSN_WRITE_31                    0x00000020
920 6643d27e bellard
/* Modifies the general purpose register in MIPS16OP_*_REG32R.  */
921 6643d27e bellard
#define MIPS16_INSN_WRITE_GPR_Y                    0x00000040
922 6643d27e bellard
/* Reads the register in MIPS16OP_*_RX.  */
923 6643d27e bellard
#define MIPS16_INSN_READ_X                    0x00000080
924 6643d27e bellard
/* Reads the register in MIPS16OP_*_RY.  */
925 6643d27e bellard
#define MIPS16_INSN_READ_Y                    0x00000100
926 6643d27e bellard
/* Reads the register in MIPS16OP_*_MOVE32Z.  */
927 6643d27e bellard
#define MIPS16_INSN_READ_Z                    0x00000200
928 6643d27e bellard
/* Reads the T ($24) register.  */
929 6643d27e bellard
#define MIPS16_INSN_READ_T                    0x00000400
930 6643d27e bellard
/* Reads the SP ($29) register.  */
931 6643d27e bellard
#define MIPS16_INSN_READ_SP                    0x00000800
932 6643d27e bellard
/* Reads the RA ($31) register.  */
933 6643d27e bellard
#define MIPS16_INSN_READ_31                    0x00001000
934 6643d27e bellard
/* Reads the program counter.  */
935 6643d27e bellard
#define MIPS16_INSN_READ_PC                    0x00002000
936 6643d27e bellard
/* Reads the general purpose register in MIPS16OP_*_REGR32.  */
937 6643d27e bellard
#define MIPS16_INSN_READ_GPR_X                    0x00004000
938 6643d27e bellard
/* Is a branch insn. */
939 6643d27e bellard
#define MIPS16_INSN_BRANCH                  0x00010000
940 6643d27e bellard
941 6643d27e bellard
/* The following flags have the same value for the mips16 opcode
942 6643d27e bellard
   table:
943 6643d27e bellard
   INSN_UNCOND_BRANCH_DELAY
944 6643d27e bellard
   INSN_COND_BRANCH_DELAY
945 6643d27e bellard
   INSN_COND_BRANCH_LIKELY (never used)
946 6643d27e bellard
   INSN_READ_HI
947 6643d27e bellard
   INSN_READ_LO
948 6643d27e bellard
   INSN_WRITE_HI
949 6643d27e bellard
   INSN_WRITE_LO
950 6643d27e bellard
   INSN_TRAP
951 6643d27e bellard
   INSN_ISA3
952 6643d27e bellard
   */
953 6643d27e bellard
954 6643d27e bellard
extern const struct mips_opcode mips16_opcodes[];
955 6643d27e bellard
extern const int bfd_mips16_num_opcodes;
956 6643d27e bellard
957 6643d27e bellard
/* Short hand so the lines aren't too long.  */
958 6643d27e bellard
959 6643d27e bellard
#define LDD     INSN_LOAD_MEMORY_DELAY
960 6643d27e bellard
#define LCD        INSN_LOAD_COPROC_DELAY
961 6643d27e bellard
#define UBD     INSN_UNCOND_BRANCH_DELAY
962 6643d27e bellard
#define CBD        INSN_COND_BRANCH_DELAY
963 6643d27e bellard
#define COD     INSN_COPROC_MOVE_DELAY
964 6643d27e bellard
#define CLD        INSN_COPROC_MEMORY_DELAY
965 6643d27e bellard
#define CBL        INSN_COND_BRANCH_LIKELY
966 6643d27e bellard
#define TRAP        INSN_TRAP
967 6643d27e bellard
#define SM        INSN_STORE_MEMORY
968 6643d27e bellard
969 6643d27e bellard
#define WR_d    INSN_WRITE_GPR_D
970 6643d27e bellard
#define WR_t    INSN_WRITE_GPR_T
971 6643d27e bellard
#define WR_31   INSN_WRITE_GPR_31
972 6643d27e bellard
#define WR_D    INSN_WRITE_FPR_D
973 6643d27e bellard
#define WR_T        INSN_WRITE_FPR_T
974 6643d27e bellard
#define WR_S        INSN_WRITE_FPR_S
975 6643d27e bellard
#define RD_s    INSN_READ_GPR_S
976 6643d27e bellard
#define RD_b    INSN_READ_GPR_S
977 6643d27e bellard
#define RD_t    INSN_READ_GPR_T
978 6643d27e bellard
#define RD_S    INSN_READ_FPR_S
979 6643d27e bellard
#define RD_T    INSN_READ_FPR_T
980 6643d27e bellard
#define RD_R        INSN_READ_FPR_R
981 6643d27e bellard
#define WR_CC        INSN_WRITE_COND_CODE
982 6643d27e bellard
#define RD_CC        INSN_READ_COND_CODE
983 6643d27e bellard
#define RD_C0   INSN_COP
984 6643d27e bellard
#define RD_C1        INSN_COP
985 6643d27e bellard
#define RD_C2   INSN_COP
986 6643d27e bellard
#define RD_C3   INSN_COP
987 6643d27e bellard
#define WR_C0   INSN_COP
988 6643d27e bellard
#define WR_C1        INSN_COP
989 6643d27e bellard
#define WR_C2   INSN_COP
990 6643d27e bellard
#define WR_C3   INSN_COP
991 6643d27e bellard
992 6643d27e bellard
#define WR_HI        INSN_WRITE_HI
993 6643d27e bellard
#define RD_HI        INSN_READ_HI
994 6643d27e bellard
#define MOD_HI  WR_HI|RD_HI
995 6643d27e bellard
996 6643d27e bellard
#define WR_LO        INSN_WRITE_LO
997 6643d27e bellard
#define RD_LO        INSN_READ_LO
998 6643d27e bellard
#define MOD_LO  WR_LO|RD_LO
999 6643d27e bellard
1000 6643d27e bellard
#define WR_HILO WR_HI|WR_LO
1001 6643d27e bellard
#define RD_HILO RD_HI|RD_LO
1002 6643d27e bellard
#define MOD_HILO WR_HILO|RD_HILO
1003 6643d27e bellard
1004 6643d27e bellard
#define IS_M    INSN_MULT
1005 6643d27e bellard
1006 6643d27e bellard
#define WR_MACC INSN_WRITE_MDMX_ACC
1007 6643d27e bellard
#define RD_MACC INSN_READ_MDMX_ACC
1008 6643d27e bellard
1009 6643d27e bellard
#define I1        INSN_ISA1
1010 6643d27e bellard
#define I2        INSN_ISA2
1011 6643d27e bellard
#define I3        INSN_ISA3
1012 6643d27e bellard
#define I4        INSN_ISA4
1013 6643d27e bellard
#define I5        INSN_ISA5
1014 6643d27e bellard
#define I32        INSN_ISA32
1015 6643d27e bellard
#define I64     INSN_ISA64
1016 6643d27e bellard
#define I33        INSN_ISA32R2
1017 6643d27e bellard
#define I65        INSN_ISA64R2
1018 6643d27e bellard
1019 6643d27e bellard
/* MIPS64 MIPS-3D ASE support.  */
1020 6643d27e bellard
#define I16     INSN_MIPS16
1021 6643d27e bellard
1022 6643d27e bellard
/* MIPS64 MIPS-3D ASE support.  */
1023 6643d27e bellard
#define M3D     INSN_MIPS3D
1024 6643d27e bellard
1025 6643d27e bellard
/* MIPS64 MDMX ASE support.  */
1026 6643d27e bellard
#define MX      INSN_MDMX
1027 6643d27e bellard
1028 6643d27e bellard
#define P3        INSN_4650
1029 6643d27e bellard
#define L1        INSN_4010
1030 6643d27e bellard
#define V1        (INSN_4100 | INSN_4111 | INSN_4120)
1031 6643d27e bellard
#define T3      INSN_3900
1032 6643d27e bellard
#define M1        INSN_10000
1033 6643d27e bellard
#define SB1     INSN_SB1
1034 6643d27e bellard
#define N411        INSN_4111
1035 6643d27e bellard
#define N412        INSN_4120
1036 6643d27e bellard
#define N5        (INSN_5400 | INSN_5500)
1037 6643d27e bellard
#define N54        INSN_5400
1038 6643d27e bellard
#define N55        INSN_5500
1039 6643d27e bellard
1040 6643d27e bellard
#define G1      (T3             \
1041 6643d27e bellard
                 )
1042 6643d27e bellard
1043 6643d27e bellard
#define G2      (T3             \
1044 6643d27e bellard
                 )
1045 6643d27e bellard
1046 6643d27e bellard
#define G3      (I4             \
1047 6643d27e bellard
                 )
1048 6643d27e bellard
1049 6643d27e bellard
/* The order of overloaded instructions matters.  Label arguments and
1050 6643d27e bellard
   register arguments look the same. Instructions that can have either
1051 6643d27e bellard
   for arguments must apear in the correct order in this table for the
1052 6643d27e bellard
   assembler to pick the right one. In other words, entries with
1053 6643d27e bellard
   immediate operands must apear after the same instruction with
1054 6643d27e bellard
   registers.
1055 6643d27e bellard

1056 6643d27e bellard
   Because of the lookup algorithm used, entries with the same opcode
1057 6643d27e bellard
   name must be contiguous.
1058 6643d27e bellard
 
1059 6643d27e bellard
   Many instructions are short hand for other instructions (i.e., The
1060 6643d27e bellard
   jal <register> instruction is short for jalr <register>).  */
1061 6643d27e bellard
1062 6643d27e bellard
const struct mips_opcode mips_builtin_opcodes[] =
1063 6643d27e bellard
{
1064 6643d27e bellard
/* These instructions appear first so that the disassembler will find
1065 6643d27e bellard
   them first.  The assemblers uses a hash table based on the
1066 6643d27e bellard
   instruction name anyhow.  */
1067 6643d27e bellard
/* name,    args,        match,            mask,        pinfo,                  membership */
1068 6643d27e bellard
{"pref",    "k,o(b)",   0xcc000000, 0xfc000000, RD_b,                   I4|I32|G3        },
1069 6643d27e bellard
{"prefx",   "h,t(b)",        0x4c00000f, 0xfc0007ff, RD_b|RD_t,                I4        },
1070 6643d27e bellard
{"nop",     "",         0x00000000, 0xffffffff, 0,                      I1      }, /* sll */
1071 6643d27e bellard
{"ssnop",   "",         0x00000040, 0xffffffff, 0,                      I32|N55        }, /* sll */
1072 6643d27e bellard
{"ehb",     "",         0x000000c0, 0xffffffff, 0,                      I33        }, /* sll */
1073 6643d27e bellard
{"li",      "t,j",      0x24000000, 0xffe00000, WR_t,                        I1        }, /* addiu */
1074 6643d27e bellard
{"li",            "t,i",        0x34000000, 0xffe00000, WR_t,                        I1        }, /* ori */
1075 6643d27e bellard
{"li",      "t,I",        0,    (int) M_LI,        INSN_MACRO,                I1        },
1076 6643d27e bellard
{"move",    "d,s",        0,    (int) M_MOVE,        INSN_MACRO,                I1        },
1077 6643d27e bellard
{"move",    "d,s",        0x0000002d, 0xfc1f07ff, WR_d|RD_s,                I3        },/* daddu */
1078 6643d27e bellard
{"move",    "d,s",        0x00000021, 0xfc1f07ff, WR_d|RD_s,                I1        },/* addu */
1079 6643d27e bellard
{"move",    "d,s",        0x00000025, 0xfc1f07ff,        WR_d|RD_s,                I1        },/* or */
1080 6643d27e bellard
{"b",       "p",        0x10000000, 0xffff0000,        UBD,                        I1        },/* beq 0,0 */
1081 6643d27e bellard
{"b",       "p",        0x04010000, 0xffff0000,        UBD,                        I1        },/* bgez 0 */
1082 6643d27e bellard
{"bal",     "p",        0x04110000, 0xffff0000,        UBD|WR_31,                I1        },/* bgezal 0*/
1083 6643d27e bellard
1084 6643d27e bellard
{"abs",     "d,v",        0,    (int) M_ABS,        INSN_MACRO,                I1        },
1085 6643d27e bellard
{"abs.s",   "D,V",        0x46000005, 0xffff003f,        WR_D|RD_S|FP_S,                I1        },
1086 6643d27e bellard
{"abs.d",   "D,V",        0x46200005, 0xffff003f,        WR_D|RD_S|FP_D,                I1        },
1087 6643d27e bellard
{"abs.ps",  "D,V",        0x46c00005, 0xffff003f,        WR_D|RD_S|FP_D,                I5        },
1088 6643d27e bellard
{"add",     "d,v,t",        0x00000020, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1089 6643d27e bellard
{"add",     "t,r,I",        0,    (int) M_ADD_I,        INSN_MACRO,                I1        },
1090 6643d27e bellard
{"add.s",   "D,V,T",        0x46000000, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        I1        },
1091 6643d27e bellard
{"add.d",   "D,V,T",        0x46200000, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I1        },
1092 6643d27e bellard
{"add.ob",  "X,Y,Q",        0x7800000b, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1093 6643d27e bellard
{"add.ob",  "D,S,T",        0x4ac0000b, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1094 6643d27e bellard
{"add.ob",  "D,S,T[e]",        0x4800000b, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1095 6643d27e bellard
{"add.ob",  "D,S,k",        0x4bc0000b, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1096 6643d27e bellard
{"add.ps",  "D,V,T",        0x46c00000, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1097 6643d27e bellard
{"add.qh",  "X,Y,Q",        0x7820000b, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1098 6643d27e bellard
{"adda.ob", "Y,Q",        0x78000037, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1099 6643d27e bellard
{"adda.qh", "Y,Q",        0x78200037, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1100 6643d27e bellard
{"addi",    "t,r,j",        0x20000000, 0xfc000000,        WR_t|RD_s,                I1        },
1101 6643d27e bellard
{"addiu",   "t,r,j",        0x24000000, 0xfc000000,        WR_t|RD_s,                I1        },
1102 6643d27e bellard
{"addl.ob", "Y,Q",        0x78000437, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1103 6643d27e bellard
{"addl.qh", "Y,Q",        0x78200437, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1104 6643d27e bellard
{"addr.ps", "D,S,T",        0x46c00018, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        M3D        },
1105 6643d27e bellard
{"addu",    "d,v,t",        0x00000021, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1106 6643d27e bellard
{"addu",    "t,r,I",        0,    (int) M_ADDU_I,        INSN_MACRO,                I1        },
1107 6643d27e bellard
{"alni.ob", "X,Y,Z,O",        0x78000018, 0xff00003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1108 6643d27e bellard
{"alni.ob", "D,S,T,%",        0x48000018, 0xff00003f,        WR_D|RD_S|RD_T,         N54        },
1109 6643d27e bellard
{"alni.qh", "X,Y,Z,O",        0x7800001a, 0xff00003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1110 6643d27e bellard
{"alnv.ps", "D,V,T,s",        0x4c00001e, 0xfc00003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1111 6643d27e bellard
{"alnv.ob", "X,Y,Z,s",        0x78000019, 0xfc00003f,        WR_D|RD_S|RD_T|RD_s|FP_D, MX|SB1        },
1112 6643d27e bellard
{"alnv.qh", "X,Y,Z,s",        0x7800001b, 0xfc00003f,        WR_D|RD_S|RD_T|RD_s|FP_D, MX        },
1113 6643d27e bellard
{"and",     "d,v,t",        0x00000024, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1114 6643d27e bellard
{"and",     "t,r,I",        0,    (int) M_AND_I,        INSN_MACRO,                I1        },
1115 6643d27e bellard
{"and.ob",  "X,Y,Q",        0x7800000c, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1116 6643d27e bellard
{"and.ob",  "D,S,T",        0x4ac0000c, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1117 6643d27e bellard
{"and.ob",  "D,S,T[e]",        0x4800000c, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1118 6643d27e bellard
{"and.ob",  "D,S,k",        0x4bc0000c, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1119 6643d27e bellard
{"and.qh",  "X,Y,Q",        0x7820000c, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1120 6643d27e bellard
{"andi",    "t,r,i",        0x30000000, 0xfc000000,        WR_t|RD_s,                I1        },
1121 6643d27e bellard
/* b is at the top of the table.  */
1122 6643d27e bellard
/* bal is at the top of the table.  */
1123 6643d27e bellard
{"bc0f",    "p",        0x41000000, 0xffff0000,        CBD|RD_CC,                I1        },
1124 6643d27e bellard
{"bc0fl",   "p",        0x41020000, 0xffff0000,        CBL|RD_CC,                I2|T3        },
1125 6643d27e bellard
{"bc0t",    "p",        0x41010000, 0xffff0000,        CBD|RD_CC,                I1        },
1126 6643d27e bellard
{"bc0tl",   "p",        0x41030000, 0xffff0000,        CBL|RD_CC,                I2|T3        },
1127 6643d27e bellard
{"bc1any2f", "N,p",        0x45200000, 0xffe30000,        CBD|RD_CC|FP_S,                M3D        },
1128 6643d27e bellard
{"bc1any2t", "N,p",        0x45210000, 0xffe30000,        CBD|RD_CC|FP_S,                M3D        },
1129 6643d27e bellard
{"bc1any4f", "N,p",        0x45400000, 0xffe30000,        CBD|RD_CC|FP_S,                M3D        },
1130 6643d27e bellard
{"bc1any4t", "N,p",        0x45410000, 0xffe30000,        CBD|RD_CC|FP_S,                M3D        },
1131 6643d27e bellard
{"bc1f",    "p",        0x45000000, 0xffff0000,        CBD|RD_CC|FP_S,                I1        },
1132 6643d27e bellard
{"bc1f",    "N,p",      0x45000000, 0xffe30000, CBD|RD_CC|FP_S,         I4|I32        },
1133 6643d27e bellard
{"bc1fl",   "p",        0x45020000, 0xffff0000,        CBL|RD_CC|FP_S,                I2|T3        },
1134 6643d27e bellard
{"bc1fl",   "N,p",      0x45020000, 0xffe30000, CBL|RD_CC|FP_S,         I4|I32        },
1135 6643d27e bellard
{"bc1t",    "p",        0x45010000, 0xffff0000,        CBD|RD_CC|FP_S,                I1        },
1136 6643d27e bellard
{"bc1t",    "N,p",      0x45010000, 0xffe30000, CBD|RD_CC|FP_S,         I4|I32        },
1137 6643d27e bellard
{"bc1tl",   "p",        0x45030000, 0xffff0000,        CBL|RD_CC|FP_S,                I2|T3        },
1138 6643d27e bellard
{"bc1tl",   "N,p",      0x45030000, 0xffe30000, CBL|RD_CC|FP_S,         I4|I32        },
1139 6643d27e bellard
/* bc2* are at the bottom of the table.  */
1140 6643d27e bellard
{"bc3f",    "p",        0x4d000000, 0xffff0000,        CBD|RD_CC,                I1        },
1141 6643d27e bellard
{"bc3fl",   "p",        0x4d020000, 0xffff0000,        CBL|RD_CC,                I2|T3        },
1142 6643d27e bellard
{"bc3t",    "p",        0x4d010000, 0xffff0000,        CBD|RD_CC,                I1        },
1143 6643d27e bellard
{"bc3tl",   "p",        0x4d030000, 0xffff0000,        CBL|RD_CC,                I2|T3        },
1144 6643d27e bellard
{"beqz",    "s,p",        0x10000000, 0xfc1f0000,        CBD|RD_s,                I1        },
1145 6643d27e bellard
{"beqzl",   "s,p",        0x50000000, 0xfc1f0000,        CBL|RD_s,                I2|T3        },
1146 6643d27e bellard
{"beq",     "s,t,p",        0x10000000, 0xfc000000,        CBD|RD_s|RD_t,                I1        },
1147 6643d27e bellard
{"beq",     "s,I,p",        0,    (int) M_BEQ_I,        INSN_MACRO,                I1        },
1148 6643d27e bellard
{"beql",    "s,t,p",        0x50000000, 0xfc000000,        CBL|RD_s|RD_t,                I2|T3        },
1149 6643d27e bellard
{"beql",    "s,I,p",        0,    (int) M_BEQL_I,        INSN_MACRO,                I2|T3        },
1150 6643d27e bellard
{"bge",     "s,t,p",        0,    (int) M_BGE,        INSN_MACRO,                I1        },
1151 6643d27e bellard
{"bge",     "s,I,p",        0,    (int) M_BGE_I,        INSN_MACRO,                I1        },
1152 6643d27e bellard
{"bgel",    "s,t,p",        0,    (int) M_BGEL,        INSN_MACRO,                I2|T3        },
1153 6643d27e bellard
{"bgel",    "s,I,p",        0,    (int) M_BGEL_I,        INSN_MACRO,                I2|T3        },
1154 6643d27e bellard
{"bgeu",    "s,t,p",        0,    (int) M_BGEU,        INSN_MACRO,                I1        },
1155 6643d27e bellard
{"bgeu",    "s,I,p",        0,    (int) M_BGEU_I,        INSN_MACRO,                I1        },
1156 6643d27e bellard
{"bgeul",   "s,t,p",        0,    (int) M_BGEUL,        INSN_MACRO,                I2|T3        },
1157 6643d27e bellard
{"bgeul",   "s,I,p",        0,    (int) M_BGEUL_I,        INSN_MACRO,                I2|T3        },
1158 6643d27e bellard
{"bgez",    "s,p",        0x04010000, 0xfc1f0000,        CBD|RD_s,                I1        },
1159 6643d27e bellard
{"bgezl",   "s,p",        0x04030000, 0xfc1f0000,        CBL|RD_s,                I2|T3        },
1160 6643d27e bellard
{"bgezal",  "s,p",        0x04110000, 0xfc1f0000,        CBD|RD_s|WR_31,                I1        },
1161 6643d27e bellard
{"bgezall", "s,p",        0x04130000, 0xfc1f0000,        CBL|RD_s|WR_31,                I2|T3        },
1162 6643d27e bellard
{"bgt",     "s,t,p",        0,    (int) M_BGT,        INSN_MACRO,                I1        },
1163 6643d27e bellard
{"bgt",     "s,I,p",        0,    (int) M_BGT_I,        INSN_MACRO,                I1        },
1164 6643d27e bellard
{"bgtl",    "s,t,p",        0,    (int) M_BGTL,        INSN_MACRO,                I2|T3        },
1165 6643d27e bellard
{"bgtl",    "s,I,p",        0,    (int) M_BGTL_I,        INSN_MACRO,                I2|T3        },
1166 6643d27e bellard
{"bgtu",    "s,t,p",        0,    (int) M_BGTU,        INSN_MACRO,                I1        },
1167 6643d27e bellard
{"bgtu",    "s,I,p",        0,    (int) M_BGTU_I,        INSN_MACRO,                I1        },
1168 6643d27e bellard
{"bgtul",   "s,t,p",        0,    (int) M_BGTUL,        INSN_MACRO,                I2|T3        },
1169 6643d27e bellard
{"bgtul",   "s,I,p",        0,    (int) M_BGTUL_I,        INSN_MACRO,                I2|T3        },
1170 6643d27e bellard
{"bgtz",    "s,p",        0x1c000000, 0xfc1f0000,        CBD|RD_s,                I1        },
1171 6643d27e bellard
{"bgtzl",   "s,p",        0x5c000000, 0xfc1f0000,        CBL|RD_s,                I2|T3        },
1172 6643d27e bellard
{"ble",     "s,t,p",        0,    (int) M_BLE,        INSN_MACRO,                I1        },
1173 6643d27e bellard
{"ble",     "s,I,p",        0,    (int) M_BLE_I,        INSN_MACRO,                I1        },
1174 6643d27e bellard
{"blel",    "s,t,p",        0,    (int) M_BLEL,        INSN_MACRO,                I2|T3        },
1175 6643d27e bellard
{"blel",    "s,I,p",        0,    (int) M_BLEL_I,        INSN_MACRO,                I2|T3        },
1176 6643d27e bellard
{"bleu",    "s,t,p",        0,    (int) M_BLEU,        INSN_MACRO,                I1        },
1177 6643d27e bellard
{"bleu",    "s,I,p",        0,    (int) M_BLEU_I,        INSN_MACRO,                I1        },
1178 6643d27e bellard
{"bleul",   "s,t,p",        0,    (int) M_BLEUL,        INSN_MACRO,                I2|T3        },
1179 6643d27e bellard
{"bleul",   "s,I,p",        0,    (int) M_BLEUL_I,        INSN_MACRO,                I2|T3        },
1180 6643d27e bellard
{"blez",    "s,p",        0x18000000, 0xfc1f0000,        CBD|RD_s,                I1        },
1181 6643d27e bellard
{"blezl",   "s,p",        0x58000000, 0xfc1f0000,        CBL|RD_s,                I2|T3        },
1182 6643d27e bellard
{"blt",     "s,t,p",        0,    (int) M_BLT,        INSN_MACRO,                I1        },
1183 6643d27e bellard
{"blt",     "s,I,p",        0,    (int) M_BLT_I,        INSN_MACRO,                I1        },
1184 6643d27e bellard
{"bltl",    "s,t,p",        0,    (int) M_BLTL,        INSN_MACRO,                I2|T3        },
1185 6643d27e bellard
{"bltl",    "s,I,p",        0,    (int) M_BLTL_I,        INSN_MACRO,                I2|T3        },
1186 6643d27e bellard
{"bltu",    "s,t,p",        0,    (int) M_BLTU,        INSN_MACRO,                I1        },
1187 6643d27e bellard
{"bltu",    "s,I,p",        0,    (int) M_BLTU_I,        INSN_MACRO,                I1        },
1188 6643d27e bellard
{"bltul",   "s,t,p",        0,    (int) M_BLTUL,        INSN_MACRO,                I2|T3        },
1189 6643d27e bellard
{"bltul",   "s,I,p",        0,    (int) M_BLTUL_I,        INSN_MACRO,                I2|T3        },
1190 6643d27e bellard
{"bltz",    "s,p",        0x04000000, 0xfc1f0000,        CBD|RD_s,                I1        },
1191 6643d27e bellard
{"bltzl",   "s,p",        0x04020000, 0xfc1f0000,        CBL|RD_s,                I2|T3        },
1192 6643d27e bellard
{"bltzal",  "s,p",        0x04100000, 0xfc1f0000,        CBD|RD_s|WR_31,                I1        },
1193 6643d27e bellard
{"bltzall", "s,p",        0x04120000, 0xfc1f0000,        CBL|RD_s|WR_31,                I2|T3        },
1194 6643d27e bellard
{"bnez",    "s,p",        0x14000000, 0xfc1f0000,        CBD|RD_s,                I1        },
1195 6643d27e bellard
{"bnezl",   "s,p",        0x54000000, 0xfc1f0000,        CBL|RD_s,                I2|T3        },
1196 6643d27e bellard
{"bne",     "s,t,p",        0x14000000, 0xfc000000,        CBD|RD_s|RD_t,                I1        },
1197 6643d27e bellard
{"bne",     "s,I,p",        0,    (int) M_BNE_I,        INSN_MACRO,                I1        },
1198 6643d27e bellard
{"bnel",    "s,t,p",        0x54000000, 0xfc000000,        CBL|RD_s|RD_t,                 I2|T3        },
1199 6643d27e bellard
{"bnel",    "s,I,p",        0,    (int) M_BNEL_I,        INSN_MACRO,                I2|T3        },
1200 6643d27e bellard
{"break",   "",                0x0000000d, 0xffffffff,        TRAP,                        I1        },
1201 6643d27e bellard
{"break",   "c",        0x0000000d, 0xfc00ffff,        TRAP,                        I1        },
1202 6643d27e bellard
{"break",   "c,q",        0x0000000d, 0xfc00003f,        TRAP,                        I1        },
1203 6643d27e bellard
{"c.f.d",   "S,T",        0x46200030, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1204 6643d27e bellard
{"c.f.d",   "M,S,T",    0x46200030, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1205 6643d27e bellard
{"c.f.s",   "S,T",      0x46000030, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1206 6643d27e bellard
{"c.f.s",   "M,S,T",    0x46000030, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1207 6643d27e bellard
{"c.f.ps",  "S,T",        0x46c00030, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1208 6643d27e bellard
{"c.f.ps",  "M,S,T",        0x46c00030, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1209 6643d27e bellard
{"c.un.d",  "S,T",        0x46200031, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1210 6643d27e bellard
{"c.un.d",  "M,S,T",    0x46200031, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1211 6643d27e bellard
{"c.un.s",  "S,T",      0x46000031, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1212 6643d27e bellard
{"c.un.s",  "M,S,T",    0x46000031, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1213 6643d27e bellard
{"c.un.ps", "S,T",        0x46c00031, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1214 6643d27e bellard
{"c.un.ps", "M,S,T",        0x46c00031, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1215 6643d27e bellard
{"c.eq.d",  "S,T",        0x46200032, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1216 6643d27e bellard
{"c.eq.d",  "M,S,T",    0x46200032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1217 6643d27e bellard
{"c.eq.s",  "S,T",      0x46000032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1218 6643d27e bellard
{"c.eq.s",  "M,S,T",    0x46000032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1219 6643d27e bellard
{"c.eq.ob", "Y,Q",        0x78000001, 0xfc2007ff,        WR_CC|RD_S|RD_T|FP_D,        MX|SB1        },
1220 6643d27e bellard
{"c.eq.ob", "S,T",        0x4ac00001, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1221 6643d27e bellard
{"c.eq.ob", "S,T[e]",        0x48000001, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1222 6643d27e bellard
{"c.eq.ob", "S,k",        0x4bc00001, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1223 6643d27e bellard
{"c.eq.ps", "S,T",        0x46c00032, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1224 6643d27e bellard
{"c.eq.ps", "M,S,T",        0x46c00032, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1225 6643d27e bellard
{"c.eq.qh", "Y,Q",        0x78200001, 0xfc2007ff,        WR_CC|RD_S|RD_T|FP_D,        MX        },
1226 6643d27e bellard
{"c.ueq.d", "S,T",        0x46200033, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1227 6643d27e bellard
{"c.ueq.d", "M,S,T",    0x46200033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1228 6643d27e bellard
{"c.ueq.s", "S,T",      0x46000033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1229 6643d27e bellard
{"c.ueq.s", "M,S,T",    0x46000033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1230 6643d27e bellard
{"c.ueq.ps","S,T",        0x46c00033, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1231 6643d27e bellard
{"c.ueq.ps","M,S,T",        0x46c00033, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1232 6643d27e bellard
{"c.olt.d", "S,T",      0x46200034, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I1      },
1233 6643d27e bellard
{"c.olt.d", "M,S,T",    0x46200034, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1234 6643d27e bellard
{"c.olt.s", "S,T",        0x46000034, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_S,        I1        },
1235 6643d27e bellard
{"c.olt.s", "M,S,T",    0x46000034, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1236 6643d27e bellard
{"c.olt.ps","S,T",        0x46c00034, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1237 6643d27e bellard
{"c.olt.ps","M,S,T",        0x46c00034, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1238 6643d27e bellard
{"c.ult.d", "S,T",        0x46200035, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1239 6643d27e bellard
{"c.ult.d", "M,S,T",    0x46200035, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1240 6643d27e bellard
{"c.ult.s", "S,T",      0x46000035, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1241 6643d27e bellard
{"c.ult.s", "M,S,T",    0x46000035, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1242 6643d27e bellard
{"c.ult.ps","S,T",        0x46c00035, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1243 6643d27e bellard
{"c.ult.ps","M,S,T",        0x46c00035, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1244 6643d27e bellard
{"c.ole.d", "S,T",      0x46200036, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D,   I1      },
1245 6643d27e bellard
{"c.ole.d", "M,S,T",    0x46200036, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1246 6643d27e bellard
{"c.ole.s", "S,T",      0x46000036, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1247 6643d27e bellard
{"c.ole.s", "M,S,T",    0x46000036, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1248 6643d27e bellard
{"c.ole.ps","S,T",        0x46c00036, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1249 6643d27e bellard
{"c.ole.ps","M,S,T",        0x46c00036, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1250 6643d27e bellard
{"c.ule.d", "S,T",        0x46200037, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1251 6643d27e bellard
{"c.ule.d", "M,S,T",    0x46200037, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1252 6643d27e bellard
{"c.ule.s", "S,T",      0x46000037, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1253 6643d27e bellard
{"c.ule.s", "M,S,T",    0x46000037, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1254 6643d27e bellard
{"c.ule.ps","S,T",        0x46c00037, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1255 6643d27e bellard
{"c.ule.ps","M,S,T",        0x46c00037, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1256 6643d27e bellard
{"c.sf.d",  "S,T",        0x46200038, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1257 6643d27e bellard
{"c.sf.d",  "M,S,T",    0x46200038, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1258 6643d27e bellard
{"c.sf.s",  "S,T",      0x46000038, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1259 6643d27e bellard
{"c.sf.s",  "M,S,T",    0x46000038, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1260 6643d27e bellard
{"c.sf.ps", "S,T",        0x46c00038, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1261 6643d27e bellard
{"c.sf.ps", "M,S,T",        0x46c00038, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1262 6643d27e bellard
{"c.ngle.d","S,T",        0x46200039, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1263 6643d27e bellard
{"c.ngle.d","M,S,T",    0x46200039, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1264 6643d27e bellard
{"c.ngle.s","S,T",      0x46000039, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1265 6643d27e bellard
{"c.ngle.s","M,S,T",    0x46000039, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1266 6643d27e bellard
{"c.ngle.ps","S,T",        0x46c00039, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1267 6643d27e bellard
{"c.ngle.ps","M,S,T",        0x46c00039, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1268 6643d27e bellard
{"c.seq.d", "S,T",        0x4620003a, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1269 6643d27e bellard
{"c.seq.d", "M,S,T",    0x4620003a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1270 6643d27e bellard
{"c.seq.s", "S,T",      0x4600003a, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1271 6643d27e bellard
{"c.seq.s", "M,S,T",    0x4600003a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1272 6643d27e bellard
{"c.seq.ps","S,T",        0x46c0003a, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1273 6643d27e bellard
{"c.seq.ps","M,S,T",        0x46c0003a, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1274 6643d27e bellard
{"c.ngl.d", "S,T",        0x4620003b, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1275 6643d27e bellard
{"c.ngl.d", "M,S,T",    0x4620003b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1276 6643d27e bellard
{"c.ngl.s", "S,T",      0x4600003b, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1277 6643d27e bellard
{"c.ngl.s", "M,S,T",    0x4600003b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1278 6643d27e bellard
{"c.ngl.ps","S,T",        0x46c0003b, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1279 6643d27e bellard
{"c.ngl.ps","M,S,T",        0x46c0003b, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1280 6643d27e bellard
{"c.lt.d",  "S,T",        0x4620003c, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1281 6643d27e bellard
{"c.lt.d",  "M,S,T",    0x4620003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1282 6643d27e bellard
{"c.lt.s",  "S,T",        0x4600003c, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_S,        I1        },
1283 6643d27e bellard
{"c.lt.s",  "M,S,T",    0x4600003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1284 6643d27e bellard
{"c.lt.ob", "Y,Q",        0x78000004, 0xfc2007ff,        WR_CC|RD_S|RD_T|FP_D,        MX|SB1        },
1285 6643d27e bellard
{"c.lt.ob", "S,T",        0x4ac00004, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1286 6643d27e bellard
{"c.lt.ob", "S,T[e]",        0x48000004, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1287 6643d27e bellard
{"c.lt.ob", "S,k",        0x4bc00004, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1288 6643d27e bellard
{"c.lt.ps", "S,T",        0x46c0003c, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1289 6643d27e bellard
{"c.lt.ps", "M,S,T",        0x46c0003c, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1290 6643d27e bellard
{"c.lt.qh", "Y,Q",        0x78200004, 0xfc2007ff,        WR_CC|RD_S|RD_T|FP_D,        MX        },
1291 6643d27e bellard
{"c.nge.d", "S,T",        0x4620003d, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1292 6643d27e bellard
{"c.nge.d", "M,S,T",    0x4620003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1293 6643d27e bellard
{"c.nge.s", "S,T",      0x4600003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1294 6643d27e bellard
{"c.nge.s", "M,S,T",    0x4600003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1295 6643d27e bellard
{"c.nge.ps","S,T",        0x46c0003d, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1296 6643d27e bellard
{"c.nge.ps","M,S,T",        0x46c0003d, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1297 6643d27e bellard
{"c.le.d",  "S,T",        0x4620003e, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1298 6643d27e bellard
{"c.le.d",  "M,S,T",    0x4620003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1299 6643d27e bellard
{"c.le.s",  "S,T",        0x4600003e, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_S,        I1        },
1300 6643d27e bellard
{"c.le.s",  "M,S,T",    0x4600003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1301 6643d27e bellard
{"c.le.ob", "Y,Q",        0x78000005, 0xfc2007ff,        WR_CC|RD_S|RD_T|FP_D,        MX|SB1        },
1302 6643d27e bellard
{"c.le.ob", "S,T",        0x4ac00005, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1303 6643d27e bellard
{"c.le.ob", "S,T[e]",        0x48000005, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1304 6643d27e bellard
{"c.le.ob", "S,k",        0x4bc00005, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1305 6643d27e bellard
{"c.le.ps", "S,T",        0x46c0003e, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1306 6643d27e bellard
{"c.le.ps", "M,S,T",        0x46c0003e, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1307 6643d27e bellard
{"c.le.qh", "Y,Q",        0x78200005, 0xfc2007ff,        WR_CC|RD_S|RD_T|FP_D,        MX        },
1308 6643d27e bellard
{"c.ngt.d", "S,T",        0x4620003f, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I1        },
1309 6643d27e bellard
{"c.ngt.d", "M,S,T",    0x4620003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D,   I4|I32        },
1310 6643d27e bellard
{"c.ngt.s", "S,T",      0x4600003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S,   I1      },
1311 6643d27e bellard
{"c.ngt.s", "M,S,T",    0x4600003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S,   I4|I32        },
1312 6643d27e bellard
{"c.ngt.ps","S,T",        0x46c0003f, 0xffe007ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1313 6643d27e bellard
{"c.ngt.ps","M,S,T",        0x46c0003f, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        I5        },
1314 6643d27e bellard
{"cabs.eq.d",  "M,S,T",        0x46200072, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1315 6643d27e bellard
{"cabs.eq.ps", "M,S,T",        0x46c00072, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1316 6643d27e bellard
{"cabs.eq.s",  "M,S,T",        0x46000072, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1317 6643d27e bellard
{"cabs.f.d",   "M,S,T",        0x46200070, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1318 6643d27e bellard
{"cabs.f.ps",  "M,S,T",        0x46c00070, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1319 6643d27e bellard
{"cabs.f.s",   "M,S,T",        0x46000070, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1320 6643d27e bellard
{"cabs.le.d",  "M,S,T",        0x4620007e, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1321 6643d27e bellard
{"cabs.le.ps", "M,S,T",        0x46c0007e, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1322 6643d27e bellard
{"cabs.le.s",  "M,S,T",        0x4600007e, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1323 6643d27e bellard
{"cabs.lt.d",  "M,S,T",        0x4620007c, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1324 6643d27e bellard
{"cabs.lt.ps", "M,S,T",        0x46c0007c, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1325 6643d27e bellard
{"cabs.lt.s",  "M,S,T",        0x4600007c, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1326 6643d27e bellard
{"cabs.nge.d", "M,S,T",        0x4620007d, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1327 6643d27e bellard
{"cabs.nge.ps","M,S,T",        0x46c0007d, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1328 6643d27e bellard
{"cabs.nge.s", "M,S,T",        0x4600007d, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1329 6643d27e bellard
{"cabs.ngl.d", "M,S,T",        0x4620007b, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1330 6643d27e bellard
{"cabs.ngl.ps","M,S,T",        0x46c0007b, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1331 6643d27e bellard
{"cabs.ngl.s", "M,S,T",        0x4600007b, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1332 6643d27e bellard
{"cabs.ngle.d","M,S,T",        0x46200079, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1333 6643d27e bellard
{"cabs.ngle.ps","M,S,T",0x46c00079, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1334 6643d27e bellard
{"cabs.ngle.s","M,S,T",        0x46000079, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1335 6643d27e bellard
{"cabs.ngt.d", "M,S,T",        0x4620007f, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1336 6643d27e bellard
{"cabs.ngt.ps","M,S,T",        0x46c0007f, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1337 6643d27e bellard
{"cabs.ngt.s", "M,S,T",        0x4600007f, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1338 6643d27e bellard
{"cabs.ole.d", "M,S,T",        0x46200076, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1339 6643d27e bellard
{"cabs.ole.ps","M,S,T",        0x46c00076, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1340 6643d27e bellard
{"cabs.ole.s", "M,S,T",        0x46000076, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1341 6643d27e bellard
{"cabs.olt.d", "M,S,T",        0x46200074, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1342 6643d27e bellard
{"cabs.olt.ps","M,S,T",        0x46c00074, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1343 6643d27e bellard
{"cabs.olt.s", "M,S,T",        0x46000074, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1344 6643d27e bellard
{"cabs.seq.d", "M,S,T",        0x4620007a, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1345 6643d27e bellard
{"cabs.seq.ps","M,S,T",        0x46c0007a, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1346 6643d27e bellard
{"cabs.seq.s", "M,S,T",        0x4600007a, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1347 6643d27e bellard
{"cabs.sf.d",  "M,S,T",        0x46200078, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1348 6643d27e bellard
{"cabs.sf.ps", "M,S,T",        0x46c00078, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1349 6643d27e bellard
{"cabs.sf.s",  "M,S,T",        0x46000078, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1350 6643d27e bellard
{"cabs.ueq.d", "M,S,T",        0x46200073, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1351 6643d27e bellard
{"cabs.ueq.ps","M,S,T",        0x46c00073, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1352 6643d27e bellard
{"cabs.ueq.s", "M,S,T",        0x46000073, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1353 6643d27e bellard
{"cabs.ule.d", "M,S,T",        0x46200077, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1354 6643d27e bellard
{"cabs.ule.ps","M,S,T",        0x46c00077, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1355 6643d27e bellard
{"cabs.ule.s", "M,S,T",        0x46000077, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1356 6643d27e bellard
{"cabs.ult.d", "M,S,T",        0x46200075, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1357 6643d27e bellard
{"cabs.ult.ps","M,S,T",        0x46c00075, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1358 6643d27e bellard
{"cabs.ult.s", "M,S,T",        0x46000075, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1359 6643d27e bellard
{"cabs.un.d",  "M,S,T",        0x46200071, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1360 6643d27e bellard
{"cabs.un.ps", "M,S,T",        0x46c00071, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_D,        M3D        },
1361 6643d27e bellard
{"cabs.un.s",  "M,S,T",        0x46000071, 0xffe000ff,        RD_S|RD_T|WR_CC|FP_S,        M3D        },
1362 6643d27e bellard
{"cache",   "k,o(b)",   0xbc000000, 0xfc000000, RD_b,                   I3|I32|T3},
1363 6643d27e bellard
{"ceil.l.d", "D,S",        0x4620000a, 0xffff003f, WR_D|RD_S|FP_D,                I3        },
1364 6643d27e bellard
{"ceil.l.s", "D,S",        0x4600000a, 0xffff003f, WR_D|RD_S|FP_S,                I3        },
1365 6643d27e bellard
{"ceil.w.d", "D,S",        0x4620000e, 0xffff003f, WR_D|RD_S|FP_D,                I2        },
1366 6643d27e bellard
{"ceil.w.s", "D,S",        0x4600000e, 0xffff003f, WR_D|RD_S|FP_S,                I2        },
1367 6643d27e bellard
{"cfc0",    "t,G",        0x40400000, 0xffe007ff,        LCD|WR_t|RD_C0,                I1        },
1368 6643d27e bellard
{"cfc1",    "t,G",        0x44400000, 0xffe007ff,        LCD|WR_t|RD_C1|FP_S,        I1        },
1369 6643d27e bellard
{"cfc1",    "t,S",        0x44400000, 0xffe007ff,        LCD|WR_t|RD_C1|FP_S,        I1        },
1370 6643d27e bellard
/* cfc2 is at the bottom of the table.  */
1371 6643d27e bellard
{"cfc3",    "t,G",        0x4c400000, 0xffe007ff,        LCD|WR_t|RD_C3,                I1        },
1372 6643d27e bellard
{"clo",     "U,s",      0x70000021, 0xfc0007ff, WR_d|WR_t|RD_s,         I32|N55 },
1373 6643d27e bellard
{"clz",     "U,s",      0x70000020, 0xfc0007ff, WR_d|WR_t|RD_s,         I32|N55 },
1374 6643d27e bellard
{"ctc0",    "t,G",        0x40c00000, 0xffe007ff,        COD|RD_t|WR_CC,                I1        },
1375 6643d27e bellard
{"ctc1",    "t,G",        0x44c00000, 0xffe007ff,        COD|RD_t|WR_CC|FP_S,        I1        },
1376 6643d27e bellard
{"ctc1",    "t,S",        0x44c00000, 0xffe007ff,        COD|RD_t|WR_CC|FP_S,        I1        },
1377 6643d27e bellard
/* ctc2 is at the bottom of the table.  */
1378 6643d27e bellard
{"ctc3",    "t,G",        0x4cc00000, 0xffe007ff,        COD|RD_t|WR_CC,                I1        },
1379 6643d27e bellard
{"cvt.d.l", "D,S",        0x46a00021, 0xffff003f,        WR_D|RD_S|FP_D,                I3        },
1380 6643d27e bellard
{"cvt.d.s", "D,S",        0x46000021, 0xffff003f,        WR_D|RD_S|FP_D|FP_S,        I1        },
1381 6643d27e bellard
{"cvt.d.w", "D,S",        0x46800021, 0xffff003f,        WR_D|RD_S|FP_D,                I1        },
1382 6643d27e bellard
{"cvt.l.d", "D,S",        0x46200025, 0xffff003f,        WR_D|RD_S|FP_D,                I3        },
1383 6643d27e bellard
{"cvt.l.s", "D,S",        0x46000025, 0xffff003f,        WR_D|RD_S|FP_S,                I3        },
1384 6643d27e bellard
{"cvt.s.l", "D,S",        0x46a00020, 0xffff003f,        WR_D|RD_S|FP_S,                I3        },
1385 6643d27e bellard
{"cvt.s.d", "D,S",        0x46200020, 0xffff003f,        WR_D|RD_S|FP_S|FP_D,        I1        },
1386 6643d27e bellard
{"cvt.s.w", "D,S",        0x46800020, 0xffff003f,        WR_D|RD_S|FP_S,                I1        },
1387 6643d27e bellard
{"cvt.s.pl","D,S",        0x46c00028, 0xffff003f,        WR_D|RD_S|FP_S|FP_D,        I5        },
1388 6643d27e bellard
{"cvt.s.pu","D,S",        0x46c00020, 0xffff003f,        WR_D|RD_S|FP_S|FP_D,        I5        },
1389 6643d27e bellard
{"cvt.w.d", "D,S",        0x46200024, 0xffff003f,        WR_D|RD_S|FP_D,                I1        },
1390 6643d27e bellard
{"cvt.w.s", "D,S",        0x46000024, 0xffff003f,        WR_D|RD_S|FP_S,                I1        },
1391 6643d27e bellard
{"cvt.ps.pw", "D,S",        0x46800026, 0xffff003f,        WR_D|RD_S|FP_S|FP_D,        M3D        },
1392 6643d27e bellard
{"cvt.ps.s","D,V,T",        0x46000026, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1393 6643d27e bellard
{"cvt.pw.ps", "D,S",        0x46c00024, 0xffff003f,        WR_D|RD_S|FP_S|FP_D,        M3D        },
1394 6643d27e bellard
{"dabs",    "d,v",        0,    (int) M_DABS,        INSN_MACRO,                I3        },
1395 6643d27e bellard
{"dadd",    "d,v,t",        0x0000002c, 0xfc0007ff, WR_d|RD_s|RD_t,                I3        },
1396 6643d27e bellard
{"dadd",    "t,r,I",        0,    (int) M_DADD_I,        INSN_MACRO,                I3        },
1397 6643d27e bellard
{"daddi",   "t,r,j",        0x60000000, 0xfc000000, WR_t|RD_s,                I3        },
1398 6643d27e bellard
{"daddiu",  "t,r,j",        0x64000000, 0xfc000000, WR_t|RD_s,                I3        },
1399 6643d27e bellard
{"daddu",   "d,v,t",        0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t,                I3        },
1400 6643d27e bellard
{"daddu",   "t,r,I",        0,    (int) M_DADDU_I,        INSN_MACRO,                I3        },
1401 6643d27e bellard
{"dbreak",  "",                0x7000003f, 0xffffffff,        0,                        N5        },
1402 6643d27e bellard
{"dclo",    "U,s",      0x70000025, 0xfc0007ff, RD_s|WR_d|WR_t,         I64|N55 },
1403 6643d27e bellard
{"dclz",    "U,s",      0x70000024, 0xfc0007ff, RD_s|WR_d|WR_t,         I64|N55 },
1404 6643d27e bellard
/* dctr and dctw are used on the r5000.  */
1405 6643d27e bellard
{"dctr",    "o(b)",        0xbc050000, 0xfc1f0000, RD_b,                        I3        },
1406 6643d27e bellard
{"dctw",    "o(b)",        0xbc090000, 0xfc1f0000, RD_b,                        I3        },
1407 6643d27e bellard
{"deret",   "",         0x4200001f, 0xffffffff, 0,                         I32|G2        },
1408 6643d27e bellard
{"dext",    "t,r,I,+I",        0,    (int) M_DEXT,        INSN_MACRO,                I65        },
1409 6643d27e bellard
{"dext",    "t,r,+A,+C", 0x7c000003, 0xfc00003f, WR_t|RD_s,                    I65        },
1410 6643d27e bellard
{"dextm",   "t,r,+A,+G", 0x7c000001, 0xfc00003f, WR_t|RD_s,                    I65        },
1411 6643d27e bellard
{"dextu",   "t,r,+E,+H", 0x7c000002, 0xfc00003f, WR_t|RD_s,                    I65        },
1412 6643d27e bellard
/* For ddiv, see the comments about div.  */
1413 6643d27e bellard
{"ddiv",    "z,s,t",    0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I3      },
1414 6643d27e bellard
{"ddiv",    "d,v,t",        0,    (int) M_DDIV_3,        INSN_MACRO,                I3        },
1415 6643d27e bellard
{"ddiv",    "d,v,I",        0,    (int) M_DDIV_3I,        INSN_MACRO,                I3        },
1416 6643d27e bellard
/* For ddivu, see the comments about div.  */
1417 6643d27e bellard
{"ddivu",   "z,s,t",    0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I3      },
1418 6643d27e bellard
{"ddivu",   "d,v,t",        0,    (int) M_DDIVU_3,        INSN_MACRO,                I3        },
1419 6643d27e bellard
{"ddivu",   "d,v,I",        0,    (int) M_DDIVU_3I,        INSN_MACRO,                I3        },
1420 6643d27e bellard
{"di",      "",                0x41606000, 0xffffffff,        WR_t|WR_C0,                I33        },
1421 6643d27e bellard
{"di",      "t",        0x41606000, 0xffe0ffff,        WR_t|WR_C0,                I33        },
1422 6643d27e bellard
{"dins",    "t,r,I,+I",        0,    (int) M_DINS,        INSN_MACRO,                I65        },
1423 6643d27e bellard
{"dins",    "t,r,+A,+B", 0x7c000007, 0xfc00003f, WR_t|RD_s,                    I65        },
1424 6643d27e bellard
{"dinsm",   "t,r,+A,+F", 0x7c000005, 0xfc00003f, WR_t|RD_s,                    I65        },
1425 6643d27e bellard
{"dinsu",   "t,r,+E,+F", 0x7c000006, 0xfc00003f, WR_t|RD_s,                    I65        },
1426 6643d27e bellard
/* The MIPS assembler treats the div opcode with two operands as
1427 6643d27e bellard
   though the first operand appeared twice (the first operand is both
1428 6643d27e bellard
   a source and a destination).  To get the div machine instruction,
1429 6643d27e bellard
   you must use an explicit destination of $0.  */
1430 6643d27e bellard
{"div",     "z,s,t",    0x0000001a, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I1      },
1431 6643d27e bellard
{"div",     "z,t",      0x0000001a, 0xffe0ffff, RD_s|RD_t|WR_HILO,      I1      },
1432 6643d27e bellard
{"div",     "d,v,t",        0,    (int) M_DIV_3,        INSN_MACRO,                I1        },
1433 6643d27e bellard
{"div",     "d,v,I",        0,    (int) M_DIV_3I,        INSN_MACRO,                I1        },
1434 6643d27e bellard
{"div.d",   "D,V,T",        0x46200003, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I1        },
1435 6643d27e bellard
{"div.s",   "D,V,T",        0x46000003, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        I1        },
1436 6643d27e bellard
{"div.ps",  "D,V,T",        0x46c00003, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        SB1        },
1437 6643d27e bellard
/* For divu, see the comments about div.  */
1438 6643d27e bellard
{"divu",    "z,s,t",    0x0000001b, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I1      },
1439 6643d27e bellard
{"divu",    "z,t",      0x0000001b, 0xffe0ffff, RD_s|RD_t|WR_HILO,      I1      },
1440 6643d27e bellard
{"divu",    "d,v,t",        0,    (int) M_DIVU_3,        INSN_MACRO,                I1        },
1441 6643d27e bellard
{"divu",    "d,v,I",        0,    (int) M_DIVU_3I,        INSN_MACRO,                I1        },
1442 6643d27e bellard
{"dla",     "t,A(b)",        0,    (int) M_DLA_AB,        INSN_MACRO,                I3        },
1443 6643d27e bellard
{"dlca",    "t,A(b)",        0,    (int) M_DLCA_AB,        INSN_MACRO,                I3        },
1444 6643d27e bellard
{"dli",     "t,j",      0x24000000, 0xffe00000, WR_t,                        I3        }, /* addiu */
1445 6643d27e bellard
{"dli",            "t,i",        0x34000000, 0xffe00000, WR_t,                        I3        }, /* ori */
1446 6643d27e bellard
{"dli",     "t,I",        0,    (int) M_DLI,        INSN_MACRO,                I3        },
1447 6643d27e bellard
{"dmacc",   "d,s,t",        0x00000029, 0xfc0007ff,        RD_s|RD_t|WR_LO|WR_d,        N412        },
1448 6643d27e bellard
{"dmacchi", "d,s,t",        0x00000229, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d,        N412        },
1449 6643d27e bellard
{"dmacchis", "d,s,t",        0x00000629, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d,        N412        },
1450 6643d27e bellard
{"dmacchiu", "d,s,t",        0x00000269, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d,        N412        },
1451 6643d27e bellard
{"dmacchius", "d,s,t",        0x00000669, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d,        N412        },
1452 6643d27e bellard
{"dmaccs",  "d,s,t",        0x00000429, 0xfc0007ff,        RD_s|RD_t|WR_LO|WR_d,        N412        },
1453 6643d27e bellard
{"dmaccu",  "d,s,t",        0x00000069, 0xfc0007ff,        RD_s|RD_t|WR_LO|WR_d,        N412        },
1454 6643d27e bellard
{"dmaccus", "d,s,t",        0x00000469, 0xfc0007ff,        RD_s|RD_t|WR_LO|WR_d,        N412        },
1455 6643d27e bellard
{"dmadd16", "s,t",      0x00000029, 0xfc00ffff, RD_s|RD_t|MOD_LO,       N411    },
1456 6643d27e bellard
{"dmfc0",   "t,G",        0x40200000, 0xffe007ff, LCD|WR_t|RD_C0,                I3        },
1457 6643d27e bellard
{"dmfc0",   "t,+D",     0x40200000, 0xffe007f8, LCD|WR_t|RD_C0,         I64     },
1458 6643d27e bellard
{"dmfc0",   "t,G,H",    0x40200000, 0xffe007f8, LCD|WR_t|RD_C0,         I64     },
1459 6643d27e bellard
{"dmtc0",   "t,G",        0x40a00000, 0xffe007ff, COD|RD_t|WR_C0|WR_CC,        I3        },
1460 6643d27e bellard
{"dmtc0",   "t,+D",     0x40a00000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC,   I64     },
1461 6643d27e bellard
{"dmtc0",   "t,G,H",    0x40a00000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC,   I64     },
1462 6643d27e bellard
{"dmfc1",   "t,S",        0x44200000, 0xffe007ff, LCD|WR_t|RD_S|FP_S,        I3        },
1463 6643d27e bellard
{"dmfc1",   "t,G",      0x44200000, 0xffe007ff, LCD|WR_t|RD_S|FP_S,     I3      },
1464 6643d27e bellard
{"dmtc1",   "t,S",        0x44a00000, 0xffe007ff, COD|RD_t|WR_S|FP_S,        I3        },
1465 6643d27e bellard
{"dmtc1",   "t,G",      0x44a00000, 0xffe007ff, COD|RD_t|WR_S|FP_S,     I3      },
1466 6643d27e bellard
/* dmfc2 is at the bottom of the table.  */
1467 6643d27e bellard
/* dmtc2 is at the bottom of the table.  */
1468 6643d27e bellard
{"dmfc3",   "t,G",      0x4c200000, 0xffe007ff, LCD|WR_t|RD_C3,         I3      },
1469 6643d27e bellard
{"dmfc3",   "t,G,H",    0x4c200000, 0xffe007f8, LCD|WR_t|RD_C3,         I64     },
1470 6643d27e bellard
{"dmtc3",   "t,G",      0x4ca00000, 0xffe007ff, COD|RD_t|WR_C3|WR_CC,   I3      },
1471 6643d27e bellard
{"dmtc3",   "t,G,H",    0x4ca00000, 0xffe007f8, COD|RD_t|WR_C3|WR_CC,   I64     },
1472 6643d27e bellard
{"dmul",    "d,v,t",        0,    (int) M_DMUL,        INSN_MACRO,                I3        },
1473 6643d27e bellard
{"dmul",    "d,v,I",        0,    (int) M_DMUL_I,        INSN_MACRO,                I3        },
1474 6643d27e bellard
{"dmulo",   "d,v,t",        0,    (int) M_DMULO,        INSN_MACRO,                I3        },
1475 6643d27e bellard
{"dmulo",   "d,v,I",        0,    (int) M_DMULO_I,        INSN_MACRO,                I3        },
1476 6643d27e bellard
{"dmulou",  "d,v,t",        0,    (int) M_DMULOU,        INSN_MACRO,                I3        },
1477 6643d27e bellard
{"dmulou",  "d,v,I",        0,    (int) M_DMULOU_I,        INSN_MACRO,                I3        },
1478 6643d27e bellard
{"dmult",   "s,t",      0x0000001c, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I3        },
1479 6643d27e bellard
{"dmultu",  "s,t",      0x0000001d, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I3        },
1480 6643d27e bellard
{"dneg",    "d,w",        0x0000002e, 0xffe007ff,        WR_d|RD_t,                I3        }, /* dsub 0 */
1481 6643d27e bellard
{"dnegu",   "d,w",        0x0000002f, 0xffe007ff,        WR_d|RD_t,                I3        }, /* dsubu 0*/
1482 6643d27e bellard
{"drem",    "z,s,t",    0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I3      },
1483 6643d27e bellard
{"drem",    "d,v,t",        3,    (int) M_DREM_3,        INSN_MACRO,                I3        },
1484 6643d27e bellard
{"drem",    "d,v,I",        3,    (int) M_DREM_3I,        INSN_MACRO,                I3        },
1485 6643d27e bellard
{"dremu",   "z,s,t",    0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I3      },
1486 6643d27e bellard
{"dremu",   "d,v,t",        3,    (int) M_DREMU_3,        INSN_MACRO,                I3        },
1487 6643d27e bellard
{"dremu",   "d,v,I",        3,    (int) M_DREMU_3I,        INSN_MACRO,                I3        },
1488 6643d27e bellard
{"dret",    "",                0x7000003e, 0xffffffff,        0,                        N5        },
1489 6643d27e bellard
{"drol",    "d,v,t",        0,    (int) M_DROL,        INSN_MACRO,                I3        },
1490 6643d27e bellard
{"drol",    "d,v,I",        0,    (int) M_DROL_I,        INSN_MACRO,                I3        },
1491 6643d27e bellard
{"dror",    "d,v,t",        0,    (int) M_DROR,        INSN_MACRO,                I3        },
1492 6643d27e bellard
{"dror",    "d,v,I",        0,    (int) M_DROR_I,        INSN_MACRO,                I3        },
1493 6643d27e bellard
{"dror",    "d,w,<",        0x0020003a, 0xffe0003f,        WR_d|RD_t,                N5|I65        },
1494 6643d27e bellard
{"drorv",   "d,t,s",        0x00000056, 0xfc0007ff,        RD_t|RD_s|WR_d,                N5|I65        },
1495 6643d27e bellard
{"dror32",  "d,w,<",        0x0020003e, 0xffe0003f,        WR_d|RD_t,                N5|I65        },
1496 6643d27e bellard
{"drotl",   "d,v,t",        0,    (int) M_DROL,        INSN_MACRO,                I65        },
1497 6643d27e bellard
{"drotl",   "d,v,I",        0,    (int) M_DROL_I,        INSN_MACRO,                I65        },
1498 6643d27e bellard
{"drotr",   "d,v,t",        0,    (int) M_DROR,        INSN_MACRO,                I65        },
1499 6643d27e bellard
{"drotr",   "d,v,I",        0,    (int) M_DROR_I,        INSN_MACRO,                I65        },
1500 6643d27e bellard
{"drotrv",  "d,t,s",        0x00000056, 0xfc0007ff,        RD_t|RD_s|WR_d,                I65        },
1501 6643d27e bellard
{"drotr32", "d,w,<",        0x0020003e, 0xffe0003f,        WR_d|RD_t,                I65        },
1502 6643d27e bellard
{"dsbh",    "d,w",        0x7c0000a4, 0xffe007ff,        WR_d|RD_t,                I65        },
1503 6643d27e bellard
{"dshd",    "d,w",        0x7c000164, 0xffe007ff,        WR_d|RD_t,                I65        },
1504 6643d27e bellard
{"dsllv",   "d,t,s",        0x00000014, 0xfc0007ff,        WR_d|RD_t|RD_s,                I3        },
1505 6643d27e bellard
{"dsll32",  "d,w,<",        0x0000003c, 0xffe0003f, WR_d|RD_t,                I3        },
1506 6643d27e bellard
{"dsll",    "d,w,s",        0x00000014, 0xfc0007ff,        WR_d|RD_t|RD_s,                I3        }, /* dsllv */
1507 6643d27e bellard
{"dsll",    "d,w,>",        0x0000003c, 0xffe0003f, WR_d|RD_t,                I3        }, /* dsll32 */
1508 6643d27e bellard
{"dsll",    "d,w,<",        0x00000038, 0xffe0003f,        WR_d|RD_t,                I3        },
1509 6643d27e bellard
{"dsrav",   "d,t,s",        0x00000017, 0xfc0007ff,        WR_d|RD_t|RD_s,                I3        },
1510 6643d27e bellard
{"dsra32",  "d,w,<",        0x0000003f, 0xffe0003f, WR_d|RD_t,                I3        },
1511 6643d27e bellard
{"dsra",    "d,w,s",        0x00000017, 0xfc0007ff,        WR_d|RD_t|RD_s,                I3        }, /* dsrav */
1512 6643d27e bellard
{"dsra",    "d,w,>",        0x0000003f, 0xffe0003f, WR_d|RD_t,                I3        }, /* dsra32 */
1513 6643d27e bellard
{"dsra",    "d,w,<",        0x0000003b, 0xffe0003f,        WR_d|RD_t,                I3        },
1514 6643d27e bellard
{"dsrlv",   "d,t,s",        0x00000016, 0xfc0007ff,        WR_d|RD_t|RD_s,                I3        },
1515 6643d27e bellard
{"dsrl32",  "d,w,<",        0x0000003e, 0xffe0003f, WR_d|RD_t,                I3        },
1516 6643d27e bellard
{"dsrl",    "d,w,s",        0x00000016, 0xfc0007ff,        WR_d|RD_t|RD_s,                I3        }, /* dsrlv */
1517 6643d27e bellard
{"dsrl",    "d,w,>",        0x0000003e, 0xffe0003f, WR_d|RD_t,                I3        }, /* dsrl32 */
1518 6643d27e bellard
{"dsrl",    "d,w,<",        0x0000003a, 0xffe0003f,        WR_d|RD_t,                I3        },
1519 6643d27e bellard
{"dsub",    "d,v,t",        0x0000002e, 0xfc0007ff,        WR_d|RD_s|RD_t,                I3        },
1520 6643d27e bellard
{"dsub",    "d,v,I",        0,    (int) M_DSUB_I,        INSN_MACRO,                I3        },
1521 6643d27e bellard
{"dsubu",   "d,v,t",        0x0000002f, 0xfc0007ff,        WR_d|RD_s|RD_t,                I3        },
1522 6643d27e bellard
{"dsubu",   "d,v,I",        0,    (int) M_DSUBU_I,        INSN_MACRO,                I3        },
1523 6643d27e bellard
{"ei",      "",                0x41606020, 0xffffffff,        WR_t|WR_C0,                I33        },
1524 6643d27e bellard
{"ei",      "t",        0x41606020, 0xffe0ffff,        WR_t|WR_C0,                I33        },
1525 6643d27e bellard
{"eret",    "",         0x42000018, 0xffffffff, 0,                      I3|I32        },
1526 6643d27e bellard
{"ext",     "t,r,+A,+C", 0x7c000000, 0xfc00003f, WR_t|RD_s,                    I33        },
1527 6643d27e bellard
{"floor.l.d", "D,S",        0x4620000b, 0xffff003f, WR_D|RD_S|FP_D,                I3        },
1528 6643d27e bellard
{"floor.l.s", "D,S",        0x4600000b, 0xffff003f, WR_D|RD_S|FP_S,                I3        },
1529 6643d27e bellard
{"floor.w.d", "D,S",        0x4620000f, 0xffff003f, WR_D|RD_S|FP_D,                I2        },
1530 6643d27e bellard
{"floor.w.s", "D,S",        0x4600000f, 0xffff003f, WR_D|RD_S|FP_S,                I2        },
1531 6643d27e bellard
{"flushi",  "",                0xbc010000, 0xffffffff, 0,                        L1        },
1532 6643d27e bellard
{"flushd",  "",                0xbc020000, 0xffffffff, 0,                         L1        },
1533 6643d27e bellard
{"flushid", "",                0xbc030000, 0xffffffff, 0,                         L1        },
1534 6643d27e bellard
{"hibernate","",        0x42000023, 0xffffffff,        0,                         V1        },
1535 6643d27e bellard
{"ins",     "t,r,+A,+B", 0x7c000004, 0xfc00003f, WR_t|RD_s,                    I33        },
1536 6643d27e bellard
{"jr",      "s",        0x00000008, 0xfc1fffff,        UBD|RD_s,                I1        },
1537 6643d27e bellard
{"jr.hb",   "s",        0x00000408, 0xfc1fffff,        UBD|RD_s,                I33        },
1538 6643d27e bellard
{"j",       "s",        0x00000008, 0xfc1fffff,        UBD|RD_s,                I1        }, /* jr */
1539 6643d27e bellard
/* SVR4 PIC code requires special handling for j, so it must be a
1540 6643d27e bellard
   macro.  */
1541 6643d27e bellard
{"j",            "a",        0,     (int) M_J_A,        INSN_MACRO,                I1        },
1542 6643d27e bellard
/* This form of j is used by the disassembler and internally by the
1543 6643d27e bellard
   assembler, but will never match user input (because the line above
1544 6643d27e bellard
   will match first).  */
1545 6643d27e bellard
{"j",       "a",        0x08000000, 0xfc000000,        UBD,                        I1        },
1546 6643d27e bellard
{"jalr",    "s",        0x0000f809, 0xfc1fffff,        UBD|RD_s|WR_d,                I1        },
1547 6643d27e bellard
{"jalr",    "d,s",        0x00000009, 0xfc1f07ff,        UBD|RD_s|WR_d,                I1        },
1548 6643d27e bellard
{"jalr.hb", "s",        0x0000fc09, 0xfc1fffff,        UBD|RD_s|WR_d,                I33        },
1549 6643d27e bellard
{"jalr.hb", "d,s",        0x00000409, 0xfc1f07ff,        UBD|RD_s|WR_d,                I33        },
1550 6643d27e bellard
/* SVR4 PIC code requires special handling for jal, so it must be a
1551 6643d27e bellard
   macro.  */
1552 6643d27e bellard
{"jal",     "d,s",        0,     (int) M_JAL_2,        INSN_MACRO,                I1        },
1553 6643d27e bellard
{"jal",     "s",        0,     (int) M_JAL_1,        INSN_MACRO,                I1        },
1554 6643d27e bellard
{"jal",     "a",        0,     (int) M_JAL_A,        INSN_MACRO,                I1        },
1555 6643d27e bellard
/* This form of jal is used by the disassembler and internally by the
1556 6643d27e bellard
   assembler, but will never match user input (because the line above
1557 6643d27e bellard
   will match first).  */
1558 6643d27e bellard
{"jal",     "a",        0x0c000000, 0xfc000000,        UBD|WR_31,                I1        },
1559 6643d27e bellard
{"jalx",    "a",        0x74000000, 0xfc000000, UBD|WR_31,                I16     },
1560 6643d27e bellard
{"la",      "t,A(b)",        0,    (int) M_LA_AB,        INSN_MACRO,                I1        },
1561 6643d27e bellard
{"lb",      "t,o(b)",        0x80000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1562 6643d27e bellard
{"lb",      "t,A(b)",        0,    (int) M_LB_AB,        INSN_MACRO,                I1        },
1563 6643d27e bellard
{"lbu",     "t,o(b)",        0x90000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1564 6643d27e bellard
{"lbu",     "t,A(b)",        0,    (int) M_LBU_AB,        INSN_MACRO,                I1        },
1565 6643d27e bellard
{"lca",     "t,A(b)",        0,    (int) M_LCA_AB,        INSN_MACRO,                I1        },
1566 6643d27e bellard
{"ld",            "t,o(b)",   0xdc000000, 0xfc000000, WR_t|RD_b,                I3        },
1567 6643d27e bellard
{"ld",      "t,o(b)",        0,    (int) M_LD_OB,        INSN_MACRO,                I1        },
1568 6643d27e bellard
{"ld",      "t,A(b)",        0,    (int) M_LD_AB,        INSN_MACRO,                I1        },
1569 6643d27e bellard
{"ldc1",    "T,o(b)",        0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D,        I2        },
1570 6643d27e bellard
{"ldc1",    "E,o(b)",        0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D,        I2        },
1571 6643d27e bellard
{"ldc1",    "T,A(b)",        0,    (int) M_LDC1_AB,        INSN_MACRO,                I2        },
1572 6643d27e bellard
{"ldc1",    "E,A(b)",        0,    (int) M_LDC1_AB,        INSN_MACRO,                I2        },
1573 6643d27e bellard
{"l.d",     "T,o(b)",        0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D,        I2        }, /* ldc1 */
1574 6643d27e bellard
{"l.d",     "T,o(b)",        0,    (int) M_L_DOB,        INSN_MACRO,                I1        },
1575 6643d27e bellard
{"l.d",     "T,A(b)",        0,    (int) M_L_DAB,        INSN_MACRO,                I1        },
1576 6643d27e bellard
{"ldc2",    "E,o(b)",        0xd8000000, 0xfc000000, CLD|RD_b|WR_CC,                I2        },
1577 6643d27e bellard
{"ldc2",    "E,A(b)",        0,    (int) M_LDC2_AB,        INSN_MACRO,                I2        },
1578 6643d27e bellard
{"ldc3",    "E,o(b)",        0xdc000000, 0xfc000000, CLD|RD_b|WR_CC,                I2        },
1579 6643d27e bellard
{"ldc3",    "E,A(b)",        0,    (int) M_LDC3_AB,        INSN_MACRO,                I2        },
1580 6643d27e bellard
{"ldl",            "t,o(b)",        0x68000000, 0xfc000000, LDD|WR_t|RD_b,                I3        },
1581 6643d27e bellard
{"ldl",            "t,A(b)",        0,    (int) M_LDL_AB,        INSN_MACRO,                I3        },
1582 6643d27e bellard
{"ldr",            "t,o(b)",        0x6c000000, 0xfc000000, LDD|WR_t|RD_b,                I3        },
1583 6643d27e bellard
{"ldr",     "t,A(b)",        0,    (int) M_LDR_AB,        INSN_MACRO,                I3        },
1584 6643d27e bellard
{"ldxc1",   "D,t(b)",        0x4c000001, 0xfc00f83f, LDD|WR_D|RD_t|RD_b,        I4        },
1585 6643d27e bellard
{"lh",      "t,o(b)",        0x84000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1586 6643d27e bellard
{"lh",      "t,A(b)",        0,    (int) M_LH_AB,        INSN_MACRO,                I1        },
1587 6643d27e bellard
{"lhu",     "t,o(b)",        0x94000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1588 6643d27e bellard
{"lhu",     "t,A(b)",        0,    (int) M_LHU_AB,        INSN_MACRO,                I1        },
1589 6643d27e bellard
/* li is at the start of the table.  */
1590 6643d27e bellard
{"li.d",    "t,F",        0,    (int) M_LI_D,        INSN_MACRO,                I1        },
1591 6643d27e bellard
{"li.d",    "T,L",        0,    (int) M_LI_DD,        INSN_MACRO,                I1        },
1592 6643d27e bellard
{"li.s",    "t,f",        0,    (int) M_LI_S,        INSN_MACRO,                I1        },
1593 6643d27e bellard
{"li.s",    "T,l",        0,    (int) M_LI_SS,        INSN_MACRO,                I1        },
1594 6643d27e bellard
{"ll",            "t,o(b)",        0xc0000000, 0xfc000000, LDD|RD_b|WR_t,                I2        },
1595 6643d27e bellard
{"ll",            "t,A(b)",        0,    (int) M_LL_AB,        INSN_MACRO,                I2        },
1596 6643d27e bellard
{"lld",            "t,o(b)",        0xd0000000, 0xfc000000, LDD|RD_b|WR_t,                I3        },
1597 6643d27e bellard
{"lld",     "t,A(b)",        0,    (int) M_LLD_AB,        INSN_MACRO,                I3        },
1598 6643d27e bellard
{"lui",     "t,u",        0x3c000000, 0xffe00000,        WR_t,                        I1        },
1599 6643d27e bellard
{"luxc1",   "D,t(b)",        0x4c000005, 0xfc00f83f, LDD|WR_D|RD_t|RD_b,        I5|N55        },
1600 6643d27e bellard
{"lw",      "t,o(b)",        0x8c000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1601 6643d27e bellard
{"lw",      "t,A(b)",        0,    (int) M_LW_AB,        INSN_MACRO,                I1        },
1602 6643d27e bellard
{"lwc0",    "E,o(b)",        0xc0000000, 0xfc000000,        CLD|RD_b|WR_CC,                I1        },
1603 6643d27e bellard
{"lwc0",    "E,A(b)",        0,    (int) M_LWC0_AB,        INSN_MACRO,                I1        },
1604 6643d27e bellard
{"lwc1",    "T,o(b)",        0xc4000000, 0xfc000000,        CLD|RD_b|WR_T|FP_S,        I1        },
1605 6643d27e bellard
{"lwc1",    "E,o(b)",        0xc4000000, 0xfc000000,        CLD|RD_b|WR_T|FP_S,        I1        },
1606 6643d27e bellard
{"lwc1",    "T,A(b)",        0,    (int) M_LWC1_AB,        INSN_MACRO,                I1        },
1607 6643d27e bellard
{"lwc1",    "E,A(b)",        0,    (int) M_LWC1_AB,        INSN_MACRO,                I1        },
1608 6643d27e bellard
{"l.s",     "T,o(b)",        0xc4000000, 0xfc000000,        CLD|RD_b|WR_T|FP_S,        I1        }, /* lwc1 */
1609 6643d27e bellard
{"l.s",     "T,A(b)",        0,    (int) M_LWC1_AB,        INSN_MACRO,                I1        },
1610 6643d27e bellard
{"lwc2",    "E,o(b)",        0xc8000000, 0xfc000000,        CLD|RD_b|WR_CC,                I1        },
1611 6643d27e bellard
{"lwc2",    "E,A(b)",        0,    (int) M_LWC2_AB,        INSN_MACRO,                I1        },
1612 6643d27e bellard
{"lwc3",    "E,o(b)",        0xcc000000, 0xfc000000,        CLD|RD_b|WR_CC,                I1        },
1613 6643d27e bellard
{"lwc3",    "E,A(b)",        0,    (int) M_LWC3_AB,        INSN_MACRO,                I1        },
1614 6643d27e bellard
{"lwl",     "t,o(b)",        0x88000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1615 6643d27e bellard
{"lwl",     "t,A(b)",        0,    (int) M_LWL_AB,        INSN_MACRO,                I1        },
1616 6643d27e bellard
{"lcache",  "t,o(b)",        0x88000000, 0xfc000000,        LDD|RD_b|WR_t,                I2        }, /* same */
1617 6643d27e bellard
{"lcache",  "t,A(b)",        0,    (int) M_LWL_AB,        INSN_MACRO,                I2        }, /* as lwl */
1618 6643d27e bellard
{"lwr",     "t,o(b)",        0x98000000, 0xfc000000,        LDD|RD_b|WR_t,                I1        },
1619 6643d27e bellard
{"lwr",     "t,A(b)",        0,    (int) M_LWR_AB,        INSN_MACRO,                I1        },
1620 6643d27e bellard
{"flush",   "t,o(b)",        0x98000000, 0xfc000000,        LDD|RD_b|WR_t,                I2        }, /* same */
1621 6643d27e bellard
{"flush",   "t,A(b)",        0,    (int) M_LWR_AB,        INSN_MACRO,                I2        }, /* as lwr */
1622 6643d27e bellard
{"lwu",     "t,o(b)",        0x9c000000, 0xfc000000,        LDD|RD_b|WR_t,                I3        },
1623 6643d27e bellard
{"lwu",     "t,A(b)",        0,    (int) M_LWU_AB,        INSN_MACRO,                I3        },
1624 6643d27e bellard
{"lwxc1",   "D,t(b)",        0x4c000000, 0xfc00f83f, LDD|WR_D|RD_t|RD_b,        I4        },
1625 6643d27e bellard
{"macc",    "d,s,t",        0x00000028, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, N412    },
1626 6643d27e bellard
{"macc",    "d,s,t",        0x00000158, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d,        N5      },
1627 6643d27e bellard
{"maccs",   "d,s,t",        0x00000428, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d, N412    },
1628 6643d27e bellard
{"macchi",  "d,s,t",        0x00000228, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, N412    },
1629 6643d27e bellard
{"macchi",  "d,s,t",        0x00000358, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5      },
1630 6643d27e bellard
{"macchis", "d,s,t",        0x00000628, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d, N412    },
1631 6643d27e bellard
{"macchiu", "d,s,t",        0x00000268, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d, N412    },
1632 6643d27e bellard
{"macchiu", "d,s,t",        0x00000359, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d,        N5      },
1633 6643d27e bellard
{"macchius","d,s,t",        0x00000668, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d, N412    },
1634 6643d27e bellard
{"maccu",   "d,s,t",        0x00000068, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d, N412    },
1635 6643d27e bellard
{"maccu",   "d,s,t",        0x00000159, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d,        N5      },
1636 6643d27e bellard
{"maccus",  "d,s,t",        0x00000468, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d, N412    },
1637 6643d27e bellard
{"mad",     "s,t",      0x70000000, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     P3      },
1638 6643d27e bellard
{"madu",    "s,t",      0x70000001, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     P3      },
1639 6643d27e bellard
{"madd.d",  "D,R,S,T",        0x4c000021, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D,    I4        },
1640 6643d27e bellard
{"madd.s",  "D,R,S,T",        0x4c000020, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S,    I4        },
1641 6643d27e bellard
{"madd.ps", "D,R,S,T",        0x4c000026, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D,    I5        },
1642 6643d27e bellard
{"madd",    "s,t",      0x0000001c, 0xfc00ffff, RD_s|RD_t|WR_HILO,           L1 },
1643 6643d27e bellard
{"madd",    "s,t",      0x70000000, 0xfc00ffff, RD_s|RD_t|MOD_HILO,          I32|N55},
1644 6643d27e bellard
{"madd",    "s,t",      0x70000000, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M,      G1 },
1645 6643d27e bellard
{"madd",    "d,s,t",    0x70000000, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1 },
1646 6643d27e bellard
{"maddu",   "s,t",      0x0000001d, 0xfc00ffff, RD_s|RD_t|WR_HILO,           L1 },
1647 6643d27e bellard
{"maddu",   "s,t",      0x70000001, 0xfc00ffff, RD_s|RD_t|MOD_HILO,          I32|N55},
1648 6643d27e bellard
{"maddu",   "s,t",      0x70000001, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M,      G1        },
1649 6643d27e bellard
{"maddu",   "d,s,t",    0x70000001, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1        },
1650 6643d27e bellard
{"madd16",  "s,t",      0x00000028, 0xfc00ffff, RD_s|RD_t|MOD_HILO,        N411    },
1651 6643d27e bellard
{"max.ob",  "X,Y,Q",        0x78000007, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1652 6643d27e bellard
{"max.ob",  "D,S,T",        0x4ac00007, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1653 6643d27e bellard
{"max.ob",  "D,S,T[e]",        0x48000007, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1654 6643d27e bellard
{"max.ob",  "D,S,k",        0x4bc00007, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1655 6643d27e bellard
{"max.qh",  "X,Y,Q",        0x78200007, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1656 6643d27e bellard
{"mfpc",    "t,P",        0x4000c801, 0xffe0ffc1,        LCD|WR_t|RD_C0,                M1|N5        },
1657 6643d27e bellard
{"mfps",    "t,P",        0x4000c800, 0xffe0ffc1,        LCD|WR_t|RD_C0,                M1|N5        },
1658 6643d27e bellard
{"mfc0",    "t,G",        0x40000000, 0xffe007ff,        LCD|WR_t|RD_C0,                I1        },
1659 6643d27e bellard
{"mfc0",    "t,+D",     0x40000000, 0xffe007f8, LCD|WR_t|RD_C0,         I32     },
1660 6643d27e bellard
{"mfc0",    "t,G,H",    0x40000000, 0xffe007f8, LCD|WR_t|RD_C0,         I32     },
1661 6643d27e bellard
{"mfc1",    "t,S",        0x44000000, 0xffe007ff,        LCD|WR_t|RD_S|FP_S,        I1        },
1662 6643d27e bellard
{"mfc1",    "t,G",        0x44000000, 0xffe007ff,        LCD|WR_t|RD_S|FP_S,        I1        },
1663 6643d27e bellard
{"mfhc1",   "t,S",        0x44600000, 0xffe007ff,        LCD|WR_t|RD_S|FP_S,        I33        },
1664 6643d27e bellard
{"mfhc1",   "t,G",        0x44600000, 0xffe007ff,        LCD|WR_t|RD_S|FP_S,        I33        },
1665 6643d27e bellard
/* mfc2 is at the bottom of the table.  */
1666 6643d27e bellard
/* mfhc2 is at the bottom of the table.  */
1667 6643d27e bellard
{"mfc3",    "t,G",        0x4c000000, 0xffe007ff,        LCD|WR_t|RD_C3,                I1        },
1668 6643d27e bellard
{"mfc3",    "t,G,H",    0x4c000000, 0xffe007f8, LCD|WR_t|RD_C3,         I32     },
1669 6643d27e bellard
{"mfdr",    "t,G",        0x7000003d, 0xffe007ff,        LCD|WR_t|RD_C0,                N5      },
1670 6643d27e bellard
{"mfhi",    "d",        0x00000010, 0xffff07ff,        WR_d|RD_HI,                I1        },
1671 6643d27e bellard
{"mflo",    "d",        0x00000012, 0xffff07ff,        WR_d|RD_LO,                I1        },
1672 6643d27e bellard
{"min.ob",  "X,Y,Q",        0x78000006, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1673 6643d27e bellard
{"min.ob",  "D,S,T",        0x4ac00006, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1674 6643d27e bellard
{"min.ob",  "D,S,T[e]",        0x48000006, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1675 6643d27e bellard
{"min.ob",  "D,S,k",        0x4bc00006, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1676 6643d27e bellard
{"min.qh",  "X,Y,Q",        0x78200006, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1677 6643d27e bellard
{"mov.d",   "D,S",        0x46200006, 0xffff003f,        WR_D|RD_S|FP_D,                I1        },
1678 6643d27e bellard
{"mov.s",   "D,S",        0x46000006, 0xffff003f,        WR_D|RD_S|FP_S,                I1        },
1679 6643d27e bellard
{"mov.ps",  "D,S",        0x46c00006, 0xffff003f,        WR_D|RD_S|FP_D,                I5        },
1680 6643d27e bellard
{"movf",    "d,s,N",    0x00000001, 0xfc0307ff, WR_d|RD_s|RD_CC|FP_D|FP_S, I4|I32},
1681 6643d27e bellard
{"movf.d",  "D,S,N",    0x46200011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   I4|I32        },
1682 6643d27e bellard
{"movf.l",  "D,S,N",        0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,        MX|SB1        },
1683 6643d27e bellard
{"movf.l",  "X,Y,N",        0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,        MX|SB1        },
1684 6643d27e bellard
{"movf.s",  "D,S,N",    0x46000011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S,   I4|I32        },
1685 6643d27e bellard
{"movf.ps", "D,S,N",        0x46c00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,        I5        },
1686 6643d27e bellard
{"movn",    "d,v,t",    0x0000000b, 0xfc0007ff, WR_d|RD_s|RD_t,         I4|I32        },
1687 6643d27e bellard
{"ffc",     "d,v",        0x0000000b, 0xfc1f07ff,        WR_d|RD_s,                L1        },
1688 6643d27e bellard
{"movn.d",  "D,S,t",    0x46200013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I4|I32        },
1689 6643d27e bellard
{"movn.l",  "D,S,t",    0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX|SB1        },
1690 6643d27e bellard
{"movn.l",  "X,Y,t",    0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX|SB1        },
1691 6643d27e bellard
{"movn.s",  "D,S,t",    0x46000013, 0xffe0003f, WR_D|RD_S|RD_t|FP_S,    I4|I32        },
1692 6643d27e bellard
{"movn.ps", "D,S,t",    0x46c00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I5        },
1693 6643d27e bellard
{"movt",    "d,s,N",    0x00010001, 0xfc0307ff, WR_d|RD_s|RD_CC,        I4|I32        },
1694 6643d27e bellard
{"movt.d",  "D,S,N",    0x46210011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   I4|I32        },
1695 6643d27e bellard
{"movt.l",  "D,S,N",    0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   MX|SB1        },
1696 6643d27e bellard
{"movt.l",  "X,Y,N",    0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,   MX|SB1        },
1697 6643d27e bellard
{"movt.s",  "D,S,N",    0x46010011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S,   I4|I32        },
1698 6643d27e bellard
{"movt.ps", "D,S,N",        0x46c10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D,        I5        },
1699 6643d27e bellard
{"movz",    "d,v,t",    0x0000000a, 0xfc0007ff, WR_d|RD_s|RD_t,         I4|I32        },
1700 6643d27e bellard
{"ffs",     "d,v",        0x0000000a, 0xfc1f07ff,        WR_d|RD_s,                L1        },
1701 6643d27e bellard
{"movz.d",  "D,S,t",    0x46200012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I4|I32        },
1702 6643d27e bellard
{"movz.l",  "D,S,t",    0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX|SB1        },
1703 6643d27e bellard
{"movz.l",  "X,Y,t",    0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    MX|SB1        },
1704 6643d27e bellard
{"movz.s",  "D,S,t",    0x46000012, 0xffe0003f, WR_D|RD_S|RD_t|FP_S,    I4|I32        },
1705 6643d27e bellard
{"movz.ps", "D,S,t",    0x46c00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D,    I5        },
1706 6643d27e bellard
{"msac",    "d,s,t",        0x000001d8, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1707 6643d27e bellard
{"msacu",   "d,s,t",        0x000001d9, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1708 6643d27e bellard
{"msachi",  "d,s,t",        0x000003d8, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1709 6643d27e bellard
{"msachiu", "d,s,t",        0x000003d9, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1710 6643d27e bellard
/* move is at the top of the table.  */
1711 6643d27e bellard
{"msgn.qh", "X,Y,Q",        0x78200000, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1712 6643d27e bellard
{"msub.d",  "D,R,S,T",        0x4c000029, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I4        },
1713 6643d27e bellard
{"msub.s",  "D,R,S,T",        0x4c000028, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, I4        },
1714 6643d27e bellard
{"msub.ps", "D,R,S,T",        0x4c00002e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I5        },
1715 6643d27e bellard
{"msub",    "s,t",      0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO,        L1            },
1716 6643d27e bellard
{"msub",    "s,t",      0x70000004, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     I32|N55 },
1717 6643d27e bellard
{"msubu",   "s,t",      0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO,        L1        },
1718 6643d27e bellard
{"msubu",   "s,t",      0x70000005, 0xfc00ffff, RD_s|RD_t|MOD_HILO,     I32|N55        },
1719 6643d27e bellard
{"mtpc",    "t,P",        0x4080c801, 0xffe0ffc1,        COD|RD_t|WR_C0,                M1|N5        },
1720 6643d27e bellard
{"mtps",    "t,P",        0x4080c800, 0xffe0ffc1,        COD|RD_t|WR_C0,                M1|N5        },
1721 6643d27e bellard
{"mtc0",    "t,G",        0x40800000, 0xffe007ff,        COD|RD_t|WR_C0|WR_CC,        I1        },
1722 6643d27e bellard
{"mtc0",    "t,+D",     0x40800000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC,   I32     },
1723 6643d27e bellard
{"mtc0",    "t,G,H",    0x40800000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC,   I32     },
1724 6643d27e bellard
{"mtc1",    "t,S",        0x44800000, 0xffe007ff,        COD|RD_t|WR_S|FP_S,        I1        },
1725 6643d27e bellard
{"mtc1",    "t,G",        0x44800000, 0xffe007ff,        COD|RD_t|WR_S|FP_S,        I1        },
1726 6643d27e bellard
{"mthc1",   "t,S",        0x44e00000, 0xffe007ff,        COD|RD_t|WR_S|FP_S,        I33        },
1727 6643d27e bellard
{"mthc1",   "t,G",        0x44e00000, 0xffe007ff,        COD|RD_t|WR_S|FP_S,        I33        },
1728 6643d27e bellard
/* mtc2 is at the bottom of the table.  */
1729 6643d27e bellard
/* mthc2 is at the bottom of the table.  */
1730 6643d27e bellard
{"mtc3",    "t,G",        0x4c800000, 0xffe007ff,        COD|RD_t|WR_C3|WR_CC,        I1        },
1731 6643d27e bellard
{"mtc3",    "t,G,H",    0x4c800000, 0xffe007f8, COD|RD_t|WR_C3|WR_CC,   I32     },
1732 6643d27e bellard
{"mtdr",    "t,G",        0x7080003d, 0xffe007ff,        COD|RD_t|WR_C0,                N5        },
1733 6643d27e bellard
{"mthi",    "s",        0x00000011, 0xfc1fffff,        RD_s|WR_HI,                I1        },
1734 6643d27e bellard
{"mtlo",    "s",        0x00000013, 0xfc1fffff,        RD_s|WR_LO,                I1        },
1735 6643d27e bellard
{"mul.d",   "D,V,T",        0x46200002, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I1        },
1736 6643d27e bellard
{"mul.s",   "D,V,T",        0x46000002, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        I1        },
1737 6643d27e bellard
{"mul.ob",  "X,Y,Q",        0x78000030, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1738 6643d27e bellard
{"mul.ob",  "D,S,T",        0x4ac00030, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1739 6643d27e bellard
{"mul.ob",  "D,S,T[e]",        0x48000030, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1740 6643d27e bellard
{"mul.ob",  "D,S,k",        0x4bc00030, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1741 6643d27e bellard
{"mul.ps",  "D,V,T",        0x46c00002, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1742 6643d27e bellard
{"mul.qh",  "X,Y,Q",        0x78200030, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1743 6643d27e bellard
{"mul",     "d,v,t",    0x70000002, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, I32|P3|N55},
1744 6643d27e bellard
{"mul",     "d,s,t",        0x00000058, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N54        },
1745 6643d27e bellard
{"mul",     "d,v,t",        0,    (int) M_MUL,        INSN_MACRO,                I1        },
1746 6643d27e bellard
{"mul",     "d,v,I",        0,    (int) M_MUL_I,        INSN_MACRO,                I1        },
1747 6643d27e bellard
{"mula.ob", "Y,Q",        0x78000033, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1748 6643d27e bellard
{"mula.ob", "S,T",        0x4ac00033, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1749 6643d27e bellard
{"mula.ob", "S,T[e]",        0x48000033, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1750 6643d27e bellard
{"mula.ob", "S,k",        0x4bc00033, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1751 6643d27e bellard
{"mula.qh", "Y,Q",        0x78200033, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1752 6643d27e bellard
{"mulhi",   "d,s,t",        0x00000258, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1753 6643d27e bellard
{"mulhiu",  "d,s,t",        0x00000259, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1754 6643d27e bellard
{"mull.ob", "Y,Q",        0x78000433, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D, MX|SB1        },
1755 6643d27e bellard
{"mull.ob", "S,T",        0x4ac00433, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1756 6643d27e bellard
{"mull.ob", "S,T[e]",        0x48000433, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1757 6643d27e bellard
{"mull.ob", "S,k",        0x4bc00433, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1758 6643d27e bellard
{"mull.qh", "Y,Q",        0x78200433, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1759 6643d27e bellard
{"mulo",    "d,v,t",        0,    (int) M_MULO,        INSN_MACRO,                I1        },
1760 6643d27e bellard
{"mulo",    "d,v,I",        0,    (int) M_MULO_I,        INSN_MACRO,                I1        },
1761 6643d27e bellard
{"mulou",   "d,v,t",        0,    (int) M_MULOU,        INSN_MACRO,                I1        },
1762 6643d27e bellard
{"mulou",   "d,v,I",        0,    (int) M_MULOU_I,        INSN_MACRO,                I1        },
1763 6643d27e bellard
{"mulr.ps", "D,S,T",        0x46c0001a, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        M3D        },
1764 6643d27e bellard
{"muls",    "d,s,t",        0x000000d8, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1765 6643d27e bellard
{"mulsu",   "d,s,t",        0x000000d9, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1766 6643d27e bellard
{"mulshi",  "d,s,t",        0x000002d8, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1767 6643d27e bellard
{"mulshiu", "d,s,t",        0x000002d9, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1768 6643d27e bellard
{"muls.ob", "Y,Q",        0x78000032, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1769 6643d27e bellard
{"muls.ob", "S,T",        0x4ac00032, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1770 6643d27e bellard
{"muls.ob", "S,T[e]",        0x48000032, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1771 6643d27e bellard
{"muls.ob", "S,k",        0x4bc00032, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1772 6643d27e bellard
{"muls.qh", "Y,Q",        0x78200032, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1773 6643d27e bellard
{"mulsl.ob", "Y,Q",        0x78000432, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1774 6643d27e bellard
{"mulsl.ob", "S,T",        0x4ac00432, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1775 6643d27e bellard
{"mulsl.ob", "S,T[e]",        0x48000432, 0xfe2007ff,        WR_CC|RD_S|RD_T,        N54        },
1776 6643d27e bellard
{"mulsl.ob", "S,k",        0x4bc00432, 0xffe007ff,        WR_CC|RD_S|RD_T,        N54        },
1777 6643d27e bellard
{"mulsl.qh", "Y,Q",        0x78200432, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1778 6643d27e bellard
{"mult",    "s,t",      0x00000018, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, I1        },
1779 6643d27e bellard
{"mult",    "d,s,t",    0x00000018, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1        },
1780 6643d27e bellard
{"multu",   "s,t",      0x00000019, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, I1        },
1781 6643d27e bellard
{"multu",   "d,s,t",    0x00000019, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1        },
1782 6643d27e bellard
{"mulu",    "d,s,t",        0x00000059, 0xfc0007ff,        RD_s|RD_t|WR_HILO|WR_d,        N5        },
1783 6643d27e bellard
{"neg",     "d,w",        0x00000022, 0xffe007ff,        WR_d|RD_t,                I1        }, /* sub 0 */
1784 6643d27e bellard
{"negu",    "d,w",        0x00000023, 0xffe007ff,        WR_d|RD_t,                I1        }, /* subu 0 */
1785 6643d27e bellard
{"neg.d",   "D,V",        0x46200007, 0xffff003f,        WR_D|RD_S|FP_D,                I1        },
1786 6643d27e bellard
{"neg.s",   "D,V",        0x46000007, 0xffff003f,        WR_D|RD_S|FP_S,                I1        },
1787 6643d27e bellard
{"neg.ps",  "D,V",        0x46c00007, 0xffff003f,        WR_D|RD_S|FP_D,                I5        },
1788 6643d27e bellard
{"nmadd.d", "D,R,S,T",        0x4c000031, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I4        },
1789 6643d27e bellard
{"nmadd.s", "D,R,S,T",        0x4c000030, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, I4        },
1790 6643d27e bellard
{"nmadd.ps","D,R,S,T",        0x4c000036, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I5        },
1791 6643d27e bellard
{"nmsub.d", "D,R,S,T",        0x4c000039, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I4        },
1792 6643d27e bellard
{"nmsub.s", "D,R,S,T",        0x4c000038, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, I4        },
1793 6643d27e bellard
{"nmsub.ps","D,R,S,T",        0x4c00003e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I5        },
1794 6643d27e bellard
/* nop is at the start of the table.  */
1795 6643d27e bellard
{"nor",     "d,v,t",        0x00000027, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1796 6643d27e bellard
{"nor",     "t,r,I",        0,    (int) M_NOR_I,        INSN_MACRO,                I1        },
1797 6643d27e bellard
{"nor.ob",  "X,Y,Q",        0x7800000f, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1798 6643d27e bellard
{"nor.ob",  "D,S,T",        0x4ac0000f, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1799 6643d27e bellard
{"nor.ob",  "D,S,T[e]",        0x4800000f, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1800 6643d27e bellard
{"nor.ob",  "D,S,k",        0x4bc0000f, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1801 6643d27e bellard
{"nor.qh",  "X,Y,Q",        0x7820000f, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1802 6643d27e bellard
{"not",     "d,v",        0x00000027, 0xfc1f07ff,        WR_d|RD_s|RD_t,                I1        },/*nor d,s,0*/
1803 6643d27e bellard
{"or",      "d,v,t",        0x00000025, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1804 6643d27e bellard
{"or",      "t,r,I",        0,    (int) M_OR_I,        INSN_MACRO,                I1        },
1805 6643d27e bellard
{"or.ob",   "X,Y,Q",        0x7800000e, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1806 6643d27e bellard
{"or.ob",   "D,S,T",        0x4ac0000e, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1807 6643d27e bellard
{"or.ob",   "D,S,T[e]",        0x4800000e, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1808 6643d27e bellard
{"or.ob",   "D,S,k",        0x4bc0000e, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1809 6643d27e bellard
{"or.qh",   "X,Y,Q",        0x7820000e, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1810 6643d27e bellard
{"ori",     "t,r,i",        0x34000000, 0xfc000000,        WR_t|RD_s,                I1        },
1811 6643d27e bellard
{"pabsdiff.ob", "X,Y,Q",0x78000009, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        SB1        },
1812 6643d27e bellard
{"pabsdiffc.ob", "Y,Q",        0x78000035, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        SB1        },
1813 6643d27e bellard
{"pavg.ob", "X,Y,Q",        0x78000008, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        SB1        },
1814 6643d27e bellard
{"pickf.ob", "X,Y,Q",        0x78000002, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1815 6643d27e bellard
{"pickf.ob", "D,S,T",        0x4ac00002, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1816 6643d27e bellard
{"pickf.ob", "D,S,T[e]",0x48000002, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1817 6643d27e bellard
{"pickf.ob", "D,S,k",        0x4bc00002, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1818 6643d27e bellard
{"pickf.qh", "X,Y,Q",        0x78200002, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1819 6643d27e bellard
{"pickt.ob", "X,Y,Q",        0x78000003, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1820 6643d27e bellard
{"pickt.ob", "D,S,T",        0x4ac00003, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1821 6643d27e bellard
{"pickt.ob", "D,S,T[e]",0x48000003, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1822 6643d27e bellard
{"pickt.ob", "D,S,k",        0x4bc00003, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1823 6643d27e bellard
{"pickt.qh", "X,Y,Q",        0x78200003, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1824 6643d27e bellard
{"pll.ps",  "D,V,T",        0x46c0002c, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1825 6643d27e bellard
{"plu.ps",  "D,V,T",        0x46c0002d, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1826 6643d27e bellard
  /* pref and prefx are at the start of the table.  */
1827 6643d27e bellard
{"pul.ps",  "D,V,T",        0x46c0002e, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1828 6643d27e bellard
{"puu.ps",  "D,V,T",        0x46c0002f, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1829 6643d27e bellard
{"rach.ob", "X",        0x7a00003f, 0xfffff83f,        WR_D|RD_MACC|FP_D,        MX|SB1        },
1830 6643d27e bellard
{"rach.ob", "D",        0x4a00003f, 0xfffff83f,        WR_D,                        N54        },
1831 6643d27e bellard
{"rach.qh", "X",        0x7a20003f, 0xfffff83f,        WR_D|RD_MACC|FP_D,        MX        },
1832 6643d27e bellard
{"racl.ob", "X",        0x7800003f, 0xfffff83f,        WR_D|RD_MACC|FP_D,        MX|SB1        },
1833 6643d27e bellard
{"racl.ob", "D",        0x4800003f, 0xfffff83f,        WR_D,                        N54        },
1834 6643d27e bellard
{"racl.qh", "X",        0x7820003f, 0xfffff83f,        WR_D|RD_MACC|FP_D,        MX        },
1835 6643d27e bellard
{"racm.ob", "X",        0x7900003f, 0xfffff83f,        WR_D|RD_MACC|FP_D,        MX|SB1        },
1836 6643d27e bellard
{"racm.ob", "D",        0x4900003f, 0xfffff83f,        WR_D,                        N54        },
1837 6643d27e bellard
{"racm.qh", "X",        0x7920003f, 0xfffff83f,        WR_D|RD_MACC|FP_D,        MX        },
1838 6643d27e bellard
{"recip.d", "D,S",        0x46200015, 0xffff003f, WR_D|RD_S|FP_D,                I4        },
1839 6643d27e bellard
{"recip.ps","D,S",        0x46c00015, 0xffff003f, WR_D|RD_S|FP_D,                SB1        },
1840 6643d27e bellard
{"recip.s", "D,S",        0x46000015, 0xffff003f, WR_D|RD_S|FP_S,                I4        },
1841 6643d27e bellard
{"recip1.d",  "D,S",        0x4620001d, 0xffff003f,        WR_D|RD_S|FP_D,                M3D        },
1842 6643d27e bellard
{"recip1.ps", "D,S",        0x46c0001d, 0xffff003f,        WR_D|RD_S|FP_S,                M3D        },
1843 6643d27e bellard
{"recip1.s",  "D,S",        0x4600001d, 0xffff003f,        WR_D|RD_S|FP_S,                M3D        },
1844 6643d27e bellard
{"recip2.d",  "D,S,T",        0x4620001c, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        M3D        },
1845 6643d27e bellard
{"recip2.ps", "D,S,T",        0x46c0001c, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        M3D        },
1846 6643d27e bellard
{"recip2.s",  "D,S,T",        0x4600001c, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        M3D        },
1847 6643d27e bellard
{"rem",     "z,s,t",    0x0000001a, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I1        },
1848 6643d27e bellard
{"rem",     "d,v,t",        0,    (int) M_REM_3,        INSN_MACRO,                I1        },
1849 6643d27e bellard
{"rem",     "d,v,I",        0,    (int) M_REM_3I,        INSN_MACRO,                I1        },
1850 6643d27e bellard
{"remu",    "z,s,t",    0x0000001b, 0xfc00ffff, RD_s|RD_t|WR_HILO,      I1        },
1851 6643d27e bellard
{"remu",    "d,v,t",        0,    (int) M_REMU_3,        INSN_MACRO,                I1        },
1852 6643d27e bellard
{"remu",    "d,v,I",        0,    (int) M_REMU_3I,        INSN_MACRO,                I1        },
1853 6643d27e bellard
{"rdhwr",   "t,K",        0x7c00003b, 0xffe007ff, WR_t,                        I33        },
1854 6643d27e bellard
{"rdpgpr",  "d,w",        0x41400000, 0xffe007ff, WR_d,                        I33        },
1855 6643d27e bellard
{"rfe",     "",                0x42000010, 0xffffffff,        0,                        I1|T3        },
1856 6643d27e bellard
{"rnas.qh", "X,Q",        0x78200025, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX        },
1857 6643d27e bellard
{"rnau.ob", "X,Q",        0x78000021, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX|SB1        },
1858 6643d27e bellard
{"rnau.qh", "X,Q",        0x78200021, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX        },
1859 6643d27e bellard
{"rnes.qh", "X,Q",        0x78200026, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX        },
1860 6643d27e bellard
{"rneu.ob", "X,Q",        0x78000022, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX|SB1        },
1861 6643d27e bellard
{"rneu.qh", "X,Q",        0x78200022, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX        },
1862 6643d27e bellard
{"rol",     "d,v,t",        0,    (int) M_ROL,        INSN_MACRO,                I1        },
1863 6643d27e bellard
{"rol",     "d,v,I",        0,    (int) M_ROL_I,        INSN_MACRO,                I1        },
1864 6643d27e bellard
{"ror",     "d,v,t",        0,    (int) M_ROR,        INSN_MACRO,                I1        },
1865 6643d27e bellard
{"ror",     "d,v,I",        0,    (int) M_ROR_I,        INSN_MACRO,                I1        },
1866 6643d27e bellard
{"ror",            "d,w,<",        0x00200002, 0xffe0003f,        WR_d|RD_t,                N5|I33        },
1867 6643d27e bellard
{"rorv",    "d,t,s",        0x00000046, 0xfc0007ff,        RD_t|RD_s|WR_d,                N5|I33        },
1868 6643d27e bellard
{"rotl",    "d,v,t",        0,    (int) M_ROL,        INSN_MACRO,                I33        },
1869 6643d27e bellard
{"rotl",    "d,v,I",        0,    (int) M_ROL_I,        INSN_MACRO,                I33        },
1870 6643d27e bellard
{"rotr",    "d,v,t",        0,    (int) M_ROR,        INSN_MACRO,                I33        },
1871 6643d27e bellard
{"rotr",    "d,v,I",        0,    (int) M_ROR_I,        INSN_MACRO,                I33        },
1872 6643d27e bellard
{"rotrv",   "d,t,s",        0x00000046, 0xfc0007ff,        RD_t|RD_s|WR_d,                I33        },
1873 6643d27e bellard
{"round.l.d", "D,S",        0x46200008, 0xffff003f, WR_D|RD_S|FP_D,                I3        },
1874 6643d27e bellard
{"round.l.s", "D,S",        0x46000008, 0xffff003f, WR_D|RD_S|FP_S,                I3        },
1875 6643d27e bellard
{"round.w.d", "D,S",        0x4620000c, 0xffff003f, WR_D|RD_S|FP_D,                I2        },
1876 6643d27e bellard
{"round.w.s", "D,S",        0x4600000c, 0xffff003f, WR_D|RD_S|FP_S,                I2        },
1877 6643d27e bellard
{"rsqrt.d", "D,S",        0x46200016, 0xffff003f, WR_D|RD_S|FP_D,                I4        },
1878 6643d27e bellard
{"rsqrt.ps","D,S",        0x46c00016, 0xffff003f, WR_D|RD_S|FP_D,                SB1        },
1879 6643d27e bellard
{"rsqrt.s", "D,S",        0x46000016, 0xffff003f, WR_D|RD_S|FP_S,                I4        },
1880 6643d27e bellard
{"rsqrt1.d",  "D,S",        0x4620001e, 0xffff003f,        WR_D|RD_S|FP_D,                M3D        },
1881 6643d27e bellard
{"rsqrt1.ps", "D,S",        0x46c0001e, 0xffff003f,        WR_D|RD_S|FP_S,                M3D        },
1882 6643d27e bellard
{"rsqrt1.s",  "D,S",        0x4600001e, 0xffff003f,        WR_D|RD_S|FP_S,                M3D        },
1883 6643d27e bellard
{"rsqrt2.d",  "D,S,T",        0x4620001f, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        M3D        },
1884 6643d27e bellard
{"rsqrt2.ps", "D,S,T",        0x46c0001f, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        M3D        },
1885 6643d27e bellard
{"rsqrt2.s",  "D,S,T",        0x4600001f, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        M3D        },
1886 6643d27e bellard
{"rzs.qh",  "X,Q",        0x78200024, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX        },
1887 6643d27e bellard
{"rzu.ob",  "X,Q",        0x78000020, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX|SB1        },
1888 6643d27e bellard
{"rzu.ob",  "D,k",        0x4bc00020, 0xffe0f83f,        WR_D|RD_S|RD_T,                N54        },
1889 6643d27e bellard
{"rzu.qh",  "X,Q",        0x78200020, 0xfc20f83f,        WR_D|RD_MACC|RD_T|FP_D,        MX        },
1890 6643d27e bellard
{"sb",      "t,o(b)",        0xa0000000, 0xfc000000,        SM|RD_t|RD_b,                I1        },
1891 6643d27e bellard
{"sb",      "t,A(b)",        0,    (int) M_SB_AB,        INSN_MACRO,                I1        },
1892 6643d27e bellard
{"sc",            "t,o(b)",        0xe0000000, 0xfc000000, SM|RD_t|WR_t|RD_b,        I2        },
1893 6643d27e bellard
{"sc",            "t,A(b)",        0,    (int) M_SC_AB,        INSN_MACRO,                I2        },
1894 6643d27e bellard
{"scd",            "t,o(b)",        0xf0000000, 0xfc000000, SM|RD_t|WR_t|RD_b,        I3        },
1895 6643d27e bellard
{"scd",            "t,A(b)",        0,    (int) M_SCD_AB,        INSN_MACRO,                I3        },
1896 6643d27e bellard
{"sd",            "t,o(b)",        0xfc000000, 0xfc000000,        SM|RD_t|RD_b,                I3        },
1897 6643d27e bellard
{"sd",      "t,o(b)",        0,    (int) M_SD_OB,        INSN_MACRO,                I1        },
1898 6643d27e bellard
{"sd",      "t,A(b)",        0,    (int) M_SD_AB,        INSN_MACRO,                I1        },
1899 6643d27e bellard
{"sdbbp",   "",                0x0000000e, 0xffffffff,        TRAP,                   G2        },
1900 6643d27e bellard
{"sdbbp",   "c",        0x0000000e, 0xfc00ffff,        TRAP,                        G2        },
1901 6643d27e bellard
{"sdbbp",   "c,q",        0x0000000e, 0xfc00003f,        TRAP,                        G2        },
1902 6643d27e bellard
{"sdbbp",   "",         0x7000003f, 0xffffffff, TRAP,                   I32     },
1903 6643d27e bellard
{"sdbbp",   "B",        0x7000003f, 0xfc00003f, TRAP,                   I32     },
1904 6643d27e bellard
{"sdc1",    "T,o(b)",        0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D,        I2        },
1905 6643d27e bellard
{"sdc1",    "E,o(b)",        0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D,        I2        },
1906 6643d27e bellard
{"sdc1",    "T,A(b)",        0,    (int) M_SDC1_AB,        INSN_MACRO,                I2        },
1907 6643d27e bellard
{"sdc1",    "E,A(b)",        0,    (int) M_SDC1_AB,        INSN_MACRO,                I2        },
1908 6643d27e bellard
{"sdc2",    "E,o(b)",        0xf8000000, 0xfc000000, SM|RD_C2|RD_b,                I2        },
1909 6643d27e bellard
{"sdc2",    "E,A(b)",        0,    (int) M_SDC2_AB,        INSN_MACRO,                I2        },
1910 6643d27e bellard
{"sdc3",    "E,o(b)",        0xfc000000, 0xfc000000, SM|RD_C3|RD_b,                I2        },
1911 6643d27e bellard
{"sdc3",    "E,A(b)",        0,    (int) M_SDC3_AB,        INSN_MACRO,                I2        },
1912 6643d27e bellard
{"s.d",     "T,o(b)",        0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D,        I2        },
1913 6643d27e bellard
{"s.d",     "T,o(b)",        0,    (int) M_S_DOB,        INSN_MACRO,                I1        },
1914 6643d27e bellard
{"s.d",     "T,A(b)",        0,    (int) M_S_DAB,        INSN_MACRO,                I1        },
1915 6643d27e bellard
{"sdl",     "t,o(b)",        0xb0000000, 0xfc000000,        SM|RD_t|RD_b,                I3        },
1916 6643d27e bellard
{"sdl",     "t,A(b)",        0,    (int) M_SDL_AB,        INSN_MACRO,                I3        },
1917 6643d27e bellard
{"sdr",     "t,o(b)",        0xb4000000, 0xfc000000,        SM|RD_t|RD_b,                I3        },
1918 6643d27e bellard
{"sdr",     "t,A(b)",        0,    (int) M_SDR_AB,        INSN_MACRO,                I3        },
1919 6643d27e bellard
{"sdxc1",   "S,t(b)",   0x4c000009, 0xfc0007ff, SM|RD_S|RD_t|RD_b,        I4        },
1920 6643d27e bellard
{"seb",     "d,w",        0x7c000420, 0xffe007ff,        WR_d|RD_t,                I33        },
1921 6643d27e bellard
{"seh",     "d,w",        0x7c000620, 0xffe007ff,        WR_d|RD_t,                I33        },
1922 6643d27e bellard
{"selsl",   "d,v,t",        0x00000005, 0xfc0007ff,        WR_d|RD_s|RD_t,                L1        },
1923 6643d27e bellard
{"selsr",   "d,v,t",        0x00000001, 0xfc0007ff,        WR_d|RD_s|RD_t,                L1        },
1924 6643d27e bellard
{"seq",     "d,v,t",        0,    (int) M_SEQ,        INSN_MACRO,                I1        },
1925 6643d27e bellard
{"seq",     "d,v,I",        0,    (int) M_SEQ_I,        INSN_MACRO,                I1        },
1926 6643d27e bellard
{"sge",     "d,v,t",        0,    (int) M_SGE,        INSN_MACRO,                I1        },
1927 6643d27e bellard
{"sge",     "d,v,I",        0,    (int) M_SGE_I,        INSN_MACRO,                I1        },
1928 6643d27e bellard
{"sgeu",    "d,v,t",        0,    (int) M_SGEU,        INSN_MACRO,                I1        },
1929 6643d27e bellard
{"sgeu",    "d,v,I",        0,    (int) M_SGEU_I,        INSN_MACRO,                I1        },
1930 6643d27e bellard
{"sgt",     "d,v,t",        0,    (int) M_SGT,        INSN_MACRO,                I1        },
1931 6643d27e bellard
{"sgt",     "d,v,I",        0,    (int) M_SGT_I,        INSN_MACRO,                I1        },
1932 6643d27e bellard
{"sgtu",    "d,v,t",        0,    (int) M_SGTU,        INSN_MACRO,                I1        },
1933 6643d27e bellard
{"sgtu",    "d,v,I",        0,    (int) M_SGTU_I,        INSN_MACRO,                I1        },
1934 6643d27e bellard
{"sh",      "t,o(b)",        0xa4000000, 0xfc000000,        SM|RD_t|RD_b,                I1        },
1935 6643d27e bellard
{"sh",      "t,A(b)",        0,    (int) M_SH_AB,        INSN_MACRO,                I1        },
1936 6643d27e bellard
{"shfl.bfla.qh", "X,Y,Z", 0x7a20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX        },
1937 6643d27e bellard
{"shfl.mixh.ob", "X,Y,Z", 0x7980001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1938 6643d27e bellard
{"shfl.mixh.ob", "D,S,T", 0x4980001f, 0xffe0003f, WR_D|RD_S|RD_T,         N54        },
1939 6643d27e bellard
{"shfl.mixh.qh", "X,Y,Z", 0x7820001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX        },
1940 6643d27e bellard
{"shfl.mixl.ob", "X,Y,Z", 0x79c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1941 6643d27e bellard
{"shfl.mixl.ob", "D,S,T", 0x49c0001f, 0xffe0003f, WR_D|RD_S|RD_T,         N54        },
1942 6643d27e bellard
{"shfl.mixl.qh", "X,Y,Z", 0x78a0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX        },
1943 6643d27e bellard
{"shfl.pach.ob", "X,Y,Z", 0x7900001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1944 6643d27e bellard
{"shfl.pach.ob", "D,S,T", 0x4900001f, 0xffe0003f, WR_D|RD_S|RD_T,         N54        },
1945 6643d27e bellard
{"shfl.pach.qh", "X,Y,Z", 0x7920001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX        },
1946 6643d27e bellard
{"shfl.pacl.ob", "D,S,T", 0x4940001f, 0xffe0003f, WR_D|RD_S|RD_T,         N54        },
1947 6643d27e bellard
{"shfl.repa.qh", "X,Y,Z", 0x7b20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX        },
1948 6643d27e bellard
{"shfl.repb.qh", "X,Y,Z", 0x7ba0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX        },
1949 6643d27e bellard
{"shfl.upsl.ob", "X,Y,Z", 0x78c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1950 6643d27e bellard
{"sle",     "d,v,t",        0,    (int) M_SLE,        INSN_MACRO,                I1        },
1951 6643d27e bellard
{"sle",     "d,v,I",        0,    (int) M_SLE_I,        INSN_MACRO,                I1        },
1952 6643d27e bellard
{"sleu",    "d,v,t",        0,    (int) M_SLEU,        INSN_MACRO,                I1        },
1953 6643d27e bellard
{"sleu",    "d,v,I",        0,    (int) M_SLEU_I,        INSN_MACRO,                I1        },
1954 6643d27e bellard
{"sllv",    "d,t,s",        0x00000004, 0xfc0007ff,        WR_d|RD_t|RD_s,                I1        },
1955 6643d27e bellard
{"sll",     "d,w,s",        0x00000004, 0xfc0007ff,        WR_d|RD_t|RD_s,                I1        }, /* sllv */
1956 6643d27e bellard
{"sll",     "d,w,<",        0x00000000, 0xffe0003f,        WR_d|RD_t,                I1        },
1957 6643d27e bellard
{"sll.ob",  "X,Y,Q",        0x78000010, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1958 6643d27e bellard
{"sll.ob",  "D,S,T[e]",        0x48000010, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1959 6643d27e bellard
{"sll.ob",  "D,S,k",        0x4bc00010, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1960 6643d27e bellard
{"sll.qh",  "X,Y,Q",        0x78200010, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1961 6643d27e bellard
{"slt",     "d,v,t",        0x0000002a, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1962 6643d27e bellard
{"slt",     "d,v,I",        0,    (int) M_SLT_I,        INSN_MACRO,                I1        },
1963 6643d27e bellard
{"slti",    "t,r,j",        0x28000000, 0xfc000000,        WR_t|RD_s,                I1        },
1964 6643d27e bellard
{"sltiu",   "t,r,j",        0x2c000000, 0xfc000000,        WR_t|RD_s,                I1        },
1965 6643d27e bellard
{"sltu",    "d,v,t",        0x0000002b, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1966 6643d27e bellard
{"sltu",    "d,v,I",        0,    (int) M_SLTU_I,        INSN_MACRO,                I1        },
1967 6643d27e bellard
{"sne",     "d,v,t",        0,    (int) M_SNE,        INSN_MACRO,                I1        },
1968 6643d27e bellard
{"sne",     "d,v,I",        0,    (int) M_SNE_I,        INSN_MACRO,                I1        },
1969 6643d27e bellard
{"sqrt.d",  "D,S",        0x46200004, 0xffff003f, WR_D|RD_S|FP_D,                I2        },
1970 6643d27e bellard
{"sqrt.s",  "D,S",        0x46000004, 0xffff003f, WR_D|RD_S|FP_S,                I2        },
1971 6643d27e bellard
{"sqrt.ps", "D,S",        0x46c00004, 0xffff003f, WR_D|RD_S|FP_D,                SB1        },
1972 6643d27e bellard
{"srav",    "d,t,s",        0x00000007, 0xfc0007ff,        WR_d|RD_t|RD_s,                I1        },
1973 6643d27e bellard
{"sra",     "d,w,s",        0x00000007, 0xfc0007ff,        WR_d|RD_t|RD_s,                I1        }, /* srav */
1974 6643d27e bellard
{"sra",     "d,w,<",        0x00000003, 0xffe0003f,        WR_d|RD_t,                I1        },
1975 6643d27e bellard
{"sra.qh",  "X,Y,Q",        0x78200013, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1976 6643d27e bellard
{"srlv",    "d,t,s",        0x00000006, 0xfc0007ff,        WR_d|RD_t|RD_s,                I1        },
1977 6643d27e bellard
{"srl",     "d,w,s",        0x00000006, 0xfc0007ff,        WR_d|RD_t|RD_s,                I1        }, /* srlv */
1978 6643d27e bellard
{"srl",     "d,w,<",        0x00000002, 0xffe0003f,        WR_d|RD_t,                I1        },
1979 6643d27e bellard
{"srl.ob",  "X,Y,Q",        0x78000012, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1980 6643d27e bellard
{"srl.ob",  "D,S,T[e]",        0x48000012, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1981 6643d27e bellard
{"srl.ob",  "D,S,k",        0x4bc00012, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1982 6643d27e bellard
{"srl.qh",  "X,Y,Q",        0x78200012, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1983 6643d27e bellard
/* ssnop is at the start of the table.  */
1984 6643d27e bellard
{"standby", "",         0x42000021, 0xffffffff,        0,                        V1        },
1985 6643d27e bellard
{"sub",     "d,v,t",        0x00000022, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
1986 6643d27e bellard
{"sub",     "d,v,I",        0,    (int) M_SUB_I,        INSN_MACRO,                I1        },
1987 6643d27e bellard
{"sub.d",   "D,V,T",        0x46200001, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I1        },
1988 6643d27e bellard
{"sub.s",   "D,V,T",        0x46000001, 0xffe0003f,        WR_D|RD_S|RD_T|FP_S,        I1        },
1989 6643d27e bellard
{"sub.ob",  "X,Y,Q",        0x7800000a, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
1990 6643d27e bellard
{"sub.ob",  "D,S,T",        0x4ac0000a, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1991 6643d27e bellard
{"sub.ob",  "D,S,T[e]",        0x4800000a, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
1992 6643d27e bellard
{"sub.ob",  "D,S,k",        0x4bc0000a, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
1993 6643d27e bellard
{"sub.ps",  "D,V,T",        0x46c00001, 0xffe0003f,        WR_D|RD_S|RD_T|FP_D,        I5        },
1994 6643d27e bellard
{"sub.qh",  "X,Y,Q",        0x7820000a, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
1995 6643d27e bellard
{"suba.ob", "Y,Q",        0x78000036, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1996 6643d27e bellard
{"suba.qh", "Y,Q",        0x78200036, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1997 6643d27e bellard
{"subl.ob", "Y,Q",        0x78000436, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
1998 6643d27e bellard
{"subl.qh", "Y,Q",        0x78200436, 0xfc2007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
1999 6643d27e bellard
{"subu",    "d,v,t",        0x00000023, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
2000 6643d27e bellard
{"subu",    "d,v,I",        0,    (int) M_SUBU_I,        INSN_MACRO,                I1        },
2001 6643d27e bellard
{"suspend", "",         0x42000022, 0xffffffff,        0,                        V1        },
2002 6643d27e bellard
{"suxc1",   "S,t(b)",   0x4c00000d, 0xfc0007ff, SM|RD_S|RD_t|RD_b,        I5|N55        },
2003 6643d27e bellard
{"sw",      "t,o(b)",        0xac000000, 0xfc000000,        SM|RD_t|RD_b,                I1        },
2004 6643d27e bellard
{"sw",      "t,A(b)",        0,    (int) M_SW_AB,        INSN_MACRO,                I1        },
2005 6643d27e bellard
{"swc0",    "E,o(b)",        0xe0000000, 0xfc000000,        SM|RD_C0|RD_b,                I1        },
2006 6643d27e bellard
{"swc0",    "E,A(b)",        0,    (int) M_SWC0_AB,        INSN_MACRO,                I1        },
2007 6643d27e bellard
{"swc1",    "T,o(b)",        0xe4000000, 0xfc000000,        SM|RD_T|RD_b|FP_S,        I1        },
2008 6643d27e bellard
{"swc1",    "E,o(b)",        0xe4000000, 0xfc000000,        SM|RD_T|RD_b|FP_S,        I1        },
2009 6643d27e bellard
{"swc1",    "T,A(b)",        0,    (int) M_SWC1_AB,        INSN_MACRO,                I1        },
2010 6643d27e bellard
{"swc1",    "E,A(b)",        0,    (int) M_SWC1_AB,        INSN_MACRO,                I1        },
2011 6643d27e bellard
{"s.s",     "T,o(b)",        0xe4000000, 0xfc000000,        SM|RD_T|RD_b|FP_S,        I1        }, /* swc1 */
2012 6643d27e bellard
{"s.s",     "T,A(b)",        0,    (int) M_SWC1_AB,        INSN_MACRO,                I1        },
2013 6643d27e bellard
{"swc2",    "E,o(b)",        0xe8000000, 0xfc000000,        SM|RD_C2|RD_b,                I1        },
2014 6643d27e bellard
{"swc2",    "E,A(b)",        0,    (int) M_SWC2_AB,        INSN_MACRO,                I1        },
2015 6643d27e bellard
{"swc3",    "E,o(b)",        0xec000000, 0xfc000000,        SM|RD_C3|RD_b,                I1        },
2016 6643d27e bellard
{"swc3",    "E,A(b)",        0,    (int) M_SWC3_AB,        INSN_MACRO,                I1        },
2017 6643d27e bellard
{"swl",     "t,o(b)",        0xa8000000, 0xfc000000,        SM|RD_t|RD_b,                I1        },
2018 6643d27e bellard
{"swl",     "t,A(b)",        0,    (int) M_SWL_AB,        INSN_MACRO,                I1        },
2019 6643d27e bellard
{"scache",  "t,o(b)",        0xa8000000, 0xfc000000,        RD_t|RD_b,                I2        }, /* same */
2020 6643d27e bellard
{"scache",  "t,A(b)",        0,    (int) M_SWL_AB,        INSN_MACRO,                I2        }, /* as swl */
2021 6643d27e bellard
{"swr",     "t,o(b)",        0xb8000000, 0xfc000000,        SM|RD_t|RD_b,                I1        },
2022 6643d27e bellard
{"swr",     "t,A(b)",        0,    (int) M_SWR_AB,        INSN_MACRO,                I1        },
2023 6643d27e bellard
{"invalidate", "t,o(b)",0xb8000000, 0xfc000000,        RD_t|RD_b,                I2        }, /* same */
2024 6643d27e bellard
{"invalidate", "t,A(b)",0,    (int) M_SWR_AB,        INSN_MACRO,                I2        }, /* as swr */
2025 6643d27e bellard
{"swxc1",   "S,t(b)",   0x4c000008, 0xfc0007ff, SM|RD_S|RD_t|RD_b,        I4        },
2026 6643d27e bellard
{"sync",    "",                0x0000000f, 0xffffffff,        INSN_SYNC,                I2|G1        },
2027 6643d27e bellard
{"sync.p",  "",                0x0000040f, 0xffffffff,        INSN_SYNC,                I2        },
2028 6643d27e bellard
{"sync.l",  "",                0x0000000f, 0xffffffff,        INSN_SYNC,                I2        },
2029 6643d27e bellard
{"synci",   "o(b)",        0x041f0000, 0xfc1f0000,        SM|RD_b,                I33        },
2030 6643d27e bellard
{"syscall", "",                0x0000000c, 0xffffffff,        TRAP,                        I1        },
2031 6643d27e bellard
{"syscall", "B",        0x0000000c, 0xfc00003f,        TRAP,                        I1        },
2032 6643d27e bellard
{"teqi",    "s,j",        0x040c0000, 0xfc1f0000, RD_s|TRAP,                I2        },
2033 6643d27e bellard
{"teq",            "s,t",        0x00000034, 0xfc00ffff, RD_s|RD_t|TRAP,                I2        },
2034 6643d27e bellard
{"teq",            "s,t,q",        0x00000034, 0xfc00003f, RD_s|RD_t|TRAP,                I2        },
2035 6643d27e bellard
{"teq",     "s,j",        0x040c0000, 0xfc1f0000, RD_s|TRAP,                I2        }, /* teqi */
2036 6643d27e bellard
{"teq",     "s,I",        0,    (int) M_TEQ_I,        INSN_MACRO,                I2        },
2037 6643d27e bellard
{"tgei",    "s,j",        0x04080000, 0xfc1f0000, RD_s|TRAP,                I2        },
2038 6643d27e bellard
{"tge",            "s,t",        0x00000030, 0xfc00ffff,        RD_s|RD_t|TRAP,                I2        },
2039 6643d27e bellard
{"tge",            "s,t,q",        0x00000030, 0xfc00003f,        RD_s|RD_t|TRAP,                I2        },
2040 6643d27e bellard
{"tge",     "s,j",        0x04080000, 0xfc1f0000, RD_s|TRAP,                I2        }, /* tgei */
2041 6643d27e bellard
{"tge",            "s,I",        0,    (int) M_TGE_I,    INSN_MACRO,                I2        },
2042 6643d27e bellard
{"tgeiu",   "s,j",        0x04090000, 0xfc1f0000, RD_s|TRAP,                I2        },
2043 6643d27e bellard
{"tgeu",    "s,t",        0x00000031, 0xfc00ffff, RD_s|RD_t|TRAP,                I2        },
2044 6643d27e bellard
{"tgeu",    "s,t,q",        0x00000031, 0xfc00003f, RD_s|RD_t|TRAP,                I2        },
2045 6643d27e bellard
{"tgeu",    "s,j",        0x04090000, 0xfc1f0000, RD_s|TRAP,                I2        }, /* tgeiu */
2046 6643d27e bellard
{"tgeu",    "s,I",        0,    (int) M_TGEU_I,        INSN_MACRO,                I2        },
2047 6643d27e bellard
{"tlbp",    "",         0x42000008, 0xffffffff, INSN_TLB,               I1           },
2048 6643d27e bellard
{"tlbr",    "",         0x42000001, 0xffffffff, INSN_TLB,               I1           },
2049 6643d27e bellard
{"tlbwi",   "",         0x42000002, 0xffffffff, INSN_TLB,               I1           },
2050 6643d27e bellard
{"tlbwr",   "",         0x42000006, 0xffffffff, INSN_TLB,               I1           },
2051 6643d27e bellard
{"tlti",    "s,j",        0x040a0000, 0xfc1f0000,        RD_s|TRAP,                I2        },
2052 6643d27e bellard
{"tlt",     "s,t",        0x00000032, 0xfc00ffff, RD_s|RD_t|TRAP,                I2        },
2053 6643d27e bellard
{"tlt",     "s,t,q",        0x00000032, 0xfc00003f, RD_s|RD_t|TRAP,                I2        },
2054 6643d27e bellard
{"tlt",     "s,j",        0x040a0000, 0xfc1f0000,        RD_s|TRAP,                I2        }, /* tlti */
2055 6643d27e bellard
{"tlt",     "s,I",        0,    (int) M_TLT_I,        INSN_MACRO,                I2        },
2056 6643d27e bellard
{"tltiu",   "s,j",        0x040b0000, 0xfc1f0000, RD_s|TRAP,                I2        },
2057 6643d27e bellard
{"tltu",    "s,t",        0x00000033, 0xfc00ffff, RD_s|RD_t|TRAP,                I2        },
2058 6643d27e bellard
{"tltu",    "s,t,q",        0x00000033, 0xfc00003f, RD_s|RD_t|TRAP,                I2        },
2059 6643d27e bellard
{"tltu",    "s,j",        0x040b0000, 0xfc1f0000, RD_s|TRAP,                I2        }, /* tltiu */
2060 6643d27e bellard
{"tltu",    "s,I",        0,    (int) M_TLTU_I,        INSN_MACRO,                I2        },
2061 6643d27e bellard
{"tnei",    "s,j",        0x040e0000, 0xfc1f0000, RD_s|TRAP,                I2        },
2062 6643d27e bellard
{"tne",     "s,t",        0x00000036, 0xfc00ffff, RD_s|RD_t|TRAP,                I2        },
2063 6643d27e bellard
{"tne",     "s,t,q",        0x00000036, 0xfc00003f, RD_s|RD_t|TRAP,                I2        },
2064 6643d27e bellard
{"tne",     "s,j",        0x040e0000, 0xfc1f0000, RD_s|TRAP,                I2        }, /* tnei */
2065 6643d27e bellard
{"tne",     "s,I",        0,    (int) M_TNE_I,        INSN_MACRO,                I2        },
2066 6643d27e bellard
{"trunc.l.d", "D,S",        0x46200009, 0xffff003f, WR_D|RD_S|FP_D,                I3        },
2067 6643d27e bellard
{"trunc.l.s", "D,S",        0x46000009, 0xffff003f,        WR_D|RD_S|FP_S,                I3        },
2068 6643d27e bellard
{"trunc.w.d", "D,S",        0x4620000d, 0xffff003f, WR_D|RD_S|FP_D,                I2        },
2069 6643d27e bellard
{"trunc.w.d", "D,S,x",        0x4620000d, 0xffff003f, WR_D|RD_S|FP_D,                I2        },
2070 6643d27e bellard
{"trunc.w.d", "D,S,t",        0,    (int) M_TRUNCWD,        INSN_MACRO,                I1        },
2071 6643d27e bellard
{"trunc.w.s", "D,S",        0x4600000d, 0xffff003f,        WR_D|RD_S|FP_S,                I2        },
2072 6643d27e bellard
{"trunc.w.s", "D,S,x",        0x4600000d, 0xffff003f,        WR_D|RD_S|FP_S,                I2        },
2073 6643d27e bellard
{"trunc.w.s", "D,S,t",        0,    (int) M_TRUNCWS,        INSN_MACRO,                I1        },
2074 6643d27e bellard
{"uld",     "t,o(b)",        0,    (int) M_ULD,        INSN_MACRO,                I3        },
2075 6643d27e bellard
{"uld",     "t,A(b)",        0,    (int) M_ULD_A,        INSN_MACRO,                I3        },
2076 6643d27e bellard
{"ulh",     "t,o(b)",        0,    (int) M_ULH,        INSN_MACRO,                I1        },
2077 6643d27e bellard
{"ulh",     "t,A(b)",        0,    (int) M_ULH_A,        INSN_MACRO,                I1        },
2078 6643d27e bellard
{"ulhu",    "t,o(b)",        0,    (int) M_ULHU,        INSN_MACRO,                I1        },
2079 6643d27e bellard
{"ulhu",    "t,A(b)",        0,    (int) M_ULHU_A,        INSN_MACRO,                I1        },
2080 6643d27e bellard
{"ulw",     "t,o(b)",        0,    (int) M_ULW,        INSN_MACRO,                I1        },
2081 6643d27e bellard
{"ulw",     "t,A(b)",        0,    (int) M_ULW_A,        INSN_MACRO,                I1        },
2082 6643d27e bellard
{"usd",     "t,o(b)",        0,    (int) M_USD,        INSN_MACRO,                I3        },
2083 6643d27e bellard
{"usd",     "t,A(b)",        0,    (int) M_USD_A,        INSN_MACRO,                I3        },
2084 6643d27e bellard
{"ush",     "t,o(b)",        0,    (int) M_USH,        INSN_MACRO,                I1        },
2085 6643d27e bellard
{"ush",     "t,A(b)",        0,    (int) M_USH_A,        INSN_MACRO,                I1        },
2086 6643d27e bellard
{"usw",     "t,o(b)",        0,    (int) M_USW,        INSN_MACRO,                I1        },
2087 6643d27e bellard
{"usw",     "t,A(b)",        0,    (int) M_USW_A,        INSN_MACRO,                I1        },
2088 6643d27e bellard
{"wach.ob", "Y",        0x7a00003e, 0xffff07ff,        WR_MACC|RD_S|FP_D,        MX|SB1        },
2089 6643d27e bellard
{"wach.ob", "S",        0x4a00003e, 0xffff07ff,        RD_S,                        N54        },
2090 6643d27e bellard
{"wach.qh", "Y",        0x7a20003e, 0xffff07ff,        WR_MACC|RD_S|FP_D,        MX        },
2091 6643d27e bellard
{"wacl.ob", "Y,Z",        0x7800003e, 0xffe007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX|SB1        },
2092 6643d27e bellard
{"wacl.ob", "S,T",        0x4800003e, 0xffe007ff,        RD_S|RD_T,                N54        },
2093 6643d27e bellard
{"wacl.qh", "Y,Z",        0x7820003e, 0xffe007ff,        WR_MACC|RD_S|RD_T|FP_D,        MX        },
2094 6643d27e bellard
{"wait",    "",         0x42000020, 0xffffffff, TRAP,                   I3|I32        },
2095 6643d27e bellard
{"wait",    "J",        0x42000020, 0xfe00003f, TRAP,                   I32|N55        },
2096 6643d27e bellard
{"waiti",   "",                0x42000020, 0xffffffff,        TRAP,                        L1        },
2097 6643d27e bellard
{"wb",             "o(b)",        0xbc040000, 0xfc1f0000, SM|RD_b,                L1        },
2098 6643d27e bellard
{"wrpgpr",  "d,w",        0x41c00000, 0xffe007ff, RD_t,                        I33        },
2099 6643d27e bellard
{"wsbh",    "d,w",        0x7c0000a0, 0xffe007ff,        WR_d|RD_t,                I33        },
2100 6643d27e bellard
{"xor",     "d,v,t",        0x00000026, 0xfc0007ff,        WR_d|RD_s|RD_t,                I1        },
2101 6643d27e bellard
{"xor",     "t,r,I",        0,    (int) M_XOR_I,        INSN_MACRO,                I1        },
2102 6643d27e bellard
{"xor.ob",  "X,Y,Q",        0x7800000d, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX|SB1        },
2103 6643d27e bellard
{"xor.ob",  "D,S,T",        0x4ac0000d, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
2104 6643d27e bellard
{"xor.ob",  "D,S,T[e]",        0x4800000d, 0xfe20003f,        WR_D|RD_S|RD_T,                N54        },
2105 6643d27e bellard
{"xor.ob",  "D,S,k",        0x4bc0000d, 0xffe0003f,        WR_D|RD_S|RD_T,                N54        },
2106 6643d27e bellard
{"xor.qh",  "X,Y,Q",        0x7820000d, 0xfc20003f,        WR_D|RD_S|RD_T|FP_D,        MX        },
2107 6643d27e bellard
{"xori",    "t,r,i",        0x38000000, 0xfc000000,        WR_t|RD_s,                I1        },
2108 6643d27e bellard
2109 6643d27e bellard
/* Coprocessor 2 move/branch operations overlap with VR5400 .ob format
2110 6643d27e bellard
   instructions so they are here for the latters to take precedence.  */
2111 6643d27e bellard
{"bc2f",    "p",        0x49000000, 0xffff0000,        CBD|RD_CC,                I1        },
2112 6643d27e bellard
{"bc2fl",   "p",        0x49020000, 0xffff0000,        CBL|RD_CC,                I2|T3        },
2113 6643d27e bellard
{"bc2t",    "p",        0x49010000, 0xffff0000,        CBD|RD_CC,                I1        },
2114 6643d27e bellard
{"bc2tl",   "p",        0x49030000, 0xffff0000,        CBL|RD_CC,                I2|T3        },
2115 6643d27e bellard
{"cfc2",    "t,G",        0x48400000, 0xffe007ff,        LCD|WR_t|RD_C2,                I1        },
2116 6643d27e bellard
{"ctc2",    "t,G",        0x48c00000, 0xffe007ff,        COD|RD_t|WR_CC,                I1        },
2117 6643d27e bellard
{"dmfc2",   "t,G",        0x48200000, 0xffe007ff,        LCD|WR_t|RD_C2,                I3        },
2118 6643d27e bellard
{"dmfc2",   "t,G,H",        0x48200000, 0xffe007f8,        LCD|WR_t|RD_C2,                I64        },
2119 6643d27e bellard
{"dmtc2",   "t,G",        0x48a00000, 0xffe007ff,        COD|RD_t|WR_C2|WR_CC,        I3        },
2120 6643d27e bellard
{"dmtc2",   "t,G,H",        0x48a00000, 0xffe007f8,        COD|RD_t|WR_C2|WR_CC,        I64        },
2121 6643d27e bellard
{"mfc2",    "t,G",        0x48000000, 0xffe007ff,        LCD|WR_t|RD_C2,                I1        },
2122 6643d27e bellard
{"mfc2",    "t,G,H",        0x48000000, 0xffe007f8,        LCD|WR_t|RD_C2,                I32        },
2123 6643d27e bellard
{"mfhc2",   "t,i",        0x48600000, 0xffe00000,        LCD|WR_t|RD_C2,                I33        },
2124 6643d27e bellard
{"mtc2",    "t,G",        0x48800000, 0xffe007ff,        COD|RD_t|WR_C2|WR_CC,        I1        },
2125 6643d27e bellard
{"mtc2",    "t,G,H",        0x48800000, 0xffe007f8,        COD|RD_t|WR_C2|WR_CC,        I32        },
2126 6643d27e bellard
{"mthc2",   "t,i",        0x48e00000, 0xffe00000,        COD|RD_t|WR_C2|WR_CC,        I33        },
2127 6643d27e bellard
2128 6643d27e bellard
/* No hazard protection on coprocessor instructions--they shouldn't
2129 6643d27e bellard
   change the state of the processor and if they do it's up to the
2130 6643d27e bellard
   user to put in nops as necessary.  These are at the end so that the
2131 6643d27e bellard
   disassembler recognizes more specific versions first.  */
2132 6643d27e bellard
{"c0",      "C",        0x42000000, 0xfe000000,        0,                        I1        },
2133 6643d27e bellard
{"c1",      "C",        0x46000000, 0xfe000000,        0,                        I1        },
2134 6643d27e bellard
{"c2",      "C",        0x4a000000, 0xfe000000,        0,                        I1        },
2135 6643d27e bellard
{"c3",      "C",        0x4e000000, 0xfe000000,        0,                        I1        },
2136 6643d27e bellard
{"cop0",     "C",        0,    (int) M_COP0,        INSN_MACRO,                I1        },
2137 6643d27e bellard
{"cop1",     "C",        0,    (int) M_COP1,        INSN_MACRO,                I1        },
2138 6643d27e bellard
{"cop2",     "C",        0,    (int) M_COP2,        INSN_MACRO,                I1        },
2139 6643d27e bellard
{"cop3",     "C",        0,    (int) M_COP3,        INSN_MACRO,                I1        },
2140 6643d27e bellard
2141 6643d27e bellard
  /* Conflicts with the 4650's "mul" instruction.  Nobody's using the
2142 6643d27e bellard
     4010 any more, so move this insn out of the way.  If the object
2143 6643d27e bellard
     format gave us more info, we could do this right.  */
2144 6643d27e bellard
{"addciu",  "t,r,j",        0x70000000, 0xfc000000,        WR_t|RD_s,                L1        },
2145 6643d27e bellard
};
2146 6643d27e bellard
2147 6643d27e bellard
#define MIPS_NUM_OPCODES \
2148 6643d27e bellard
        ((sizeof mips_builtin_opcodes) / (sizeof (mips_builtin_opcodes[0])))
2149 6643d27e bellard
const int bfd_mips_num_builtin_opcodes = MIPS_NUM_OPCODES;
2150 6643d27e bellard
2151 6643d27e bellard
/* const removed from the following to allow for dynamic extensions to the
2152 6643d27e bellard
 * built-in instruction set. */
2153 6643d27e bellard
struct mips_opcode *mips_opcodes =
2154 6643d27e bellard
  (struct mips_opcode *) mips_builtin_opcodes;
2155 6643d27e bellard
int bfd_mips_num_opcodes = MIPS_NUM_OPCODES;
2156 6643d27e bellard
#undef MIPS_NUM_OPCODES
2157 6643d27e bellard
2158 6643d27e bellard
/* Mips instructions are at maximum this many bytes long.  */
2159 6643d27e bellard
#define INSNLEN 4
2160 6643d27e bellard
2161 6643d27e bellard
static void set_default_mips_dis_options
2162 6643d27e bellard
  PARAMS ((struct disassemble_info *));
2163 6643d27e bellard
static void parse_mips_dis_option
2164 6643d27e bellard
  PARAMS ((const char *, unsigned int));
2165 6643d27e bellard
static void parse_mips_dis_options
2166 6643d27e bellard
  PARAMS ((const char *));
2167 6643d27e bellard
static int _print_insn_mips
2168 6643d27e bellard
  PARAMS ((bfd_vma, struct disassemble_info *, enum bfd_endian));
2169 6643d27e bellard
static int print_insn_mips
2170 6643d27e bellard
  PARAMS ((bfd_vma, unsigned long int, struct disassemble_info *));
2171 6643d27e bellard
static void print_insn_args
2172 6643d27e bellard
  PARAMS ((const char *, unsigned long, bfd_vma, struct disassemble_info *));
2173 6643d27e bellard
#if 0
2174 6643d27e bellard
static int print_insn_mips16
2175 6643d27e bellard
  PARAMS ((bfd_vma, struct disassemble_info *));
2176 6643d27e bellard
#endif
2177 6643d27e bellard
#if 0
2178 6643d27e bellard
static int is_newabi
2179 6643d27e bellard
  PARAMS ((Elf32_Ehdr *));
2180 6643d27e bellard
#endif
2181 6643d27e bellard
#if 0
2182 6643d27e bellard
static void print_mips16_insn_arg
2183 6643d27e bellard
  PARAMS ((int, const struct mips_opcode *, int, bfd_boolean, int, bfd_vma,
2184 6643d27e bellard
           struct disassemble_info *));
2185 6643d27e bellard
#endif
2186 6643d27e bellard
 
2187 6643d27e bellard
/* FIXME: These should be shared with gdb somehow.  */
2188 6643d27e bellard
2189 6643d27e bellard
struct mips_cp0sel_name {
2190 6643d27e bellard
        unsigned int cp0reg;
2191 6643d27e bellard
        unsigned int sel;
2192 6643d27e bellard
        const char * const name;
2193 6643d27e bellard
};
2194 6643d27e bellard
2195 6643d27e bellard
/* The mips16 register names.  */
2196 6643d27e bellard
static const char * const mips16_reg_names[] = {
2197 6643d27e bellard
  "s0", "s1", "v0", "v1", "a0", "a1", "a2", "a3"
2198 6643d27e bellard
};
2199 6643d27e bellard
2200 6643d27e bellard
static const char * const mips_gpr_names_numeric[32] = {
2201 6643d27e bellard
  "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
2202 6643d27e bellard
  "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
2203 6643d27e bellard
  "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
2204 6643d27e bellard
  "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
2205 6643d27e bellard
};
2206 6643d27e bellard
2207 6643d27e bellard
static const char * const mips_gpr_names_oldabi[32] = {
2208 6643d27e bellard
  "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
2209 6643d27e bellard
  "t0",   "t1",   "t2",   "t3",   "t4",   "t5",   "t6",   "t7",
2210 6643d27e bellard
  "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
2211 6643d27e bellard
  "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
2212 6643d27e bellard
};
2213 6643d27e bellard
2214 6643d27e bellard
static const char * const mips_gpr_names_newabi[32] = {
2215 6643d27e bellard
  "zero", "at",   "v0",   "v1",   "a0",   "a1",   "a2",   "a3",
2216 6643d27e bellard
  "a4",   "a5",   "a6",   "a7",   "t0",   "t1",   "t2",   "t3",
2217 6643d27e bellard
  "s0",   "s1",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
2218 6643d27e bellard
  "t8",   "t9",   "k0",   "k1",   "gp",   "sp",   "s8",   "ra"
2219 6643d27e bellard
};
2220 6643d27e bellard
2221 6643d27e bellard
static const char * const mips_fpr_names_numeric[32] = {
2222 6643d27e bellard
  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
2223 6643d27e bellard
  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2224 6643d27e bellard
  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2225 6643d27e bellard
  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
2226 6643d27e bellard
};
2227 6643d27e bellard
2228 6643d27e bellard
static const char * const mips_fpr_names_32[32] = {
2229 6643d27e bellard
  "fv0",  "fv0f", "fv1",  "fv1f", "ft0",  "ft0f", "ft1",  "ft1f",
2230 6643d27e bellard
  "ft2",  "ft2f", "ft3",  "ft3f", "fa0",  "fa0f", "fa1",  "fa1f",
2231 6643d27e bellard
  "ft4",  "ft4f", "ft5",  "ft5f", "fs0",  "fs0f", "fs1",  "fs1f",
2232 6643d27e bellard
  "fs2",  "fs2f", "fs3",  "fs3f", "fs4",  "fs4f", "fs5",  "fs5f"
2233 6643d27e bellard
};
2234 6643d27e bellard
2235 6643d27e bellard
static const char * const mips_fpr_names_n32[32] = {
2236 6643d27e bellard
  "fv0",  "ft14", "fv1",  "ft15", "ft0",  "ft1",  "ft2",  "ft3",
2237 6643d27e bellard
  "ft4",  "ft5",  "ft6",  "ft7",  "fa0",  "fa1",  "fa2",  "fa3",
2238 6643d27e bellard
  "fa4",  "fa5",  "fa6",  "fa7",  "fs0",  "ft8",  "fs1",  "ft9",
2239 6643d27e bellard
  "fs2",  "ft10", "fs3",  "ft11", "fs4",  "ft12", "fs5",  "ft13"
2240 6643d27e bellard
};
2241 6643d27e bellard
2242 6643d27e bellard
static const char * const mips_fpr_names_64[32] = {
2243 6643d27e bellard
  "fv0",  "ft12", "fv1",  "ft13", "ft0",  "ft1",  "ft2",  "ft3",
2244 6643d27e bellard
  "ft4",  "ft5",  "ft6",  "ft7",  "fa0",  "fa1",  "fa2",  "fa3",
2245 6643d27e bellard
  "fa4",  "fa5",  "fa6",  "fa7",  "ft8",  "ft9",  "ft10", "ft11",
2246 6643d27e bellard
  "fs0",  "fs1",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7"
2247 6643d27e bellard
};
2248 6643d27e bellard
2249 6643d27e bellard
static const char * const mips_cp0_names_numeric[32] = {
2250 6643d27e bellard
  "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
2251 6643d27e bellard
  "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
2252 6643d27e bellard
  "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
2253 6643d27e bellard
  "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
2254 6643d27e bellard
};
2255 6643d27e bellard
2256 6643d27e bellard
static const char * const mips_cp0_names_mips3264[32] = {
2257 6643d27e bellard
  "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
2258 6643d27e bellard
  "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
2259 6643d27e bellard
  "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
2260 6643d27e bellard
  "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
2261 6643d27e bellard
  "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
2262 6643d27e bellard
  "c0_xcontext",  "$21",          "$22",          "c0_debug",
2263 6643d27e bellard
  "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr",
2264 6643d27e bellard
  "c0_taglo",     "c0_taghi",     "c0_errorepc",  "c0_desave",
2265 6643d27e bellard
};
2266 6643d27e bellard
2267 6643d27e bellard
static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] = {
2268 6643d27e bellard
  { 16, 1, "c0_config1"                },
2269 6643d27e bellard
  { 16, 2, "c0_config2"                },
2270 6643d27e bellard
  { 16, 3, "c0_config3"                },
2271 6643d27e bellard
  { 18, 1, "c0_watchlo,1"        },
2272 6643d27e bellard
  { 18, 2, "c0_watchlo,2"        },
2273 6643d27e bellard
  { 18, 3, "c0_watchlo,3"        },
2274 6643d27e bellard
  { 18, 4, "c0_watchlo,4"        },
2275 6643d27e bellard
  { 18, 5, "c0_watchlo,5"        },
2276 6643d27e bellard
  { 18, 6, "c0_watchlo,6"        },
2277 6643d27e bellard
  { 18, 7, "c0_watchlo,7"        },
2278 6643d27e bellard
  { 19, 1, "c0_watchhi,1"        },
2279 6643d27e bellard
  { 19, 2, "c0_watchhi,2"        },
2280 6643d27e bellard
  { 19, 3, "c0_watchhi,3"        },
2281 6643d27e bellard
  { 19, 4, "c0_watchhi,4"        },
2282 6643d27e bellard
  { 19, 5, "c0_watchhi,5"        },
2283 6643d27e bellard
  { 19, 6, "c0_watchhi,6"        },
2284 6643d27e bellard
  { 19, 7, "c0_watchhi,7"        },
2285 6643d27e bellard
  { 25, 1, "c0_perfcnt,1"        },
2286 6643d27e bellard
  { 25, 2, "c0_perfcnt,2"        },
2287 6643d27e bellard
  { 25, 3, "c0_perfcnt,3"        },
2288 6643d27e bellard
  { 25, 4, "c0_perfcnt,4"        },
2289 6643d27e bellard
  { 25, 5, "c0_perfcnt,5"        },
2290 6643d27e bellard
  { 25, 6, "c0_perfcnt,6"        },
2291 6643d27e bellard
  { 25, 7, "c0_perfcnt,7"        },
2292 6643d27e bellard
  { 27, 1, "c0_cacheerr,1"        },
2293 6643d27e bellard
  { 27, 2, "c0_cacheerr,2"        },
2294 6643d27e bellard
  { 27, 3, "c0_cacheerr,3"        },
2295 6643d27e bellard
  { 28, 1, "c0_datalo"                },
2296 6643d27e bellard
  { 29, 1, "c0_datahi"                }
2297 6643d27e bellard
};
2298 6643d27e bellard
2299 6643d27e bellard
static const char * const mips_cp0_names_mips3264r2[32] = {
2300 6643d27e bellard
  "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
2301 6643d27e bellard
  "c0_context",   "c0_pagemask",  "c0_wired",     "c0_hwrena",
2302 6643d27e bellard
  "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
2303 6643d27e bellard
  "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
2304 6643d27e bellard
  "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
2305 6643d27e bellard
  "c0_xcontext",  "$21",          "$22",          "c0_debug",
2306 6643d27e bellard
  "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr",
2307 6643d27e bellard
  "c0_taglo",     "c0_taghi",     "c0_errorepc",  "c0_desave",
2308 6643d27e bellard
};
2309 6643d27e bellard
2310 6643d27e bellard
static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] = {
2311 6643d27e bellard
  {  4, 1, "c0_contextconfig"        },
2312 6643d27e bellard
  {  5, 1, "c0_pagegrain"        },
2313 6643d27e bellard
  { 12, 1, "c0_intctl"                },
2314 6643d27e bellard
  { 12, 2, "c0_srsctl"                },
2315 6643d27e bellard
  { 12, 3, "c0_srsmap"                },
2316 6643d27e bellard
  { 15, 1, "c0_ebase"                },
2317 6643d27e bellard
  { 16, 1, "c0_config1"                },
2318 6643d27e bellard
  { 16, 2, "c0_config2"                },
2319 6643d27e bellard
  { 16, 3, "c0_config3"                },
2320 6643d27e bellard
  { 18, 1, "c0_watchlo,1"        },
2321 6643d27e bellard
  { 18, 2, "c0_watchlo,2"        },
2322 6643d27e bellard
  { 18, 3, "c0_watchlo,3"        },
2323 6643d27e bellard
  { 18, 4, "c0_watchlo,4"        },
2324 6643d27e bellard
  { 18, 5, "c0_watchlo,5"        },
2325 6643d27e bellard
  { 18, 6, "c0_watchlo,6"        },
2326 6643d27e bellard
  { 18, 7, "c0_watchlo,7"        },
2327 6643d27e bellard
  { 19, 1, "c0_watchhi,1"        },
2328 6643d27e bellard
  { 19, 2, "c0_watchhi,2"        },
2329 6643d27e bellard
  { 19, 3, "c0_watchhi,3"        },
2330 6643d27e bellard
  { 19, 4, "c0_watchhi,4"        },
2331 6643d27e bellard
  { 19, 5, "c0_watchhi,5"        },
2332 6643d27e bellard
  { 19, 6, "c0_watchhi,6"        },
2333 6643d27e bellard
  { 19, 7, "c0_watchhi,7"        },
2334 6643d27e bellard
  { 23, 1, "c0_tracecontrol"        },
2335 6643d27e bellard
  { 23, 2, "c0_tracecontrol2"        },
2336 6643d27e bellard
  { 23, 3, "c0_usertracedata"        },
2337 6643d27e bellard
  { 23, 4, "c0_tracebpc"        },
2338 6643d27e bellard
  { 25, 1, "c0_perfcnt,1"        },
2339 6643d27e bellard
  { 25, 2, "c0_perfcnt,2"        },
2340 6643d27e bellard
  { 25, 3, "c0_perfcnt,3"        },
2341 6643d27e bellard
  { 25, 4, "c0_perfcnt,4"        },
2342 6643d27e bellard
  { 25, 5, "c0_perfcnt,5"        },
2343 6643d27e bellard
  { 25, 6, "c0_perfcnt,6"        },
2344 6643d27e bellard
  { 25, 7, "c0_perfcnt,7"        },
2345 6643d27e bellard
  { 27, 1, "c0_cacheerr,1"        },
2346 6643d27e bellard
  { 27, 2, "c0_cacheerr,2"        },
2347 6643d27e bellard
  { 27, 3, "c0_cacheerr,3"        },
2348 6643d27e bellard
  { 28, 1, "c0_datalo"                },
2349 6643d27e bellard
  { 28, 2, "c0_taglo1"                },
2350 6643d27e bellard
  { 28, 3, "c0_datalo1"                },
2351 6643d27e bellard
  { 28, 4, "c0_taglo2"                },
2352 6643d27e bellard
  { 28, 5, "c0_datalo2"                },
2353 6643d27e bellard
  { 28, 6, "c0_taglo3"                },
2354 6643d27e bellard
  { 28, 7, "c0_datalo3"                },
2355 6643d27e bellard
  { 29, 1, "c0_datahi"                },
2356 6643d27e bellard
  { 29, 2, "c0_taghi1"                },
2357 6643d27e bellard
  { 29, 3, "c0_datahi1"                },
2358 6643d27e bellard
  { 29, 4, "c0_taghi2"                },
2359 6643d27e bellard
  { 29, 5, "c0_datahi2"                },
2360 6643d27e bellard
  { 29, 6, "c0_taghi3"                },
2361 6643d27e bellard
  { 29, 7, "c0_datahi3"                },
2362 6643d27e bellard
};
2363 6643d27e bellard
2364 6643d27e bellard
/* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods.  */
2365 6643d27e bellard
static const char * const mips_cp0_names_sb1[32] = {
2366 6643d27e bellard
  "c0_index",     "c0_random",    "c0_entrylo0",  "c0_entrylo1",
2367 6643d27e bellard
  "c0_context",   "c0_pagemask",  "c0_wired",     "$7",
2368 6643d27e bellard
  "c0_badvaddr",  "c0_count",     "c0_entryhi",   "c0_compare",
2369 6643d27e bellard
  "c0_status",    "c0_cause",     "c0_epc",       "c0_prid",
2370 6643d27e bellard
  "c0_config",    "c0_lladdr",    "c0_watchlo",   "c0_watchhi",
2371 6643d27e bellard
  "c0_xcontext",  "$21",          "$22",          "c0_debug",
2372 6643d27e bellard
  "c0_depc",      "c0_perfcnt",   "c0_errctl",    "c0_cacheerr_i",
2373 6643d27e bellard
  "c0_taglo_i",   "c0_taghi_i",   "c0_errorepc",  "c0_desave",
2374 6643d27e bellard
};
2375 6643d27e bellard
2376 6643d27e bellard
static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] = {
2377 6643d27e bellard
  { 16, 1, "c0_config1"                },
2378 6643d27e bellard
  { 18, 1, "c0_watchlo,1"        },
2379 6643d27e bellard
  { 19, 1, "c0_watchhi,1"        },
2380 6643d27e bellard
  { 22, 0, "c0_perftrace"        },
2381 6643d27e bellard
  { 23, 3, "c0_edebug"                },
2382 6643d27e bellard
  { 25, 1, "c0_perfcnt,1"        },
2383 6643d27e bellard
  { 25, 2, "c0_perfcnt,2"        },
2384 6643d27e bellard
  { 25, 3, "c0_perfcnt,3"        },
2385 6643d27e bellard
  { 25, 4, "c0_perfcnt,4"        },
2386 6643d27e bellard
  { 25, 5, "c0_perfcnt,5"        },
2387 6643d27e bellard
  { 25, 6, "c0_perfcnt,6"        },
2388 6643d27e bellard
  { 25, 7, "c0_perfcnt,7"        },
2389 6643d27e bellard
  { 26, 1, "c0_buserr_pa"        },
2390 6643d27e bellard
  { 27, 1, "c0_cacheerr_d"        },
2391 6643d27e bellard
  { 27, 3, "c0_cacheerr_d_pa"        },
2392 6643d27e bellard
  { 28, 1, "c0_datalo_i"        },
2393 6643d27e bellard
  { 28, 2, "c0_taglo_d"                },
2394 6643d27e bellard
  { 28, 3, "c0_datalo_d"        },
2395 6643d27e bellard
  { 29, 1, "c0_datahi_i"        },
2396 6643d27e bellard
  { 29, 2, "c0_taghi_d"                },
2397 6643d27e bellard
  { 29, 3, "c0_datahi_d"        },
2398 6643d27e bellard
};
2399 6643d27e bellard
2400 6643d27e bellard
static const char * const mips_hwr_names_numeric[32] = {
2401 6643d27e bellard
  "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
2402 6643d27e bellard
  "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
2403 6643d27e bellard
  "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
2404 6643d27e bellard
  "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
2405 6643d27e bellard
};
2406 6643d27e bellard
2407 6643d27e bellard
static const char * const mips_hwr_names_mips3264r2[32] = {
2408 6643d27e bellard
  "hwr_cpunum",   "hwr_synci_step", "hwr_cc",     "hwr_ccres",
2409 6643d27e bellard
  "$4",          "$5",            "$6",           "$7",
2410 6643d27e bellard
  "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
2411 6643d27e bellard
  "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
2412 6643d27e bellard
  "$24",  "$25",  "$26",  "$27",  "$28",  "$29",  "$30",  "$31"
2413 6643d27e bellard
};
2414 6643d27e bellard
2415 6643d27e bellard
struct mips_abi_choice {
2416 6643d27e bellard
  const char *name;
2417 6643d27e bellard
  const char * const *gpr_names;
2418 6643d27e bellard
  const char * const *fpr_names;
2419 6643d27e bellard
};
2420 6643d27e bellard
2421 6643d27e bellard
struct mips_abi_choice mips_abi_choices[] = {
2422 6643d27e bellard
  { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric },
2423 6643d27e bellard
  { "32", mips_gpr_names_oldabi, mips_fpr_names_32 },
2424 6643d27e bellard
  { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 },
2425 6643d27e bellard
  { "64", mips_gpr_names_newabi, mips_fpr_names_64 },
2426 6643d27e bellard
};
2427 6643d27e bellard
2428 6643d27e bellard
struct mips_arch_choice {
2429 6643d27e bellard
  const char *name;
2430 6643d27e bellard
  int bfd_mach_valid;
2431 6643d27e bellard
  unsigned long bfd_mach;
2432 6643d27e bellard
  int processor;
2433 6643d27e bellard
  int isa;
2434 6643d27e bellard
  const char * const *cp0_names;
2435 6643d27e bellard
  const struct mips_cp0sel_name *cp0sel_names;
2436 6643d27e bellard
  unsigned int cp0sel_names_len;
2437 6643d27e bellard
  const char * const *hwr_names;
2438 6643d27e bellard
};
2439 6643d27e bellard
2440 6643d27e bellard
#define bfd_mach_mips3000              3000
2441 6643d27e bellard
#define bfd_mach_mips3900              3900
2442 6643d27e bellard
#define bfd_mach_mips4000              4000
2443 6643d27e bellard
#define bfd_mach_mips4010              4010
2444 6643d27e bellard
#define bfd_mach_mips4100              4100
2445 6643d27e bellard
#define bfd_mach_mips4111              4111
2446 6643d27e bellard
#define bfd_mach_mips4120              4120
2447 6643d27e bellard
#define bfd_mach_mips4300              4300
2448 6643d27e bellard
#define bfd_mach_mips4400              4400
2449 6643d27e bellard
#define bfd_mach_mips4600              4600
2450 6643d27e bellard
#define bfd_mach_mips4650              4650
2451 6643d27e bellard
#define bfd_mach_mips5000              5000
2452 6643d27e bellard
#define bfd_mach_mips5400              5400
2453 6643d27e bellard
#define bfd_mach_mips5500              5500
2454 6643d27e bellard
#define bfd_mach_mips6000              6000
2455 6643d27e bellard
#define bfd_mach_mips7000              7000
2456 6643d27e bellard
#define bfd_mach_mips8000              8000
2457 6643d27e bellard
#define bfd_mach_mips10000             10000
2458 6643d27e bellard
#define bfd_mach_mips12000             12000
2459 6643d27e bellard
#define bfd_mach_mips16                16
2460 6643d27e bellard
#define bfd_mach_mips5                 5
2461 6643d27e bellard
#define bfd_mach_mips_sb1              12310201 /* octal 'SB', 01 */
2462 6643d27e bellard
#define bfd_mach_mipsisa32             32
2463 6643d27e bellard
#define bfd_mach_mipsisa32r2           33
2464 6643d27e bellard
#define bfd_mach_mipsisa64             64
2465 6643d27e bellard
#define bfd_mach_mipsisa64r2           65
2466 6643d27e bellard
2467 6643d27e bellard
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
2468 6643d27e bellard
2469 6643d27e bellard
const struct mips_arch_choice mips_arch_choices[] = {
2470 6643d27e bellard
  { "numeric",        0, 0, 0, 0,
2471 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2472 6643d27e bellard
2473 6643d27e bellard
  { "r3000",        1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1,
2474 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2475 6643d27e bellard
  { "r3900",        1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1,
2476 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2477 6643d27e bellard
  { "r4000",        1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3,
2478 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2479 6643d27e bellard
  { "r4010",        1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2,
2480 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2481 6643d27e bellard
  { "vr4100",        1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3,
2482 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2483 6643d27e bellard
  { "vr4111",        1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3,
2484 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2485 6643d27e bellard
  { "vr4120",        1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3,
2486 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2487 6643d27e bellard
  { "r4300",        1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3,
2488 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2489 6643d27e bellard
  { "r4400",        1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3,
2490 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2491 6643d27e bellard
  { "r4600",        1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3,
2492 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2493 6643d27e bellard
  { "r4650",        1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3,
2494 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2495 6643d27e bellard
  { "r5000",        1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4,
2496 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2497 6643d27e bellard
  { "vr5400",        1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4,
2498 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2499 6643d27e bellard
  { "vr5500",        1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4,
2500 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2501 6643d27e bellard
  { "r6000",        1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2,
2502 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2503 6643d27e bellard
  { "rm7000",        1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
2504 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2505 6643d27e bellard
  { "rm9000",        1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4,
2506 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2507 6643d27e bellard
  { "r8000",        1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4,
2508 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2509 6643d27e bellard
  { "r10000",        1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4,
2510 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2511 6643d27e bellard
  { "r12000",        1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4,
2512 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2513 6643d27e bellard
  { "mips5",        1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5,
2514 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2515 6643d27e bellard
2516 6643d27e bellard
  /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
2517 6643d27e bellard
     Note that MIPS-3D and MDMX are not applicable to MIPS32.  (See
2518 6643d27e bellard
     _MIPS32 Architecture For Programmers Volume I: Introduction to the
2519 6643d27e bellard
     MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
2520 6643d27e bellard
     page 1.  */
2521 6643d27e bellard
  { "mips32",        1, bfd_mach_mipsisa32, CPU_MIPS32,
2522 6643d27e bellard
    ISA_MIPS32 | INSN_MIPS16,
2523 6643d27e bellard
    mips_cp0_names_mips3264,
2524 6643d27e bellard
    mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
2525 6643d27e bellard
    mips_hwr_names_numeric },
2526 6643d27e bellard
2527 6643d27e bellard
  { "mips32r2",        1, bfd_mach_mipsisa32r2, CPU_MIPS32R2,
2528 6643d27e bellard
    ISA_MIPS32R2 | INSN_MIPS16,
2529 6643d27e bellard
    mips_cp0_names_mips3264r2,
2530 6643d27e bellard
    mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
2531 6643d27e bellard
    mips_hwr_names_mips3264r2 },
2532 6643d27e bellard
2533 6643d27e bellard
  /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs.  */
2534 6643d27e bellard
  { "mips64",        1, bfd_mach_mipsisa64, CPU_MIPS64,
2535 6643d27e bellard
    ISA_MIPS64 | INSN_MIPS16 | INSN_MIPS3D | INSN_MDMX,
2536 6643d27e bellard
    mips_cp0_names_mips3264,
2537 6643d27e bellard
    mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264),
2538 6643d27e bellard
    mips_hwr_names_numeric },
2539 6643d27e bellard
2540 6643d27e bellard
  { "mips64r2",        1, bfd_mach_mipsisa64r2, CPU_MIPS64R2,
2541 6643d27e bellard
    ISA_MIPS64R2 | INSN_MIPS16 | INSN_MIPS3D | INSN_MDMX,
2542 6643d27e bellard
    mips_cp0_names_mips3264r2,
2543 6643d27e bellard
    mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2),
2544 6643d27e bellard
    mips_hwr_names_mips3264r2 },
2545 6643d27e bellard
2546 6643d27e bellard
  { "sb1",        1, bfd_mach_mips_sb1, CPU_SB1,
2547 6643d27e bellard
    ISA_MIPS64 | INSN_MIPS3D | INSN_SB1,
2548 6643d27e bellard
    mips_cp0_names_sb1,
2549 6643d27e bellard
    mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1),
2550 6643d27e bellard
    mips_hwr_names_numeric },
2551 6643d27e bellard
2552 6643d27e bellard
  /* This entry, mips16, is here only for ISA/processor selection; do
2553 6643d27e bellard
     not print its name.  */
2554 6643d27e bellard
  { "",                1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3 | INSN_MIPS16,
2555 6643d27e bellard
    mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric },
2556 6643d27e bellard
};
2557 6643d27e bellard
2558 6643d27e bellard
/* ISA and processor type to disassemble for, and register names to use.
2559 6643d27e bellard
   set_default_mips_dis_options and parse_mips_dis_options fill in these
2560 6643d27e bellard
   values.  */
2561 6643d27e bellard
static int mips_processor;
2562 6643d27e bellard
static int mips_isa;
2563 6643d27e bellard
static const char * const *mips_gpr_names;
2564 6643d27e bellard
static const char * const *mips_fpr_names;
2565 6643d27e bellard
static const char * const *mips_cp0_names;
2566 6643d27e bellard
static const struct mips_cp0sel_name *mips_cp0sel_names;
2567 6643d27e bellard
static int mips_cp0sel_names_len;
2568 6643d27e bellard
static const char * const *mips_hwr_names;
2569 6643d27e bellard
2570 6643d27e bellard
static const struct mips_abi_choice *choose_abi_by_name
2571 6643d27e bellard
  PARAMS ((const char *, unsigned int));
2572 6643d27e bellard
static const struct mips_arch_choice *choose_arch_by_name
2573 6643d27e bellard
  PARAMS ((const char *, unsigned int));
2574 6643d27e bellard
static const struct mips_arch_choice *choose_arch_by_number
2575 6643d27e bellard
  PARAMS ((unsigned long));
2576 6643d27e bellard
static const struct mips_cp0sel_name *lookup_mips_cp0sel_name
2577 6643d27e bellard
  PARAMS ((const struct mips_cp0sel_name *, unsigned int, unsigned int,
2578 6643d27e bellard
           unsigned int));
2579 6643d27e bellard
 
2580 6643d27e bellard
static const struct mips_abi_choice *
2581 6643d27e bellard
choose_abi_by_name (name, namelen)
2582 6643d27e bellard
     const char *name;
2583 6643d27e bellard
     unsigned int namelen;
2584 6643d27e bellard
{
2585 6643d27e bellard
  const struct mips_abi_choice *c;
2586 6643d27e bellard
  unsigned int i;
2587 6643d27e bellard
2588 6643d27e bellard
  for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++)
2589 6643d27e bellard
    {
2590 6643d27e bellard
      if (strncmp (mips_abi_choices[i].name, name, namelen) == 0
2591 6643d27e bellard
          && strlen (mips_abi_choices[i].name) == namelen)
2592 6643d27e bellard
        c = &mips_abi_choices[i];
2593 6643d27e bellard
    }
2594 6643d27e bellard
  return c;
2595 6643d27e bellard
}
2596 6643d27e bellard
2597 6643d27e bellard
static const struct mips_arch_choice *
2598 6643d27e bellard
choose_arch_by_name (name, namelen)
2599 6643d27e bellard
     const char *name;
2600 6643d27e bellard
     unsigned int namelen;
2601 6643d27e bellard
{
2602 6643d27e bellard
  const struct mips_arch_choice *c = NULL;
2603 6643d27e bellard
  unsigned int i;
2604 6643d27e bellard
2605 6643d27e bellard
  for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
2606 6643d27e bellard
    {
2607 6643d27e bellard
      if (strncmp (mips_arch_choices[i].name, name, namelen) == 0
2608 6643d27e bellard
          && strlen (mips_arch_choices[i].name) == namelen)
2609 6643d27e bellard
        c = &mips_arch_choices[i];
2610 6643d27e bellard
    }
2611 6643d27e bellard
  return c;
2612 6643d27e bellard
}
2613 6643d27e bellard
2614 6643d27e bellard
static const struct mips_arch_choice *
2615 6643d27e bellard
choose_arch_by_number (mach)
2616 6643d27e bellard
     unsigned long mach;
2617 6643d27e bellard
{
2618 6643d27e bellard
  static unsigned long hint_bfd_mach;
2619 6643d27e bellard
  static const struct mips_arch_choice *hint_arch_choice;
2620 6643d27e bellard
  const struct mips_arch_choice *c;
2621 6643d27e bellard
  unsigned int i;
2622 6643d27e bellard
2623 6643d27e bellard
  /* We optimize this because even if the user specifies no
2624 6643d27e bellard
     flags, this will be done for every instruction!  */
2625 6643d27e bellard
  if (hint_bfd_mach == mach
2626 6643d27e bellard
      && hint_arch_choice != NULL
2627 6643d27e bellard
      && hint_arch_choice->bfd_mach == hint_bfd_mach)
2628 6643d27e bellard
    return hint_arch_choice;
2629 6643d27e bellard
2630 6643d27e bellard
  for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++)
2631 6643d27e bellard
    {
2632 6643d27e bellard
      if (mips_arch_choices[i].bfd_mach_valid
2633 6643d27e bellard
          && mips_arch_choices[i].bfd_mach == mach)
2634 6643d27e bellard
        {
2635 6643d27e bellard
          c = &mips_arch_choices[i];
2636 6643d27e bellard
          hint_bfd_mach = mach;
2637 6643d27e bellard
          hint_arch_choice = c;
2638 6643d27e bellard
        }
2639 6643d27e bellard
    }
2640 6643d27e bellard
  return c;
2641 6643d27e bellard
}
2642 6643d27e bellard
2643 6643d27e bellard
void
2644 6643d27e bellard
set_default_mips_dis_options (info)
2645 6643d27e bellard
     struct disassemble_info *info;
2646 6643d27e bellard
{
2647 6643d27e bellard
  const struct mips_arch_choice *chosen_arch;
2648 6643d27e bellard
2649 6643d27e bellard
  /* Defaults: mipsIII/r3000 (?!), (o)32-style ("oldabi") GPR names,
2650 6643d27e bellard
     and numeric FPR, CP0 register, and HWR names.  */
2651 6643d27e bellard
  mips_isa = ISA_MIPS3;
2652 6643d27e bellard
  mips_processor =  CPU_R3000;
2653 6643d27e bellard
  mips_gpr_names = mips_gpr_names_oldabi;
2654 6643d27e bellard
  mips_fpr_names = mips_fpr_names_numeric;
2655 6643d27e bellard
  mips_cp0_names = mips_cp0_names_numeric;
2656 6643d27e bellard
  mips_cp0sel_names = NULL;
2657 6643d27e bellard
  mips_cp0sel_names_len = 0;
2658 6643d27e bellard
  mips_hwr_names = mips_hwr_names_numeric;
2659 6643d27e bellard
2660 6643d27e bellard
  /* If an ELF "newabi" binary, use the n32/(n)64 GPR names.  */
2661 6643d27e bellard
#if 0
2662 6643d27e bellard
  if (info->flavour == bfd_target_elf_flavour && info->section != NULL)
2663 6643d27e bellard
    {
2664 6643d27e bellard
      Elf_Internal_Ehdr *header;
2665 6643d27e bellard

2666 6643d27e bellard
      header = elf_elfheader (info->section->owner);
2667 6643d27e bellard
      if (is_newabi (header))
2668 6643d27e bellard
        mips_gpr_names = mips_gpr_names_newabi;
2669 6643d27e bellard
    }
2670 6643d27e bellard
#endif
2671 6643d27e bellard
2672 6643d27e bellard
  /* Set ISA, architecture, and cp0 register names as best we can.  */
2673 6643d27e bellard
#if ! SYMTAB_AVAILABLE && 0
2674 6643d27e bellard
  /* This is running out on a target machine, not in a host tool.
2675 6643d27e bellard
     FIXME: Where does mips_target_info come from?  */
2676 6643d27e bellard
  target_processor = mips_target_info.processor;
2677 6643d27e bellard
  mips_isa = mips_target_info.isa;
2678 6643d27e bellard
#else
2679 6643d27e bellard
  chosen_arch = choose_arch_by_number (info->mach);
2680 6643d27e bellard
  if (chosen_arch != NULL)
2681 6643d27e bellard
    {
2682 6643d27e bellard
      mips_processor = chosen_arch->processor;
2683 6643d27e bellard
      mips_isa = chosen_arch->isa;
2684 6643d27e bellard
      mips_cp0_names = chosen_arch->cp0_names;
2685 6643d27e bellard
      mips_cp0sel_names = chosen_arch->cp0sel_names;
2686 6643d27e bellard
      mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
2687 6643d27e bellard
      mips_hwr_names = chosen_arch->hwr_names;
2688 6643d27e bellard
    }
2689 6643d27e bellard
#endif
2690 6643d27e bellard
}
2691 6643d27e bellard
2692 6643d27e bellard
void
2693 6643d27e bellard
parse_mips_dis_option (option, len)
2694 6643d27e bellard
     const char *option;
2695 6643d27e bellard
     unsigned int len;
2696 6643d27e bellard
{
2697 6643d27e bellard
  unsigned int i, optionlen, vallen;
2698 6643d27e bellard
  const char *val;
2699 6643d27e bellard
  const struct mips_abi_choice *chosen_abi;
2700 6643d27e bellard
  const struct mips_arch_choice *chosen_arch;
2701 6643d27e bellard
2702 6643d27e bellard
  /* Look for the = that delimits the end of the option name.  */
2703 6643d27e bellard
  for (i = 0; i < len; i++)
2704 6643d27e bellard
    {
2705 6643d27e bellard
      if (option[i] == '=')
2706 6643d27e bellard
        break;
2707 6643d27e bellard
    }
2708 6643d27e bellard
  if (i == 0)                /* Invalid option: no name before '='.  */
2709 6643d27e bellard
    return;
2710 6643d27e bellard
  if (i == len)                /* Invalid option: no '='.  */
2711 6643d27e bellard
    return;
2712 6643d27e bellard
  if (i == (len - 1))        /* Invalid option: no value after '='.  */
2713 6643d27e bellard
    return;
2714 6643d27e bellard
2715 6643d27e bellard
  optionlen = i;
2716 6643d27e bellard
  val = option + (optionlen + 1);
2717 6643d27e bellard
  vallen = len - (optionlen + 1);
2718 6643d27e bellard
2719 6643d27e bellard
  if (strncmp("gpr-names", option, optionlen) == 0
2720 6643d27e bellard
      && strlen("gpr-names") == optionlen)
2721 6643d27e bellard
    {
2722 6643d27e bellard
      chosen_abi = choose_abi_by_name (val, vallen);
2723 6643d27e bellard
      if (chosen_abi != NULL)
2724 6643d27e bellard
        mips_gpr_names = chosen_abi->gpr_names;
2725 6643d27e bellard
      return;
2726 6643d27e bellard
    }
2727 6643d27e bellard
2728 6643d27e bellard
  if (strncmp("fpr-names", option, optionlen) == 0
2729 6643d27e bellard
      && strlen("fpr-names") == optionlen)
2730 6643d27e bellard
    {
2731 6643d27e bellard
      chosen_abi = choose_abi_by_name (val, vallen);
2732 6643d27e bellard
      if (chosen_abi != NULL)
2733 6643d27e bellard
        mips_fpr_names = chosen_abi->fpr_names;
2734 6643d27e bellard
      return;
2735 6643d27e bellard
    }
2736 6643d27e bellard
2737 6643d27e bellard
  if (strncmp("cp0-names", option, optionlen) == 0
2738 6643d27e bellard
      && strlen("cp0-names") == optionlen)
2739 6643d27e bellard
    {
2740 6643d27e bellard
      chosen_arch = choose_arch_by_name (val, vallen);
2741 6643d27e bellard
      if (chosen_arch != NULL)
2742 6643d27e bellard
        {
2743 6643d27e bellard
          mips_cp0_names = chosen_arch->cp0_names;
2744 6643d27e bellard
          mips_cp0sel_names = chosen_arch->cp0sel_names;
2745 6643d27e bellard
          mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
2746 6643d27e bellard
        }
2747 6643d27e bellard
      return;
2748 6643d27e bellard
    }
2749 6643d27e bellard
2750 6643d27e bellard
  if (strncmp("hwr-names", option, optionlen) == 0
2751 6643d27e bellard
      && strlen("hwr-names") == optionlen)
2752 6643d27e bellard
    {
2753 6643d27e bellard
      chosen_arch = choose_arch_by_name (val, vallen);
2754 6643d27e bellard
      if (chosen_arch != NULL)
2755 6643d27e bellard
        mips_hwr_names = chosen_arch->hwr_names;
2756 6643d27e bellard
      return;
2757 6643d27e bellard
    }
2758 6643d27e bellard
2759 6643d27e bellard
  if (strncmp("reg-names", option, optionlen) == 0
2760 6643d27e bellard
      && strlen("reg-names") == optionlen)
2761 6643d27e bellard
    {
2762 6643d27e bellard
      /* We check both ABI and ARCH here unconditionally, so
2763 6643d27e bellard
         that "numeric" will do the desirable thing: select
2764 6643d27e bellard
         numeric register names for all registers.  Other than
2765 6643d27e bellard
         that, a given name probably won't match both.  */
2766 6643d27e bellard
      chosen_abi = choose_abi_by_name (val, vallen);
2767 6643d27e bellard
      if (chosen_abi != NULL)
2768 6643d27e bellard
        {
2769 6643d27e bellard
          mips_gpr_names = chosen_abi->gpr_names;
2770 6643d27e bellard
          mips_fpr_names = chosen_abi->fpr_names;
2771 6643d27e bellard
        }
2772 6643d27e bellard
      chosen_arch = choose_arch_by_name (val, vallen);
2773 6643d27e bellard
      if (chosen_arch != NULL)
2774 6643d27e bellard
        {
2775 6643d27e bellard
          mips_cp0_names = chosen_arch->cp0_names;
2776 6643d27e bellard
          mips_cp0sel_names = chosen_arch->cp0sel_names;
2777 6643d27e bellard
          mips_cp0sel_names_len = chosen_arch->cp0sel_names_len;
2778 6643d27e bellard
          mips_hwr_names = chosen_arch->hwr_names;
2779 6643d27e bellard
        }
2780 6643d27e bellard
      return;
2781 6643d27e bellard
    }
2782 6643d27e bellard
2783 6643d27e bellard
  /* Invalid option.  */
2784 6643d27e bellard
}
2785 6643d27e bellard
2786 6643d27e bellard
void
2787 6643d27e bellard
parse_mips_dis_options (options)
2788 6643d27e bellard
     const char *options;
2789 6643d27e bellard
{
2790 6643d27e bellard
  const char *option_end;
2791 6643d27e bellard
2792 6643d27e bellard
  if (options == NULL)
2793 6643d27e bellard
    return;
2794 6643d27e bellard
2795 6643d27e bellard
  while (*options != '\0')
2796 6643d27e bellard
    {
2797 6643d27e bellard
      /* Skip empty options.  */
2798 6643d27e bellard
      if (*options == ',')
2799 6643d27e bellard
        {
2800 6643d27e bellard
          options++;
2801 6643d27e bellard
          continue;
2802 6643d27e bellard
        }
2803 6643d27e bellard
2804 6643d27e bellard
      /* We know that *options is neither NUL or a comma.  */
2805 6643d27e bellard
      option_end = options + 1;
2806 6643d27e bellard
      while (*option_end != ',' && *option_end != '\0')
2807 6643d27e bellard
        option_end++;
2808 6643d27e bellard
2809 6643d27e bellard
      parse_mips_dis_option (options, option_end - options);
2810 6643d27e bellard
2811 6643d27e bellard
      /* Go on to the next one.  If option_end points to a comma, it
2812 6643d27e bellard
         will be skipped above.  */
2813 6643d27e bellard
      options = option_end;
2814 6643d27e bellard
    }
2815 6643d27e bellard
}
2816 6643d27e bellard
2817 6643d27e bellard
static const struct mips_cp0sel_name *
2818 6643d27e bellard
lookup_mips_cp0sel_name(names, len, cp0reg, sel)
2819 6643d27e bellard
        const struct mips_cp0sel_name *names;
2820 6643d27e bellard
        unsigned int len, cp0reg, sel;
2821 6643d27e bellard
{
2822 6643d27e bellard
  unsigned int i;
2823 6643d27e bellard
2824 6643d27e bellard
  for (i = 0; i < len; i++)
2825 6643d27e bellard
    if (names[i].cp0reg == cp0reg && names[i].sel == sel)
2826 6643d27e bellard
      return &names[i];
2827 6643d27e bellard
  return NULL;
2828 6643d27e bellard
}
2829 6643d27e bellard
 
2830 6643d27e bellard
/* Print insn arguments for 32/64-bit code.  */
2831 6643d27e bellard
2832 6643d27e bellard
static void
2833 6643d27e bellard
print_insn_args (d, l, pc, info)
2834 6643d27e bellard
     const char *d;
2835 6643d27e bellard
     register unsigned long int l;
2836 6643d27e bellard
     bfd_vma pc;
2837 6643d27e bellard
     struct disassemble_info *info;
2838 6643d27e bellard
{
2839 6643d27e bellard
  int op, delta;
2840 6643d27e bellard
  unsigned int lsb, msb, msbd;
2841 6643d27e bellard
2842 6643d27e bellard
  lsb = 0;
2843 6643d27e bellard
2844 6643d27e bellard
  for (; *d != '\0'; d++)
2845 6643d27e bellard
    {
2846 6643d27e bellard
      switch (*d)
2847 6643d27e bellard
        {
2848 6643d27e bellard
        case ',':
2849 6643d27e bellard
        case '(':
2850 6643d27e bellard
        case ')':
2851 6643d27e bellard
        case '[':
2852 6643d27e bellard
        case ']':
2853 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%c", *d);
2854 6643d27e bellard
          break;
2855 6643d27e bellard
2856 6643d27e bellard
        case '+':
2857 6643d27e bellard
          /* Extension character; switch for second char.  */
2858 6643d27e bellard
          d++;
2859 6643d27e bellard
          switch (*d)
2860 6643d27e bellard
            {
2861 6643d27e bellard
            case '\0':
2862 6643d27e bellard
              /* xgettext:c-format */
2863 6643d27e bellard
              (*info->fprintf_func) (info->stream,
2864 6643d27e bellard
                                     _("# internal error, incomplete extension sequence (+)"));
2865 6643d27e bellard
              return;
2866 6643d27e bellard
2867 6643d27e bellard
            case 'A':
2868 6643d27e bellard
              lsb = (l >> OP_SH_SHAMT) & OP_MASK_SHAMT;
2869 6643d27e bellard
              (*info->fprintf_func) (info->stream, "0x%x", lsb);
2870 6643d27e bellard
              break;
2871 6643d27e bellard
        
2872 6643d27e bellard
            case 'B':
2873 6643d27e bellard
              msb = (l >> OP_SH_INSMSB) & OP_MASK_INSMSB;
2874 6643d27e bellard
              (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1);
2875 6643d27e bellard
              break;
2876 6643d27e bellard
2877 6643d27e bellard
            case 'C':
2878 6643d27e bellard
            case 'H':
2879 6643d27e bellard
              msbd = (l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD;
2880 6643d27e bellard
              (*info->fprintf_func) (info->stream, "0x%x", msbd + 1);
2881 6643d27e bellard
              break;
2882 6643d27e bellard
2883 6643d27e bellard
            case 'D':
2884 6643d27e bellard
              {
2885 6643d27e bellard
                const struct mips_cp0sel_name *n;
2886 6643d27e bellard
                unsigned int cp0reg, sel;
2887 6643d27e bellard
2888 6643d27e bellard
                cp0reg = (l >> OP_SH_RD) & OP_MASK_RD;
2889 6643d27e bellard
                sel = (l >> OP_SH_SEL) & OP_MASK_SEL;
2890 6643d27e bellard
2891 6643d27e bellard
                /* CP0 register including 'sel' code for mtcN (et al.), to be
2892 6643d27e bellard
                   printed textually if known.  If not known, print both
2893 6643d27e bellard
                   CP0 register name and sel numerically since CP0 register
2894 6643d27e bellard
                   with sel 0 may have a name unrelated to register being
2895 6643d27e bellard
                   printed.  */
2896 6643d27e bellard
                n = lookup_mips_cp0sel_name(mips_cp0sel_names,
2897 6643d27e bellard
                                            mips_cp0sel_names_len, cp0reg, sel);
2898 6643d27e bellard
                if (n != NULL)
2899 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "%s", n->name);
2900 6643d27e bellard
                else
2901 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel);
2902 6643d27e bellard
                break;
2903 6643d27e bellard
              }
2904 6643d27e bellard
2905 6643d27e bellard
            case 'E':
2906 6643d27e bellard
              lsb = ((l >> OP_SH_SHAMT) & OP_MASK_SHAMT) + 32;
2907 6643d27e bellard
              (*info->fprintf_func) (info->stream, "0x%x", lsb);
2908 6643d27e bellard
              break;
2909 6643d27e bellard
        
2910 6643d27e bellard
            case 'F':
2911 6643d27e bellard
              msb = ((l >> OP_SH_INSMSB) & OP_MASK_INSMSB) + 32;
2912 6643d27e bellard
              (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1);
2913 6643d27e bellard
              break;
2914 6643d27e bellard
2915 6643d27e bellard
            case 'G':
2916 6643d27e bellard
              msbd = ((l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD) + 32;
2917 6643d27e bellard
              (*info->fprintf_func) (info->stream, "0x%x", msbd + 1);
2918 6643d27e bellard
              break;
2919 6643d27e bellard
2920 6643d27e bellard
            default:
2921 6643d27e bellard
              /* xgettext:c-format */
2922 6643d27e bellard
              (*info->fprintf_func) (info->stream,
2923 6643d27e bellard
                                     _("# internal error, undefined extension sequence (+%c)"),
2924 6643d27e bellard
                                     *d);
2925 6643d27e bellard
              return;
2926 6643d27e bellard
            }
2927 6643d27e bellard
          break;
2928 6643d27e bellard
2929 6643d27e bellard
        case 's':
2930 6643d27e bellard
        case 'b':
2931 6643d27e bellard
        case 'r':
2932 6643d27e bellard
        case 'v':
2933 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
2934 6643d27e bellard
                                 mips_gpr_names[(l >> OP_SH_RS) & OP_MASK_RS]);
2935 6643d27e bellard
          break;
2936 6643d27e bellard
2937 6643d27e bellard
        case 't':
2938 6643d27e bellard
        case 'w':
2939 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
2940 6643d27e bellard
                                 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
2941 6643d27e bellard
          break;
2942 6643d27e bellard
2943 6643d27e bellard
        case 'i':
2944 6643d27e bellard
        case 'u':
2945 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
2946 6643d27e bellard
                                 (l >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE);
2947 6643d27e bellard
          break;
2948 6643d27e bellard
2949 6643d27e bellard
        case 'j': /* Same as i, but sign-extended.  */
2950 6643d27e bellard
        case 'o':
2951 6643d27e bellard
          delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
2952 6643d27e bellard
          if (delta & 0x8000)
2953 6643d27e bellard
            delta |= ~0xffff;
2954 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d",
2955 6643d27e bellard
                                 delta);
2956 6643d27e bellard
          break;
2957 6643d27e bellard
2958 6643d27e bellard
        case 'h':
2959 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
2960 6643d27e bellard
                                 (unsigned int) ((l >> OP_SH_PREFX)
2961 6643d27e bellard
                                                 & OP_MASK_PREFX));
2962 6643d27e bellard
          break;
2963 6643d27e bellard
2964 6643d27e bellard
        case 'k':
2965 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
2966 6643d27e bellard
                                 (unsigned int) ((l >> OP_SH_CACHE)
2967 6643d27e bellard
                                                 & OP_MASK_CACHE));
2968 6643d27e bellard
          break;
2969 6643d27e bellard
2970 6643d27e bellard
        case 'a':
2971 6643d27e bellard
          info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff)
2972 6643d27e bellard
                          | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2));
2973 6643d27e bellard
          (*info->print_address_func) (info->target, info);
2974 6643d27e bellard
          break;
2975 6643d27e bellard
2976 6643d27e bellard
        case 'p':
2977 6643d27e bellard
          /* Sign extend the displacement.  */
2978 6643d27e bellard
          delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
2979 6643d27e bellard
          if (delta & 0x8000)
2980 6643d27e bellard
            delta |= ~0xffff;
2981 6643d27e bellard
          info->target = (delta << 2) + pc + INSNLEN;
2982 6643d27e bellard
          (*info->print_address_func) (info->target, info);
2983 6643d27e bellard
          break;
2984 6643d27e bellard
2985 6643d27e bellard
        case 'd':
2986 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
2987 6643d27e bellard
                                 mips_gpr_names[(l >> OP_SH_RD) & OP_MASK_RD]);
2988 6643d27e bellard
          break;
2989 6643d27e bellard
2990 6643d27e bellard
        case 'U':
2991 6643d27e bellard
          {
2992 6643d27e bellard
            /* First check for both rd and rt being equal.  */
2993 6643d27e bellard
            unsigned int reg = (l >> OP_SH_RD) & OP_MASK_RD;
2994 6643d27e bellard
            if (reg == ((l >> OP_SH_RT) & OP_MASK_RT))
2995 6643d27e bellard
              (*info->fprintf_func) (info->stream, "%s",
2996 6643d27e bellard
                                     mips_gpr_names[reg]);
2997 6643d27e bellard
            else
2998 6643d27e bellard
              {
2999 6643d27e bellard
                /* If one is zero use the other.  */
3000 6643d27e bellard
                if (reg == 0)
3001 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "%s",
3002 6643d27e bellard
                                         mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
3003 6643d27e bellard
                else if (((l >> OP_SH_RT) & OP_MASK_RT) == 0)
3004 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "%s",
3005 6643d27e bellard
                                         mips_gpr_names[reg]);
3006 6643d27e bellard
                else /* Bogus, result depends on processor.  */
3007 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "%s or %s",
3008 6643d27e bellard
                                         mips_gpr_names[reg],
3009 6643d27e bellard
                                         mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]);
3010 6643d27e bellard
              }
3011 6643d27e bellard
          }
3012 6643d27e bellard
          break;
3013 6643d27e bellard
3014 6643d27e bellard
        case 'z':
3015 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]);
3016 6643d27e bellard
          break;
3017 6643d27e bellard
3018 6643d27e bellard
        case '<':
3019 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
3020 6643d27e bellard
                                 (l >> OP_SH_SHAMT) & OP_MASK_SHAMT);
3021 6643d27e bellard
          break;
3022 6643d27e bellard
3023 6643d27e bellard
        case 'c':
3024 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
3025 6643d27e bellard
                                 (l >> OP_SH_CODE) & OP_MASK_CODE);
3026 6643d27e bellard
          break;
3027 6643d27e bellard
3028 6643d27e bellard
        case 'q':
3029 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
3030 6643d27e bellard
                                 (l >> OP_SH_CODE2) & OP_MASK_CODE2);
3031 6643d27e bellard
          break;
3032 6643d27e bellard
3033 6643d27e bellard
        case 'C':
3034 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
3035 6643d27e bellard
                                 (l >> OP_SH_COPZ) & OP_MASK_COPZ);
3036 6643d27e bellard
          break;
3037 6643d27e bellard
3038 6643d27e bellard
        case 'B':
3039 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
3040 6643d27e bellard
                                 (l >> OP_SH_CODE20) & OP_MASK_CODE20);
3041 6643d27e bellard
          break;
3042 6643d27e bellard
3043 6643d27e bellard
        case 'J':
3044 6643d27e bellard
          (*info->fprintf_func) (info->stream, "0x%x",
3045 6643d27e bellard
                                 (l >> OP_SH_CODE19) & OP_MASK_CODE19);
3046 6643d27e bellard
          break;
3047 6643d27e bellard
3048 6643d27e bellard
        case 'S':
3049 6643d27e bellard
        case 'V':
3050 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
3051 6643d27e bellard
                                 mips_fpr_names[(l >> OP_SH_FS) & OP_MASK_FS]);
3052 6643d27e bellard
          break;
3053 6643d27e bellard
3054 6643d27e bellard
        case 'T':
3055 6643d27e bellard
        case 'W':
3056 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
3057 6643d27e bellard
                                 mips_fpr_names[(l >> OP_SH_FT) & OP_MASK_FT]);
3058 6643d27e bellard
          break;
3059 6643d27e bellard
3060 6643d27e bellard
        case 'D':
3061 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
3062 6643d27e bellard
                                 mips_fpr_names[(l >> OP_SH_FD) & OP_MASK_FD]);
3063 6643d27e bellard
          break;
3064 6643d27e bellard
3065 6643d27e bellard
        case 'R':
3066 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
3067 6643d27e bellard
                                 mips_fpr_names[(l >> OP_SH_FR) & OP_MASK_FR]);
3068 6643d27e bellard
          break;
3069 6643d27e bellard
3070 6643d27e bellard
        case 'E':
3071 6643d27e bellard
          /* Coprocessor register for lwcN instructions, et al.
3072 6643d27e bellard

3073 6643d27e bellard
             Note that there is no load/store cp0 instructions, and
3074 6643d27e bellard
             that FPU (cp1) instructions disassemble this field using
3075 6643d27e bellard
             'T' format.  Therefore, until we gain understanding of
3076 6643d27e bellard
             cp2 register names, we can simply print the register
3077 6643d27e bellard
             numbers.  */
3078 6643d27e bellard
          (*info->fprintf_func) (info->stream, "$%d",
3079 6643d27e bellard
                                 (l >> OP_SH_RT) & OP_MASK_RT);
3080 6643d27e bellard
          break;
3081 6643d27e bellard
3082 6643d27e bellard
        case 'G':
3083 6643d27e bellard
          /* Coprocessor register for mtcN instructions, et al.  Note
3084 6643d27e bellard
             that FPU (cp1) instructions disassemble this field using
3085 6643d27e bellard
             'S' format.  Therefore, we only need to worry about cp0,
3086 6643d27e bellard
             cp2, and cp3.  */
3087 6643d27e bellard
          op = (l >> OP_SH_OP) & OP_MASK_OP;
3088 6643d27e bellard
          if (op == OP_OP_COP0)
3089 6643d27e bellard
            (*info->fprintf_func) (info->stream, "%s",
3090 6643d27e bellard
                                   mips_cp0_names[(l >> OP_SH_RD) & OP_MASK_RD]);
3091 6643d27e bellard
          else
3092 6643d27e bellard
            (*info->fprintf_func) (info->stream, "$%d",
3093 6643d27e bellard
                                   (l >> OP_SH_RD) & OP_MASK_RD);
3094 6643d27e bellard
          break;
3095 6643d27e bellard
3096 6643d27e bellard
        case 'K':
3097 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s",
3098 6643d27e bellard
                                 mips_hwr_names[(l >> OP_SH_RD) & OP_MASK_RD]);
3099 6643d27e bellard
          break;
3100 6643d27e bellard
3101 6643d27e bellard
        case 'N':
3102 6643d27e bellard
          (*info->fprintf_func) (info->stream, "$fcc%d",
3103 6643d27e bellard
                                 (l >> OP_SH_BCC) & OP_MASK_BCC);
3104 6643d27e bellard
          break;
3105 6643d27e bellard
3106 6643d27e bellard
        case 'M':
3107 6643d27e bellard
          (*info->fprintf_func) (info->stream, "$fcc%d",
3108 6643d27e bellard
                                 (l >> OP_SH_CCC) & OP_MASK_CCC);
3109 6643d27e bellard
          break;
3110 6643d27e bellard
3111 6643d27e bellard
        case 'P':
3112 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d",
3113 6643d27e bellard
                                 (l >> OP_SH_PERFREG) & OP_MASK_PERFREG);
3114 6643d27e bellard
          break;
3115 6643d27e bellard
3116 6643d27e bellard
        case 'e':
3117 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d",
3118 6643d27e bellard
                                 (l >> OP_SH_VECBYTE) & OP_MASK_VECBYTE);
3119 6643d27e bellard
          break;
3120 6643d27e bellard
3121 6643d27e bellard
        case '%':
3122 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d",
3123 6643d27e bellard
                                 (l >> OP_SH_VECALIGN) & OP_MASK_VECALIGN);
3124 6643d27e bellard
          break;
3125 6643d27e bellard
3126 6643d27e bellard
        case 'H':
3127 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d",
3128 6643d27e bellard
                                 (l >> OP_SH_SEL) & OP_MASK_SEL);
3129 6643d27e bellard
          break;
3130 6643d27e bellard
3131 6643d27e bellard
        case 'O':
3132 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d",
3133 6643d27e bellard
                                 (l >> OP_SH_ALN) & OP_MASK_ALN);
3134 6643d27e bellard
          break;
3135 6643d27e bellard
3136 6643d27e bellard
        case 'Q':
3137 6643d27e bellard
          {
3138 6643d27e bellard
            unsigned int vsel = (l >> OP_SH_VSEL) & OP_MASK_VSEL;
3139 6643d27e bellard
            if ((vsel & 0x10) == 0)
3140 6643d27e bellard
              {
3141 6643d27e bellard
                int fmt;
3142 6643d27e bellard
                vsel &= 0x0f;
3143 6643d27e bellard
                for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
3144 6643d27e bellard
                  if ((vsel & 1) == 0)
3145 6643d27e bellard
                    break;
3146 6643d27e bellard
                (*info->fprintf_func) (info->stream, "$v%d[%d]",
3147 6643d27e bellard
                                       (l >> OP_SH_FT) & OP_MASK_FT,
3148 6643d27e bellard
                                       vsel >> 1);
3149 6643d27e bellard
              }
3150 6643d27e bellard
            else if ((vsel & 0x08) == 0)
3151 6643d27e bellard
              {
3152 6643d27e bellard
                (*info->fprintf_func) (info->stream, "$v%d",
3153 6643d27e bellard
                                       (l >> OP_SH_FT) & OP_MASK_FT);
3154 6643d27e bellard
              }
3155 6643d27e bellard
            else
3156 6643d27e bellard
              {
3157 6643d27e bellard
                (*info->fprintf_func) (info->stream, "0x%x",
3158 6643d27e bellard
                                       (l >> OP_SH_FT) & OP_MASK_FT);
3159 6643d27e bellard
              }
3160 6643d27e bellard
          }
3161 6643d27e bellard
          break;
3162 6643d27e bellard
3163 6643d27e bellard
        case 'X':
3164 6643d27e bellard
          (*info->fprintf_func) (info->stream, "$v%d",
3165 6643d27e bellard
                                 (l >> OP_SH_FD) & OP_MASK_FD);
3166 6643d27e bellard
          break;
3167 6643d27e bellard
3168 6643d27e bellard
        case 'Y':
3169 6643d27e bellard
          (*info->fprintf_func) (info->stream, "$v%d",
3170 6643d27e bellard
                                 (l >> OP_SH_FS) & OP_MASK_FS);
3171 6643d27e bellard
          break;
3172 6643d27e bellard
3173 6643d27e bellard
        case 'Z':
3174 6643d27e bellard
          (*info->fprintf_func) (info->stream, "$v%d",
3175 6643d27e bellard
                                 (l >> OP_SH_FT) & OP_MASK_FT);
3176 6643d27e bellard
          break;
3177 6643d27e bellard
3178 6643d27e bellard
        default:
3179 6643d27e bellard
          /* xgettext:c-format */
3180 6643d27e bellard
          (*info->fprintf_func) (info->stream,
3181 6643d27e bellard
                                 _("# internal error, undefined modifier(%c)"),
3182 6643d27e bellard
                                 *d);
3183 6643d27e bellard
          return;
3184 6643d27e bellard
        }
3185 6643d27e bellard
    }
3186 6643d27e bellard
}
3187 6643d27e bellard
 
3188 6643d27e bellard
/* Check if the object uses NewABI conventions.  */
3189 6643d27e bellard
#if 0
3190 6643d27e bellard
static int
3191 6643d27e bellard
is_newabi (header)
3192 6643d27e bellard
     Elf_Internal_Ehdr *header;
3193 6643d27e bellard
{
3194 6643d27e bellard
  /* There are no old-style ABIs which use 64-bit ELF.  */
3195 6643d27e bellard
  if (header->e_ident[EI_CLASS] == ELFCLASS64)
3196 6643d27e bellard
    return 1;
3197 6643d27e bellard

3198 6643d27e bellard
  /* If a 32-bit ELF file, n32 is a new-style ABI.  */
3199 6643d27e bellard
  if ((header->e_flags & EF_MIPS_ABI2) != 0)
3200 6643d27e bellard
    return 1;
3201 6643d27e bellard

3202 6643d27e bellard
  return 0;
3203 6643d27e bellard
}
3204 6643d27e bellard
#endif
3205 6643d27e bellard
 
3206 6643d27e bellard
/* Print the mips instruction at address MEMADDR in debugged memory,
3207 6643d27e bellard
   on using INFO.  Returns length of the instruction, in bytes, which is
3208 6643d27e bellard
   always INSNLEN.  BIGENDIAN must be 1 if this is big-endian code, 0 if
3209 6643d27e bellard
   this is little-endian code.  */
3210 6643d27e bellard
3211 6643d27e bellard
static int
3212 6643d27e bellard
print_insn_mips (memaddr, word, info)
3213 6643d27e bellard
     bfd_vma memaddr;
3214 6643d27e bellard
     unsigned long int word;
3215 6643d27e bellard
     struct disassemble_info *info;
3216 6643d27e bellard
{
3217 6643d27e bellard
  register const struct mips_opcode *op;
3218 6643d27e bellard
  static bfd_boolean init = 0;
3219 6643d27e bellard
  static const struct mips_opcode *mips_hash[OP_MASK_OP + 1];
3220 6643d27e bellard
3221 6643d27e bellard
  /* Build a hash table to shorten the search time.  */
3222 6643d27e bellard
  if (! init)
3223 6643d27e bellard
    {
3224 6643d27e bellard
      unsigned int i;
3225 6643d27e bellard
3226 6643d27e bellard
      for (i = 0; i <= OP_MASK_OP; i++)
3227 6643d27e bellard
        {
3228 6643d27e bellard
          for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++)
3229 6643d27e bellard
            {
3230 6643d27e bellard
              if (op->pinfo == INSN_MACRO)
3231 6643d27e bellard
                continue;
3232 6643d27e bellard
              if (i == ((op->match >> OP_SH_OP) & OP_MASK_OP))
3233 6643d27e bellard
                {
3234 6643d27e bellard
                  mips_hash[i] = op;
3235 6643d27e bellard
                  break;
3236 6643d27e bellard
                }
3237 6643d27e bellard
            }
3238 6643d27e bellard
        }
3239 6643d27e bellard
3240 6643d27e bellard
      init = 1;
3241 6643d27e bellard
    }
3242 6643d27e bellard
3243 6643d27e bellard
  info->bytes_per_chunk = INSNLEN;
3244 6643d27e bellard
  info->display_endian = info->endian;
3245 6643d27e bellard
  info->insn_info_valid = 1;
3246 6643d27e bellard
  info->branch_delay_insns = 0;
3247 6643d27e bellard
  info->data_size = 0;
3248 6643d27e bellard
  info->insn_type = dis_nonbranch;
3249 6643d27e bellard
  info->target = 0;
3250 6643d27e bellard
  info->target2 = 0;
3251 6643d27e bellard
3252 6643d27e bellard
  op = mips_hash[(word >> OP_SH_OP) & OP_MASK_OP];
3253 6643d27e bellard
  if (op != NULL)
3254 6643d27e bellard
    {
3255 6643d27e bellard
      for (; op < &mips_opcodes[NUMOPCODES]; op++)
3256 6643d27e bellard
        {
3257 6643d27e bellard
          if (op->pinfo != INSN_MACRO && (word & op->mask) == op->match)
3258 6643d27e bellard
            {
3259 6643d27e bellard
              register const char *d;
3260 6643d27e bellard
3261 6643d27e bellard
              /* We always allow to disassemble the jalx instruction.  */
3262 6643d27e bellard
              if (! OPCODE_IS_MEMBER (op, mips_isa, mips_processor)
3263 6643d27e bellard
                  && strcmp (op->name, "jalx"))
3264 6643d27e bellard
                continue;
3265 6643d27e bellard
3266 6643d27e bellard
              /* Figure out instruction type and branch delay information.  */
3267 6643d27e bellard
              if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3268 6643d27e bellard
                {
3269 6643d27e bellard
                  if ((info->insn_type & INSN_WRITE_GPR_31) != 0)
3270 6643d27e bellard
                    info->insn_type = dis_jsr;
3271 6643d27e bellard
                  else
3272 6643d27e bellard
                    info->insn_type = dis_branch;
3273 6643d27e bellard
                  info->branch_delay_insns = 1;
3274 6643d27e bellard
                }
3275 6643d27e bellard
              else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
3276 6643d27e bellard
                                     | INSN_COND_BRANCH_LIKELY)) != 0)
3277 6643d27e bellard
                {
3278 6643d27e bellard
                  if ((info->insn_type & INSN_WRITE_GPR_31) != 0)
3279 6643d27e bellard
                    info->insn_type = dis_condjsr;
3280 6643d27e bellard
                  else
3281 6643d27e bellard
                    info->insn_type = dis_condbranch;
3282 6643d27e bellard
                  info->branch_delay_insns = 1;
3283 6643d27e bellard
                }
3284 6643d27e bellard
              else if ((op->pinfo & (INSN_STORE_MEMORY
3285 6643d27e bellard
                                     | INSN_LOAD_MEMORY_DELAY)) != 0)
3286 6643d27e bellard
                info->insn_type = dis_dref;
3287 6643d27e bellard
3288 6643d27e bellard
              (*info->fprintf_func) (info->stream, "%s", op->name);
3289 6643d27e bellard
3290 6643d27e bellard
              d = op->args;
3291 6643d27e bellard
              if (d != NULL && *d != '\0')
3292 6643d27e bellard
                {
3293 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "\t");
3294 6643d27e bellard
                  print_insn_args (d, word, memaddr, info);
3295 6643d27e bellard
                }
3296 6643d27e bellard
3297 6643d27e bellard
              return INSNLEN;
3298 6643d27e bellard
            }
3299 6643d27e bellard
        }
3300 6643d27e bellard
    }
3301 6643d27e bellard
3302 6643d27e bellard
  /* Handle undefined instructions.  */
3303 6643d27e bellard
  info->insn_type = dis_noninsn;
3304 6643d27e bellard
  (*info->fprintf_func) (info->stream, "0x%x", word);
3305 6643d27e bellard
  return INSNLEN;
3306 6643d27e bellard
}
3307 6643d27e bellard
 
3308 6643d27e bellard
/* In an environment where we do not know the symbol type of the
3309 6643d27e bellard
   instruction we are forced to assume that the low order bit of the
3310 6643d27e bellard
   instructions' address may mark it as a mips16 instruction.  If we
3311 6643d27e bellard
   are single stepping, or the pc is within the disassembled function,
3312 6643d27e bellard
   this works.  Otherwise, we need a clue.  Sometimes.  */
3313 6643d27e bellard
3314 6643d27e bellard
static int
3315 6643d27e bellard
_print_insn_mips (memaddr, info, endianness)
3316 6643d27e bellard
     bfd_vma memaddr;
3317 6643d27e bellard
     struct disassemble_info *info;
3318 6643d27e bellard
     enum bfd_endian endianness;
3319 6643d27e bellard
{
3320 6643d27e bellard
  bfd_byte buffer[INSNLEN];
3321 6643d27e bellard
  int status;
3322 6643d27e bellard
3323 6643d27e bellard
  set_default_mips_dis_options (info);
3324 6643d27e bellard
  parse_mips_dis_options (info->disassembler_options);
3325 6643d27e bellard
3326 6643d27e bellard
#if 0
3327 6643d27e bellard
#if 1
3328 6643d27e bellard
  /* FIXME: If odd address, this is CLEARLY a mips 16 instruction.  */
3329 6643d27e bellard
  /* Only a few tools will work this way.  */
3330 6643d27e bellard
  if (memaddr & 0x01)
3331 6643d27e bellard
    return print_insn_mips16 (memaddr, info);
3332 6643d27e bellard
#endif
3333 6643d27e bellard
3334 6643d27e bellard
#if SYMTAB_AVAILABLE
3335 6643d27e bellard
  if (info->mach == bfd_mach_mips16
3336 6643d27e bellard
      || (info->flavour == bfd_target_elf_flavour
3337 6643d27e bellard
          && info->symbols != NULL
3338 6643d27e bellard
          && ((*(elf_symbol_type **) info->symbols)->internal_elf_sym.st_other
3339 6643d27e bellard
              == STO_MIPS16)))
3340 6643d27e bellard
    return print_insn_mips16 (memaddr, info);
3341 6643d27e bellard
#endif
3342 6643d27e bellard
#endif
3343 6643d27e bellard
3344 6643d27e bellard
  status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info);
3345 6643d27e bellard
  if (status == 0)
3346 6643d27e bellard
    {
3347 6643d27e bellard
      unsigned long insn;
3348 6643d27e bellard
3349 6643d27e bellard
      if (endianness == BFD_ENDIAN_BIG)
3350 6643d27e bellard
        insn = (unsigned long) bfd_getb32 (buffer);
3351 6643d27e bellard
      else
3352 6643d27e bellard
        insn = (unsigned long) bfd_getl32 (buffer);
3353 6643d27e bellard
3354 6643d27e bellard
      return print_insn_mips (memaddr, insn, info);
3355 6643d27e bellard
    }
3356 6643d27e bellard
  else
3357 6643d27e bellard
    {
3358 6643d27e bellard
      (*info->memory_error_func) (status, memaddr, info);
3359 6643d27e bellard
      return -1;
3360 6643d27e bellard
    }
3361 6643d27e bellard
}
3362 6643d27e bellard
3363 6643d27e bellard
int
3364 6643d27e bellard
print_insn_big_mips (memaddr, info)
3365 6643d27e bellard
     bfd_vma memaddr;
3366 6643d27e bellard
     struct disassemble_info *info;
3367 6643d27e bellard
{
3368 6643d27e bellard
  return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG);
3369 6643d27e bellard
}
3370 6643d27e bellard
3371 6643d27e bellard
int
3372 6643d27e bellard
print_insn_little_mips (memaddr, info)
3373 6643d27e bellard
     bfd_vma memaddr;
3374 6643d27e bellard
     struct disassemble_info *info;
3375 6643d27e bellard
{
3376 6643d27e bellard
  return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE);
3377 6643d27e bellard
}
3378 6643d27e bellard
 
3379 6643d27e bellard
/* Disassemble mips16 instructions.  */
3380 6643d27e bellard
#if 0
3381 6643d27e bellard
static int
3382 6643d27e bellard
print_insn_mips16 (memaddr, info)
3383 6643d27e bellard
     bfd_vma memaddr;
3384 6643d27e bellard
     struct disassemble_info *info;
3385 6643d27e bellard
{
3386 6643d27e bellard
  int status;
3387 6643d27e bellard
  bfd_byte buffer[2];
3388 6643d27e bellard
  int length;
3389 6643d27e bellard
  int insn;
3390 6643d27e bellard
  bfd_boolean use_extend;
3391 6643d27e bellard
  int extend = 0;
3392 6643d27e bellard
  const struct mips_opcode *op, *opend;
3393 6643d27e bellard

3394 6643d27e bellard
  info->bytes_per_chunk = 2;
3395 6643d27e bellard
  info->display_endian = info->endian;
3396 6643d27e bellard
  info->insn_info_valid = 1;
3397 6643d27e bellard
  info->branch_delay_insns = 0;
3398 6643d27e bellard
  info->data_size = 0;
3399 6643d27e bellard
  info->insn_type = dis_nonbranch;
3400 6643d27e bellard
  info->target = 0;
3401 6643d27e bellard
  info->target2 = 0;
3402 6643d27e bellard

3403 6643d27e bellard
  status = (*info->read_memory_func) (memaddr, buffer, 2, info);
3404 6643d27e bellard
  if (status != 0)
3405 6643d27e bellard
    {
3406 6643d27e bellard
      (*info->memory_error_func) (status, memaddr, info);
3407 6643d27e bellard
      return -1;
3408 6643d27e bellard
    }
3409 6643d27e bellard

3410 6643d27e bellard
  length = 2;
3411 6643d27e bellard

3412 6643d27e bellard
  if (info->endian == BFD_ENDIAN_BIG)
3413 6643d27e bellard
    insn = bfd_getb16 (buffer);
3414 6643d27e bellard
  else
3415 6643d27e bellard
    insn = bfd_getl16 (buffer);
3416 6643d27e bellard

3417 6643d27e bellard
  /* Handle the extend opcode specially.  */
3418 6643d27e bellard
  use_extend = FALSE;
3419 6643d27e bellard
  if ((insn & 0xf800) == 0xf000)
3420 6643d27e bellard
    {
3421 6643d27e bellard
      use_extend = TRUE;
3422 6643d27e bellard
      extend = insn & 0x7ff;
3423 6643d27e bellard

3424 6643d27e bellard
      memaddr += 2;
3425 6643d27e bellard

3426 6643d27e bellard
      status = (*info->read_memory_func) (memaddr, buffer, 2, info);
3427 6643d27e bellard
      if (status != 0)
3428 6643d27e bellard
        {
3429 6643d27e bellard
          (*info->fprintf_func) (info->stream, "extend 0x%x",
3430 6643d27e bellard
                                 (unsigned int) extend);
3431 6643d27e bellard
          (*info->memory_error_func) (status, memaddr, info);
3432 6643d27e bellard
          return -1;
3433 6643d27e bellard
        }
3434 6643d27e bellard

3435 6643d27e bellard
      if (info->endian == BFD_ENDIAN_BIG)
3436 6643d27e bellard
        insn = bfd_getb16 (buffer);
3437 6643d27e bellard
      else
3438 6643d27e bellard
        insn = bfd_getl16 (buffer);
3439 6643d27e bellard

3440 6643d27e bellard
      /* Check for an extend opcode followed by an extend opcode.  */
3441 6643d27e bellard
      if ((insn & 0xf800) == 0xf000)
3442 6643d27e bellard
        {
3443 6643d27e bellard
          (*info->fprintf_func) (info->stream, "extend 0x%x",
3444 6643d27e bellard
                                 (unsigned int) extend);
3445 6643d27e bellard
          info->insn_type = dis_noninsn;
3446 6643d27e bellard
          return length;
3447 6643d27e bellard
        }
3448 6643d27e bellard

3449 6643d27e bellard
      length += 2;
3450 6643d27e bellard
    }
3451 6643d27e bellard

3452 6643d27e bellard
  /* FIXME: Should probably use a hash table on the major opcode here.  */
3453 6643d27e bellard

3454 6643d27e bellard
  opend = mips16_opcodes + bfd_mips16_num_opcodes;
3455 6643d27e bellard
  for (op = mips16_opcodes; op < opend; op++)
3456 6643d27e bellard
    {
3457 6643d27e bellard
      if (op->pinfo != INSN_MACRO && (insn & op->mask) == op->match)
3458 6643d27e bellard
        {
3459 6643d27e bellard
          const char *s;
3460 6643d27e bellard

3461 6643d27e bellard
          if (strchr (op->args, 'a') != NULL)
3462 6643d27e bellard
            {
3463 6643d27e bellard
              if (use_extend)
3464 6643d27e bellard
                {
3465 6643d27e bellard
                  (*info->fprintf_func) (info->stream, "extend 0x%x",
3466 6643d27e bellard
                                         (unsigned int) extend);
3467 6643d27e bellard
                  info->insn_type = dis_noninsn;
3468 6643d27e bellard
                  return length - 2;
3469 6643d27e bellard
                }
3470 6643d27e bellard

3471 6643d27e bellard
              use_extend = FALSE;
3472 6643d27e bellard

3473 6643d27e bellard
              memaddr += 2;
3474 6643d27e bellard

3475 6643d27e bellard
              status = (*info->read_memory_func) (memaddr, buffer, 2,
3476 6643d27e bellard
                                                  info);
3477 6643d27e bellard
              if (status == 0)
3478 6643d27e bellard
                {
3479 6643d27e bellard
                  use_extend = TRUE;
3480 6643d27e bellard
                  if (info->endian == BFD_ENDIAN_BIG)
3481 6643d27e bellard
                    extend = bfd_getb16 (buffer);
3482 6643d27e bellard
                  else
3483 6643d27e bellard
                    extend = bfd_getl16 (buffer);
3484 6643d27e bellard
                  length += 2;
3485 6643d27e bellard
                }
3486 6643d27e bellard
            }
3487 6643d27e bellard

3488 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%s", op->name);
3489 6643d27e bellard
          if (op->args[0] != '\0')
3490 6643d27e bellard
            (*info->fprintf_func) (info->stream, "\t");
3491 6643d27e bellard

3492 6643d27e bellard
          for (s = op->args; *s != '\0'; s++)
3493 6643d27e bellard
            {
3494 6643d27e bellard
              if (*s == ','
3495 6643d27e bellard
                  && s[1] == 'w'
3496 6643d27e bellard
                  && (((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX)
3497 6643d27e bellard
                      == ((insn >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY)))
3498 6643d27e bellard
                {
3499 6643d27e bellard
                  /* Skip the register and the comma.  */
3500 6643d27e bellard
                  ++s;
3501 6643d27e bellard
                  continue;
3502 6643d27e bellard
                }
3503 6643d27e bellard
              if (*s == ','
3504 6643d27e bellard
                  && s[1] == 'v'
3505 6643d27e bellard
                  && (((insn >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ)
3506 6643d27e bellard
                      == ((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX)))
3507 6643d27e bellard
                {
3508 6643d27e bellard
                  /* Skip the register and the comma.  */
3509 6643d27e bellard
                  ++s;
3510 6643d27e bellard
                  continue;
3511 6643d27e bellard
                }
3512 6643d27e bellard
              print_mips16_insn_arg (*s, op, insn, use_extend, extend, memaddr,
3513 6643d27e bellard
                                     info);
3514 6643d27e bellard
            }
3515 6643d27e bellard

3516 6643d27e bellard
          if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3517 6643d27e bellard
            {
3518 6643d27e bellard
              info->branch_delay_insns = 1;
3519 6643d27e bellard
              if (info->insn_type != dis_jsr)
3520 6643d27e bellard
                info->insn_type = dis_branch;
3521 6643d27e bellard
            }
3522 6643d27e bellard

3523 6643d27e bellard
          return length;
3524 6643d27e bellard
        }
3525 6643d27e bellard
    }
3526 6643d27e bellard

3527 6643d27e bellard
  if (use_extend)
3528 6643d27e bellard
    (*info->fprintf_func) (info->stream, "0x%x", extend | 0xf000);
3529 6643d27e bellard
  (*info->fprintf_func) (info->stream, "0x%x", insn);
3530 6643d27e bellard
  info->insn_type = dis_noninsn;
3531 6643d27e bellard

3532 6643d27e bellard
  return length;
3533 6643d27e bellard
}
3534 6643d27e bellard

3535 6643d27e bellard
/* Disassemble an operand for a mips16 instruction.  */
3536 6643d27e bellard

3537 6643d27e bellard
static void
3538 6643d27e bellard
print_mips16_insn_arg (type, op, l, use_extend, extend, memaddr, info)
3539 6643d27e bellard
     char type;
3540 6643d27e bellard
     const struct mips_opcode *op;
3541 6643d27e bellard
     int l;
3542 6643d27e bellard
     bfd_boolean use_extend;
3543 6643d27e bellard
     int extend;
3544 6643d27e bellard
     bfd_vma memaddr;
3545 6643d27e bellard
     struct disassemble_info *info;
3546 6643d27e bellard
{
3547 6643d27e bellard
  switch (type)
3548 6643d27e bellard
    {
3549 6643d27e bellard
    case ',':
3550 6643d27e bellard
    case '(':
3551 6643d27e bellard
    case ')':
3552 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%c", type);
3553 6643d27e bellard
      break;
3554 6643d27e bellard

3555 6643d27e bellard
    case 'y':
3556 6643d27e bellard
    case 'w':
3557 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s",
3558 6643d27e bellard
                             mips16_reg_names[((l >> MIPS16OP_SH_RY)
3559 6643d27e bellard
                                               & MIPS16OP_MASK_RY)]);
3560 6643d27e bellard
      break;
3561 6643d27e bellard

3562 6643d27e bellard
    case 'x':
3563 6643d27e bellard
    case 'v':
3564 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s",
3565 6643d27e bellard
                             mips16_reg_names[((l >> MIPS16OP_SH_RX)
3566 6643d27e bellard
                                               & MIPS16OP_MASK_RX)]);
3567 6643d27e bellard
      break;
3568 6643d27e bellard

3569 6643d27e bellard
    case 'z':
3570 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s",
3571 6643d27e bellard
                             mips16_reg_names[((l >> MIPS16OP_SH_RZ)
3572 6643d27e bellard
                                               & MIPS16OP_MASK_RZ)]);
3573 6643d27e bellard
      break;
3574 6643d27e bellard

3575 6643d27e bellard
    case 'Z':
3576 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s",
3577 6643d27e bellard
                             mips16_reg_names[((l >> MIPS16OP_SH_MOVE32Z)
3578 6643d27e bellard
                                               & MIPS16OP_MASK_MOVE32Z)]);
3579 6643d27e bellard
      break;
3580 6643d27e bellard

3581 6643d27e bellard
    case '0':
3582 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]);
3583 6643d27e bellard
      break;
3584 6643d27e bellard

3585 6643d27e bellard
    case 'S':
3586 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[29]);
3587 6643d27e bellard
      break;
3588 6643d27e bellard

3589 6643d27e bellard
    case 'P':
3590 6643d27e bellard
      (*info->fprintf_func) (info->stream, "$pc");
3591 6643d27e bellard
      break;
3592 6643d27e bellard

3593 6643d27e bellard
    case 'R':
3594 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[31]);
3595 6643d27e bellard
      break;
3596 6643d27e bellard

3597 6643d27e bellard
    case 'X':
3598 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s",
3599 6643d27e bellard
                             mips_gpr_names[((l >> MIPS16OP_SH_REGR32)
3600 6643d27e bellard
                                            & MIPS16OP_MASK_REGR32)]);
3601 6643d27e bellard
      break;
3602 6643d27e bellard

3603 6643d27e bellard
    case 'Y':
3604 6643d27e bellard
      (*info->fprintf_func) (info->stream, "%s",
3605 6643d27e bellard
                             mips_gpr_names[MIPS16OP_EXTRACT_REG32R (l)]);
3606 6643d27e bellard
      break;
3607 6643d27e bellard

3608 6643d27e bellard
    case '<':
3609 6643d27e bellard
    case '>':
3610 6643d27e bellard
    case '[':
3611 6643d27e bellard
    case ']':
3612 6643d27e bellard
    case '4':
3613 6643d27e bellard
    case '5':
3614 6643d27e bellard
    case 'H':
3615 6643d27e bellard
    case 'W':
3616 6643d27e bellard
    case 'D':
3617 6643d27e bellard
    case 'j':
3618 6643d27e bellard
    case '6':
3619 6643d27e bellard
    case '8':
3620 6643d27e bellard
    case 'V':
3621 6643d27e bellard
    case 'C':
3622 6643d27e bellard
    case 'U':
3623 6643d27e bellard
    case 'k':
3624 6643d27e bellard
    case 'K':
3625 6643d27e bellard
    case 'p':
3626 6643d27e bellard
    case 'q':
3627 6643d27e bellard
    case 'A':
3628 6643d27e bellard
    case 'B':
3629 6643d27e bellard
    case 'E':
3630 6643d27e bellard
      {
3631 6643d27e bellard
        int immed, nbits, shift, signedp, extbits, pcrel, extu, branch;
3632 6643d27e bellard

3633 6643d27e bellard
        shift = 0;
3634 6643d27e bellard
        signedp = 0;
3635 6643d27e bellard
        extbits = 16;
3636 6643d27e bellard
        pcrel = 0;
3637 6643d27e bellard
        extu = 0;
3638 6643d27e bellard
        branch = 0;
3639 6643d27e bellard
        switch (type)
3640 6643d27e bellard
          {
3641 6643d27e bellard
          case '<':
3642 6643d27e bellard
            nbits = 3;
3643 6643d27e bellard
            immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
3644 6643d27e bellard
            extbits = 5;
3645 6643d27e bellard
            extu = 1;
3646 6643d27e bellard
            break;
3647 6643d27e bellard
          case '>':
3648 6643d27e bellard
            nbits = 3;
3649 6643d27e bellard
            immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
3650 6643d27e bellard
            extbits = 5;
3651 6643d27e bellard
            extu = 1;
3652 6643d27e bellard
            break;
3653 6643d27e bellard
          case '[':
3654 6643d27e bellard
            nbits = 3;
3655 6643d27e bellard
            immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
3656 6643d27e bellard
            extbits = 6;
3657 6643d27e bellard
            extu = 1;
3658 6643d27e bellard
            break;
3659 6643d27e bellard
          case ']':
3660 6643d27e bellard
            nbits = 3;
3661 6643d27e bellard
            immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
3662 6643d27e bellard
            extbits = 6;
3663 6643d27e bellard
            extu = 1;
3664 6643d27e bellard
            break;
3665 6643d27e bellard
          case '4':
3666 6643d27e bellard
            nbits = 4;
3667 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM4) & MIPS16OP_MASK_IMM4;
3668 6643d27e bellard
            signedp = 1;
3669 6643d27e bellard
            extbits = 15;
3670 6643d27e bellard
            break;
3671 6643d27e bellard
          case '5':
3672 6643d27e bellard
            nbits = 5;
3673 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3674 6643d27e bellard
            info->insn_type = dis_dref;
3675 6643d27e bellard
            info->data_size = 1;
3676 6643d27e bellard
            break;
3677 6643d27e bellard
          case 'H':
3678 6643d27e bellard
            nbits = 5;
3679 6643d27e bellard
            shift = 1;
3680 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3681 6643d27e bellard
            info->insn_type = dis_dref;
3682 6643d27e bellard
            info->data_size = 2;
3683 6643d27e bellard
            break;
3684 6643d27e bellard
          case 'W':
3685 6643d27e bellard
            nbits = 5;
3686 6643d27e bellard
            shift = 2;
3687 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3688 6643d27e bellard
            if ((op->pinfo & MIPS16_INSN_READ_PC) == 0
3689 6643d27e bellard
                && (op->pinfo & MIPS16_INSN_READ_SP) == 0)
3690 6643d27e bellard
              {
3691 6643d27e bellard
                info->insn_type = dis_dref;
3692 6643d27e bellard
                info->data_size = 4;
3693 6643d27e bellard
              }
3694 6643d27e bellard
            break;
3695 6643d27e bellard
          case 'D':
3696 6643d27e bellard
            nbits = 5;
3697 6643d27e bellard
            shift = 3;
3698 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3699 6643d27e bellard
            info->insn_type = dis_dref;
3700 6643d27e bellard
            info->data_size = 8;
3701 6643d27e bellard
            break;
3702 6643d27e bellard
          case 'j':
3703 6643d27e bellard
            nbits = 5;
3704 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3705 6643d27e bellard
            signedp = 1;
3706 6643d27e bellard
            break;
3707 6643d27e bellard
          case '6':
3708 6643d27e bellard
            nbits = 6;
3709 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6;
3710 6643d27e bellard
            break;
3711 6643d27e bellard
          case '8':
3712 6643d27e bellard
            nbits = 8;
3713 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3714 6643d27e bellard
            break;
3715 6643d27e bellard
          case 'V':
3716 6643d27e bellard
            nbits = 8;
3717 6643d27e bellard
            shift = 2;
3718 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3719 6643d27e bellard
            /* FIXME: This might be lw, or it might be addiu to $sp or
3720 6643d27e bellard
               $pc.  We assume it's load.  */
3721 6643d27e bellard
            info->insn_type = dis_dref;
3722 6643d27e bellard
            info->data_size = 4;
3723 6643d27e bellard
            break;
3724 6643d27e bellard
          case 'C':
3725 6643d27e bellard
            nbits = 8;
3726 6643d27e bellard
            shift = 3;
3727 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3728 6643d27e bellard
            info->insn_type = dis_dref;
3729 6643d27e bellard
            info->data_size = 8;
3730 6643d27e bellard
            break;
3731 6643d27e bellard
          case 'U':
3732 6643d27e bellard
            nbits = 8;
3733 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3734 6643d27e bellard
            extu = 1;
3735 6643d27e bellard
            break;
3736 6643d27e bellard
          case 'k':
3737 6643d27e bellard
            nbits = 8;
3738 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3739 6643d27e bellard
            signedp = 1;
3740 6643d27e bellard
            break;
3741 6643d27e bellard
          case 'K':
3742 6643d27e bellard
            nbits = 8;
3743 6643d27e bellard
            shift = 3;
3744 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3745 6643d27e bellard
            signedp = 1;
3746 6643d27e bellard
            break;
3747 6643d27e bellard
          case 'p':
3748 6643d27e bellard
            nbits = 8;
3749 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3750 6643d27e bellard
            signedp = 1;
3751 6643d27e bellard
            pcrel = 1;
3752 6643d27e bellard
            branch = 1;
3753 6643d27e bellard
            info->insn_type = dis_condbranch;
3754 6643d27e bellard
            break;
3755 6643d27e bellard
          case 'q':
3756 6643d27e bellard
            nbits = 11;
3757 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM11) & MIPS16OP_MASK_IMM11;
3758 6643d27e bellard
            signedp = 1;
3759 6643d27e bellard
            pcrel = 1;
3760 6643d27e bellard
            branch = 1;
3761 6643d27e bellard
            info->insn_type = dis_branch;
3762 6643d27e bellard
            break;
3763 6643d27e bellard
          case 'A':
3764 6643d27e bellard
            nbits = 8;
3765 6643d27e bellard
            shift = 2;
3766 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8;
3767 6643d27e bellard
            pcrel = 1;
3768 6643d27e bellard
            /* FIXME: This can be lw or la.  We assume it is lw.  */
3769 6643d27e bellard
            info->insn_type = dis_dref;
3770 6643d27e bellard
            info->data_size = 4;
3771 6643d27e bellard
            break;
3772 6643d27e bellard
          case 'B':
3773 6643d27e bellard
            nbits = 5;
3774 6643d27e bellard
            shift = 3;
3775 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3776 6643d27e bellard
            pcrel = 1;
3777 6643d27e bellard
            info->insn_type = dis_dref;
3778 6643d27e bellard
            info->data_size = 8;
3779 6643d27e bellard
            break;
3780 6643d27e bellard
          case 'E':
3781 6643d27e bellard
            nbits = 5;
3782 6643d27e bellard
            shift = 2;
3783 6643d27e bellard
            immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5;
3784 6643d27e bellard
            pcrel = 1;
3785 6643d27e bellard
            break;
3786 6643d27e bellard
          default:
3787 6643d27e bellard
            abort ();
3788 6643d27e bellard
          }
3789 6643d27e bellard

3790 6643d27e bellard
        if (! use_extend)
3791 6643d27e bellard
          {
3792 6643d27e bellard
            if (signedp && immed >= (1 << (nbits - 1)))
3793 6643d27e bellard
              immed -= 1 << nbits;
3794 6643d27e bellard
            immed <<= shift;
3795 6643d27e bellard
            if ((type == '<' || type == '>' || type == '[' || type == ']')
3796 6643d27e bellard
                && immed == 0)
3797 6643d27e bellard
              immed = 8;
3798 6643d27e bellard
          }
3799 6643d27e bellard
        else
3800 6643d27e bellard
          {
3801 6643d27e bellard
            if (extbits == 16)
3802 6643d27e bellard
              immed |= ((extend & 0x1f) << 11) | (extend & 0x7e0);
3803 6643d27e bellard
            else if (extbits == 15)
3804 6643d27e bellard
              immed |= ((extend & 0xf) << 11) | (extend & 0x7f0);
3805 6643d27e bellard
            else
3806 6643d27e bellard
              immed = ((extend >> 6) & 0x1f) | (extend & 0x20);
3807 6643d27e bellard
            immed &= (1 << extbits) - 1;
3808 6643d27e bellard
            if (! extu && immed >= (1 << (extbits - 1)))
3809 6643d27e bellard
              immed -= 1 << extbits;
3810 6643d27e bellard
          }
3811 6643d27e bellard

3812 6643d27e bellard
        if (! pcrel)
3813 6643d27e bellard
          (*info->fprintf_func) (info->stream, "%d", immed);
3814 6643d27e bellard
        else
3815 6643d27e bellard
          {
3816 6643d27e bellard
            bfd_vma baseaddr;
3817 6643d27e bellard

3818 6643d27e bellard
            if (branch)
3819 6643d27e bellard
              {
3820 6643d27e bellard
                immed *= 2;
3821 6643d27e bellard
                baseaddr = memaddr + 2;
3822 6643d27e bellard
              }
3823 6643d27e bellard
            else if (use_extend)
3824 6643d27e bellard
              baseaddr = memaddr - 2;
3825 6643d27e bellard
            else
3826 6643d27e bellard
              {
3827 6643d27e bellard
                int status;
3828 6643d27e bellard
                bfd_byte buffer[2];
3829 6643d27e bellard

3830 6643d27e bellard
                baseaddr = memaddr;
3831 6643d27e bellard

3832 6643d27e bellard
                /* If this instruction is in the delay slot of a jr
3833 6643d27e bellard
                   instruction, the base address is the address of the
3834 6643d27e bellard
                   jr instruction.  If it is in the delay slot of jalr
3835 6643d27e bellard
                   instruction, the base address is the address of the
3836 6643d27e bellard
                   jalr instruction.  This test is unreliable: we have
3837 6643d27e bellard
                   no way of knowing whether the previous word is
3838 6643d27e bellard
                   instruction or data.  */
3839 6643d27e bellard
                status = (*info->read_memory_func) (memaddr - 4, buffer, 2,
3840 6643d27e bellard
                                                    info);
3841 6643d27e bellard
                if (status == 0
3842 6643d27e bellard
                    && (((info->endian == BFD_ENDIAN_BIG
3843 6643d27e bellard
                          ? bfd_getb16 (buffer)
3844 6643d27e bellard
                          : bfd_getl16 (buffer))
3845 6643d27e bellard
                         & 0xf800) == 0x1800))
3846 6643d27e bellard
                  baseaddr = memaddr - 4;
3847 6643d27e bellard
                else
3848 6643d27e bellard
                  {
3849 6643d27e bellard
                    status = (*info->read_memory_func) (memaddr - 2, buffer,
3850 6643d27e bellard
                                                        2, info);
3851 6643d27e bellard
                    if (status == 0
3852 6643d27e bellard
                        && (((info->endian == BFD_ENDIAN_BIG
3853 6643d27e bellard
                              ? bfd_getb16 (buffer)
3854 6643d27e bellard
                              : bfd_getl16 (buffer))
3855 6643d27e bellard
                             & 0xf81f) == 0xe800))
3856 6643d27e bellard
                      baseaddr = memaddr - 2;
3857 6643d27e bellard
                  }
3858 6643d27e bellard
              }
3859 6643d27e bellard
            info->target = (baseaddr & ~((1 << shift) - 1)) + immed;
3860 6643d27e bellard
            (*info->print_address_func) (info->target, info);
3861 6643d27e bellard
          }
3862 6643d27e bellard
      }
3863 6643d27e bellard
      break;
3864 6643d27e bellard

3865 6643d27e bellard
    case 'a':
3866 6643d27e bellard
      if (! use_extend)
3867 6643d27e bellard
        extend = 0;
3868 6643d27e bellard
      l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
3869 6643d27e bellard
      info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l;
3870 6643d27e bellard
      (*info->print_address_func) (info->target, info);
3871 6643d27e bellard
      info->insn_type = dis_jsr;
3872 6643d27e bellard
      info->branch_delay_insns = 1;
3873 6643d27e bellard
      break;
3874 6643d27e bellard

3875 6643d27e bellard
    case 'l':
3876 6643d27e bellard
    case 'L':
3877 6643d27e bellard
      {
3878 6643d27e bellard
        int need_comma, amask, smask;
3879 6643d27e bellard

3880 6643d27e bellard
        need_comma = 0;
3881 6643d27e bellard

3882 6643d27e bellard
        l = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6;
3883 6643d27e bellard

3884 6643d27e bellard
        amask = (l >> 3) & 7;
3885 6643d27e bellard

3886 6643d27e bellard
        if (amask > 0 && amask < 5)
3887 6643d27e bellard
          {
3888 6643d27e bellard
            (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]);
3889 6643d27e bellard
            if (amask > 1)
3890 6643d27e bellard
              (*info->fprintf_func) (info->stream, "-%s",
3891 6643d27e bellard
                                     mips_gpr_names[amask + 3]);
3892 6643d27e bellard
            need_comma = 1;
3893 6643d27e bellard
          }
3894 6643d27e bellard

3895 6643d27e bellard
        smask = (l >> 1) & 3;
3896 6643d27e bellard
        if (smask == 3)
3897 6643d27e bellard
          {
3898 6643d27e bellard
            (*info->fprintf_func) (info->stream, "%s??",
3899 6643d27e bellard
                                   need_comma ? "," : "");
3900 6643d27e bellard
            need_comma = 1;
3901 6643d27e bellard
          }
3902 6643d27e bellard
        else if (smask > 0)
3903 6643d27e bellard
          {
3904 6643d27e bellard
            (*info->fprintf_func) (info->stream, "%s%s",
3905 6643d27e bellard
                                   need_comma ? "," : "",
3906 6643d27e bellard
                                   mips_gpr_names[16]);
3907 6643d27e bellard
            if (smask > 1)
3908 6643d27e bellard
              (*info->fprintf_func) (info->stream, "-%s",
3909 6643d27e bellard
                                     mips_gpr_names[smask + 15]);
3910 6643d27e bellard
            need_comma = 1;
3911 6643d27e bellard
          }
3912 6643d27e bellard

3913 6643d27e bellard
        if (l & 1)
3914 6643d27e bellard
          {
3915 6643d27e bellard
            (*info->fprintf_func) (info->stream, "%s%s",
3916 6643d27e bellard
                                   need_comma ? "," : "",
3917 6643d27e bellard
                                   mips_gpr_names[31]);
3918 6643d27e bellard
            need_comma = 1;
3919 6643d27e bellard
          }
3920 6643d27e bellard

3921 6643d27e bellard
        if (amask == 5 || amask == 6)
3922 6643d27e bellard
          {
3923 6643d27e bellard
            (*info->fprintf_func) (info->stream, "%s$f0",
3924 6643d27e bellard
                                   need_comma ? "," : "");
3925 6643d27e bellard
            if (amask == 6)
3926 6643d27e bellard
              (*info->fprintf_func) (info->stream, "-$f1");
3927 6643d27e bellard
          }
3928 6643d27e bellard
      }
3929 6643d27e bellard
      break;
3930 6643d27e bellard

3931 6643d27e bellard
    default:
3932 6643d27e bellard
      /* xgettext:c-format */
3933 6643d27e bellard
      (*info->fprintf_func)
3934 6643d27e bellard
        (info->stream,
3935 6643d27e bellard
         _("# internal disassembler error, unrecognised modifier (%c)"),
3936 6643d27e bellard
         type);
3937 6643d27e bellard
      abort ();
3938 6643d27e bellard
    }
3939 6643d27e bellard
}
3940 6643d27e bellard
#endif
3941 6643d27e bellard
3942 6643d27e bellard
void
3943 6643d27e bellard
print_mips_disassembler_options (stream)
3944 6643d27e bellard
     FILE *stream;
3945 6643d27e bellard
{
3946 6643d27e bellard
  unsigned int i;
3947 6643d27e bellard
3948 6643d27e bellard
  fprintf (stream, _("\n\
3949 6643d27e bellard
The following MIPS specific disassembler options are supported for use\n\
3950 6643d27e bellard
with the -M switch (multiple options should be separated by commas):\n"));
3951 6643d27e bellard
3952 6643d27e bellard
  fprintf (stream, _("\n\
3953 6643d27e bellard
  gpr-names=ABI            Print GPR names according to  specified ABI.\n\
3954 6643d27e bellard
                           Default: based on binary being disassembled.\n"));
3955 6643d27e bellard
3956 6643d27e bellard
  fprintf (stream, _("\n\
3957 6643d27e bellard
  fpr-names=ABI            Print FPR names according to specified ABI.\n\
3958 6643d27e bellard
                           Default: numeric.\n"));
3959 6643d27e bellard
3960 6643d27e bellard
  fprintf (stream, _("\n\
3961 6643d27e bellard
  cp0-names=ARCH           Print CP0 register names according to\n\
3962 6643d27e bellard
                           specified architecture.\n\
3963 6643d27e bellard
                           Default: based on binary being disassembled.\n"));
3964 6643d27e bellard
3965 6643d27e bellard
  fprintf (stream, _("\n\
3966 6643d27e bellard
  hwr-names=ARCH           Print HWR names according to specified \n\
3967 6643d27e bellard
                           architecture.\n\
3968 6643d27e bellard
                           Default: based on binary being disassembled.\n"));
3969 6643d27e bellard
3970 6643d27e bellard
  fprintf (stream, _("\n\
3971 6643d27e bellard
  reg-names=ABI            Print GPR and FPR names according to\n\
3972 6643d27e bellard
                           specified ABI.\n"));
3973 6643d27e bellard
3974 6643d27e bellard
  fprintf (stream, _("\n\
3975 6643d27e bellard
  reg-names=ARCH           Print CP0 register and HWR names according to\n\
3976 6643d27e bellard
                           specified architecture.\n"));
3977 6643d27e bellard
3978 6643d27e bellard
  fprintf (stream, _("\n\
3979 6643d27e bellard
  For the options above, the following values are supported for \"ABI\":\n\
3980 6643d27e bellard
   "));
3981 6643d27e bellard
  for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++)
3982 6643d27e bellard
    fprintf (stream, " %s", mips_abi_choices[i].name);
3983 6643d27e bellard
  fprintf (stream, _("\n"));
3984 6643d27e bellard
3985 6643d27e bellard
  fprintf (stream, _("\n\
3986 6643d27e bellard
  For the options above, The following values are supported for \"ARCH\":\n\
3987 6643d27e bellard
   "));
3988 6643d27e bellard
  for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++)
3989 6643d27e bellard
    if (*mips_arch_choices[i].name != '\0')
3990 6643d27e bellard
      fprintf (stream, " %s", mips_arch_choices[i].name);
3991 6643d27e bellard
  fprintf (stream, _("\n"));
3992 6643d27e bellard
3993 6643d27e bellard
  fprintf (stream, _("\n"));
3994 6643d27e bellard
}