Merge branch 'master' of /home/nchip/public_html/qemu into garage-push
[qemu] / sparc-dis.c
1 /*
2  * These files from binutils are concatenated:
3  * include/opcode/sparc.h, opcodes/sparc-opc.c, opcodes/sparc-dis.c
4  */
5
6 /* include/opcode/sparc.h */
7
8 /* Definitions for opcode table for the sparc.
9    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2002,
10    2003, 2005 Free Software Foundation, Inc.
11
12    This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and
13    the GNU Binutils.
14
15    GAS/GDB is free software; you can redistribute it and/or modify
16    it under the terms of the GNU General Public License as published by
17    the Free Software Foundation; either version 2, or (at your option)
18    any later version.
19
20    GAS/GDB is distributed in the hope that it will be useful,
21    but WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23    GNU General Public License for more details.
24
25    You should have received a copy of the GNU General Public License
26    along with GAS or GDB; see the file COPYING. If not, write to
27    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
28    Boston, MA 02110-1301, USA.  */
29
30 #include <stdlib.h>
31 #include "dis-asm.h"
32
33 /* The SPARC opcode table (and other related data) is defined in
34    the opcodes library in sparc-opc.c.  If you change anything here, make
35    sure you fix up that file, and vice versa.  */
36
37  /* FIXME-someday: perhaps the ,a's and such should be embedded in the
38     instruction's name rather than the args.  This would make gas faster, pinsn
39     slower, but would mess up some macros a bit.  xoxorich. */
40
41 /* List of instruction sets variations.
42    These values are such that each element is either a superset of a
43    preceding each one or they conflict in which case SPARC_OPCODE_CONFLICT_P
44    returns non-zero.
45    The values are indices into `sparc_opcode_archs' defined in sparc-opc.c.
46    Don't change this without updating sparc-opc.c.  */
47
48 enum sparc_opcode_arch_val
49 {
50   SPARC_OPCODE_ARCH_V6 = 0,
51   SPARC_OPCODE_ARCH_V7,
52   SPARC_OPCODE_ARCH_V8,
53   SPARC_OPCODE_ARCH_SPARCLET,
54   SPARC_OPCODE_ARCH_SPARCLITE,
55   /* V9 variants must appear last.  */
56   SPARC_OPCODE_ARCH_V9,
57   SPARC_OPCODE_ARCH_V9A, /* V9 with ultrasparc additions.  */
58   SPARC_OPCODE_ARCH_V9B, /* V9 with ultrasparc and cheetah additions.  */
59   SPARC_OPCODE_ARCH_BAD  /* Error return from sparc_opcode_lookup_arch.  */
60 };
61
62 /* The highest architecture in the table.  */
63 #define SPARC_OPCODE_ARCH_MAX (SPARC_OPCODE_ARCH_BAD - 1)
64
65 /* Given an enum sparc_opcode_arch_val, return the bitmask to use in
66    insn encoding/decoding.  */
67 #define SPARC_OPCODE_ARCH_MASK(arch) (1 << (arch))
68
69 /* Given a valid sparc_opcode_arch_val, return non-zero if it's v9.  */
70 #define SPARC_OPCODE_ARCH_V9_P(arch) ((arch) >= SPARC_OPCODE_ARCH_V9)
71
72 /* Table of cpu variants.  */
73
74 typedef struct sparc_opcode_arch
75 {
76   const char *name;
77   /* Mask of sparc_opcode_arch_val's supported.
78      EG: For v7 this would be
79      (SPARC_OPCODE_ARCH_MASK (..._V6) | SPARC_OPCODE_ARCH_MASK (..._V7)).
80      These are short's because sparc_opcode.architecture is.  */
81   short supported;
82 } sparc_opcode_arch;
83
84 static const struct sparc_opcode_arch sparc_opcode_archs[];
85
86 /* Return the bitmask of supported architectures for ARCH.  */
87 #define SPARC_OPCODE_SUPPORTED(ARCH) (sparc_opcode_archs[ARCH].supported)
88
89 /* Non-zero if ARCH1 conflicts with ARCH2.
90    IE: ARCH1 as a supported bit set that ARCH2 doesn't, and vice versa.  */
91 #define SPARC_OPCODE_CONFLICT_P(ARCH1, ARCH2) \
92  (((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \
93    != SPARC_OPCODE_SUPPORTED (ARCH1)) \
94   && ((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \
95      != SPARC_OPCODE_SUPPORTED (ARCH2)))
96
97 /* Structure of an opcode table entry.  */
98
99 typedef struct sparc_opcode
100 {
101   const char *name;
102   unsigned long match;  /* Bits that must be set.  */
103   unsigned long lose;   /* Bits that must not be set.  */
104   const char *args;
105   /* This was called "delayed" in versions before the flags.  */
106   char flags;
107   short architecture;   /* Bitmask of sparc_opcode_arch_val's.  */
108 } sparc_opcode;
109
110 #define F_DELAYED       1       /* Delayed branch.  */
111 #define F_ALIAS         2       /* Alias for a "real" instruction.  */
112 #define F_UNBR          4       /* Unconditional branch.  */
113 #define F_CONDBR        8       /* Conditional branch.  */
114 #define F_JSR           16      /* Subroutine call.  */
115 #define F_FLOAT         32      /* Floating point instruction (not a branch).  */
116 #define F_FBR           64      /* Floating point branch.  */
117 /* FIXME: Add F_ANACHRONISTIC flag for v9.  */
118
119 /* All sparc opcodes are 32 bits, except for the `set' instruction (really a
120    macro), which is 64 bits. It is handled as a special case.
121
122    The match component is a mask saying which bits must match a particular
123    opcode in order for an instruction to be an instance of that opcode.
124
125    The args component is a string containing one character for each operand of the
126    instruction.
127
128    Kinds of operands:
129         #       Number used by optimizer.       It is ignored.
130         1       rs1 register.
131         2       rs2 register.
132         d       rd register.
133         e       frs1 floating point register.
134         v       frs1 floating point register (double/even).
135         V       frs1 floating point register (quad/multiple of 4).
136         f       frs2 floating point register.
137         B       frs2 floating point register (double/even).
138         R       frs2 floating point register (quad/multiple of 4).
139         g       frsd floating point register.
140         H       frsd floating point register (double/even).
141         J       frsd floating point register (quad/multiple of 4).
142         b       crs1 coprocessor register
143         c       crs2 coprocessor register
144         D       crsd coprocessor register
145         m       alternate space register (asr) in rd
146         M       alternate space register (asr) in rs1
147         h       22 high bits.
148         X       5 bit unsigned immediate
149         Y       6 bit unsigned immediate
150         3       SIAM mode (3 bits). (v9b)
151         K       MEMBAR mask (7 bits). (v9)
152         j       10 bit Immediate. (v9)
153         I       11 bit Immediate. (v9)
154         i       13 bit Immediate.
155         n       22 bit immediate.
156         k       2+14 bit PC relative immediate. (v9)
157         G       19 bit PC relative immediate. (v9)
158         l       22 bit PC relative immediate.
159         L       30 bit PC relative immediate.
160         a       Annul.  The annul bit is set.
161         A       Alternate address space. Stored as 8 bits.
162         C       Coprocessor state register.
163         F       floating point state register.
164         p       Processor state register.
165         N       Branch predict clear ",pn" (v9)
166         T       Branch predict set ",pt" (v9)
167         z       %icc. (v9)
168         Z       %xcc. (v9)
169         q       Floating point queue.
170         r       Single register that is both rs1 and rd.
171         O       Single register that is both rs2 and rd.
172         Q       Coprocessor queue.
173         S       Special case.
174         t       Trap base register.
175         w       Window invalid mask register.
176         y       Y register.
177         u       sparclet coprocessor registers in rd position
178         U       sparclet coprocessor registers in rs1 position
179         E       %ccr. (v9)
180         s       %fprs. (v9)
181         P       %pc.  (v9)
182         W       %tick.  (v9)
183         o       %asi. (v9)
184         6       %fcc0. (v9)
185         7       %fcc1. (v9)
186         8       %fcc2. (v9)
187         9       %fcc3. (v9)
188         !       Privileged Register in rd (v9)
189         ?       Privileged Register in rs1 (v9)
190         *       Prefetch function constant. (v9)
191         x       OPF field (v9 impdep).
192         0       32/64 bit immediate for set or setx (v9) insns
193         _       Ancillary state register in rd (v9a)
194         /       Ancillary state register in rs1 (v9a)
195
196   The following chars are unused: (note: ,[] are used as punctuation)
197   [45].  */
198
199 #define OP2(x)          (((x) & 0x7) << 22)  /* Op2 field of format2 insns.  */
200 #define OP3(x)          (((x) & 0x3f) << 19) /* Op3 field of format3 insns.  */
201 #define OP(x)           ((unsigned) ((x) & 0x3) << 30) /* Op field of all insns.  */
202 #define OPF(x)          (((x) & 0x1ff) << 5) /* Opf field of float insns.  */
203 #define OPF_LOW5(x)     OPF ((x) & 0x1f)     /* V9.  */
204 #define F3F(x, y, z)    (OP (x) | OP3 (y) | OPF (z)) /* Format3 float insns.  */
205 #define F3I(x)          (((x) & 0x1) << 13)  /* Immediate field of format 3 insns.  */
206 #define F2(x, y)        (OP (x) | OP2(y))    /* Format 2 insns.  */
207 #define F3(x, y, z)     (OP (x) | OP3(y) | F3I(z)) /* Format3 insns.  */
208 #define F1(x)           (OP (x))
209 #define DISP30(x)       ((x) & 0x3fffffff)
210 #define ASI(x)          (((x) & 0xff) << 5)  /* Asi field of format3 insns.  */
211 #define RS2(x)          ((x) & 0x1f)         /* Rs2 field.  */
212 #define SIMM13(x)       ((x) & 0x1fff)       /* Simm13 field.  */
213 #define RD(x)           (((x) & 0x1f) << 25) /* Destination register field.  */
214 #define RS1(x)          (((x) & 0x1f) << 14) /* Rs1 field.  */
215 #define ASI_RS2(x)      (SIMM13 (x))
216 #define MEMBAR(x)       ((x) & 0x7f)
217 #define SLCPOP(x)       (((x) & 0x7f) << 6)  /* Sparclet cpop.  */
218
219 #define ANNUL   (1 << 29)
220 #define BPRED   (1 << 19)       /* V9.  */
221 #define IMMED   F3I (1)
222 #define RD_G0   RD (~0)
223 #define RS1_G0  RS1 (~0)
224 #define RS2_G0  RS2 (~0)
225
226 static const struct sparc_opcode sparc_opcodes[];
227
228 static const char *sparc_decode_asi_v8 (int);
229 static const char *sparc_decode_asi_v9 (int);
230 static const char *sparc_decode_membar (int);
231 static const char *sparc_decode_prefetch (int);
232 static const char *sparc_decode_sparclet_cpreg (int);
233
234 /* Local Variables:
235    fill-column: 131
236    comment-column: 0
237    End: */
238
239 /* opcodes/sparc-opc.c */
240
241 /* Table of opcodes for the sparc.
242    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
243    2000, 2002, 2004, 2005
244    Free Software Foundation, Inc.
245
246    This file is part of the BFD library.
247
248    BFD is free software; you can redistribute it and/or modify it under
249    the terms of the GNU General Public License as published by the Free
250    Software Foundation; either version 2, or (at your option) any later
251    version.
252
253    BFD is distributed in the hope that it will be useful, but WITHOUT ANY
254    WARRANTY; without even the implied warranty of MERCHANTABILITY or
255    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
256    for more details.
257
258    You should have received a copy of the GNU General Public License
259    along with this software; see the file COPYING.  If not, write to
260    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
261    Boston, MA 02110-1301, USA.  */
262
263 /* FIXME-someday: perhaps the ,a's and such should be embedded in the
264    instruction's name rather than the args.  This would make gas faster, pinsn
265    slower, but would mess up some macros a bit.  xoxorich. */
266
267 /* Some defines to make life easy.  */
268 #define MASK_V6         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V6)
269 #define MASK_V7         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V7)
270 #define MASK_V8         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8)
271 #define MASK_SPARCLET   SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET)
272 #define MASK_SPARCLITE  SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
273 #define MASK_V9         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9)
274 #define MASK_V9A        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A)
275 #define MASK_V9B        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B)
276
277 /* Bit masks of architectures supporting the insn.  */
278
279 #define v6              (MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLET \
280                          | MASK_SPARCLITE | MASK_V9 | MASK_V9A | MASK_V9B)
281 /* v6 insns not supported on the sparclet.  */
282 #define v6notlet        (MASK_V6 | MASK_V7 | MASK_V8 \
283                          | MASK_SPARCLITE | MASK_V9 | MASK_V9A | MASK_V9B)
284 #define v7              (MASK_V7 | MASK_V8 | MASK_SPARCLET \
285                          | MASK_SPARCLITE | MASK_V9 | MASK_V9A | MASK_V9B)
286 /* Although not all insns are implemented in hardware, sparclite is defined
287    to be a superset of v8.  Unimplemented insns trap and are then theoretically
288    implemented in software.
289    It's not clear that the same is true for sparclet, although the docs
290    suggest it is.  Rather than complicating things, the sparclet assembler
291    recognizes all v8 insns.  */
292 #define v8              (MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE \
293                          | MASK_V9 | MASK_V9A | MASK_V9B)
294 #define sparclet        (MASK_SPARCLET)
295 #define sparclite       (MASK_SPARCLITE)
296 #define v9              (MASK_V9 | MASK_V9A | MASK_V9B)
297 #define v9a             (MASK_V9A | MASK_V9B)
298 #define v9b             (MASK_V9B)
299 /* v6 insns not supported by v9.  */
300 #define v6notv9         (MASK_V6 | MASK_V7 | MASK_V8 \
301                          | MASK_SPARCLET | MASK_SPARCLITE)
302 /* v9a instructions which would appear to be aliases to v9's impdep's
303    otherwise.  */
304 #define v9notv9a        (MASK_V9)
305
306 /* Table of opcode architectures.
307    The order is defined in opcode/sparc.h.  */
308
309 static const struct sparc_opcode_arch sparc_opcode_archs[] =
310 {
311   { "v6", MASK_V6 },
312   { "v7", MASK_V6 | MASK_V7 },
313   { "v8", MASK_V6 | MASK_V7 | MASK_V8 },
314   { "sparclet", MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLET },
315   { "sparclite", MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLITE },
316   /* ??? Don't some v8 privileged insns conflict with v9?  */
317   { "v9", MASK_V6 | MASK_V7 | MASK_V8 | MASK_V9 },
318   /* v9 with ultrasparc additions */
319   { "v9a", MASK_V6 | MASK_V7 | MASK_V8 | MASK_V9 | MASK_V9A },
320   /* v9 with cheetah additions */
321   { "v9b", MASK_V6 | MASK_V7 | MASK_V8 | MASK_V9 | MASK_V9A | MASK_V9B },
322   { NULL, 0 }
323 };
324
325 /* Branch condition field.  */
326 #define COND(x)         (((x) & 0xf) << 25)
327
328 /* v9: Move (MOVcc and FMOVcc) condition field.  */
329 #define MCOND(x,i_or_f) ((((i_or_f) & 1) << 18) | (((x) >> 11) & (0xf << 14))) /* v9 */
330
331 /* v9: Move register (MOVRcc and FMOVRcc) condition field.  */
332 #define RCOND(x)        (((x) & 0x7) << 10)     /* v9 */
333
334 #define CONDA   (COND (0x8))
335 #define CONDCC  (COND (0xd))
336 #define CONDCS  (COND (0x5))
337 #define CONDE   (COND (0x1))
338 #define CONDG   (COND (0xa))
339 #define CONDGE  (COND (0xb))
340 #define CONDGU  (COND (0xc))
341 #define CONDL   (COND (0x3))
342 #define CONDLE  (COND (0x2))
343 #define CONDLEU (COND (0x4))
344 #define CONDN   (COND (0x0))
345 #define CONDNE  (COND (0x9))
346 #define CONDNEG (COND (0x6))
347 #define CONDPOS (COND (0xe))
348 #define CONDVC  (COND (0xf))
349 #define CONDVS  (COND (0x7))
350
351 #define CONDNZ  CONDNE
352 #define CONDZ   CONDE
353 #define CONDGEU CONDCC
354 #define CONDLU  CONDCS
355
356 #define FCONDA          (COND (0x8))
357 #define FCONDE          (COND (0x9))
358 #define FCONDG          (COND (0x6))
359 #define FCONDGE         (COND (0xb))
360 #define FCONDL          (COND (0x4))
361 #define FCONDLE         (COND (0xd))
362 #define FCONDLG         (COND (0x2))
363 #define FCONDN          (COND (0x0))
364 #define FCONDNE         (COND (0x1))
365 #define FCONDO          (COND (0xf))
366 #define FCONDU          (COND (0x7))
367 #define FCONDUE         (COND (0xa))
368 #define FCONDUG         (COND (0x5))
369 #define FCONDUGE        (COND (0xc))
370 #define FCONDUL         (COND (0x3))
371 #define FCONDULE        (COND (0xe))
372
373 #define FCONDNZ FCONDNE
374 #define FCONDZ  FCONDE
375
376 #define ICC             (0)     /* v9 */
377 #define XCC             (1 << 12) /* v9 */
378 #define FCC(x)          (((x) & 0x3) << 11) /* v9 */
379 #define FBFCC(x)        (((x) & 0x3) << 20)     /* v9 */
380 \f
381 /* The order of the opcodes in the table is significant:
382
383         * The assembler requires that all instances of the same mnemonic must
384         be consecutive. If they aren't, the assembler will bomb at runtime.
385
386         * The disassembler should not care about the order of the opcodes.  */
387
388 /* Entries for commutative arithmetic operations.  */
389 /* ??? More entries can make use of this.  */
390 #define COMMUTEOP(opcode, op3, arch_mask) \
391 { opcode,       F3(2, op3, 0), F3(~2, ~op3, ~0)|ASI(~0),        "1,2,d", 0, arch_mask }, \
392 { opcode,       F3(2, op3, 1), F3(~2, ~op3, ~1),                "1,i,d", 0, arch_mask }, \
393 { opcode,       F3(2, op3, 1), F3(~2, ~op3, ~1),                "i,1,d", 0, arch_mask }
394
395 static const struct sparc_opcode sparc_opcodes[] = {
396
397 { "ld", F3(3, 0x00, 0), F3(~3, ~0x00, ~0),              "[1+2],d", 0, v6 },
398 { "ld", F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,       "[1],d", 0, v6 }, /* ld [rs1+%g0],d */
399 { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[1+i],d", 0, v6 },
400 { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[i+1],d", 0, v6 },
401 { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,       "[i],d", 0, v6 },
402 { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ld [rs1+0],d */
403 { "ld", F3(3, 0x20, 0), F3(~3, ~0x20, ~0),              "[1+2],g", 0, v6 },
404 { "ld", F3(3, 0x20, 0), F3(~3, ~0x20, ~0)|RS2_G0,       "[1],g", 0, v6 }, /* ld [rs1+%g0],d */
405 { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1),              "[1+i],g", 0, v6 },
406 { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1),              "[i+1],g", 0, v6 },
407 { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|RS1_G0,       "[i],g", 0, v6 },
408 { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|SIMM13(~0),   "[1],g", 0, v6 }, /* ld [rs1+0],d */
409
410 { "ld", F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RD(~0),       "[1+2],F", 0, v6 },
411 { "ld", F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RS2_G0|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+%g0],d */
412 { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),       "[1+i],F", 0, v6 },
413 { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),       "[i+1],F", 0, v6 },
414 { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~0),"[i],F", 0, v6 },
415 { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+0],d */
416
417 { "ld", F3(3, 0x30, 0), F3(~3, ~0x30, ~0),              "[1+2],D", 0, v6notv9 },
418 { "ld", F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,       "[1],D", 0, v6notv9 }, /* ld [rs1+%g0],d */
419 { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[1+i],D", 0, v6notv9 },
420 { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[i+1],D", 0, v6notv9 },
421 { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,       "[i],D", 0, v6notv9 },
422 { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),   "[1],D", 0, v6notv9 }, /* ld [rs1+0],d */
423 { "ld", F3(3, 0x31, 0), F3(~3, ~0x31, ~0),              "[1+2],C", 0, v6notv9 },
424 { "ld", F3(3, 0x31, 0), F3(~3, ~0x31, ~0)|RS2_G0,       "[1],C", 0, v6notv9 }, /* ld [rs1+%g0],d */
425 { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1),              "[1+i],C", 0, v6notv9 },
426 { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1),              "[i+1],C", 0, v6notv9 },
427 { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|RS1_G0,       "[i],C", 0, v6notv9 },
428 { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|SIMM13(~0),   "[1],C", 0, v6notv9 }, /* ld [rs1+0],d */
429
430 /* The v9 LDUW is the same as the old 'ld' opcode, it is not the same as the
431    'ld' pseudo-op in v9.  */
432 { "lduw",       F3(3, 0x00, 0), F3(~3, ~0x00, ~0),              "[1+2],d", F_ALIAS, v9 },
433 { "lduw",       F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,       "[1],d", F_ALIAS, v9 }, /* ld [rs1+%g0],d */
434 { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[1+i],d", F_ALIAS, v9 },
435 { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[i+1],d", F_ALIAS, v9 },
436 { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,       "[i],d", F_ALIAS, v9 },
437 { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),   "[1],d", F_ALIAS, v9 }, /* ld [rs1+0],d */
438
439 { "ldd",        F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
440 { "ldd",        F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldd [rs1+%g0],d */
441 { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1),              "[1+i],d", 0, v6 },
442 { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1),              "[i+1],d", 0, v6 },
443 { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|RS1_G0,       "[i],d", 0, v6 },
444 { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldd [rs1+0],d */
445 { "ldd",        F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI(~0),      "[1+2],H", 0, v6 },
446 { "ldd",        F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI_RS2(~0),  "[1],H", 0, v6 }, /* ldd [rs1+%g0],d */
447 { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1),              "[1+i],H", 0, v6 },
448 { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1),              "[i+1],H", 0, v6 },
449 { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|RS1_G0,       "[i],H", 0, v6 },
450 { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|SIMM13(~0),   "[1],H", 0, v6 }, /* ldd [rs1+0],d */
451
452 { "ldd",        F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI(~0),      "[1+2],D", 0, v6notv9 },
453 { "ldd",        F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI_RS2(~0),  "[1],D", 0, v6notv9 }, /* ldd [rs1+%g0],d */
454 { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[1+i],D", 0, v6notv9 },
455 { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[i+1],D", 0, v6notv9 },
456 { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,       "[i],D", 0, v6notv9 },
457 { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),   "[1],D", 0, v6notv9 }, /* ldd [rs1+0],d */
458
459 { "ldq",        F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI(~0),      "[1+2],J", 0, v9 },
460 { "ldq",        F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI_RS2(~0),  "[1],J", 0, v9 }, /* ldd [rs1+%g0],d */
461 { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1),              "[1+i],J", 0, v9 },
462 { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1),              "[i+1],J", 0, v9 },
463 { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|RS1_G0,       "[i],J", 0, v9 },
464 { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|SIMM13(~0),   "[1],J", 0, v9 }, /* ldd [rs1+0],d */
465
466 { "ldsb",       F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
467 { "ldsb",       F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldsb [rs1+%g0],d */
468 { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1),              "[1+i],d", 0, v6 },
469 { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1),              "[i+1],d", 0, v6 },
470 { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|RS1_G0,       "[i],d", 0, v6 },
471 { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldsb [rs1+0],d */
472
473 { "ldsh",       F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldsh [rs1+%g0],d */
474 { "ldsh",       F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
475 { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),              "[1+i],d", 0, v6 },
476 { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),              "[i+1],d", 0, v6 },
477 { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|RS1_G0,       "[i],d", 0, v6 },
478 { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldsh [rs1+0],d */
479
480 { "ldstub",     F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
481 { "ldstub",     F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldstub [rs1+%g0],d */
482 { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),              "[1+i],d", 0, v6 },
483 { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),              "[i+1],d", 0, v6 },
484 { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|RS1_G0,       "[i],d", 0, v6 },
485 { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldstub [rs1+0],d */
486
487 { "ldsw",       F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI(~0),      "[1+2],d", 0, v9 },
488 { "ldsw",       F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI_RS2(~0),  "[1],d", 0, v9 }, /* ldsw [rs1+%g0],d */
489 { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1),              "[1+i],d", 0, v9 },
490 { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1),              "[i+1],d", 0, v9 },
491 { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|RS1_G0,       "[i],d", 0, v9 },
492 { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|SIMM13(~0),   "[1],d", 0, v9 }, /* ldsw [rs1+0],d */
493
494 { "ldub",       F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
495 { "ldub",       F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldub [rs1+%g0],d */
496 { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1),              "[1+i],d", 0, v6 },
497 { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1),              "[i+1],d", 0, v6 },
498 { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|RS1_G0,       "[i],d", 0, v6 },
499 { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldub [rs1+0],d */
500
501 { "lduh",       F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
502 { "lduh",       F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* lduh [rs1+%g0],d */
503 { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1),              "[1+i],d", 0, v6 },
504 { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1),              "[i+1],d", 0, v6 },
505 { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|RS1_G0,       "[i],d", 0, v6 },
506 { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* lduh [rs1+0],d */
507
508 { "ldx",        F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI(~0),      "[1+2],d", 0, v9 },
509 { "ldx",        F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI_RS2(~0),  "[1],d", 0, v9 }, /* ldx [rs1+%g0],d */
510 { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),              "[1+i],d", 0, v9 },
511 { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),              "[i+1],d", 0, v9 },
512 { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|RS1_G0,       "[i],d", 0, v9 },
513 { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|SIMM13(~0),   "[1],d", 0, v9 }, /* ldx [rs1+0],d */
514
515 { "ldx",        F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RD(~1), "[1+2],F", 0, v9 },
516 { "ldx",        F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RS2_G0|RD(~1),  "[1],F", 0, v9 }, /* ld [rs1+%g0],d */
517 { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1), "[1+i],F", 0, v9 },
518 { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1), "[i+1],F", 0, v9 },
519 { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~1),  "[i],F", 0, v9 },
520 { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~1),"[1],F", 0, v9 }, /* ld [rs1+0],d */
521
522 { "lda",        F3(3, 0x10, 0), F3(~3, ~0x10, ~0),              "[1+2]A,d", 0, v6 },
523 { "lda",        F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* lda [rs1+%g0],d */
524 { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[1+i]o,d", 0, v9 },
525 { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[i+1]o,d", 0, v9 },
526 { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
527 { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
528 { "lda",        F3(3, 0x30, 0), F3(~3, ~0x30, ~0),              "[1+2]A,g", 0, v9 },
529 { "lda",        F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,       "[1]A,g", 0, v9 }, /* lda [rs1+%g0],d */
530 { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[1+i]o,g", 0, v9 },
531 { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[i+1]o,g", 0, v9 },
532 { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,       "[i]o,g", 0, v9 },
533 { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),   "[1]o,g", 0, v9 }, /* ld [rs1+0],d */
534
535 { "ldda",       F3(3, 0x13, 0), F3(~3, ~0x13, ~0),              "[1+2]A,d", 0, v6 },
536 { "ldda",       F3(3, 0x13, 0), F3(~3, ~0x13, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldda [rs1+%g0],d */
537 { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1),              "[1+i]o,d", 0, v9 },
538 { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1),              "[i+1]o,d", 0, v9 },
539 { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
540 { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
541
542 { "ldda",       F3(3, 0x33, 0), F3(~3, ~0x33, ~0),              "[1+2]A,H", 0, v9 },
543 { "ldda",       F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|RS2_G0,       "[1]A,H", 0, v9 }, /* ldda [rs1+%g0],d */
544 { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[1+i]o,H", 0, v9 },
545 { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[i+1]o,H", 0, v9 },
546 { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,       "[i]o,H", 0, v9 },
547 { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),   "[1]o,H", 0, v9 }, /* ld [rs1+0],d */
548
549 { "ldqa",       F3(3, 0x32, 0), F3(~3, ~0x32, ~0),              "[1+2]A,J", 0, v9 },
550 { "ldqa",       F3(3, 0x32, 0), F3(~3, ~0x32, ~0)|RS2_G0,       "[1]A,J", 0, v9 }, /* ldd [rs1+%g0],d */
551 { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1),              "[1+i]o,J", 0, v9 },
552 { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1),              "[i+1]o,J", 0, v9 },
553 { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|RS1_G0,       "[i]o,J", 0, v9 },
554 { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|SIMM13(~0),   "[1]o,J", 0, v9 }, /* ldd [rs1+0],d */
555
556 { "ldsba",      F3(3, 0x19, 0), F3(~3, ~0x19, ~0),              "[1+2]A,d", 0, v6 },
557 { "ldsba",      F3(3, 0x19, 0), F3(~3, ~0x19, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldsba [rs1+%g0],d */
558 { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1),              "[1+i]o,d", 0, v9 },
559 { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1),              "[i+1]o,d", 0, v9 },
560 { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
561 { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
562
563 { "ldsha",      F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0),              "[1+2]A,d", 0, v6 },
564 { "ldsha",      F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldsha [rs1+%g0],d */
565 { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),              "[1+i]o,d", 0, v9 },
566 { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),              "[i+1]o,d", 0, v9 },
567 { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
568 { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
569
570 { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0),              "[1+2]A,d", 0, v6 },
571 { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldstuba [rs1+%g0],d */
572 { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),              "[1+i]o,d", 0, v9 },
573 { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),              "[i+1]o,d", 0, v9 },
574 { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
575 { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
576
577 { "ldswa",      F3(3, 0x18, 0), F3(~3, ~0x18, ~0),              "[1+2]A,d", 0, v9 },
578 { "ldswa",      F3(3, 0x18, 0), F3(~3, ~0x18, ~0)|RS2_G0,       "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
579 { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1),              "[1+i]o,d", 0, v9 },
580 { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1),              "[i+1]o,d", 0, v9 },
581 { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
582 { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
583
584 { "lduba",      F3(3, 0x11, 0), F3(~3, ~0x11, ~0),              "[1+2]A,d", 0, v6 },
585 { "lduba",      F3(3, 0x11, 0), F3(~3, ~0x11, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* lduba [rs1+%g0],d */
586 { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1),              "[1+i]o,d", 0, v9 },
587 { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1),              "[i+1]o,d", 0, v9 },
588 { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
589 { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
590
591 { "lduha",      F3(3, 0x12, 0), F3(~3, ~0x12, ~0),              "[1+2]A,d", 0, v6 },
592 { "lduha",      F3(3, 0x12, 0), F3(~3, ~0x12, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* lduha [rs1+%g0],d */
593 { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1),              "[1+i]o,d", 0, v9 },
594 { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1),              "[i+1]o,d", 0, v9 },
595 { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
596 { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
597
598 { "lduwa",      F3(3, 0x10, 0), F3(~3, ~0x10, ~0),              "[1+2]A,d", F_ALIAS, v9 }, /* lduwa === lda */
599 { "lduwa",      F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,       "[1]A,d", F_ALIAS, v9 }, /* lda [rs1+%g0],d */
600 { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[1+i]o,d", F_ALIAS, v9 },
601 { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[i+1]o,d", F_ALIAS, v9 },
602 { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,       "[i]o,d", F_ALIAS, v9 },
603 { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),   "[1]o,d", F_ALIAS, v9 }, /* ld [rs1+0],d */
604
605 { "ldxa",       F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0),              "[1+2]A,d", 0, v9 },
606 { "ldxa",       F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0)|RS2_G0,       "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
607 { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),              "[1+i]o,d", 0, v9 },
608 { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),              "[i+1]o,d", 0, v9 },
609 { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
610 { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
611
612 { "st", F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),              "d,[1+2]", 0, v6 },
613 { "st", F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),          "d,[1]", 0, v6 }, /* st d,[rs1+%g0] */
614 { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1),                      "d,[1+i]", 0, v6 },
615 { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1),                      "d,[i+1]", 0, v6 },
616 { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,               "d,[i]", 0, v6 },
617 { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),           "d,[1]", 0, v6 }, /* st d,[rs1+0] */
618 { "st", F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI(~0),              "g,[1+2]", 0, v6 },
619 { "st", F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI_RS2(~0),          "g,[1]", 0, v6 }, /* st d[rs1+%g0] */
620 { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1),                      "g,[1+i]", 0, v6 },
621 { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1),                      "g,[i+1]", 0, v6 },
622 { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|RS1_G0,               "g,[i]", 0, v6 },
623 { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|SIMM13(~0),           "g,[1]", 0, v6 }, /* st d,[rs1+0] */
624
625 { "st", F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI(~0),              "D,[1+2]", 0, v6notv9 },
626 { "st", F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI_RS2(~0),          "D,[1]", 0, v6notv9 }, /* st d,[rs1+%g0] */
627 { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1),                      "D,[1+i]", 0, v6notv9 },
628 { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1),                      "D,[i+1]", 0, v6notv9 },
629 { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,               "D,[i]", 0, v6notv9 },
630 { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),           "D,[1]", 0, v6notv9 }, /* st d,[rs1+0] */
631 { "st", F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI(~0),              "C,[1+2]", 0, v6notv9 },
632 { "st", F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI_RS2(~0),          "C,[1]", 0, v6notv9 }, /* st d,[rs1+%g0] */
633 { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1),                      "C,[1+i]", 0, v6notv9 },
634 { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1),                      "C,[i+1]", 0, v6notv9 },
635 { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|RS1_G0,               "C,[i]", 0, v6notv9 },
636 { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|SIMM13(~0),           "C,[1]", 0, v6notv9 }, /* st d,[rs1+0] */
637
638 { "st", F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI(~0),        "F,[1+2]", 0, v6 },
639 { "st", F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI_RS2(~0),    "F,[1]", 0, v6 }, /* st d,[rs1+%g0] */
640 { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,                "F,[1+i]", 0, v6 },
641 { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,                "F,[i+1]", 0, v6 },
642 { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|RS1_G0,         "F,[i]", 0, v6 },
643 { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|SIMM13(~0),     "F,[1]", 0, v6 }, /* st d,[rs1+0] */
644
645 { "stw",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v9 },
646 { "stw",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
647 { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v9 },
648 { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v9 },
649 { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v9 },
650 { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
651 { "stsw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v9 },
652 { "stsw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
653 { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v9 },
654 { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v9 },
655 { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v9 },
656 { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
657 { "stuw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v9 },
658 { "stuw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
659 { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v9 },
660 { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v9 },
661 { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v9 },
662 { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
663
664 { "spill",      F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
665 { "spill",      F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* st d,[rs1+%g0] */
666 { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v6 },
667 { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v6 },
668 { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
669 { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* st d,[rs1+0] */
670
671 { "sta",        F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", 0, v6 },
672 { "sta",        F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* sta d,[rs1+%g0] */
673 { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", 0, v9 },
674 { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", 0, v9 },
675 { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
676 { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* st d,[rs1+0] */
677
678 { "sta",        F3(3, 0x34, 0), F3(~3, ~0x34, ~0),              "g,[1+2]A", 0, v9 },
679 { "sta",        F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|RS2(~0),      "g,[1]A", 0, v9 }, /* sta d,[rs1+%g0] */
680 { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1),              "g,[1+i]o", 0, v9 },
681 { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1),              "g,[i+1]o", 0, v9 },
682 { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,       "g,[i]o", 0, v9 },
683 { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),   "g,[1]o", 0, v9 }, /* st d,[rs1+0] */
684
685 { "stwa",       F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", F_ALIAS, v9 },
686 { "stwa",       F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
687 { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", F_ALIAS, v9 },
688 { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", F_ALIAS, v9 },
689 { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
690 { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
691 { "stswa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", F_ALIAS, v9 },
692 { "stswa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
693 { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", F_ALIAS, v9 },
694 { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", F_ALIAS, v9 },
695 { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
696 { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
697 { "stuwa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", F_ALIAS, v9 },
698 { "stuwa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
699 { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", F_ALIAS, v9 },
700 { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", F_ALIAS, v9 },
701 { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
702 { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
703
704 { "stb",        F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),      "d,[1+2]", 0, v6 },
705 { "stb",        F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),  "d,[1]", 0, v6 }, /* stb d,[rs1+%g0] */
706 { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[1+i]", 0, v6 },
707 { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[i+1]", 0, v6 },
708 { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,       "d,[i]", 0, v6 },
709 { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),   "d,[1]", 0, v6 }, /* stb d,[rs1+0] */
710
711 { "stsb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
712 { "stsb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+%g0] */
713 { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[1+i]", F_ALIAS, v6 },
714 { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[i+1]", F_ALIAS, v6 },
715 { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
716 { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+0] */
717 { "stub",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
718 { "stub",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+%g0] */
719 { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[1+i]", F_ALIAS, v6 },
720 { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[i+1]", F_ALIAS, v6 },
721 { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
722 { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+0] */
723
724 { "stba",       F3(3, 0x15, 0), F3(~3, ~0x15, ~0),              "d,[1+2]A", 0, v6 },
725 { "stba",       F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* stba d,[rs1+%g0] */
726 { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[1+i]o", 0, v9 },
727 { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[i+1]o", 0, v9 },
728 { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
729 { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* stb d,[rs1+0] */
730
731 { "stsba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0),              "d,[1+2]A", F_ALIAS, v6 },
732 { "stsba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stba d,[rs1+%g0] */
733 { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[1+i]o", F_ALIAS, v9 },
734 { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[i+1]o", F_ALIAS, v9 },
735 { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
736 { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* stb d,[rs1+0] */
737 { "stuba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0),              "d,[1+2]A", F_ALIAS, v6 },
738 { "stuba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stba d,[rs1+%g0] */
739 { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[1+i]o", F_ALIAS, v9 },
740 { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[i+1]o", F_ALIAS, v9 },
741 { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
742 { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* stb d,[rs1+0] */
743
744 { "std",        F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI(~0),      "d,[1+2]", 0, v6 },
745 { "std",        F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI_RS2(~0),  "d,[1]", 0, v6 }, /* std d,[rs1+%g0] */
746 { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[1+i]", 0, v6 },
747 { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[i+1]", 0, v6 },
748 { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|RS1_G0,       "d,[i]", 0, v6 },
749 { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|SIMM13(~0),   "d,[1]", 0, v6 }, /* std d,[rs1+0] */
750
751 { "std",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),      "q,[1+2]", 0, v6notv9 },
752 { "std",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),  "q,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
753 { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "q,[1+i]", 0, v6notv9 },
754 { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "q,[i+1]", 0, v6notv9 },
755 { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,       "q,[i]", 0, v6notv9 },
756 { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),   "q,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
757 { "std",        F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI(~0),      "H,[1+2]", 0, v6 },
758 { "std",        F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI_RS2(~0),  "H,[1]", 0, v6 }, /* std d,[rs1+%g0] */
759 { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1),              "H,[1+i]", 0, v6 },
760 { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1),              "H,[i+1]", 0, v6 },
761 { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|RS1_G0,       "H,[i]", 0, v6 },
762 { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|SIMM13(~0),   "H,[1]", 0, v6 }, /* std d,[rs1+0] */
763
764 { "std",        F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),      "Q,[1+2]", 0, v6notv9 },
765 { "std",        F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),  "Q,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
766 { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "Q,[1+i]", 0, v6notv9 },
767 { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "Q,[i+1]", 0, v6notv9 },
768 { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,       "Q,[i]", 0, v6notv9 },
769 { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),   "Q,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
770 { "std",        F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI(~0),      "D,[1+2]", 0, v6notv9 },
771 { "std",        F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI_RS2(~0),  "D,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
772 { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "D,[1+i]", 0, v6notv9 },
773 { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "D,[i+1]", 0, v6notv9 },
774 { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,       "D,[i]", 0, v6notv9 },
775 { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),   "D,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
776
777 { "spilld",     F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
778 { "spilld",     F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* std d,[rs1+%g0] */
779 { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[1+i]", F_ALIAS, v6 },
780 { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[i+1]", F_ALIAS, v6 },
781 { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
782 { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* std d,[rs1+0] */
783
784 { "stda",       F3(3, 0x17, 0), F3(~3, ~0x17, ~0),              "d,[1+2]A", 0, v6 },
785 { "stda",       F3(3, 0x17, 0), F3(~3, ~0x17, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* stda d,[rs1+%g0] */
786 { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1),              "d,[1+i]o", 0, v9 },
787 { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1),              "d,[i+1]o", 0, v9 },
788 { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
789 { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* std d,[rs1+0] */
790 { "stda",       F3(3, 0x37, 0), F3(~3, ~0x37, ~0),              "H,[1+2]A", 0, v9 },
791 { "stda",       F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|RS2(~0),      "H,[1]A", 0, v9 }, /* stda d,[rs1+%g0] */
792 { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "H,[1+i]o", 0, v9 },
793 { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "H,[i+1]o", 0, v9 },
794 { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,       "H,[i]o", 0, v9 },
795 { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),   "H,[1]o", 0, v9 }, /* std d,[rs1+0] */
796
797 { "sth",        F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),      "d,[1+2]", 0, v6 },
798 { "sth",        F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),  "d,[1]", 0, v6 }, /* sth d,[rs1+%g0] */
799 { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[1+i]", 0, v6 },
800 { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[i+1]", 0, v6 },
801 { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,       "d,[i]", 0, v6 },
802 { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),   "d,[1]", 0, v6 }, /* sth d,[rs1+0] */
803
804 { "stsh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
805 { "stsh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+%g0] */
806 { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[1+i]", F_ALIAS, v6 },
807 { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[i+1]", F_ALIAS, v6 },
808 { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
809 { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+0] */
810 { "stuh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
811 { "stuh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+%g0] */
812 { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[1+i]", F_ALIAS, v6 },
813 { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[i+1]", F_ALIAS, v6 },
814 { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
815 { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+0] */
816
817 { "stha",       F3(3, 0x16, 0), F3(~3, ~0x16, ~0),              "d,[1+2]A", 0, v6 },
818 { "stha",       F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* stha ,[rs1+%g0] */
819 { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[1+i]o", 0, v9 },
820 { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[i+1]o", 0, v9 },
821 { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
822 { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* sth d,[rs1+0] */
823
824 { "stsha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0),              "d,[1+2]A", F_ALIAS, v6 },
825 { "stsha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stha ,[rs1+%g0] */
826 { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[1+i]o", F_ALIAS, v9 },
827 { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[i+1]o", F_ALIAS, v9 },
828 { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
829 { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* sth d,[rs1+0] */
830 { "stuha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0),              "d,[1+2]A", F_ALIAS, v6 },
831 { "stuha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stha ,[rs1+%g0] */
832 { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[1+i]o", F_ALIAS, v9 },
833 { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[i+1]o", F_ALIAS, v9 },
834 { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
835 { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* sth d,[rs1+0] */
836
837 { "stx",        F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI(~0),      "d,[1+2]", 0, v9 },
838 { "stx",        F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI_RS2(~0),  "d,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
839 { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),              "d,[1+i]", 0, v9 },
840 { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),              "d,[i+1]", 0, v9 },
841 { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RS1_G0,       "d,[i]", 0, v9 },
842 { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|SIMM13(~0),   "d,[1]", 0, v9 }, /* stx d,[rs1+0] */
843
844 { "stx",        F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI(~0)|RD(~1), "F,[1+2]", 0, v9 },
845 { "stx",        F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI_RS2(~0)|RD(~1),"F,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
846 { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),         "F,[1+i]", 0, v9 },
847 { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),         "F,[i+1]", 0, v9 },
848 { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RS1_G0|RD(~1),  "F,[i]", 0, v9 },
849 { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|SIMM13(~0)|RD(~1),"F,[1]", 0, v9 }, /* stx d,[rs1+0] */
850
851 { "stxa",       F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0),              "d,[1+2]A", 0, v9 },
852 { "stxa",       F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0)|RS2(~0),      "d,[1]A", 0, v9 }, /* stxa d,[rs1+%g0] */
853 { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),              "d,[1+i]o", 0, v9 },
854 { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),              "d,[i+1]o", 0, v9 },
855 { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
856 { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* stx d,[rs1+0] */
857
858 { "stq",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),      "J,[1+2]", 0, v9 },
859 { "stq",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),  "J,[1]", 0, v9 }, /* stq [rs1+%g0] */
860 { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "J,[1+i]", 0, v9 },
861 { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "J,[i+1]", 0, v9 },
862 { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,       "J,[i]", 0, v9 },
863 { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),   "J,[1]", 0, v9 }, /* stq [rs1+0] */
864
865 { "stqa",       F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),      "J,[1+2]A", 0, v9 },
866 { "stqa",       F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),  "J,[1]A", 0, v9 }, /* stqa [rs1+%g0] */
867 { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "J,[1+i]o", 0, v9 },
868 { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "J,[i+1]o", 0, v9 },
869 { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,       "J,[i]o", 0, v9 },
870 { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),   "J,[1]o", 0, v9 }, /* stqa [rs1+0] */
871
872 { "swap",       F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI(~0),      "[1+2],d", 0, v7 },
873 { "swap",       F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI_RS2(~0),  "[1],d", 0, v7 }, /* swap [rs1+%g0],d */
874 { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),              "[1+i],d", 0, v7 },
875 { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),              "[i+1],d", 0, v7 },
876 { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|RS1_G0,       "[i],d", 0, v7 },
877 { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|SIMM13(~0),   "[1],d", 0, v7 }, /* swap [rs1+0],d */
878
879 { "swapa",      F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0),              "[1+2]A,d", 0, v7 },
880 { "swapa",      F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0)|RS2(~0),      "[1]A,d", 0, v7 }, /* swapa [rs1+%g0],d */
881 { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),              "[1+i]o,d", 0, v9 },
882 { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),              "[i+1]o,d", 0, v9 },
883 { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
884 { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* swap [rs1+0],d */
885
886 { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|ASI(~0),                      "1,2,d", 0, v6 },
887 { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),     "", 0, v6 }, /* restore %g0,%g0,%g0 */
888 { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1),                              "1,i,d", 0, v6 },
889 { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1)|RD_G0|RS1_G0|SIMM13(~0),      "", 0, v6 }, /* restore %g0,0,%g0 */
890
891 { "rett",       F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI(~0),        "1+2", F_UNBR|F_DELAYED, v6 }, /* rett rs1+rs2 */
892 { "rett",       F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1,%g0 */
893 { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,                "1+i", F_UNBR|F_DELAYED, v6 }, /* rett rs1+X */
894 { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,                "i+1", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
895 { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,         "i", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
896 { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,         "i", F_UNBR|F_DELAYED, v6 },    /* rett X */
897 { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|SIMM13(~0),     "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1+0 */
898
899 { "save",       F3(2, 0x3c, 0), F3(~2, ~0x3c, ~0)|ASI(~0),      "1,2,d", 0, v6 },
900 { "save",       F3(2, 0x3c, 1), F3(~2, ~0x3c, ~1),              "1,i,d", 0, v6 },
901 { "save",       0x81e00000,     ~0x81e00000,                    "", F_ALIAS, v6 },
902
903 { "ret",  F3(2, 0x38, 1)|RS1(0x1f)|SIMM13(8), F3(~2, ~0x38, ~1)|SIMM13(~8),            "", F_UNBR|F_DELAYED, v6 }, /* jmpl %i7+8,%g0 */
904 { "retl", F3(2, 0x38, 1)|RS1(0x0f)|SIMM13(8), F3(~2, ~0x38, ~1)|RS1(~0x0f)|SIMM13(~8), "", F_UNBR|F_DELAYED, v6 }, /* jmpl %o7+8,%g0 */
905
906 { "jmpl",       F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI(~0),      "1+2,d", F_JSR|F_DELAYED, v6 },
907 { "jmpl",       F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI_RS2(~0),  "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,d */
908 { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|SIMM13(~0),   "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,d */
909 { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RS1_G0,       "i,d", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,d */
910 { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1),              "1+i,d", F_JSR|F_DELAYED, v6 },
911 { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1),              "i+1,d", F_JSR|F_DELAYED, v6 },
912
913 { "done",       F3(2, 0x3e, 0)|RD(0), F3(~2, ~0x3e, ~0)|RD(~0)|RS1_G0|SIMM13(~0),       "", 0, v9 },
914 { "retry",      F3(2, 0x3e, 0)|RD(1), F3(~2, ~0x3e, ~0)|RD(~1)|RS1_G0|SIMM13(~0),       "", 0, v9 },
915 { "saved",      F3(2, 0x31, 0)|RD(0), F3(~2, ~0x31, ~0)|RD(~0)|RS1_G0|SIMM13(~0),       "", 0, v9 },
916 { "restored",   F3(2, 0x31, 0)|RD(1), F3(~2, ~0x31, ~0)|RD(~1)|RS1_G0|SIMM13(~0),       "", 0, v9 },
917 { "allclean",   F3(2, 0x31, 0)|RD(2), F3(~2, ~0x31, ~0)|RD(~2)|RS1_G0|SIMM13(~0),       "", 0, v9 },
918 { "otherw",     F3(2, 0x31, 0)|RD(3), F3(~2, ~0x31, ~0)|RD(~3)|RS1_G0|SIMM13(~0),       "", 0, v9 },
919 { "normalw",    F3(2, 0x31, 0)|RD(4), F3(~2, ~0x31, ~0)|RD(~4)|RS1_G0|SIMM13(~0),       "", 0, v9 },
920 { "invalw",     F3(2, 0x31, 0)|RD(5), F3(~2, ~0x31, ~0)|RD(~5)|RS1_G0|SIMM13(~0),       "", 0, v9 },
921 { "sir",        F3(2, 0x30, 1)|RD(0xf), F3(~2, ~0x30, ~1)|RD(~0xf)|RS1_G0,              "i", 0, v9 },
922
923 { "flush",      F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),      "1+2", 0, v8 },
924 { "flush",      F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),  "1", 0, v8 }, /* flush rs1+%g0 */
925 { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),   "1", 0, v8 }, /* flush rs1+0 */
926 { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,       "i", 0, v8 }, /* flush %g0+i */
927 { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "1+i", 0, v8 },
928 { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "i+1", 0, v8 },
929
930 /* IFLUSH was renamed to FLUSH in v8.  */
931 { "iflush",     F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),      "1+2", F_ALIAS, v6 },
932 { "iflush",     F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),  "1", F_ALIAS, v6 }, /* flush rs1+%g0 */
933 { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),   "1", F_ALIAS, v6 }, /* flush rs1+0 */
934 { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,       "i", F_ALIAS, v6 },
935 { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "1+i", F_ALIAS, v6 },
936 { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "i+1", F_ALIAS, v6 },
937
938 { "return",     F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI(~0),      "1+2", 0, v9 },
939 { "return",     F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI_RS2(~0),  "1", 0, v9 }, /* return rs1+%g0 */
940 { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|SIMM13(~0),   "1", 0, v9 }, /* return rs1+0 */
941 { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RS1_G0,       "i", 0, v9 }, /* return %g0+i */
942 { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1),              "1+i", 0, v9 },
943 { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1),              "i+1", 0, v9 },
944
945 { "flushw",     F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),     "", 0, v9 },
946
947 { "membar",     F3(2, 0x28, 1)|RS1(0xf), F3(~2, ~0x28, ~1)|RD_G0|RS1(~0xf)|SIMM13(~127), "K", 0, v9 },
948 { "stbar",      F3(2, 0x28, 0)|RS1(0xf), F3(~2, ~0x28, ~0)|RD_G0|RS1(~0xf)|SIMM13(~0), "", 0, v8 },
949
950 { "prefetch",   F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0),              "[1+2],*", 0, v9 },
951 { "prefetch",   F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0)|RS2_G0,       "[1],*", 0, v9 }, /* prefetch [rs1+%g0],prefetch_fcn */
952 { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),              "[1+i],*", 0, v9 },
953 { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),              "[i+1],*", 0, v9 },
954 { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|RS1_G0,       "[i],*", 0, v9 },
955 { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|SIMM13(~0),   "[1],*", 0, v9 }, /* prefetch [rs1+0],prefetch_fcn */
956 { "prefetcha",  F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0),              "[1+2]A,*", 0, v9 },
957 { "prefetcha",  F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0)|RS2_G0,       "[1]A,*", 0, v9 }, /* prefetcha [rs1+%g0],prefetch_fcn */
958 { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),              "[1+i]o,*", 0, v9 },
959 { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),              "[i+1]o,*", 0, v9 },
960 { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|RS1_G0,       "[i]o,*", 0, v9 },
961 { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|SIMM13(~0),   "[1]o,*", 0, v9 }, /* prefetcha [rs1+0],d */
962
963 { "sll",        F3(2, 0x25, 0), F3(~2, ~0x25, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
964 { "sll",        F3(2, 0x25, 1), F3(~2, ~0x25, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
965 { "sra",        F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
966 { "sra",        F3(2, 0x27, 1), F3(~2, ~0x27, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
967 { "srl",        F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
968 { "srl",        F3(2, 0x26, 1), F3(~2, ~0x26, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
969
970 { "sllx",       F3(2, 0x25, 0)|(1<<12), F3(~2, ~0x25, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
971 { "sllx",       F3(2, 0x25, 1)|(1<<12), F3(~2, ~0x25, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
972 { "srax",       F3(2, 0x27, 0)|(1<<12), F3(~2, ~0x27, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
973 { "srax",       F3(2, 0x27, 1)|(1<<12), F3(~2, ~0x27, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
974 { "srlx",       F3(2, 0x26, 0)|(1<<12), F3(~2, ~0x26, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
975 { "srlx",       F3(2, 0x26, 1)|(1<<12), F3(~2, ~0x26, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
976
977 { "mulscc",     F3(2, 0x24, 0), F3(~2, ~0x24, ~0)|ASI(~0),      "1,2,d", 0, v6 },
978 { "mulscc",     F3(2, 0x24, 1), F3(~2, ~0x24, ~1),              "1,i,d", 0, v6 },
979
980 { "divscc",     F3(2, 0x1d, 0), F3(~2, ~0x1d, ~0)|ASI(~0),      "1,2,d", 0, sparclite },
981 { "divscc",     F3(2, 0x1d, 1), F3(~2, ~0x1d, ~1),              "1,i,d", 0, sparclite },
982
983 { "scan",       F3(2, 0x2c, 0), F3(~2, ~0x2c, ~0)|ASI(~0),      "1,2,d", 0, sparclet|sparclite },
984 { "scan",       F3(2, 0x2c, 1), F3(~2, ~0x2c, ~1),              "1,i,d", 0, sparclet|sparclite },
985
986 { "popc",       F3(2, 0x2e, 0), F3(~2, ~0x2e, ~0)|RS1_G0|ASI(~0),"2,d", 0, v9 },
987 { "popc",       F3(2, 0x2e, 1), F3(~2, ~0x2e, ~1)|RS1_G0,       "i,d", 0, v9 },
988
989 { "clr",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),     "d", F_ALIAS, v6 }, /* or %g0,%g0,d */
990 { "clr",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0|SIMM13(~0),            "d", F_ALIAS, v6 }, /* or %g0,0,d       */
991 { "clr",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI(~0),                "[1+2]", F_ALIAS, v6 },
992 { "clr",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI_RS2(~0),            "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+%g0] */
993 { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,                        "[1+i]", F_ALIAS, v6 },
994 { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,                        "[i+1]", F_ALIAS, v6 },
995 { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|RS1_G0,                 "[i]", F_ALIAS, v6 },
996 { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|SIMM13(~0),             "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+0] */
997
998 { "clrb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v6 },
999 { "clrb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+%g0] */
1000 { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,                "[1+i]", F_ALIAS, v6 },
1001 { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,                "[i+1]", F_ALIAS, v6 },
1002 { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|RS1_G0,         "[i]", F_ALIAS, v6 },
1003 { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|SIMM13(~0),     "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+0] */
1004
1005 { "clrh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v6 },
1006 { "clrh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+%g0] */
1007 { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,                "[1+i]", F_ALIAS, v6 },
1008 { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,                "[i+1]", F_ALIAS, v6 },
1009 { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|RS1_G0,         "[i]", F_ALIAS, v6 },
1010 { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|SIMM13(~0),     "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+0] */
1011
1012 { "clrx",       F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v9 },
1013 { "clrx",       F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v9 }, /* stx %g0,[rs1+%g0] */
1014 { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0,                "[1+i]", F_ALIAS, v9 },
1015 { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0,                "[i+1]", F_ALIAS, v9 },
1016 { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0|RS1_G0,         "[i]", F_ALIAS, v9 },
1017 { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0|SIMM13(~0),     "[1]", F_ALIAS, v9 }, /* stx %g0,[rs1+0] */
1018
1019 { "orcc",       F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1020 { "orcc",       F3(2, 0x12, 1), F3(~2, ~0x12, ~1),              "1,i,d", 0, v6 },
1021 { "orcc",       F3(2, 0x12, 1), F3(~2, ~0x12, ~1),              "i,1,d", 0, v6 },
1022
1023 /* This is not a commutative instruction.  */
1024 { "orncc",      F3(2, 0x16, 0), F3(~2, ~0x16, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1025 { "orncc",      F3(2, 0x16, 1), F3(~2, ~0x16, ~1),              "1,i,d", 0, v6 },
1026
1027 /* This is not a commutative instruction.  */
1028 { "orn",        F3(2, 0x06, 0), F3(~2, ~0x06, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1029 { "orn",        F3(2, 0x06, 1), F3(~2, ~0x06, ~1),              "1,i,d", 0, v6 },
1030
1031 { "tst",        F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|ASI_RS2(~0),    "1", 0, v6 }, /* orcc rs1, %g0, %g0 */
1032 { "tst",        F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|RS1_G0|ASI(~0), "2", 0, v6 }, /* orcc %g0, rs2, %g0 */
1033 { "tst",        F3(2, 0x12, 1), F3(~2, ~0x12, ~1)|RD_G0|SIMM13(~0),     "1", 0, v6 }, /* orcc rs1, 0, %g0 */
1034
1035 { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|ASI(~0),              "1,2,m", 0, v8 }, /* wr r,r,%asrX */
1036 { "wr", F3(2, 0x30, 1),         F3(~2, ~0x30, ~1),                      "1,i,m", 0, v8 }, /* wr r,i,%asrX */
1037 { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|ASI_RS2(~0),          "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
1038 { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),        "1,2,y", 0, v6 }, /* wr r,r,%y */
1039 { "wr", F3(2, 0x30, 1),         F3(~2, ~0x30, ~1)|RD_G0,                "1,i,y", 0, v6 }, /* wr r,i,%y */
1040 { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
1041 { "wr", F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),        "1,2,p", 0, v6notv9 }, /* wr r,r,%psr */
1042 { "wr", F3(2, 0x31, 1),         F3(~2, ~0x31, ~1)|RD_G0,                "1,i,p", 0, v6notv9 }, /* wr r,i,%psr */
1043 { "wr", F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
1044 { "wr", F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),        "1,2,w", 0, v6notv9 }, /* wr r,r,%wim */
1045 { "wr", F3(2, 0x32, 1),         F3(~2, ~0x32, ~1)|RD_G0,                "1,i,w", 0, v6notv9 }, /* wr r,i,%wim */
1046 { "wr", F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
1047 { "wr", F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),        "1,2,t", 0, v6notv9 }, /* wr r,r,%tbr */
1048 { "wr", F3(2, 0x33, 1),         F3(~2, ~0x33, ~1)|RD_G0,                "1,i,t", 0, v6notv9 }, /* wr r,i,%tbr */
1049 { "wr", F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
1050
1051 { "wr", F3(2, 0x30, 0)|RD(2),   F3(~2, ~0x30, ~0)|RD(~2)|ASI(~0),       "1,2,E", 0, v9 }, /* wr r,r,%ccr */
1052 { "wr", F3(2, 0x30, 1)|RD(2),   F3(~2, ~0x30, ~1)|RD(~2),               "1,i,E", 0, v9 }, /* wr r,i,%ccr */
1053 { "wr", F3(2, 0x30, 0)|RD(3),   F3(~2, ~0x30, ~0)|RD(~3)|ASI(~0),       "1,2,o", 0, v9 }, /* wr r,r,%asi */
1054 { "wr", F3(2, 0x30, 1)|RD(3),   F3(~2, ~0x30, ~1)|RD(~3),               "1,i,o", 0, v9 }, /* wr r,i,%asi */
1055 { "wr", F3(2, 0x30, 0)|RD(6),   F3(~2, ~0x30, ~0)|RD(~6)|ASI(~0),       "1,2,s", 0, v9 }, /* wr r,r,%fprs */
1056 { "wr", F3(2, 0x30, 1)|RD(6),   F3(~2, ~0x30, ~1)|RD(~6),               "1,i,s", 0, v9 }, /* wr r,i,%fprs */
1057
1058 { "wr", F3(2, 0x30, 0)|RD(16),  F3(~2, ~0x30, ~0)|RD(~16)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%pcr */
1059 { "wr", F3(2, 0x30, 1)|RD(16),  F3(~2, ~0x30, ~1)|RD(~16),              "1,i,_", 0, v9a }, /* wr r,i,%pcr */
1060 { "wr", F3(2, 0x30, 0)|RD(17),  F3(~2, ~0x30, ~0)|RD(~17)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%pic */
1061 { "wr", F3(2, 0x30, 1)|RD(17),  F3(~2, ~0x30, ~1)|RD(~17),              "1,i,_", 0, v9a }, /* wr r,i,%pic */
1062 { "wr", F3(2, 0x30, 0)|RD(18),  F3(~2, ~0x30, ~0)|RD(~18)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%dcr */
1063 { "wr", F3(2, 0x30, 1)|RD(18),  F3(~2, ~0x30, ~1)|RD(~18),              "1,i,_", 0, v9a }, /* wr r,i,%dcr */
1064 { "wr", F3(2, 0x30, 0)|RD(19),  F3(~2, ~0x30, ~0)|RD(~19)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%gsr */
1065 { "wr", F3(2, 0x30, 1)|RD(19),  F3(~2, ~0x30, ~1)|RD(~19),              "1,i,_", 0, v9a }, /* wr r,i,%gsr */
1066 { "wr", F3(2, 0x30, 0)|RD(20),  F3(~2, ~0x30, ~0)|RD(~20)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%set_softint */
1067 { "wr", F3(2, 0x30, 1)|RD(20),  F3(~2, ~0x30, ~1)|RD(~20),              "1,i,_", 0, v9a }, /* wr r,i,%set_softint */
1068 { "wr", F3(2, 0x30, 0)|RD(21),  F3(~2, ~0x30, ~0)|RD(~21)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%clear_softint */
1069 { "wr", F3(2, 0x30, 1)|RD(21),  F3(~2, ~0x30, ~1)|RD(~21),              "1,i,_", 0, v9a }, /* wr r,i,%clear_softint */
1070 { "wr", F3(2, 0x30, 0)|RD(22),  F3(~2, ~0x30, ~0)|RD(~22)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%softint */
1071 { "wr", F3(2, 0x30, 1)|RD(22),  F3(~2, ~0x30, ~1)|RD(~22),              "1,i,_", 0, v9a }, /* wr r,i,%softint */
1072 { "wr", F3(2, 0x30, 0)|RD(23),  F3(~2, ~0x30, ~0)|RD(~23)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%tick_cmpr */
1073 { "wr", F3(2, 0x30, 1)|RD(23),  F3(~2, ~0x30, ~1)|RD(~23),              "1,i,_", 0, v9a }, /* wr r,i,%tick_cmpr */
1074 { "wr", F3(2, 0x30, 0)|RD(24),  F3(~2, ~0x30, ~0)|RD(~24)|ASI(~0),      "1,2,_", 0, v9b }, /* wr r,r,%sys_tick */
1075 { "wr", F3(2, 0x30, 1)|RD(24),  F3(~2, ~0x30, ~1)|RD(~24),              "1,i,_", 0, v9b }, /* wr r,i,%sys_tick */
1076 { "wr", F3(2, 0x30, 0)|RD(25),  F3(~2, ~0x30, ~0)|RD(~25)|ASI(~0),      "1,2,_", 0, v9b }, /* wr r,r,%sys_tick_cmpr */
1077 { "wr", F3(2, 0x30, 1)|RD(25),  F3(~2, ~0x30, ~1)|RD(~25),              "1,i,_", 0, v9b }, /* wr r,i,%sys_tick_cmpr */
1078
1079 { "rd", F3(2, 0x28, 0),                 F3(~2, ~0x28, ~0)|SIMM13(~0),           "M,d", 0, v8 }, /* rd %asrX,r */
1080 { "rd", F3(2, 0x28, 0),                 F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", 0, v6 }, /* rd %y,r */
1081 { "rd", F3(2, 0x29, 0),                 F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", 0, v6notv9 }, /* rd %psr,r */
1082 { "rd", F3(2, 0x2a, 0),                 F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", 0, v6notv9 }, /* rd %wim,r */
1083 { "rd", F3(2, 0x2b, 0),                 F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", 0, v6notv9 }, /* rd %tbr,r */
1084
1085 { "rd", F3(2, 0x28, 0)|RS1(2),          F3(~2, ~0x28, ~0)|RS1(~2)|SIMM13(~0),   "E,d", 0, v9 }, /* rd %ccr,r */
1086 { "rd", F3(2, 0x28, 0)|RS1(3),          F3(~2, ~0x28, ~0)|RS1(~3)|SIMM13(~0),   "o,d", 0, v9 }, /* rd %asi,r */
1087 { "rd", F3(2, 0x28, 0)|RS1(4),          F3(~2, ~0x28, ~0)|RS1(~4)|SIMM13(~0),   "W,d", 0, v9 }, /* rd %tick,r */
1088 { "rd", F3(2, 0x28, 0)|RS1(5),          F3(~2, ~0x28, ~0)|RS1(~5)|SIMM13(~0),   "P,d", 0, v9 }, /* rd %pc,r */
1089 { "rd", F3(2, 0x28, 0)|RS1(6),          F3(~2, ~0x28, ~0)|RS1(~6)|SIMM13(~0),   "s,d", 0, v9 }, /* rd %fprs,r */
1090
1091 { "rd", F3(2, 0x28, 0)|RS1(16),         F3(~2, ~0x28, ~0)|RS1(~16)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %pcr,r */
1092 { "rd", F3(2, 0x28, 0)|RS1(17),         F3(~2, ~0x28, ~0)|RS1(~17)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %pic,r */
1093 { "rd", F3(2, 0x28, 0)|RS1(18),         F3(~2, ~0x28, ~0)|RS1(~18)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %dcr,r */
1094 { "rd", F3(2, 0x28, 0)|RS1(19),         F3(~2, ~0x28, ~0)|RS1(~19)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %gsr,r */
1095 { "rd", F3(2, 0x28, 0)|RS1(22),         F3(~2, ~0x28, ~0)|RS1(~22)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %softint,r */
1096 { "rd", F3(2, 0x28, 0)|RS1(23),         F3(~2, ~0x28, ~0)|RS1(~23)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %tick_cmpr,r */
1097 { "rd", F3(2, 0x28, 0)|RS1(24),         F3(~2, ~0x28, ~0)|RS1(~24)|SIMM13(~0),  "/,d", 0, v9b }, /* rd %sys_tick,r */
1098 { "rd", F3(2, 0x28, 0)|RS1(25),         F3(~2, ~0x28, ~0)|RS1(~25)|SIMM13(~0),  "/,d", 0, v9b }, /* rd %sys_tick_cmpr,r */
1099
1100 { "rdpr",       F3(2, 0x2a, 0),         F3(~2, ~0x2a, ~0)|SIMM13(~0),   "?,d", 0, v9 },   /* rdpr %priv,r */
1101 { "wrpr",       F3(2, 0x32, 0),         F3(~2, ~0x32, ~0),              "1,2,!", 0, v9 }, /* wrpr r1,r2,%priv */
1102 { "wrpr",       F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|SIMM13(~0),   "1,!", 0, v9 },   /* wrpr r1,%priv */
1103 { "wrpr",       F3(2, 0x32, 1),         F3(~2, ~0x32, ~1),              "1,i,!", 0, v9 }, /* wrpr r1,i,%priv */
1104 { "wrpr",       F3(2, 0x32, 1),         F3(~2, ~0x32, ~1),              "i,1,!", F_ALIAS, v9 }, /* wrpr i,r1,%priv */
1105 { "wrpr",       F3(2, 0x32, 1),         F3(~2, ~0x32, ~1)|RS1(~0),      "i,!", 0, v9 },   /* wrpr i,%priv */
1106
1107 { "rdhpr",      F3(2, 0x29, 0),         F3(~2, ~0x29, ~0)|SIMM13(~0),   "$,d", 0, v9 },   /* rdhpr %hpriv,r */
1108 { "wrhpr",      F3(2, 0x33, 0),         F3(~2, ~0x33, ~0),              "1,2,%", 0, v9 }, /* wrhpr r1,r2,%hpriv */
1109 { "wrhpr",      F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|SIMM13(~0),   "1,%", 0, v9 },   /* wrhpr r1,%hpriv */
1110 { "wrhpr",      F3(2, 0x33, 1),         F3(~2, ~0x33, ~1),              "1,i,%", 0, v9 }, /* wrhpr r1,i,%hpriv */
1111 { "wrhpr",      F3(2, 0x33, 1),         F3(~2, ~0x33, ~1),              "i,1,%", F_ALIAS, v9 }, /* wrhpr i,r1,%hpriv */
1112 { "wrhpr",      F3(2, 0x33, 1),         F3(~2, ~0x33, ~1)|RS1(~0),      "i,%", 0, v9 },   /* wrhpr i,%hpriv */
1113
1114 /* ??? This group seems wrong.  A three operand move?  */
1115 { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI(~0),              "1,2,m", F_ALIAS, v8 }, /* wr r,r,%asrX */
1116 { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1),                      "1,i,m", F_ALIAS, v8 }, /* wr r,i,%asrX */
1117 { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),        "1,2,y", F_ALIAS, v6 }, /* wr r,r,%y */
1118 { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,                "1,i,y", F_ALIAS, v6 }, /* wr r,i,%y */
1119 { "mov",        F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),        "1,2,p", F_ALIAS, v6notv9 }, /* wr r,r,%psr */
1120 { "mov",        F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,                "1,i,p", F_ALIAS, v6notv9 }, /* wr r,i,%psr */
1121 { "mov",        F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),        "1,2,w", F_ALIAS, v6notv9 }, /* wr r,r,%wim */
1122 { "mov",        F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,                "1,i,w", F_ALIAS, v6notv9 }, /* wr r,i,%wim */
1123 { "mov",        F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),        "1,2,t", F_ALIAS, v6notv9 }, /* wr r,r,%tbr */
1124 { "mov",        F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,                "1,i,t", F_ALIAS, v6notv9 }, /* wr r,i,%tbr */
1125
1126 { "mov",        F3(2, 0x28, 0), F3(~2, ~0x28, ~0)|SIMM13(~0),           "M,d", F_ALIAS, v8 }, /* rd %asr1,r */
1127 { "mov",        F3(2, 0x28, 0), F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", F_ALIAS, v6 }, /* rd %y,r */
1128 { "mov",        F3(2, 0x29, 0), F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", F_ALIAS, v6notv9 }, /* rd %psr,r */
1129 { "mov",        F3(2, 0x2a, 0), F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", F_ALIAS, v6notv9 }, /* rd %wim,r */
1130 { "mov",        F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", F_ALIAS, v6notv9 }, /* rd %tbr,r */
1131
1132 { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI_RS2(~0),          "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
1133 { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1),                      "i,m", F_ALIAS, v8 }, /* wr %g0,i,%asrX */
1134 { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|SIMM13(~0),           "1,m", F_ALIAS, v8 }, /* wr rs1,0,%asrX */
1135 { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
1136 { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,                "i,y", F_ALIAS, v6 }, /* wr %g0,i,%y */
1137 { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0|SIMM13(~0),     "1,y", F_ALIAS, v6 }, /* wr rs1,0,%y */
1138 { "mov",        F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
1139 { "mov",        F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,                "i,p", F_ALIAS, v6notv9 }, /* wr %g0,i,%psr */
1140 { "mov",        F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0|SIMM13(~0),     "1,p", F_ALIAS, v6notv9 }, /* wr rs1,0,%psr */
1141 { "mov",        F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
1142 { "mov",        F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,                "i,w", F_ALIAS, v6notv9 }, /* wr %g0,i,%wim */
1143 { "mov",        F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0|SIMM13(~0),     "1,w", F_ALIAS, v6notv9 }, /* wr rs1,0,%wim */
1144 { "mov",        F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
1145 { "mov",        F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,                "i,t", F_ALIAS, v6notv9 }, /* wr %g0,i,%tbr */
1146 { "mov",        F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0|SIMM13(~0),     "1,t", F_ALIAS, v6notv9 }, /* wr rs1,0,%tbr */
1147
1148 { "mov",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RS1_G0|ASI(~0),       "2,d", 0, v6 }, /* or %g0,rs2,d */
1149 { "mov",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0,               "i,d", 0, v6 }, /* or %g0,i,d   */
1150 { "mov",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI_RS2(~0),          "1,d", 0, v6 }, /* or rs1,%g0,d   */
1151 { "mov",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|SIMM13(~0),           "1,d", 0, v6 }, /* or rs1,0,d */
1152
1153 { "or", F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1154 { "or", F3(2, 0x02, 1), F3(~2, ~0x02, ~1),              "1,i,d", 0, v6 },
1155 { "or", F3(2, 0x02, 1), F3(~2, ~0x02, ~1),              "i,1,d", 0, v6 },
1156
1157 { "bset",       F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),      "2,r", F_ALIAS, v6 },   /* or rd,rs2,rd */
1158 { "bset",       F3(2, 0x02, 1), F3(~2, ~0x02, ~1),              "i,r", F_ALIAS, v6 },   /* or rd,i,rd */
1159
1160 /* This is not a commutative instruction.  */
1161 { "andn",       F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1162 { "andn",       F3(2, 0x05, 1), F3(~2, ~0x05, ~1),              "1,i,d", 0, v6 },
1163
1164 /* This is not a commutative instruction.  */
1165 { "andncc",     F3(2, 0x15, 0), F3(~2, ~0x15, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1166 { "andncc",     F3(2, 0x15, 1), F3(~2, ~0x15, ~1),              "1,i,d", 0, v6 },
1167
1168 { "bclr",       F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),      "2,r", F_ALIAS, v6 },   /* andn rd,rs2,rd */
1169 { "bclr",       F3(2, 0x05, 1), F3(~2, ~0x05, ~1),              "i,r", F_ALIAS, v6 },   /* andn rd,i,rd */
1170
1171 { "cmp",        F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|RD_G0|ASI(~0),        "1,2", 0, v6 }, /* subcc rs1,rs2,%g0 */
1172 { "cmp",        F3(2, 0x14, 1), F3(~2, ~0x14, ~1)|RD_G0,                "1,i", 0, v6 }, /* subcc rs1,i,%g0 */
1173
1174 { "sub",        F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1175 { "sub",        F3(2, 0x04, 1), F3(~2, ~0x04, ~1),              "1,i,d", 0, v6 },
1176
1177 { "subcc",      F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1178 { "subcc",      F3(2, 0x14, 1), F3(~2, ~0x14, ~1),              "1,i,d", 0, v6 },
1179
1180 { "subx",       F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),      "1,2,d", 0, v6notv9 },
1181 { "subx",       F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),              "1,i,d", 0, v6notv9 },
1182 { "subc",       F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1183 { "subc",       F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),              "1,i,d", 0, v9 },
1184
1185 { "subxcc",     F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),      "1,2,d", 0, v6notv9 },
1186 { "subxcc",     F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),              "1,i,d", 0, v6notv9 },
1187 { "subccc",     F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1188 { "subccc",     F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),              "1,i,d", 0, v9 },
1189
1190 { "and",        F3(2, 0x01, 0), F3(~2, ~0x01, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1191 { "and",        F3(2, 0x01, 1), F3(~2, ~0x01, ~1),              "1,i,d", 0, v6 },
1192 { "and",        F3(2, 0x01, 1), F3(~2, ~0x01, ~1),              "i,1,d", 0, v6 },
1193
1194 { "andcc",      F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1195 { "andcc",      F3(2, 0x11, 1), F3(~2, ~0x11, ~1),              "1,i,d", 0, v6 },
1196 { "andcc",      F3(2, 0x11, 1), F3(~2, ~0x11, ~1),              "i,1,d", 0, v6 },
1197
1198 { "dec",        F3(2, 0x04, 1)|SIMM13(0x1), F3(~2, ~0x04, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* sub rd,1,rd */
1199 { "dec",        F3(2, 0x04, 1),             F3(~2, ~0x04, ~1),                 "i,r", F_ALIAS, v8 },    /* sub rd,imm,rd */
1200 { "deccc",      F3(2, 0x14, 1)|SIMM13(0x1), F3(~2, ~0x14, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* subcc rd,1,rd */
1201 { "deccc",      F3(2, 0x14, 1),             F3(~2, ~0x14, ~1),                 "i,r", F_ALIAS, v8 },    /* subcc rd,imm,rd */
1202 { "inc",        F3(2, 0x00, 1)|SIMM13(0x1), F3(~2, ~0x00, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* add rd,1,rd */
1203 { "inc",        F3(2, 0x00, 1),             F3(~2, ~0x00, ~1),                 "i,r", F_ALIAS, v8 },    /* add rd,imm,rd */
1204 { "inccc",      F3(2, 0x10, 1)|SIMM13(0x1), F3(~2, ~0x10, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* addcc rd,1,rd */
1205 { "inccc",      F3(2, 0x10, 1),             F3(~2, ~0x10, ~1),                 "i,r", F_ALIAS, v8 },    /* addcc rd,imm,rd */
1206
1207 { "btst",       F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|RD_G0|ASI(~0), "1,2", F_ALIAS, v6 },  /* andcc rs1,rs2,%g0 */
1208 { "btst",       F3(2, 0x11, 1), F3(~2, ~0x11, ~1)|RD_G0, "i,1", F_ALIAS, v6 },  /* andcc rs1,i,%g0 */
1209
1210 { "neg",        F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "2,d", F_ALIAS, v6 }, /* sub %g0,rs2,rd */
1211 { "neg",        F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "O", F_ALIAS, v6 }, /* sub %g0,rd,rd */
1212
1213 { "add",        F3(2, 0x00, 0), F3(~2, ~0x00, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1214 { "add",        F3(2, 0x00, 1), F3(~2, ~0x00, ~1),              "1,i,d", 0, v6 },
1215 { "add",        F3(2, 0x00, 1), F3(~2, ~0x00, ~1),              "i,1,d", 0, v6 },
1216 { "addcc",      F3(2, 0x10, 0), F3(~2, ~0x10, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1217 { "addcc",      F3(2, 0x10, 1), F3(~2, ~0x10, ~1),              "1,i,d", 0, v6 },
1218 { "addcc",      F3(2, 0x10, 1), F3(~2, ~0x10, ~1),              "i,1,d", 0, v6 },
1219
1220 { "addx",       F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),      "1,2,d", 0, v6notv9 },
1221 { "addx",       F3(2, 0x08, 1), F3(~2, ~0x08, ~1),              "1,i,d", 0, v6notv9 },
1222 { "addx",       F3(2, 0x08, 1), F3(~2, ~0x08, ~1),              "i,1,d", 0, v6notv9 },
1223 { "addc",       F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1224 { "addc",       F3(2, 0x08, 1), F3(~2, ~0x08, ~1),              "1,i,d", 0, v9 },
1225 { "addc",       F3(2, 0x08, 1), F3(~2, ~0x08, ~1),              "i,1,d", 0, v9 },
1226
1227 { "addxcc",     F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),      "1,2,d", 0, v6notv9 },
1228 { "addxcc",     F3(2, 0x18, 1), F3(~2, ~0x18, ~1),              "1,i,d", 0, v6notv9 },
1229 { "addxcc",     F3(2, 0x18, 1), F3(~2, ~0x18, ~1),              "i,1,d", 0, v6notv9 },
1230 { "addccc",     F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1231 { "addccc",     F3(2, 0x18, 1), F3(~2, ~0x18, ~1),              "1,i,d", 0, v9 },
1232 { "addccc",     F3(2, 0x18, 1), F3(~2, ~0x18, ~1),              "i,1,d", 0, v9 },
1233
1234 { "smul",       F3(2, 0x0b, 0), F3(~2, ~0x0b, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1235 { "smul",       F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),              "1,i,d", 0, v8 },
1236 { "smul",       F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),              "i,1,d", 0, v8 },
1237 { "smulcc",     F3(2, 0x1b, 0), F3(~2, ~0x1b, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1238 { "smulcc",     F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),              "1,i,d", 0, v8 },
1239 { "smulcc",     F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),              "i,1,d", 0, v8 },
1240 { "umul",       F3(2, 0x0a, 0), F3(~2, ~0x0a, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1241 { "umul",       F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),              "1,i,d", 0, v8 },
1242 { "umul",       F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),              "i,1,d", 0, v8 },
1243 { "umulcc",     F3(2, 0x1a, 0), F3(~2, ~0x1a, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1244 { "umulcc",     F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),              "1,i,d", 0, v8 },
1245 { "umulcc",     F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),              "i,1,d", 0, v8 },
1246 { "sdiv",       F3(2, 0x0f, 0), F3(~2, ~0x0f, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1247 { "sdiv",       F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),              "1,i,d", 0, v8 },
1248 { "sdiv",       F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),              "i,1,d", 0, v8 },
1249 { "sdivcc",     F3(2, 0x1f, 0), F3(~2, ~0x1f, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1250 { "sdivcc",     F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),              "1,i,d", 0, v8 },
1251 { "sdivcc",     F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),              "i,1,d", 0, v8 },
1252 { "udiv",       F3(2, 0x0e, 0), F3(~2, ~0x0e, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1253 { "udiv",       F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),              "1,i,d", 0, v8 },
1254 { "udiv",       F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),              "i,1,d", 0, v8 },
1255 { "udivcc",     F3(2, 0x1e, 0), F3(~2, ~0x1e, ~0)|ASI(~0),      "1,2,d", 0, v8 },
1256 { "udivcc",     F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),              "1,i,d", 0, v8 },
1257 { "udivcc",     F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),              "i,1,d", 0, v8 },
1258
1259 { "mulx",       F3(2, 0x09, 0), F3(~2, ~0x09, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1260 { "mulx",       F3(2, 0x09, 1), F3(~2, ~0x09, ~1),              "1,i,d", 0, v9 },
1261 { "sdivx",      F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1262 { "sdivx",      F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),              "1,i,d", 0, v9 },
1263 { "udivx",      F3(2, 0x0d, 0), F3(~2, ~0x0d, ~0)|ASI(~0),      "1,2,d", 0, v9 },
1264 { "udivx",      F3(2, 0x0d, 1), F3(~2, ~0x0d, ~1),              "1,i,d", 0, v9 },
1265
1266 { "call",       F1(0x1), F1(~0x1), "L", F_JSR|F_DELAYED, v6 },
1267 { "call",       F1(0x1), F1(~0x1), "L,#", F_JSR|F_DELAYED, v6 },
1268
1269 { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),     "1+2", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%o7 */
1270 { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),     "1+2,#", F_JSR|F_DELAYED, v6 },
1271 { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0), "1", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%o7 */
1272 { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0), "1,#", F_JSR|F_DELAYED, v6 },
1273 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "1+i", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+i,%o7 */
1274 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "1+i,#", F_JSR|F_DELAYED, v6 },
1275 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "i+1", F_JSR|F_DELAYED, v6 }, /* jmpl i+rs1,%o7 */
1276 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "i+1,#", F_JSR|F_DELAYED, v6 },
1277 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,      "i", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,%o7 */
1278 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,      "i,#", F_JSR|F_DELAYED, v6 },
1279 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),  "1", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,%o7 */
1280 { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),  "1,#", F_JSR|F_DELAYED, v6 },
1281
1282
1283 /* Conditional instructions.
1284
1285    Because this part of the table was such a mess earlier, I have
1286    macrofied it so that all the branches and traps are generated from
1287    a single-line description of each condition value.  John Gilmore. */
1288
1289 /* Define branches -- one annulled, one without, etc. */
1290 #define br(opcode, mask, lose, flags) \
1291  { opcode, (mask)|ANNUL, (lose),       ",a l",   (flags), v6 }, \
1292  { opcode, (mask)      , (lose)|ANNUL, "l",     (flags), v6 }
1293
1294 #define brx(opcode, mask, lose, flags) /* v9 */ \
1295  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), "Z,G",      (flags), v9 }, \
1296  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), ",T Z,G",   (flags), v9 }, \
1297  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a Z,G",   (flags), v9 }, \
1298  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a,T Z,G", (flags), v9 }, \
1299  { opcode, (mask)|(2<<20), ANNUL|BPRED|(lose), ",N Z,G",   (flags), v9 }, \
1300  { opcode, (mask)|(2<<20)|ANNUL, BPRED|(lose), ",a,N Z,G", (flags), v9 }, \
1301  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), "z,G",      (flags), v9 }, \
1302  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), ",T z,G",   (flags), v9 }, \
1303  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a z,G",   (flags), v9 }, \
1304  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a,T z,G", (flags), v9 }, \
1305  { opcode, (mask), ANNUL|BPRED|(lose)|(2<<20), ",N z,G",   (flags), v9 }, \
1306  { opcode, (mask)|ANNUL, BPRED|(lose)|(2<<20), ",a,N z,G", (flags), v9 }
1307
1308 /* Define four traps: reg+reg, reg + immediate, immediate alone, reg alone. */
1309 #define tr(opcode, mask, lose, flags) \
1310  { opcode, (mask)|(2<<11)|IMMED, (lose)|RS1_G0, "Z,i",   (flags), v9 }, /* %g0 + imm */ \
1311  { opcode, (mask)|(2<<11)|IMMED, (lose),        "Z,1+i", (flags), v9 }, /* rs1 + imm */ \
1312  { opcode, (mask)|(2<<11), IMMED|(lose),        "Z,1+2", (flags), v9 }, /* rs1 + rs2 */ \
1313  { opcode, (mask)|(2<<11), IMMED|(lose)|RS2_G0, "Z,1",   (flags), v9 }, /* rs1 + %g0 */ \
1314  { opcode, (mask)|IMMED, (lose)|RS1_G0, "z,i",   (flags)|F_ALIAS, v9 }, /* %g0 + imm */ \
1315  { opcode, (mask)|IMMED, (lose),        "z,1+i", (flags)|F_ALIAS, v9 }, /* rs1 + imm */ \
1316  { opcode, (mask), IMMED|(lose),        "z,1+2", (flags)|F_ALIAS, v9 }, /* rs1 + rs2 */ \
1317  { opcode, (mask), IMMED|(lose)|RS2_G0, "z,1",   (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \
1318  { opcode, (mask)|IMMED, (lose)|RS1_G0,         "i",     (flags), v6 }, /* %g0 + imm */ \
1319  { opcode, (mask)|IMMED, (lose),                "1+i",   (flags), v6 }, /* rs1 + imm */ \
1320  { opcode, (mask), IMMED|(lose),                "1+2",   (flags), v6 }, /* rs1 + rs2 */ \
1321  { opcode, (mask), IMMED|(lose)|RS2_G0,         "1",     (flags), v6 } /* rs1 + %g0 */
1322
1323 /* v9: We must put `brx' before `br', to ensure that we never match something
1324    v9: against an expression unless it is an expression.  Otherwise, we end
1325    v9: up with undefined symbol tables entries, because they get added, but
1326    v9: are not deleted if the pattern fails to match.  */
1327
1328 /* Define both branches and traps based on condition mask */
1329 #define cond(bop, top, mask, flags) \
1330   brx(bop, F2(0, 1)|(mask), F2(~0, ~1)|((~mask)&COND(~0)), F_DELAYED|(flags)), /* v9 */ \
1331   br(bop,  F2(0, 2)|(mask), F2(~0, ~2)|((~mask)&COND(~0)), F_DELAYED|(flags)), \
1332   tr(top,  F3(2, 0x3a, 0)|(mask), F3(~2, ~0x3a, 0)|((~mask)&COND(~0)), ((flags) & ~(F_UNBR|F_CONDBR)))
1333
1334 /* Define all the conditions, all the branches, all the traps.  */
1335
1336 /* Standard branch, trap mnemonics */
1337 cond ("b",      "ta",   CONDA, F_UNBR),
1338 /* Alternative form (just for assembly, not for disassembly) */
1339 cond ("ba",     "t",    CONDA, F_UNBR|F_ALIAS),
1340
1341 cond ("bcc",    "tcc",  CONDCC, F_CONDBR),
1342 cond ("bcs",    "tcs",  CONDCS, F_CONDBR),
1343 cond ("be",     "te",   CONDE, F_CONDBR),
1344 cond ("beq",    "teq",  CONDE, F_CONDBR|F_ALIAS),
1345 cond ("bg",     "tg",   CONDG, F_CONDBR),
1346 cond ("bgt",    "tgt",  CONDG, F_CONDBR|F_ALIAS),
1347 cond ("bge",    "tge",  CONDGE, F_CONDBR),
1348 cond ("bgeu",   "tgeu", CONDGEU, F_CONDBR|F_ALIAS), /* for cc */
1349 cond ("bgu",    "tgu",  CONDGU, F_CONDBR),
1350 cond ("bl",     "tl",   CONDL, F_CONDBR),
1351 cond ("blt",    "tlt",  CONDL, F_CONDBR|F_ALIAS),
1352 cond ("ble",    "tle",  CONDLE, F_CONDBR),
1353 cond ("bleu",   "tleu", CONDLEU, F_CONDBR),
1354 cond ("blu",    "tlu",  CONDLU, F_CONDBR|F_ALIAS), /* for cs */
1355 cond ("bn",     "tn",   CONDN, F_CONDBR),
1356 cond ("bne",    "tne",  CONDNE, F_CONDBR),
1357 cond ("bneg",   "tneg", CONDNEG, F_CONDBR),
1358 cond ("bnz",    "tnz",  CONDNZ, F_CONDBR|F_ALIAS), /* for ne */
1359 cond ("bpos",   "tpos", CONDPOS, F_CONDBR),
1360 cond ("bvc",    "tvc",  CONDVC, F_CONDBR),
1361 cond ("bvs",    "tvs",  CONDVS, F_CONDBR),
1362 cond ("bz",     "tz",   CONDZ, F_CONDBR|F_ALIAS), /* for e */
1363
1364 #undef cond
1365 #undef br
1366 #undef brr /* v9 */
1367 #undef tr
1368
1369 #define brr(opcode, mask, lose, flags) /* v9 */ \
1370  { opcode, (mask)|BPRED, ANNUL|(lose), "1,k",      F_DELAYED|(flags), v9 }, \
1371  { opcode, (mask)|BPRED, ANNUL|(lose), ",T 1,k",   F_DELAYED|(flags), v9 }, \
1372  { opcode, (mask)|BPRED|ANNUL, (lose), ",a 1,k",   F_DELAYED|(flags), v9 }, \
1373  { opcode, (mask)|BPRED|ANNUL, (lose), ",a,T 1,k", F_DELAYED|(flags), v9 }, \
1374  { opcode, (mask), ANNUL|BPRED|(lose), ",N 1,k",   F_DELAYED|(flags), v9 }, \
1375  { opcode, (mask)|ANNUL, BPRED|(lose), ",a,N 1,k", F_DELAYED|(flags), v9 }
1376
1377 #define condr(bop, mask, flags) /* v9 */ \
1378   brr(bop, F2(0, 3)|COND(mask), F2(~0, ~3)|COND(~(mask)), (flags)) /* v9 */
1379
1380 /* v9 */ condr("brnz", 0x5, F_CONDBR),
1381 /* v9 */ condr("brz", 0x1, F_CONDBR),
1382 /* v9 */ condr("brgez", 0x7, F_CONDBR),
1383 /* v9 */ condr("brlz", 0x3, F_CONDBR),
1384 /* v9 */ condr("brlez", 0x2, F_CONDBR),
1385 /* v9 */ condr("brgz", 0x6, F_CONDBR),
1386
1387 #undef condr /* v9 */
1388 #undef brr /* v9 */
1389
1390 #define movr(opcode, mask, flags) /* v9 */ \
1391  { opcode, F3(2, 0x2f, 0)|RCOND(mask), F3(~2, ~0x2f, ~0)|RCOND(~(mask)), "1,2,d", (flags), v9 }, \
1392  { opcode, F3(2, 0x2f, 1)|RCOND(mask), F3(~2, ~0x2f, ~1)|RCOND(~(mask)), "1,j,d", (flags), v9 }
1393
1394 #define fmrrs(opcode, mask, lose, flags) /* v9 */ \
1395  { opcode, (mask), (lose), "1,f,g", (flags) | F_FLOAT, v9 }
1396 #define fmrrd(opcode, mask, lose, flags) /* v9 */ \
1397  { opcode, (mask), (lose), "1,B,H", (flags) | F_FLOAT, v9 }
1398 #define fmrrq(opcode, mask, lose, flags) /* v9 */ \
1399  { opcode, (mask), (lose), "1,R,J", (flags) | F_FLOAT, v9 }
1400
1401 #define fmovrs(mop, mask, flags) /* v9 */ \
1402   fmrrs(mop, F3(2, 0x35, 0)|OPF_LOW5(5)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~5)|RCOND(~(mask)), (flags)) /* v9 */
1403 #define fmovrd(mop, mask, flags) /* v9 */ \
1404   fmrrd(mop, F3(2, 0x35, 0)|OPF_LOW5(6)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~6)|RCOND(~(mask)), (flags)) /* v9 */
1405 #define fmovrq(mop, mask, flags) /* v9 */ \
1406   fmrrq(mop, F3(2, 0x35, 0)|OPF_LOW5(7)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~7)|RCOND(~(mask)), (flags)) /* v9 */
1407
1408 /* v9 */ movr("movrne", 0x5, 0),
1409 /* v9 */ movr("movre", 0x1, 0),
1410 /* v9 */ movr("movrgez", 0x7, 0),
1411 /* v9 */ movr("movrlz", 0x3, 0),
1412 /* v9 */ movr("movrlez", 0x2, 0),
1413 /* v9 */ movr("movrgz", 0x6, 0),
1414 /* v9 */ movr("movrnz", 0x5, F_ALIAS),
1415 /* v9 */ movr("movrz", 0x1, F_ALIAS),
1416
1417 /* v9 */ fmovrs("fmovrsne", 0x5, 0),
1418 /* v9 */ fmovrs("fmovrse", 0x1, 0),
1419 /* v9 */ fmovrs("fmovrsgez", 0x7, 0),
1420 /* v9 */ fmovrs("fmovrslz", 0x3, 0),
1421 /* v9 */ fmovrs("fmovrslez", 0x2, 0),
1422 /* v9 */ fmovrs("fmovrsgz", 0x6, 0),
1423 /* v9 */ fmovrs("fmovrsnz", 0x5, F_ALIAS),
1424 /* v9 */ fmovrs("fmovrsz", 0x1, F_ALIAS),
1425
1426 /* v9 */ fmovrd("fmovrdne", 0x5, 0),
1427 /* v9 */ fmovrd("fmovrde", 0x1, 0),
1428 /* v9 */ fmovrd("fmovrdgez", 0x7, 0),
1429 /* v9 */ fmovrd("fmovrdlz", 0x3, 0),
1430 /* v9 */ fmovrd("fmovrdlez", 0x2, 0),
1431 /* v9 */ fmovrd("fmovrdgz", 0x6, 0),
1432 /* v9 */ fmovrd("fmovrdnz", 0x5, F_ALIAS),
1433 /* v9 */ fmovrd("fmovrdz", 0x1, F_ALIAS),
1434
1435 /* v9 */ fmovrq("fmovrqne", 0x5, 0),
1436 /* v9 */ fmovrq("fmovrqe", 0x1, 0),
1437 /* v9 */ fmovrq("fmovrqgez", 0x7, 0),
1438 /* v9 */ fmovrq("fmovrqlz", 0x3, 0),
1439 /* v9 */ fmovrq("fmovrqlez", 0x2, 0),
1440 /* v9 */ fmovrq("fmovrqgz", 0x6, 0),
1441 /* v9 */ fmovrq("fmovrqnz", 0x5, F_ALIAS),
1442 /* v9 */ fmovrq("fmovrqz", 0x1, F_ALIAS),
1443
1444 #undef movr /* v9 */
1445 #undef fmovr /* v9 */
1446 #undef fmrr /* v9 */
1447
1448 #define movicc(opcode, cond, flags) /* v9 */ \
1449   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|XCC|(1<<11), "z,2,d", flags, v9 }, \
1450   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|XCC|(1<<11), "z,I,d", flags, v9 }, \
1451   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|(1<<11),     "Z,2,d", flags, v9 }, \
1452   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|(1<<11),     "Z,I,d", flags, v9 }
1453
1454 #define movfcc(opcode, fcond, flags) /* v9 */ \
1455   { opcode, F3(2, 0x2c, 0)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~0), "6,2,d", flags, v9 }, \
1456   { opcode, F3(2, 0x2c, 1)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~1), "6,I,d", flags, v9 }, \
1457   { opcode, F3(2, 0x2c, 0)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~0), "7,2,d", flags, v9 }, \
1458   { opcode, F3(2, 0x2c, 1)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~1), "7,I,d", flags, v9 }, \
1459   { opcode, F3(2, 0x2c, 0)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~0), "8,2,d", flags, v9 }, \
1460   { opcode, F3(2, 0x2c, 1)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~1), "8,I,d", flags, v9 }, \
1461   { opcode, F3(2, 0x2c, 0)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~0), "9,2,d", flags, v9 }, \
1462   { opcode, F3(2, 0x2c, 1)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~1), "9,I,d", flags, v9 }
1463
1464 #define movcc(opcode, cond, fcond, flags) /* v9 */ \
1465   movfcc (opcode, fcond, flags), /* v9 */ \
1466   movicc (opcode, cond, flags) /* v9 */
1467
1468 /* v9 */ movcc  ("mova",        CONDA, FCONDA, 0),
1469 /* v9 */ movicc ("movcc",       CONDCC, 0),
1470 /* v9 */ movicc ("movgeu",      CONDGEU, F_ALIAS),
1471 /* v9 */ movicc ("movcs",       CONDCS, 0),
1472 /* v9 */ movicc ("movlu",       CONDLU, F_ALIAS),
1473 /* v9 */ movcc  ("move",        CONDE, FCONDE, 0),
1474 /* v9 */ movcc  ("movg",        CONDG, FCONDG, 0),
1475 /* v9 */ movcc  ("movge",       CONDGE, FCONDGE, 0),
1476 /* v9 */ movicc ("movgu",       CONDGU, 0),
1477 /* v9 */ movcc  ("movl",        CONDL, FCONDL, 0),
1478 /* v9 */ movcc  ("movle",       CONDLE, FCONDLE, 0),
1479 /* v9 */ movicc ("movleu",      CONDLEU, 0),
1480 /* v9 */ movfcc ("movlg",       FCONDLG, 0),
1481 /* v9 */ movcc  ("movn",        CONDN, FCONDN, 0),
1482 /* v9 */ movcc  ("movne",       CONDNE, FCONDNE, 0),
1483 /* v9 */ movicc ("movneg",      CONDNEG, 0),
1484 /* v9 */ movcc  ("movnz",       CONDNZ, FCONDNZ, F_ALIAS),
1485 /* v9 */ movfcc ("movo",        FCONDO, 0),
1486 /* v9 */ movicc ("movpos",      CONDPOS, 0),
1487 /* v9 */ movfcc ("movu",        FCONDU, 0),
1488 /* v9 */ movfcc ("movue",       FCONDUE, 0),
1489 /* v9 */ movfcc ("movug",       FCONDUG, 0),
1490 /* v9 */ movfcc ("movuge",      FCONDUGE, 0),
1491 /* v9 */ movfcc ("movul",       FCONDUL, 0),
1492 /* v9 */ movfcc ("movule",      FCONDULE, 0),
1493 /* v9 */ movicc ("movvc",       CONDVC, 0),
1494 /* v9 */ movicc ("movvs",       CONDVS, 0),
1495 /* v9 */ movcc  ("movz",        CONDZ, FCONDZ, F_ALIAS),
1496
1497 #undef movicc /* v9 */
1498 #undef movfcc /* v9 */
1499 #undef movcc /* v9 */
1500
1501 #define FM_SF 1         /* v9 - values for fpsize */
1502 #define FM_DF 2         /* v9 */
1503 #define FM_QF 3         /* v9 */
1504
1505 #define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \
1506 { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags, v9 }, \
1507 { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags, v9 }
1508
1509 #define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \
1510 { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \
1511 { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \
1512 { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \
1513 { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 }
1514
1515 /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
1516 #define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \
1517 { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags | F_FLOAT, v9 }, \
1518 { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \
1519 { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags | F_FLOAT, v9 }, \
1520 { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \
1521 { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \
1522 { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 }
1523
1524 #define fmovicc(suffix, cond, flags) /* v9 */ \
1525 fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags),            \
1526 fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags),            \
1527 fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags)
1528
1529 #define fmovfcc(suffix, fcond, flags) /* v9 */ \
1530 fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags),           \
1531 fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags),           \
1532 fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags)
1533
1534 #define fmovcc(suffix, cond, fcond, flags) /* v9 */ \
1535 fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags),      \
1536 fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags),      \
1537 fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags)
1538
1539 /* v9 */ fmovcc  ("a", CONDA, FCONDA, 0),
1540 /* v9 */ fmovicc ("cc", CONDCC, 0),
1541 /* v9 */ fmovicc ("cs", CONDCS, 0),
1542 /* v9 */ fmovcc  ("e", CONDE, FCONDE, 0),
1543 /* v9 */ fmovcc  ("g", CONDG, FCONDG, 0),
1544 /* v9 */ fmovcc  ("ge", CONDGE, FCONDGE, 0),
1545 /* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS),
1546 /* v9 */ fmovicc ("gu", CONDGU, 0),
1547 /* v9 */ fmovcc  ("l", CONDL, FCONDL, 0),
1548 /* v9 */ fmovcc  ("le", CONDLE, FCONDLE, 0),
1549 /* v9 */ fmovicc ("leu", CONDLEU, 0),
1550 /* v9 */ fmovfcc ("lg", FCONDLG, 0),
1551 /* v9 */ fmovicc ("lu", CONDLU, F_ALIAS),
1552 /* v9 */ fmovcc  ("n", CONDN, FCONDN, 0),
1553 /* v9 */ fmovcc  ("ne", CONDNE, FCONDNE, 0),
1554 /* v9 */ fmovicc ("neg", CONDNEG, 0),
1555 /* v9 */ fmovcc  ("nz", CONDNZ, FCONDNZ, F_ALIAS),
1556 /* v9 */ fmovfcc ("o", FCONDO, 0),
1557 /* v9 */ fmovicc ("pos", CONDPOS, 0),
1558 /* v9 */ fmovfcc ("u", FCONDU, 0),
1559 /* v9 */ fmovfcc ("ue", FCONDUE, 0),
1560 /* v9 */ fmovfcc ("ug", FCONDUG, 0),
1561 /* v9 */ fmovfcc ("uge", FCONDUGE, 0),
1562 /* v9 */ fmovfcc ("ul", FCONDUL, 0),
1563 /* v9 */ fmovfcc ("ule", FCONDULE, 0),
1564 /* v9 */ fmovicc ("vc", CONDVC, 0),
1565 /* v9 */ fmovicc ("vs", CONDVS, 0),
1566 /* v9 */ fmovcc  ("z", CONDZ, FCONDZ, F_ALIAS),
1567
1568 #undef fmoviccx /* v9 */
1569 #undef fmovfccx /* v9 */
1570 #undef fmovccx /* v9 */
1571 #undef fmovicc /* v9 */
1572 #undef fmovfcc /* v9 */
1573 #undef fmovcc /* v9 */
1574 #undef FM_DF /* v9 */
1575 #undef FM_QF /* v9 */
1576 #undef FM_SF /* v9 */
1577
1578 /* Coprocessor branches.  */
1579 #define CBR(opcode, mask, lose, flags, arch) \
1580  { opcode, (mask), ANNUL | (lose), "l",    flags | F_DELAYED, arch }, \
1581  { opcode, (mask) | ANNUL, (lose), ",a l", flags | F_DELAYED, arch }
1582
1583 /* Floating point branches.  */
1584 #define FBR(opcode, mask, lose, flags) \
1585  { opcode, (mask), ANNUL | (lose), "l",    flags | F_DELAYED | F_FBR, v6 }, \
1586  { opcode, (mask) | ANNUL, (lose), ",a l", flags | F_DELAYED | F_FBR, v6 }
1587
1588 /* V9 extended floating point branches.  */
1589 #define FBRX(opcode, mask, lose, flags) /* v9 */ \
1590  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), "6,G",      flags|F_DELAYED|F_FBR, v9 }, \
1591  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), ",T 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
1592  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
1593  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a,T 6,G", flags|F_DELAYED|F_FBR, v9 }, \
1594  { opcode, FBFCC(0)|(mask), ANNUL|BPRED|FBFCC(~0)|(lose), ",N 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
1595  { opcode, FBFCC(0)|(mask)|ANNUL, BPRED|FBFCC(~0)|(lose), ",a,N 6,G", flags|F_DELAYED|F_FBR, v9 }, \
1596  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), "7,G",      flags|F_DELAYED|F_FBR, v9 }, \
1597  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), ",T 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
1598  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
1599  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a,T 7,G", flags|F_DELAYED|F_FBR, v9 }, \
1600  { opcode, FBFCC(1)|(mask), ANNUL|BPRED|FBFCC(~1)|(lose), ",N 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
1601  { opcode, FBFCC(1)|(mask)|ANNUL, BPRED|FBFCC(~1)|(lose), ",a,N 7,G", flags|F_DELAYED|F_FBR, v9 }, \
1602  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), "8,G",      flags|F_DELAYED|F_FBR, v9 }, \
1603  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), ",T 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
1604  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
1605  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a,T 8,G", flags|F_DELAYED|F_FBR, v9 }, \
1606  { opcode, FBFCC(2)|(mask), ANNUL|BPRED|FBFCC(~2)|(lose), ",N 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
1607  { opcode, FBFCC(2)|(mask)|ANNUL, BPRED|FBFCC(~2)|(lose), ",a,N 8,G", flags|F_DELAYED|F_FBR, v9 }, \
1608  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), "9,G",      flags|F_DELAYED|F_FBR, v9 }, \
1609  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), ",T 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
1610  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
1611  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a,T 9,G", flags|F_DELAYED|F_FBR, v9 }, \
1612  { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), ",N 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
1613  { opcode, FBFCC(3)|(mask)|ANNUL, BPRED|FBFCC(~3)|(lose), ",a,N 9,G", flags|F_DELAYED|F_FBR, v9 }
1614
1615 /* v9: We must put `FBRX' before `FBR', to ensure that we never match
1616    v9: something against an expression unless it is an expression.  Otherwise,
1617    v9: we end up with undefined symbol tables entries, because they get added,
1618    v9: but are not deleted if the pattern fails to match.  */
1619
1620 #define CONDFC(fop, cop, mask, flags) \
1621   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
1622   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
1623   CBR(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags, v6notlet)
1624
1625 #define CONDFCL(fop, cop, mask, flags) \
1626   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
1627   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
1628   CBR(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags, v6)
1629
1630 #define CONDF(fop, mask, flags) \
1631   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
1632   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags)
1633
1634 CONDFC  ("fb",    "cb",    0x8, F_UNBR),
1635 CONDFCL ("fba",   "cba",   0x8, F_UNBR|F_ALIAS),
1636 CONDFC  ("fbe",   "cb0",   0x9, F_CONDBR),
1637 CONDF   ("fbz",            0x9, F_CONDBR|F_ALIAS),
1638 CONDFC  ("fbg",   "cb2",   0x6, F_CONDBR),
1639 CONDFC  ("fbge",  "cb02",  0xb, F_CONDBR),
1640 CONDFC  ("fbl",   "cb1",   0x4, F_CONDBR),
1641 CONDFC  ("fble",  "cb01",  0xd, F_CONDBR),
1642 CONDFC  ("fblg",  "cb12",  0x2, F_CONDBR),
1643 CONDFCL ("fbn",   "cbn",   0x0, F_UNBR),
1644 CONDFC  ("fbne",  "cb123", 0x1, F_CONDBR),
1645 CONDF   ("fbnz",           0x1, F_CONDBR|F_ALIAS),
1646 CONDFC  ("fbo",   "cb012", 0xf, F_CONDBR),
1647 CONDFC  ("fbu",   "cb3",   0x7, F_CONDBR),
1648 CONDFC  ("fbue",  "cb03",  0xa, F_CONDBR),
1649 CONDFC  ("fbug",  "cb23",  0x5, F_CONDBR),
1650 CONDFC  ("fbuge", "cb023", 0xc, F_CONDBR),
1651 CONDFC  ("fbul",  "cb13",  0x3, F_CONDBR),
1652 CONDFC  ("fbule", "cb013", 0xe, F_CONDBR),
1653
1654 #undef CONDFC
1655 #undef CONDFCL
1656 #undef CONDF
1657 #undef CBR
1658 #undef FBR
1659 #undef FBRX     /* v9 */
1660
1661 { "jmp",        F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI(~0),        "1+2", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%g0 */
1662 { "jmp",        F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%g0 */
1663 { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,                "1+i", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+i,%g0 */
1664 { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,                "i+1", F_UNBR|F_DELAYED, v6 }, /* jmpl i+rs1,%g0 */
1665 { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|RS1_G0,         "i", F_UNBR|F_DELAYED, v6 }, /* jmpl %g0+i,%g0 */
1666 { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|SIMM13(~0),     "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+0,%g0 */
1667
1668 { "nop",        F2(0, 4), 0xfeffffff, "", 0, v6 }, /* sethi 0, %g0 */
1669
1670 { "set",        F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,d", F_ALIAS, v6 },
1671 { "setuw",      F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,d", F_ALIAS, v9 },
1672 { "setsw",      F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,d", F_ALIAS, v9 },
1673 { "setx",       F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,1,d", F_ALIAS, v9 },
1674
1675 { "sethi",      F2(0x0, 0x4), F2(~0x0, ~0x4), "h,d", 0, v6 },
1676
1677 { "taddcc",     F3(2, 0x20, 0), F3(~2, ~0x20, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1678 { "taddcc",     F3(2, 0x20, 1), F3(~2, ~0x20, ~1),              "1,i,d", 0, v6 },
1679 { "taddcc",     F3(2, 0x20, 1), F3(~2, ~0x20, ~1),              "i,1,d", 0, v6 },
1680 { "taddcctv",   F3(2, 0x22, 0), F3(~2, ~0x22, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1681 { "taddcctv",   F3(2, 0x22, 1), F3(~2, ~0x22, ~1),              "1,i,d", 0, v6 },
1682 { "taddcctv",   F3(2, 0x22, 1), F3(~2, ~0x22, ~1),              "i,1,d", 0, v6 },
1683
1684 { "tsubcc",     F3(2, 0x21, 0), F3(~2, ~0x21, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1685 { "tsubcc",     F3(2, 0x21, 1), F3(~2, ~0x21, ~1),              "1,i,d", 0, v6 },
1686 { "tsubcctv",   F3(2, 0x23, 0), F3(~2, ~0x23, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1687 { "tsubcctv",   F3(2, 0x23, 1), F3(~2, ~0x23, ~1),              "1,i,d", 0, v6 },
1688
1689 { "unimp",      F2(0x0, 0x0), 0xffc00000, "n", 0, v6notv9 },
1690 { "illtrap",    F2(0, 0), F2(~0, ~0)|RD_G0, "n", 0, v9 },
1691
1692 /* This *is* a commutative instruction.  */
1693 { "xnor",       F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1694 { "xnor",       F3(2, 0x07, 1), F3(~2, ~0x07, ~1),              "1,i,d", 0, v6 },
1695 { "xnor",       F3(2, 0x07, 1), F3(~2, ~0x07, ~1),              "i,1,d", 0, v6 },
1696 /* This *is* a commutative instruction.  */
1697 { "xnorcc",     F3(2, 0x17, 0), F3(~2, ~0x17, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1698 { "xnorcc",     F3(2, 0x17, 1), F3(~2, ~0x17, ~1),              "1,i,d", 0, v6 },
1699 { "xnorcc",     F3(2, 0x17, 1), F3(~2, ~0x17, ~1),              "i,1,d", 0, v6 },
1700 { "xor",        F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1701 { "xor",        F3(2, 0x03, 1), F3(~2, ~0x03, ~1),              "1,i,d", 0, v6 },
1702 { "xor",        F3(2, 0x03, 1), F3(~2, ~0x03, ~1),              "i,1,d", 0, v6 },
1703 { "xorcc",      F3(2, 0x13, 0), F3(~2, ~0x13, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1704 { "xorcc",      F3(2, 0x13, 1), F3(~2, ~0x13, ~1),              "1,i,d", 0, v6 },
1705 { "xorcc",      F3(2, 0x13, 1), F3(~2, ~0x13, ~1),              "i,1,d", 0, v6 },
1706
1707 { "not",        F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "1,d", F_ALIAS, v6 }, /* xnor rs1,%0,rd */
1708 { "not",        F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "r", F_ALIAS, v6 }, /* xnor rd,%0,rd */
1709
1710 { "btog",       F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),      "2,r", F_ALIAS, v6 }, /* xor rd,rs2,rd */
1711 { "btog",       F3(2, 0x03, 1), F3(~2, ~0x03, ~1),              "i,r", F_ALIAS, v6 }, /* xor rd,i,rd */
1712
1713 /* FPop1 and FPop2 are not instructions.  Don't accept them.  */
1714
1715 { "fdtoi",      F3F(2, 0x34, 0x0d2), F3F(~2, ~0x34, ~0x0d2)|RS1_G0, "B,g", F_FLOAT, v6 },
1716 { "fstoi",      F3F(2, 0x34, 0x0d1), F3F(~2, ~0x34, ~0x0d1)|RS1_G0, "f,g", F_FLOAT, v6 },
1717 { "fqtoi",      F3F(2, 0x34, 0x0d3), F3F(~2, ~0x34, ~0x0d3)|RS1_G0, "R,g", F_FLOAT, v8 },
1718
1719 { "fdtox",      F3F(2, 0x34, 0x082), F3F(~2, ~0x34, ~0x082)|RS1_G0, "B,H", F_FLOAT, v9 },
1720 { "fstox",      F3F(2, 0x34, 0x081), F3F(~2, ~0x34, ~0x081)|RS1_G0, "f,H", F_FLOAT, v9 },
1721 { "fqtox",      F3F(2, 0x34, 0x083), F3F(~2, ~0x34, ~0x083)|RS1_G0, "R,H", F_FLOAT, v9 },
1722
1723 { "fitod",      F3F(2, 0x34, 0x0c8), F3F(~2, ~0x34, ~0x0c8)|RS1_G0, "f,H", F_FLOAT, v6 },
1724 { "fitos",      F3F(2, 0x34, 0x0c4), F3F(~2, ~0x34, ~0x0c4)|RS1_G0, "f,g", F_FLOAT, v6 },
1725 { "fitoq",      F3F(2, 0x34, 0x0cc), F3F(~2, ~0x34, ~0x0cc)|RS1_G0, "f,J", F_FLOAT, v8 },
1726
1727 { "fxtod",      F3F(2, 0x34, 0x088), F3F(~2, ~0x34, ~0x088)|RS1_G0, "B,H", F_FLOAT, v9 },
1728 { "fxtos",      F3F(2, 0x34, 0x084), F3F(~2, ~0x34, ~0x084)|RS1_G0, "B,g", F_FLOAT, v9 },
1729 { "fxtoq",      F3F(2, 0x34, 0x08c), F3F(~2, ~0x34, ~0x08c)|RS1_G0, "B,J", F_FLOAT, v9 },
1730
1731 { "fdtoq",      F3F(2, 0x34, 0x0ce), F3F(~2, ~0x34, ~0x0ce)|RS1_G0, "B,J", F_FLOAT, v8 },
1732 { "fdtos",      F3F(2, 0x34, 0x0c6), F3F(~2, ~0x34, ~0x0c6)|RS1_G0, "B,g", F_FLOAT, v6 },
1733 { "fqtod",      F3F(2, 0x34, 0x0cb), F3F(~2, ~0x34, ~0x0cb)|RS1_G0, "R,H", F_FLOAT, v8 },
1734 { "fqtos",      F3F(2, 0x34, 0x0c7), F3F(~2, ~0x34, ~0x0c7)|RS1_G0, "R,g", F_FLOAT, v8 },
1735 { "fstod",      F3F(2, 0x34, 0x0c9), F3F(~2, ~0x34, ~0x0c9)|RS1_G0, "f,H", F_FLOAT, v6 },
1736 { "fstoq",      F3F(2, 0x34, 0x0cd), F3F(~2, ~0x34, ~0x0cd)|RS1_G0, "f,J", F_FLOAT, v8 },
1737
1738 { "fdivd",      F3F(2, 0x34, 0x04e), F3F(~2, ~0x34, ~0x04e), "v,B,H", F_FLOAT, v6 },
1739 { "fdivq",      F3F(2, 0x34, 0x04f), F3F(~2, ~0x34, ~0x04f), "V,R,J", F_FLOAT, v8 },
1740 { "fdivx",      F3F(2, 0x34, 0x04f), F3F(~2, ~0x34, ~0x04f), "V,R,J", F_FLOAT|F_ALIAS, v8 },
1741 { "fdivs",      F3F(2, 0x34, 0x04d), F3F(~2, ~0x34, ~0x04d), "e,f,g", F_FLOAT, v6 },
1742 { "fmuld",      F3F(2, 0x34, 0x04a), F3F(~2, ~0x34, ~0x04a), "v,B,H", F_FLOAT, v6 },
1743 { "fmulq",      F3F(2, 0x34, 0x04b), F3F(~2, ~0x34, ~0x04b), "V,R,J", F_FLOAT, v8 },
1744 { "fmulx",      F3F(2, 0x34, 0x04b), F3F(~2, ~0x34, ~0x04b), "V,R,J", F_FLOAT|F_ALIAS, v8 },
1745 { "fmuls",      F3F(2, 0x34, 0x049), F3F(~2, ~0x34, ~0x049), "e,f,g", F_FLOAT, v6 },
1746
1747 { "fdmulq",     F3F(2, 0x34, 0x06e), F3F(~2, ~0x34, ~0x06e), "v,B,J", F_FLOAT, v8 },
1748 { "fdmulx",     F3F(2, 0x34, 0x06e), F3F(~2, ~0x34, ~0x06e), "v,B,J", F_FLOAT|F_ALIAS, v8 },
1749 { "fsmuld",     F3F(2, 0x34, 0x069), F3F(~2, ~0x34, ~0x069), "e,f,H", F_FLOAT, v8 },
1750
1751 { "fsqrtd",     F3F(2, 0x34, 0x02a), F3F(~2, ~0x34, ~0x02a)|RS1_G0, "B,H", F_FLOAT, v7 },
1752 { "fsqrtq",     F3F(2, 0x34, 0x02b), F3F(~2, ~0x34, ~0x02b)|RS1_G0, "R,J", F_FLOAT, v8 },
1753 { "fsqrtx",     F3F(2, 0x34, 0x02b), F3F(~2, ~0x34, ~0x02b)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v8 },
1754 { "fsqrts",     F3F(2, 0x34, 0x029), F3F(~2, ~0x34, ~0x029)|RS1_G0, "f,g", F_FLOAT, v7 },
1755
1756 { "fabsd",      F3F(2, 0x34, 0x00a), F3F(~2, ~0x34, ~0x00a)|RS1_G0, "B,H", F_FLOAT, v9 },
1757 { "fabsq",      F3F(2, 0x34, 0x00b), F3F(~2, ~0x34, ~0x00b)|RS1_G0, "R,J", F_FLOAT, v9 },
1758 { "fabsx",      F3F(2, 0x34, 0x00b), F3F(~2, ~0x34, ~0x00b)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v9 },
1759 { "fabss",      F3F(2, 0x34, 0x009), F3F(~2, ~0x34, ~0x009)|RS1_G0, "f,g", F_FLOAT, v6 },
1760 { "fmovd",      F3F(2, 0x34, 0x002), F3F(~2, ~0x34, ~0x002)|RS1_G0, "B,H", F_FLOAT, v9 },
1761 { "fmovq",      F3F(2, 0x34, 0x003), F3F(~2, ~0x34, ~0x003)|RS1_G0, "R,J", F_FLOAT, v9 },
1762 { "fmovx",      F3F(2, 0x34, 0x003), F3F(~2, ~0x34, ~0x003)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v9 },
1763 { "fmovs",      F3F(2, 0x34, 0x001), F3F(~2, ~0x34, ~0x001)|RS1_G0, "f,g", F_FLOAT, v6 },
1764 { "fnegd",      F3F(2, 0x34, 0x006), F3F(~2, ~0x34, ~0x006)|RS1_G0, "B,H", F_FLOAT, v9 },
1765 { "fnegq",      F3F(2, 0x34, 0x007), F3F(~2, ~0x34, ~0x007)|RS1_G0, "R,J", F_FLOAT, v9 },
1766 { "fnegx",      F3F(2, 0x34, 0x007), F3F(~2, ~0x34, ~0x007)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v9 },
1767 { "fnegs",      F3F(2, 0x34, 0x005), F3F(~2, ~0x34, ~0x005)|RS1_G0, "f,g", F_FLOAT, v6 },
1768
1769 { "faddd",      F3F(2, 0x34, 0x042), F3F(~2, ~0x34, ~0x042), "v,B,H", F_FLOAT, v6 },
1770 { "faddq",      F3F(2, 0x34, 0x043), F3F(~2, ~0x34, ~0x043), "V,R,J", F_FLOAT, v8 },
1771 { "faddx",      F3F(2, 0x34, 0x043), F3F(~2, ~0x34, ~0x043), "V,R,J", F_FLOAT|F_ALIAS, v8 },
1772 { "fadds",      F3F(2, 0x34, 0x041), F3F(~2, ~0x34, ~0x041), "e,f,g", F_FLOAT, v6 },
1773 { "fsubd",      F3F(2, 0x34, 0x046), F3F(~2, ~0x34, ~0x046), "v,B,H", F_FLOAT, v6 },
1774 { "fsubq",      F3F(2, 0x34, 0x047), F3F(~2, ~0x34, ~0x047), "V,R,J", F_FLOAT, v8 },
1775 { "fsubx",      F3F(2, 0x34, 0x047), F3F(~2, ~0x34, ~0x047), "V,R,J", F_FLOAT|F_ALIAS, v8 },
1776 { "fsubs",      F3F(2, 0x34, 0x045), F3F(~2, ~0x34, ~0x045), "e,f,g", F_FLOAT, v6 },
1777
1778 #define CMPFCC(x)       (((x)&0x3)<<25)
1779
1780 { "fcmpd",                F3F(2, 0x35, 0x052),            F3F(~2, ~0x35, ~0x052)|RD_G0,  "v,B",   F_FLOAT, v6 },
1781 { "fcmpd",      CMPFCC(0)|F3F(2, 0x35, 0x052), CMPFCC(~0)|F3F(~2, ~0x35, ~0x052),        "6,v,B", F_FLOAT, v9 },
1782 { "fcmpd",      CMPFCC(1)|F3F(2, 0x35, 0x052), CMPFCC(~1)|F3F(~2, ~0x35, ~0x052),        "7,v,B", F_FLOAT, v9 },
1783 { "fcmpd",      CMPFCC(2)|F3F(2, 0x35, 0x052), CMPFCC(~2)|F3F(~2, ~0x35, ~0x052),        "8,v,B", F_FLOAT, v9 },
1784 { "fcmpd",      CMPFCC(3)|F3F(2, 0x35, 0x052), CMPFCC(~3)|F3F(~2, ~0x35, ~0x052),        "9,v,B", F_FLOAT, v9 },
1785 { "fcmped",               F3F(2, 0x35, 0x056),            F3F(~2, ~0x35, ~0x056)|RD_G0,  "v,B",   F_FLOAT, v6 },
1786 { "fcmped",     CMPFCC(0)|F3F(2, 0x35, 0x056), CMPFCC(~0)|F3F(~2, ~0x35, ~0x056),        "6,v,B", F_FLOAT, v9 },
1787 { "fcmped",     CMPFCC(1)|F3F(2, 0x35, 0x056), CMPFCC(~1)|F3F(~2, ~0x35, ~0x056),        "7,v,B", F_FLOAT, v9 },
1788 { "fcmped",     CMPFCC(2)|F3F(2, 0x35, 0x056), CMPFCC(~2)|F3F(~2, ~0x35, ~0x056),        "8,v,B", F_FLOAT, v9 },
1789 { "fcmped",     CMPFCC(3)|F3F(2, 0x35, 0x056), CMPFCC(~3)|F3F(~2, ~0x35, ~0x056),        "9,v,B", F_FLOAT, v9 },
1790 { "fcmpq",                F3F(2, 0x35, 0x053),            F3F(~2, ~0x35, ~0x053)|RD_G0,  "V,R", F_FLOAT, v8 },
1791 { "fcmpq",      CMPFCC(0)|F3F(2, 0x35, 0x053), CMPFCC(~0)|F3F(~2, ~0x35, ~0x053),        "6,V,R", F_FLOAT, v9 },
1792 { "fcmpq",      CMPFCC(1)|F3F(2, 0x35, 0x053), CMPFCC(~1)|F3F(~2, ~0x35, ~0x053),        "7,V,R", F_FLOAT, v9 },
1793 { "fcmpq",      CMPFCC(2)|F3F(2, 0x35, 0x053), CMPFCC(~2)|F3F(~2, ~0x35, ~0x053),        "8,V,R", F_FLOAT, v9 },
1794 { "fcmpq",      CMPFCC(3)|F3F(2, 0x35, 0x053), CMPFCC(~3)|F3F(~2, ~0x35, ~0x053),        "9,V,R", F_FLOAT, v9 },
1795 { "fcmpeq",               F3F(2, 0x35, 0x057),            F3F(~2, ~0x35, ~0x057)|RD_G0,  "V,R", F_FLOAT, v8 },
1796 { "fcmpeq",     CMPFCC(0)|F3F(2, 0x35, 0x057), CMPFCC(~0)|F3F(~2, ~0x35, ~0x057),        "6,V,R", F_FLOAT, v9 },
1797 { "fcmpeq",     CMPFCC(1)|F3F(2, 0x35, 0x057), CMPFCC(~1)|F3F(~2, ~0x35, ~0x057),        "7,V,R", F_FLOAT, v9 },
1798 { "fcmpeq",     CMPFCC(2)|F3F(2, 0x35, 0x057), CMPFCC(~2)|F3F(~2, ~0x35, ~0x057),        "8,V,R", F_FLOAT, v9 },
1799 { "fcmpeq",     CMPFCC(3)|F3F(2, 0x35, 0x057), CMPFCC(~3)|F3F(~2, ~0x35, ~0x057),        "9,V,R", F_FLOAT, v9 },
1800 { "fcmpx",                F3F(2, 0x35, 0x053),            F3F(~2, ~0x35, ~0x053)|RD_G0,  "V,R", F_FLOAT|F_ALIAS, v8 },
1801 { "fcmpx",      CMPFCC(0)|F3F(2, 0x35, 0x053), CMPFCC(~0)|F3F(~2, ~0x35, ~0x053),        "6,V,R", F_FLOAT|F_ALIAS, v9 },
1802 { "fcmpx",      CMPFCC(1)|F3F(2, 0x35, 0x053), CMPFCC(~1)|F3F(~2, ~0x35, ~0x053),        "7,V,R", F_FLOAT|F_ALIAS, v9 },
1803 { "fcmpx",      CMPFCC(2)|F3F(2, 0x35, 0x053), CMPFCC(~2)|F3F(~2, ~0x35, ~0x053),        "8,V,R", F_FLOAT|F_ALIAS, v9 },
1804 { "fcmpx",      CMPFCC(3)|F3F(2, 0x35, 0x053), CMPFCC(~3)|F3F(~2, ~0x35, ~0x053),        "9,V,R", F_FLOAT|F_ALIAS, v9 },
1805 { "fcmpex",               F3F(2, 0x35, 0x057),            F3F(~2, ~0x35, ~0x057)|RD_G0,  "V,R", F_FLOAT|F_ALIAS, v8 },
1806 { "fcmpex",     CMPFCC(0)|F3F(2, 0x35, 0x057), CMPFCC(~0)|F3F(~2, ~0x35, ~0x057),        "6,V,R", F_FLOAT|F_ALIAS, v9 },
1807 { "fcmpex",     CMPFCC(1)|F3F(2, 0x35, 0x057), CMPFCC(~1)|F3F(~2, ~0x35, ~0x057),        "7,V,R", F_FLOAT|F_ALIAS, v9 },
1808 { "fcmpex",     CMPFCC(2)|F3F(2, 0x35, 0x057), CMPFCC(~2)|F3F(~2, ~0x35, ~0x057),        "8,V,R", F_FLOAT|F_ALIAS, v9 },
1809 { "fcmpex",     CMPFCC(3)|F3F(2, 0x35, 0x057), CMPFCC(~3)|F3F(~2, ~0x35, ~0x057),        "9,V,R", F_FLOAT|F_ALIAS, v9 },
1810 { "fcmps",                F3F(2, 0x35, 0x051),            F3F(~2, ~0x35, ~0x051)|RD_G0, "e,f",   F_FLOAT, v6 },
1811 { "fcmps",      CMPFCC(0)|F3F(2, 0x35, 0x051), CMPFCC(~0)|F3F(~2, ~0x35, ~0x051),        "6,e,f", F_FLOAT, v9 },
1812 { "fcmps",      CMPFCC(1)|F3F(2, 0x35, 0x051), CMPFCC(~1)|F3F(~2, ~0x35, ~0x051),        "7,e,f", F_FLOAT, v9 },
1813 { "fcmps",      CMPFCC(2)|F3F(2, 0x35, 0x051), CMPFCC(~2)|F3F(~2, ~0x35, ~0x051),        "8,e,f", F_FLOAT, v9 },
1814 { "fcmps",      CMPFCC(3)|F3F(2, 0x35, 0x051), CMPFCC(~3)|F3F(~2, ~0x35, ~0x051),        "9,e,f", F_FLOAT, v9 },
1815 { "fcmpes",               F3F(2, 0x35, 0x055),            F3F(~2, ~0x35, ~0x055)|RD_G0, "e,f",   F_FLOAT, v6 },
1816 { "fcmpes",     CMPFCC(0)|F3F(2, 0x35, 0x055), CMPFCC(~0)|F3F(~2, ~0x35, ~0x055),        "6,e,f", F_FLOAT, v9 },
1817 { "fcmpes",     CMPFCC(1)|F3F(2, 0x35, 0x055), CMPFCC(~1)|F3F(~2, ~0x35, ~0x055),        "7,e,f", F_FLOAT, v9 },
1818 { "fcmpes",     CMPFCC(2)|F3F(2, 0x35, 0x055), CMPFCC(~2)|F3F(~2, ~0x35, ~0x055),        "8,e,f", F_FLOAT, v9 },
1819 { "fcmpes",     CMPFCC(3)|F3F(2, 0x35, 0x055), CMPFCC(~3)|F3F(~2, ~0x35, ~0x055),        "9,e,f", F_FLOAT, v9 },
1820
1821 /* These Extended FPop (FIFO) instructions are new in the Fujitsu
1822    MB86934, replacing the CPop instructions from v6 and later
1823    processors.  */
1824
1825 #define EFPOP1_2(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op)|RS1_G0, args, 0, sparclite }
1826 #define EFPOP1_3(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op),        args, 0, sparclite }
1827 #define EFPOP2_2(name, op, args) { name, F3F(2, 0x37, op), F3F(~2, ~0x37, ~op)|RD_G0,  args, 0, sparclite }
1828
1829 EFPOP1_2 ("efitod",     0x0c8, "f,H"),
1830 EFPOP1_2 ("efitos",     0x0c4, "f,g"),
1831 EFPOP1_2 ("efdtoi",     0x0d2, "B,g"),
1832 EFPOP1_2 ("efstoi",     0x0d1, "f,g"),
1833 EFPOP1_2 ("efstod",     0x0c9, "f,H"),
1834 EFPOP1_2 ("efdtos",     0x0c6, "B,g"),
1835 EFPOP1_2 ("efmovs",     0x001, "f,g"),
1836 EFPOP1_2 ("efnegs",     0x005, "f,g"),
1837 EFPOP1_2 ("efabss",     0x009, "f,g"),
1838 EFPOP1_2 ("efsqrtd",    0x02a, "B,H"),
1839 EFPOP1_2 ("efsqrts",    0x029, "f,g"),
1840 EFPOP1_3 ("efaddd",     0x042, "v,B,H"),
1841 EFPOP1_3 ("efadds",     0x041, "e,f,g"),
1842 EFPOP1_3 ("efsubd",     0x046, "v,B,H"),
1843 EFPOP1_3 ("efsubs",     0x045, "e,f,g"),
1844 EFPOP1_3 ("efdivd",     0x04e, "v,B,H"),
1845 EFPOP1_3 ("efdivs",     0x04d, "e,f,g"),
1846 EFPOP1_3 ("efmuld",     0x04a, "v,B,H"),
1847 EFPOP1_3 ("efmuls",     0x049, "e,f,g"),
1848 EFPOP1_3 ("efsmuld",    0x069, "e,f,H"),
1849 EFPOP2_2 ("efcmpd",     0x052, "v,B"),
1850 EFPOP2_2 ("efcmped",    0x056, "v,B"),
1851 EFPOP2_2 ("efcmps",     0x051, "e,f"),
1852 EFPOP2_2 ("efcmpes",    0x055, "e,f"),
1853
1854 #undef EFPOP1_2
1855 #undef EFPOP1_3
1856 #undef EFPOP2_2
1857
1858 /* These are marked F_ALIAS, so that they won't conflict with sparclite insns
1859    present.  Otherwise, the F_ALIAS flag is ignored.  */
1860 { "cpop1",      F3(2, 0x36, 0), F3(~2, ~0x36, ~1), "[1+2],d", F_ALIAS, v6notv9 },
1861 { "cpop2",      F3(2, 0x37, 0), F3(~2, ~0x37, ~1), "[1+2],d", F_ALIAS, v6notv9 },
1862
1863 /* sparclet specific insns */
1864
1865 COMMUTEOP ("umac", 0x3e, sparclet),
1866 COMMUTEOP ("smac", 0x3f, sparclet),
1867 COMMUTEOP ("umacd", 0x2e, sparclet),
1868 COMMUTEOP ("smacd", 0x2f, sparclet),
1869 COMMUTEOP ("umuld", 0x09, sparclet),
1870 COMMUTEOP ("smuld", 0x0d, sparclet),
1871
1872 { "shuffle",    F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),      "1,2,d", 0, sparclet },
1873 { "shuffle",    F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),              "1,i,d", 0, sparclet },
1874
1875 /* The manual isn't completely accurate on these insns.  The `rs2' field is
1876    treated as being 6 bits to account for 6 bit immediates to cpush.  It is
1877    assumed that it is intended that bit 5 is 0 when rs2 contains a reg.  */
1878 #define BIT5 (1<<5)
1879 { "crdcxt",     F3(2, 0x36, 0)|SLCPOP(4), F3(~2, ~0x36, ~0)|SLCPOP(~4)|BIT5|RS2(~0),    "U,d", 0, sparclet },
1880 { "cwrcxt",     F3(2, 0x36, 0)|SLCPOP(3), F3(~2, ~0x36, ~0)|SLCPOP(~3)|BIT5|RS2(~0),    "1,u", 0, sparclet },
1881 { "cpush",      F3(2, 0x36, 0)|SLCPOP(0), F3(~2, ~0x36, ~0)|SLCPOP(~0)|BIT5|RD(~0),     "1,2", 0, sparclet },
1882 { "cpush",      F3(2, 0x36, 1)|SLCPOP(0), F3(~2, ~0x36, ~1)|SLCPOP(~0)|RD(~0),          "1,Y", 0, sparclet },
1883 { "cpusha",     F3(2, 0x36, 0)|SLCPOP(1), F3(~2, ~0x36, ~0)|SLCPOP(~1)|BIT5|RD(~0),     "1,2", 0, sparclet },
1884 { "cpusha",     F3(2, 0x36, 1)|SLCPOP(1), F3(~2, ~0x36, ~1)|SLCPOP(~1)|RD(~0),          "1,Y", 0, sparclet },
1885 { "cpull",      F3(2, 0x36, 0)|SLCPOP(2), F3(~2, ~0x36, ~0)|SLCPOP(~2)|BIT5|RS1(~0)|RS2(~0), "d", 0, sparclet },
1886 #undef BIT5
1887
1888 /* sparclet coprocessor branch insns */
1889 #define SLCBCC2(opcode, mask, lose) \
1890  { opcode, (mask), ANNUL|(lose), "l",    F_DELAYED|F_CONDBR, sparclet }, \
1891  { opcode, (mask)|ANNUL, (lose), ",a l", F_DELAYED|F_CONDBR, sparclet }
1892 #define SLCBCC(opcode, mask) \
1893   SLCBCC2(opcode, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)))
1894
1895 /* cbn,cba can't be defined here because they're defined elsewhere and GAS
1896    requires all mnemonics of the same name to be consecutive.  */
1897 /*SLCBCC("cbn", 0), - already defined */
1898 SLCBCC("cbe", 1),
1899 SLCBCC("cbf", 2),
1900 SLCBCC("cbef", 3),
1901 SLCBCC("cbr", 4),
1902 SLCBCC("cber", 5),
1903 SLCBCC("cbfr", 6),
1904 SLCBCC("cbefr", 7),
1905 /*SLCBCC("cba", 8), - already defined */
1906 SLCBCC("cbne", 9),
1907 SLCBCC("cbnf", 10),
1908 SLCBCC("cbnef", 11),
1909 SLCBCC("cbnr", 12),
1910 SLCBCC("cbner", 13),
1911 SLCBCC("cbnfr", 14),
1912 SLCBCC("cbnefr", 15),
1913
1914 #undef SLCBCC2
1915 #undef SLCBCC
1916
1917 { "casa",       F3(3, 0x3c, 0), F3(~3, ~0x3c, ~0), "[1]A,2,d", 0, v9 },
1918 { "casa",       F3(3, 0x3c, 1), F3(~3, ~0x3c, ~1), "[1]o,2,d", 0, v9 },
1919 { "casxa",      F3(3, 0x3e, 0), F3(~3, ~0x3e, ~0), "[1]A,2,d", 0, v9 },
1920 { "casxa",      F3(3, 0x3e, 1), F3(~3, ~0x3e, ~1), "[1]o,2,d", 0, v9 },
1921
1922 /* v9 synthetic insns */
1923 { "iprefetch",  F2(0, 1)|(2<<20)|BPRED, F2(~0, ~1)|(1<<20)|ANNUL|COND(~0), "G", 0, v9 }, /* bn,a,pt %xcc,label */
1924 { "signx",      F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|ASI(~0)|RS2_G0, "1,d", F_ALIAS, v9 }, /* sra rs1,%g0,rd */
1925 { "signx",      F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|ASI(~0)|RS2_G0, "r", F_ALIAS, v9 }, /* sra rd,%g0,rd */
1926 { "clruw",      F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|ASI(~0)|RS2_G0, "1,d", F_ALIAS, v9 }, /* srl rs1,%g0,rd */
1927 { "clruw",      F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|ASI(~0)|RS2_G0, "r", F_ALIAS, v9 }, /* srl rd,%g0,rd */
1928 { "cas",        F3(3, 0x3c, 0)|ASI(0x80), F3(~3, ~0x3c, ~0)|ASI(~0x80), "[1],2,d", F_ALIAS, v9 }, /* casa [rs1]ASI_P,rs2,rd */
1929 { "casl",       F3(3, 0x3c, 0)|ASI(0x88), F3(~3, ~0x3c, ~0)|ASI(~0x88), "[1],2,d", F_ALIAS, v9 }, /* casa [rs1]ASI_P_L,rs2,rd */
1930 { "casx",       F3(3, 0x3e, 0)|ASI(0x80), F3(~3, ~0x3e, ~0)|ASI(~0x80), "[1],2,d", F_ALIAS, v9 }, /* casxa [rs1]ASI_P,rs2,rd */
1931 { "casxl",      F3(3, 0x3e, 0)|ASI(0x88), F3(~3, ~0x3e, ~0)|ASI(~0x88), "[1],2,d", F_ALIAS, v9 }, /* casxa [rs1]ASI_P_L,rs2,rd */
1932
1933 /* Ultrasparc extensions */
1934 { "shutdown",   F3F(2, 0x36, 0x080), F3F(~2, ~0x36, ~0x080)|RD_G0|RS1_G0|RS2_G0, "", 0, v9a },
1935
1936 /* FIXME: Do we want to mark these as F_FLOAT, or something similar?  */
1937 { "fpadd16",    F3F(2, 0x36, 0x050), F3F(~2, ~0x36, ~0x050), "v,B,H", 0, v9a },
1938 { "fpadd16s",   F3F(2, 0x36, 0x051), F3F(~2, ~0x36, ~0x051), "e,f,g", 0, v9a },
1939 { "fpadd32",    F3F(2, 0x36, 0x052), F3F(~2, ~0x36, ~0x052), "v,B,H", 0, v9a },
1940 { "fpadd32s",   F3F(2, 0x36, 0x053), F3F(~2, ~0x36, ~0x053), "e,f,g", 0, v9a },
1941 { "fpsub16",    F3F(2, 0x36, 0x054), F3F(~2, ~0x36, ~0x054), "v,B,H", 0, v9a },
1942 { "fpsub16s",   F3F(2, 0x36, 0x055), F3F(~2, ~0x36, ~0x055), "e,f,g", 0, v9a },
1943 { "fpsub32",    F3F(2, 0x36, 0x056), F3F(~2, ~0x36, ~0x056), "v,B,H", 0, v9a },
1944 { "fpsub32s",   F3F(2, 0x36, 0x057), F3F(~2, ~0x36, ~0x057), "e,f,g", 0, v9a },
1945
1946 { "fpack32",    F3F(2, 0x36, 0x03a), F3F(~2, ~0x36, ~0x03a), "v,B,H", 0, v9a },
1947 { "fpack16",    F3F(2, 0x36, 0x03b), F3F(~2, ~0x36, ~0x03b)|RS1_G0, "B,g", 0, v9a },
1948 { "fpackfix",   F3F(2, 0x36, 0x03d), F3F(~2, ~0x36, ~0x03d)|RS1_G0, "B,g", 0, v9a },
1949 { "fexpand",    F3F(2, 0x36, 0x04d), F3F(~2, ~0x36, ~0x04d)|RS1_G0, "f,H", 0, v9a },
1950 { "fpmerge",    F3F(2, 0x36, 0x04b), F3F(~2, ~0x36, ~0x04b), "e,f,H", 0, v9a },
1951
1952 /* Note that the mixing of 32/64 bit regs is intentional.  */
1953 { "fmul8x16",           F3F(2, 0x36, 0x031), F3F(~2, ~0x36, ~0x031), "e,B,H", 0, v9a },
1954 { "fmul8x16au",         F3F(2, 0x36, 0x033), F3F(~2, ~0x36, ~0x033), "e,f,H", 0, v9a },
1955 { "fmul8x16al",         F3F(2, 0x36, 0x035), F3F(~2, ~0x36, ~0x035), "e,f,H", 0, v9a },
1956 { "fmul8sux16",         F3F(2, 0x36, 0x036), F3F(~2, ~0x36, ~0x036), "v,B,H", 0, v9a },
1957 { "fmul8ulx16",         F3F(2, 0x36, 0x037), F3F(~2, ~0x36, ~0x037), "v,B,H", 0, v9a },
1958 { "fmuld8sux16",        F3F(2, 0x36, 0x038), F3F(~2, ~0x36, ~0x038), "e,f,H", 0, v9a },
1959 { "fmuld8ulx16",        F3F(2, 0x36, 0x039), F3F(~2, ~0x36, ~0x039), "e,f,H", 0, v9a },
1960
1961 { "alignaddr",  F3F(2, 0x36, 0x018), F3F(~2, ~0x36, ~0x018), "1,2,d", 0, v9a },
1962 { "alignaddrl", F3F(2, 0x36, 0x01a), F3F(~2, ~0x36, ~0x01a), "1,2,d", 0, v9a },
1963 { "faligndata", F3F(2, 0x36, 0x048), F3F(~2, ~0x36, ~0x048), "v,B,H", 0, v9a },
1964
1965 { "fzero",      F3F(2, 0x36, 0x060), F3F(~2, ~0x36, ~0x060), "H", 0, v9a },
1966 { "fzeros",     F3F(2, 0x36, 0x061), F3F(~2, ~0x36, ~0x061), "g", 0, v9a },
1967 { "fone",       F3F(2, 0x36, 0x07e), F3F(~2, ~0x36, ~0x07e), "H", 0, v9a },
1968 { "fones",      F3F(2, 0x36, 0x07f), F3F(~2, ~0x36, ~0x07f), "g", 0, v9a },
1969 { "fsrc1",      F3F(2, 0x36, 0x074), F3F(~2, ~0x36, ~0x074), "v,H", 0, v9a },
1970 { "fsrc1s",     F3F(2, 0x36, 0x075), F3F(~2, ~0x36, ~0x075), "e,g", 0, v9a },
1971 { "fsrc2",      F3F(2, 0x36, 0x078), F3F(~2, ~0x36, ~0x078), "B,H", 0, v9a },
1972 { "fsrc2s",     F3F(2, 0x36, 0x079), F3F(~2, ~0x36, ~0x079), "f,g", 0, v9a },
1973 { "fnot1",      F3F(2, 0x36, 0x06a), F3F(~2, ~0x36, ~0x06a), "v,H", 0, v9a },
1974 { "fnot1s",     F3F(2, 0x36, 0x06b), F3F(~2, ~0x36, ~0x06b), "e,g", 0, v9a },
1975 { "fnot2",      F3F(2, 0x36, 0x066), F3F(~2, ~0x36, ~0x066), "B,H", 0, v9a },
1976 { "fnot2s",     F3F(2, 0x36, 0x067), F3F(~2, ~0x36, ~0x067), "f,g", 0, v9a },
1977 { "for",        F3F(2, 0x36, 0x07c), F3F(~2, ~0x36, ~0x07c), "v,B,H", 0, v9a },
1978 { "fors",       F3F(2, 0x36, 0x07d), F3F(~2, ~0x36, ~0x07d), "e,f,g", 0, v9a },
1979 { "fnor",       F3F(2, 0x36, 0x062), F3F(~2, ~0x36, ~0x062), "v,B,H", 0, v9a },
1980 { "fnors",      F3F(2, 0x36, 0x063), F3F(~2, ~0x36, ~0x063), "e,f,g", 0, v9a },
1981 { "fand",       F3F(2, 0x36, 0x070), F3F(~2, ~0x36, ~0x070), "v,B,H", 0, v9a },
1982 { "fands",      F3F(2, 0x36, 0x071), F3F(~2, ~0x36, ~0x071), "e,f,g", 0, v9a },
1983 { "fnand",      F3F(2, 0x36, 0x06e), F3F(~2, ~0x36, ~0x06e), "v,B,H", 0, v9a },
1984 { "fnands",     F3F(2, 0x36, 0x06f), F3F(~2, ~0x36, ~0x06f), "e,f,g", 0, v9a },
1985 { "fxor",       F3F(2, 0x36, 0x06c), F3F(~2, ~0x36, ~0x06c), "v,B,H", 0, v9a },
1986 { "fxors",      F3F(2, 0x36, 0x06d), F3F(~2, ~0x36, ~0x06d), "e,f,g", 0, v9a },
1987 { "fxnor",      F3F(2, 0x36, 0x072), F3F(~2, ~0x36, ~0x072), "v,B,H", 0, v9a },
1988 { "fxnors",     F3F(2, 0x36, 0x073), F3F(~2, ~0x36, ~0x073), "e,f,g", 0, v9a },
1989 { "fornot1",    F3F(2, 0x36, 0x07a), F3F(~2, ~0x36, ~0x07a), "v,B,H", 0, v9a },
1990 { "fornot1s",   F3F(2, 0x36, 0x07b), F3F(~2, ~0x36, ~0x07b), "e,f,g", 0, v9a },
1991 { "fornot2",    F3F(2, 0x36, 0x076), F3F(~2, ~0x36, ~0x076), "v,B,H", 0, v9a },
1992 { "fornot2s",   F3F(2, 0x36, 0x077), F3F(~2, ~0x36, ~0x077), "e,f,g", 0, v9a },
1993 { "fandnot1",   F3F(2, 0x36, 0x068), F3F(~2, ~0x36, ~0x068), "v,B,H", 0, v9a },
1994 { "fandnot1s",  F3F(2, 0x36, 0x069), F3F(~2, ~0x36, ~0x069), "e,f,g", 0, v9a },
1995 { "fandnot2",   F3F(2, 0x36, 0x064), F3F(~2, ~0x36, ~0x064), "v,B,H", 0, v9a },
1996 { "fandnot2s",  F3F(2, 0x36, 0x065), F3F(~2, ~0x36, ~0x065), "e,f,g", 0, v9a },
1997
1998 { "fcmpgt16",   F3F(2, 0x36, 0x028), F3F(~2, ~0x36, ~0x028), "v,B,d", 0, v9a },
1999 { "fcmpgt32",   F3F(2, 0x36, 0x02c), F3F(~2, ~0x36, ~0x02c), "v,B,d", 0, v9a },
2000 { "fcmple16",   F3F(2, 0x36, 0x020), F3F(~2, ~0x36, ~0x020), "v,B,d", 0, v9a },
2001 { "fcmple32",   F3F(2, 0x36, 0x024), F3F(~2, ~0x36, ~0x024), "v,B,d", 0, v9a },
2002 { "fcmpne16",   F3F(2, 0x36, 0x022), F3F(~2, ~0x36, ~0x022), "v,B,d", 0, v9a },
2003 { "fcmpne32",   F3F(2, 0x36, 0x026), F3F(~2, ~0x36, ~0x026), "v,B,d", 0, v9a },
2004 { "fcmpeq16",   F3F(2, 0x36, 0x02a), F3F(~2, ~0x36, ~0x02a), "v,B,d", 0, v9a },
2005 { "fcmpeq32",   F3F(2, 0x36, 0x02e), F3F(~2, ~0x36, ~0x02e), "v,B,d", 0, v9a },
2006
2007 { "edge8",      F3F(2, 0x36, 0x000), F3F(~2, ~0x36, ~0x000), "1,2,d", 0, v9a },
2008 { "edge8l",     F3F(2, 0x36, 0x002), F3F(~2, ~0x36, ~0x002), "1,2,d", 0, v9a },
2009 { "edge16",     F3F(2, 0x36, 0x004), F3F(~2, ~0x36, ~0x004), "1,2,d", 0, v9a },
2010 { "edge16l",    F3F(2, 0x36, 0x006), F3F(~2, ~0x36, ~0x006), "1,2,d", 0, v9a },
2011 { "edge32",     F3F(2, 0x36, 0x008), F3F(~2, ~0x36, ~0x008), "1,2,d", 0, v9a },
2012 { "edge32l",    F3F(2, 0x36, 0x00a), F3F(~2, ~0x36, ~0x00a), "1,2,d", 0, v9a },
2013
2014 { "pdist",      F3F(2, 0x36, 0x03e), F3F(~2, ~0x36, ~0x03e), "v,B,H", 0, v9a },
2015
2016 { "array8",     F3F(2, 0x36, 0x010), F3F(~2, ~0x36, ~0x010), "1,2,d", 0, v9a },
2017 { "array16",    F3F(2, 0x36, 0x012), F3F(~2, ~0x36, ~0x012), "1,2,d", 0, v9a },
2018 { "array32",    F3F(2, 0x36, 0x014), F3F(~2, ~0x36, ~0x014), "1,2,d", 0, v9a },
2019
2020 /* Cheetah instructions */
2021 { "edge8n",    F3F(2, 0x36, 0x001), F3F(~2, ~0x36, ~0x001), "1,2,d", 0, v9b },
2022 { "edge8ln",   F3F(2, 0x36, 0x003), F3F(~2, ~0x36, ~0x003), "1,2,d", 0, v9b },
2023 { "edge16n",   F3F(2, 0x36, 0x005), F3F(~2, ~0x36, ~0x005), "1,2,d", 0, v9b },
2024 { "edge16ln",  F3F(2, 0x36, 0x007), F3F(~2, ~0x36, ~0x007), "1,2,d", 0, v9b },
2025 { "edge32n",   F3F(2, 0x36, 0x009), F3F(~2, ~0x36, ~0x009), "1,2,d", 0, v9b },
2026 { "edge32ln",  F3F(2, 0x36, 0x00b), F3F(~2, ~0x36, ~0x00b), "1,2,d", 0, v9b },
2027
2028 { "bmask",     F3F(2, 0x36, 0x019), F3F(~2, ~0x36, ~0x019), "1,2,d", 0, v9b },
2029 { "bshuffle",  F3F(2, 0x36, 0x04c), F3F(~2, ~0x36, ~0x04c), "v,B,H", 0, v9b },
2030
2031 { "siam",      F3F(2, 0x36, 0x081), F3F(~2, ~0x36, ~0x081)|RD_G0|RS1_G0|RS2(~7), "3", 0, v9b },
2032
2033 /* More v9 specific insns, these need to come last so they do not clash
2034    with v9a instructions such as "edge8" which looks like impdep1. */
2035
2036 #define IMPDEP(name, code) \
2037 { name, F3(2, code, 0), F3(~2, ~code, ~0)|ASI(~0), "1,2,d", 0, v9notv9a }, \
2038 { name, F3(2, code, 1), F3(~2, ~code, ~1),         "1,i,d", 0, v9notv9a }, \
2039 { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,1,2,d", 0, v9notv9a }, \
2040 { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,e,f,g", 0, v9notv9a }
2041
2042 IMPDEP ("impdep1", 0x36),
2043 IMPDEP ("impdep2", 0x37),
2044
2045 #undef IMPDEP
2046
2047 };
2048
2049 static const int sparc_num_opcodes = ((sizeof sparc_opcodes)/(sizeof sparc_opcodes[0]));
2050 \f
2051 /* Utilities for argument parsing.  */
2052
2053 typedef struct
2054 {
2055   int value;
2056   const char *name;
2057 } arg;
2058
2059 /* Look up VALUE in TABLE.  */
2060
2061 static const char *
2062 lookup_value (const arg *table, int value)
2063 {
2064   const arg *p;
2065
2066   for (p = table; p->name; ++p)
2067     if (value == p->value)
2068       return p->name;
2069
2070   return NULL;
2071 }
2072 \f
2073 /* Handle ASI's.  */
2074
2075 static const arg asi_table_v8[] =
2076 {
2077   { 0x00, "#ASI_M_RES00" },
2078   { 0x01, "#ASI_M_UNA01" },
2079   { 0x02, "#ASI_M_MXCC" },
2080   { 0x03, "#ASI_M_FLUSH_PROBE" },
2081   { 0x04, "#ASI_M_MMUREGS" },
2082   { 0x05, "#ASI_M_TLBDIAG" },
2083   { 0x06, "#ASI_M_DIAGS" },
2084   { 0x07, "#ASI_M_IODIAG" },
2085   { 0x08, "#ASI_M_USERTXT" },
2086   { 0x09, "#ASI_M_KERNELTXT" },
2087   { 0x0A, "#ASI_M_USERDATA" },
2088   { 0x0B, "#ASI_M_KERNELDATA" },
2089   { 0x0C, "#ASI_M_TXTC_TAG" },
2090   { 0x0D, "#ASI_M_TXTC_DATA" },
2091   { 0x0E, "#ASI_M_DATAC_TAG" },
2092   { 0x0F, "#ASI_M_DATAC_DATA" },
2093   { 0x10, "#ASI_M_FLUSH_PAGE" },
2094   { 0x11, "#ASI_M_FLUSH_SEG" },
2095   { 0x12, "#ASI_M_FLUSH_REGION" },
2096   { 0x13, "#ASI_M_FLUSH_CTX" },
2097   { 0x14, "#ASI_M_FLUSH_USER" },
2098   { 0x17, "#ASI_M_BCOPY" },
2099   { 0x18, "#ASI_M_IFLUSH_PAGE" },
2100   { 0x19, "#ASI_M_IFLUSH_SEG" },
2101   { 0x1A, "#ASI_M_IFLUSH_REGION" },
2102   { 0x1B, "#ASI_M_IFLUSH_CTX" },
2103   { 0x1C, "#ASI_M_IFLUSH_USER" },
2104   { 0x1F, "#ASI_M_BFILL" },
2105   { 0x20, "#ASI_M_BYPASS" },
2106   { 0x29, "#ASI_M_FBMEM" },
2107   { 0x2A, "#ASI_M_VMEUS" },
2108   { 0x2B, "#ASI_M_VMEPS" },
2109   { 0x2C, "#ASI_M_VMEUT" },
2110   { 0x2D, "#ASI_M_VMEPT" },
2111   { 0x2E, "#ASI_M_SBUS" },
2112   { 0x2F, "#ASI_M_CTL" },
2113   { 0x31, "#ASI_M_FLUSH_IWHOLE" },
2114   { 0x36, "#ASI_M_IC_FLCLEAR" },
2115   { 0x37, "#ASI_M_DC_FLCLEAR" },
2116   { 0x39, "#ASI_M_DCDR" },
2117   { 0x40, "#ASI_M_VIKING_TMP1" },
2118   { 0x41, "#ASI_M_VIKING_TMP2" },
2119   { 0x4c, "#ASI_M_ACTION" },
2120   { 0, 0 }
2121 };
2122
2123 static const arg asi_table_v9[] =
2124 {
2125   /* These are in the v9 architecture manual.  */
2126   /* The shorter versions appear first, they're here because Sun's as has them.
2127      Sun's as uses #ASI_P_L instead of #ASI_PL (which appears in the
2128      UltraSPARC architecture manual).  */
2129   { 0x04, "#ASI_N" },
2130   { 0x0c, "#ASI_N_L" },
2131   { 0x10, "#ASI_AIUP" },
2132   { 0x11, "#ASI_AIUS" },
2133   { 0x18, "#ASI_AIUP_L" },
2134   { 0x19, "#ASI_AIUS_L" },
2135   { 0x80, "#ASI_P" },
2136   { 0x81, "#ASI_S" },
2137   { 0x82, "#ASI_PNF" },
2138   { 0x83, "#ASI_SNF" },
2139   { 0x88, "#ASI_P_L" },
2140   { 0x89, "#ASI_S_L" },
2141   { 0x8a, "#ASI_PNF_L" },
2142   { 0x8b, "#ASI_SNF_L" },
2143   { 0x04, "#ASI_NUCLEUS" },
2144   { 0x0c, "#ASI_NUCLEUS_LITTLE" },
2145   { 0x10, "#ASI_AS_IF_USER_PRIMARY" },
2146   { 0x11, "#ASI_AS_IF_USER_SECONDARY" },
2147   { 0x18, "#ASI_AS_IF_USER_PRIMARY_LITTLE" },
2148   { 0x19, "#ASI_AS_IF_USER_SECONDARY_LITTLE" },
2149   { 0x80, "#ASI_PRIMARY" },
2150   { 0x81, "#ASI_SECONDARY" },
2151   { 0x82, "#ASI_PRIMARY_NOFAULT" },
2152   { 0x83, "#ASI_SECONDARY_NOFAULT" },
2153   { 0x88, "#ASI_PRIMARY_LITTLE" },
2154   { 0x89, "#ASI_SECONDARY_LITTLE" },
2155   { 0x8a, "#ASI_PRIMARY_NOFAULT_LITTLE" },
2156   { 0x8b, "#ASI_SECONDARY_NOFAULT_LITTLE" },
2157   /* These are UltraSPARC extensions.  */
2158   /* FIXME: There are dozens of them.  Not sure we want them all.
2159      Most are for kernel building but some are for vis type stuff.  */
2160   { 0, 0 }
2161 };
2162
2163 /* Return the name for ASI value VALUE or NULL if not found.  */
2164
2165 static const char *
2166 sparc_decode_asi_v9 (int value)
2167 {
2168   return lookup_value (asi_table_v9, value);
2169 }
2170
2171 static const char *
2172 sparc_decode_asi_v8 (int value)
2173 {
2174   return lookup_value (asi_table_v8, value);
2175 }
2176 \f
2177 /* Handle membar masks.  */
2178
2179 static const arg membar_table[] =
2180 {
2181   { 0x40, "#Sync" },
2182   { 0x20, "#MemIssue" },
2183   { 0x10, "#Lookaside" },
2184   { 0x08, "#StoreStore" },
2185   { 0x04, "#LoadStore" },
2186   { 0x02, "#StoreLoad" },
2187   { 0x01, "#LoadLoad" },
2188   { 0, 0 }
2189 };
2190
2191 /* Return the name for membar value VALUE or NULL if not found.  */
2192
2193 static const char *
2194 sparc_decode_membar (int value)
2195 {
2196   return lookup_value (membar_table, value);
2197 }
2198 \f
2199 /* Handle prefetch args.  */
2200
2201 static const arg prefetch_table[] =
2202 {
2203   { 0, "#n_reads" },
2204   { 1, "#one_read" },
2205   { 2, "#n_writes" },
2206   { 3, "#one_write" },
2207   { 4, "#page" },
2208   { 16, "#invalidate" },
2209   { 0, 0 }
2210 };
2211
2212 /* Return the name for prefetch value VALUE or NULL if not found.  */
2213
2214 static const char *
2215 sparc_decode_prefetch (int value)
2216 {
2217   return lookup_value (prefetch_table, value);
2218 }
2219 \f
2220 /* Handle sparclet coprocessor registers.  */
2221
2222 static const arg sparclet_cpreg_table[] =
2223 {
2224   { 0, "%ccsr" },
2225   { 1, "%ccfr" },
2226   { 2, "%cccrcr" },
2227   { 3, "%ccpr" },
2228   { 4, "%ccsr2" },
2229   { 5, "%cccrr" },
2230   { 6, "%ccrstr" },
2231   { 0, 0 }
2232 };
2233
2234 /* Return the name for sparclet cpreg value VALUE or NULL if not found.  */
2235
2236 static const char *
2237 sparc_decode_sparclet_cpreg (int value)
2238 {
2239   return lookup_value (sparclet_cpreg_table, value);
2240 }
2241
2242 #undef MASK_V9
2243
2244 /* opcodes/sparc-dis.c */
2245
2246 /* Print SPARC instructions.
2247    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2248    2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
2249
2250    This program is free software; you can redistribute it and/or modify
2251    it under the terms of the GNU General Public License as published by
2252    the Free Software Foundation; either version 2 of the License, or
2253    (at your option) any later version.
2254
2255    This program is distributed in the hope that it will be useful,
2256    but WITHOUT ANY WARRANTY; without even the implied warranty of
2257    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2258    GNU General Public License for more details.
2259
2260    You should have received a copy of the GNU General Public License
2261    along with this program; if not, write to the Free Software
2262    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2263    MA 02110-1301, USA.  */
2264
2265 /* Bitmask of v9 architectures.  */
2266 #define MASK_V9 ((1 << SPARC_OPCODE_ARCH_V9) \
2267                  | (1 << SPARC_OPCODE_ARCH_V9A) \
2268                  | (1 << SPARC_OPCODE_ARCH_V9B))
2269 /* 1 if INSN is for v9 only.  */
2270 #define V9_ONLY_P(insn) (! ((insn)->architecture & ~MASK_V9))
2271 /* 1 if INSN is for v9.  */
2272 #define V9_P(insn) (((insn)->architecture & MASK_V9) != 0)
2273
2274 /* The sorted opcode table.  */
2275 static const sparc_opcode **sorted_opcodes;
2276
2277 /* For faster lookup, after insns are sorted they are hashed.  */
2278 /* ??? I think there is room for even more improvement.  */
2279
2280 #define HASH_SIZE 256
2281 /* It is important that we only look at insn code bits as that is how the
2282    opcode table is hashed.  OPCODE_BITS is a table of valid bits for each
2283    of the main types (0,1,2,3).  */
2284 static const int opcode_bits[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 };
2285 #define HASH_INSN(INSN) \
2286   ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19))
2287 typedef struct sparc_opcode_hash
2288 {
2289   struct sparc_opcode_hash *next;
2290   const sparc_opcode *opcode;
2291 } sparc_opcode_hash;
2292
2293 static sparc_opcode_hash *opcode_hash_table[HASH_SIZE];
2294
2295 /* Sign-extend a value which is N bits long.  */
2296 #define SEX(value, bits) \
2297         ((((int)(value)) << ((8 * sizeof (int)) - bits))        \
2298                          >> ((8 * sizeof (int)) - bits) )
2299
2300 static const char * const reg_names[] =
2301 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2302   "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2303   "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2304   "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2305   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
2306   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
2307   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2308   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2309   "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
2310   "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
2311   "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
2312   "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
2313 /* psr, wim, tbr, fpsr, cpsr are v8 only.  */
2314   "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
2315 };
2316
2317 #define freg_names      (&reg_names[4 * 8])
2318
2319 /* These are ordered according to there register number in
2320    rdpr and wrpr insns.  */
2321 static const char * const v9_priv_reg_names[] =
2322 {
2323   "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
2324   "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
2325   "wstate", "fq", "gl"
2326   /* "ver" - special cased */
2327 };
2328
2329 /* These are ordered according to there register number in
2330    rdhpr and wrhpr insns.  */
2331 static const char * const v9_hpriv_reg_names[] =
2332 {
2333   "hpstate", "htstate", "resv2", "hintp", "resv4", "htba", "hver",
2334   "resv7", "resv8", "resv9", "resv10", "resv11", "resv12", "resv13",
2335   "resv14", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20",
2336   "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27",
2337   "resv28", "resv29", "resv30", "hstick_cmpr"
2338 };
2339
2340 /* These are ordered according to there register number in
2341    rd and wr insns (-16).  */
2342 static const char * const v9a_asr_reg_names[] =
2343 {
2344   "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint",
2345   "softint", "tick_cmpr", "sys_tick", "sys_tick_cmpr"
2346 };
2347
2348 /* Macros used to extract instruction fields.  Not all fields have
2349    macros defined here, only those which are actually used.  */
2350
2351 #define X_RD(i)      (((i) >> 25) & 0x1f)
2352 #define X_RS1(i)     (((i) >> 14) & 0x1f)
2353 #define X_LDST_I(i)  (((i) >> 13) & 1)
2354 #define X_ASI(i)     (((i) >> 5) & 0xff)
2355 #define X_RS2(i)     (((i) >> 0) & 0x1f)
2356 #define X_IMM(i,n)   (((i) >> 0) & ((1 << (n)) - 1))
2357 #define X_SIMM(i,n)  SEX (X_IMM ((i), (n)), (n))
2358 #define X_DISP22(i)  (((i) >> 0) & 0x3fffff)
2359 #define X_IMM22(i)   X_DISP22 (i)
2360 #define X_DISP30(i)  (((i) >> 0) & 0x3fffffff)
2361
2362 /* These are for v9.  */
2363 #define X_DISP16(i)  (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
2364 #define X_DISP19(i)  (((i) >> 0) & 0x7ffff)
2365 #define X_MEMBAR(i)  ((i) & 0x7f)
2366
2367 /* Here is the union which was used to extract instruction fields
2368    before the shift and mask macros were written.
2369
2370    union sparc_insn
2371      {
2372        unsigned long int code;
2373        struct
2374          {
2375            unsigned int anop:2;
2376            #define      op      ldst.anop
2377            unsigned int anrd:5;
2378            #define      rd      ldst.anrd
2379            unsigned int op3:6;
2380            unsigned int anrs1:5;
2381            #define      rs1     ldst.anrs1
2382            unsigned int i:1;
2383            unsigned int anasi:8;
2384            #define      asi     ldst.anasi
2385            unsigned int anrs2:5;
2386            #define      rs2     ldst.anrs2
2387            #define      shcnt   rs2
2388          } ldst;
2389        struct
2390          {
2391            unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
2392            unsigned int IMM13:13;
2393            #define      imm13   IMM13.IMM13
2394          } IMM13;
2395        struct
2396          {
2397            unsigned int anop:2;
2398            unsigned int a:1;
2399            unsigned int cond:4;
2400            unsigned int op2:3;
2401            unsigned int DISP22:22;
2402            #define      disp22  branch.DISP22
2403            #define      imm22   disp22
2404          } branch;
2405        struct
2406          {
2407            unsigned int anop:2;
2408            unsigned int a:1;
2409            unsigned int z:1;
2410            unsigned int rcond:3;
2411            unsigned int op2:3;
2412            unsigned int DISP16HI:2;
2413            unsigned int p:1;
2414            unsigned int _rs1:5;
2415            unsigned int DISP16LO:14;
2416          } branch16;
2417        struct
2418          {
2419            unsigned int anop:2;
2420            unsigned int adisp30:30;
2421            #define      disp30  call.adisp30
2422          } call;
2423      };  */
2424
2425 /* Nonzero if INSN is the opcode for a delayed branch.  */
2426
2427 static int
2428 is_delayed_branch (unsigned long insn)
2429 {
2430   sparc_opcode_hash *op;
2431
2432   for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
2433     {
2434       const sparc_opcode *opcode = op->opcode;
2435
2436       if ((opcode->match & insn) == opcode->match
2437           && (opcode->lose & insn) == 0)
2438         return opcode->flags & F_DELAYED;
2439     }
2440   return 0;
2441 }
2442
2443 /* extern void qsort (); */
2444
2445 /* Records current mask of SPARC_OPCODE_ARCH_FOO values, used to pass value
2446    to compare_opcodes.  */
2447 static unsigned int current_arch_mask;
2448
2449 /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values.  */
2450
2451 static int
2452 compute_arch_mask (unsigned long mach)
2453 {
2454   switch (mach)
2455     {
2456     case 0 :
2457     case bfd_mach_sparc :
2458       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8);
2459     case bfd_mach_sparc_sparclet :
2460       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET);
2461     case bfd_mach_sparc_sparclite :
2462     case bfd_mach_sparc_sparclite_le :
2463       /* sparclites insns are recognized by default (because that's how
2464          they've always been treated, for better or worse).  Kludge this by
2465          indicating generic v8 is also selected.  */
2466       return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
2467               | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8));
2468     case bfd_mach_sparc_v8plus :
2469     case bfd_mach_sparc_v9 :
2470       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
2471     case bfd_mach_sparc_v8plusa :
2472     case bfd_mach_sparc_v9a :
2473       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A);
2474     case bfd_mach_sparc_v8plusb :
2475     case bfd_mach_sparc_v9b :
2476       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B);
2477     }
2478   abort ();
2479 }
2480
2481 /* Compare opcodes A and B.  */
2482
2483 static int
2484 compare_opcodes (const void * a, const void * b)
2485 {
2486   sparc_opcode *op0 = * (sparc_opcode **) a;
2487   sparc_opcode *op1 = * (sparc_opcode **) b;
2488   unsigned long int match0 = op0->match, match1 = op1->match;
2489   unsigned long int lose0 = op0->lose, lose1 = op1->lose;
2490   register unsigned int i;
2491
2492   /* If one (and only one) insn isn't supported by the current architecture,
2493      prefer the one that is.  If neither are supported, but they're both for
2494      the same architecture, continue processing.  Otherwise (both unsupported
2495      and for different architectures), prefer lower numbered arch's (fudged
2496      by comparing the bitmasks).  */
2497   if (op0->architecture & current_arch_mask)
2498     {
2499       if (! (op1->architecture & current_arch_mask))
2500         return -1;
2501     }
2502   else
2503     {
2504       if (op1->architecture & current_arch_mask)
2505         return 1;
2506       else if (op0->architecture != op1->architecture)
2507         return op0->architecture - op1->architecture;
2508     }
2509
2510   /* If a bit is set in both match and lose, there is something
2511      wrong with the opcode table.  */
2512   if (match0 & lose0)
2513     {
2514       fprintf
2515         (stderr,
2516          /* xgettext:c-format */
2517          _("Internal error:  bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
2518          op0->name, match0, lose0);
2519       op0->lose &= ~op0->match;
2520       lose0 = op0->lose;
2521     }
2522
2523   if (match1 & lose1)
2524     {
2525       fprintf
2526         (stderr,
2527          /* xgettext:c-format */
2528          _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
2529          op1->name, match1, lose1);
2530       op1->lose &= ~op1->match;
2531       lose1 = op1->lose;
2532     }
2533
2534   /* Because the bits that are variable in one opcode are constant in
2535      another, it is important to order the opcodes in the right order.  */
2536   for (i = 0; i < 32; ++i)
2537     {
2538       unsigned long int x = 1 << i;
2539       int x0 = (match0 & x) != 0;
2540       int x1 = (match1 & x) != 0;
2541
2542       if (x0 != x1)
2543         return x1 - x0;
2544     }
2545
2546   for (i = 0; i < 32; ++i)
2547     {
2548       unsigned long int x = 1 << i;
2549       int x0 = (lose0 & x) != 0;
2550       int x1 = (lose1 & x) != 0;
2551
2552       if (x0 != x1)
2553         return x1 - x0;
2554     }
2555
2556   /* They are functionally equal.  So as long as the opcode table is
2557      valid, we can put whichever one first we want, on aesthetic grounds.  */
2558
2559   /* Our first aesthetic ground is that aliases defer to real insns.  */
2560   {
2561     int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
2562
2563     if (alias_diff != 0)
2564       /* Put the one that isn't an alias first.  */
2565       return alias_diff;
2566   }
2567
2568   /* Except for aliases, two "identical" instructions had
2569      better have the same opcode.  This is a sanity check on the table.  */
2570   i = strcmp (op0->name, op1->name);
2571   if (i)
2572     {
2573       if (op0->flags & F_ALIAS) /* If they're both aliases, be arbitrary.  */
2574         return i;
2575       else
2576         fprintf (stderr,
2577                  /* xgettext:c-format */
2578                  _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
2579                  op0->name, op1->name);
2580     }
2581
2582   /* Fewer arguments are preferred.  */
2583   {
2584     int length_diff = strlen (op0->args) - strlen (op1->args);
2585
2586     if (length_diff != 0)
2587       /* Put the one with fewer arguments first.  */
2588       return length_diff;
2589   }
2590
2591   /* Put 1+i before i+1.  */
2592   {
2593     char *p0 = (char *) strchr (op0->args, '+');
2594     char *p1 = (char *) strchr (op1->args, '+');
2595
2596     if (p0 && p1)
2597       {
2598         /* There is a plus in both operands.  Note that a plus
2599            sign cannot be the first character in args,
2600            so the following [-1]'s are valid.  */
2601         if (p0[-1] == 'i' && p1[1] == 'i')
2602           /* op0 is i+1 and op1 is 1+i, so op1 goes first.  */
2603           return 1;
2604         if (p0[1] == 'i' && p1[-1] == 'i')
2605           /* op0 is 1+i and op1 is i+1, so op0 goes first.  */
2606           return -1;
2607       }
2608   }
2609
2610   /* Put 1,i before i,1.  */
2611   {
2612     int i0 = strncmp (op0->args, "i,1", 3) == 0;
2613     int i1 = strncmp (op1->args, "i,1", 3) == 0;
2614
2615     if (i0 ^ i1)
2616       return i0 - i1;
2617   }
2618
2619   /* They are, as far as we can tell, identical.
2620      Since qsort may have rearranged the table partially, there is
2621      no way to tell which one was first in the opcode table as
2622      written, so just say there are equal.  */
2623   /* ??? This is no longer true now that we sort a vector of pointers,
2624      not the table itself.  */
2625   return 0;
2626 }
2627
2628 /* Build a hash table from the opcode table.
2629    OPCODE_TABLE is a sorted list of pointers into the opcode table.  */
2630
2631 static void
2632 build_hash_table (const sparc_opcode **opcode_table,
2633                   sparc_opcode_hash **hash_table,
2634                   int num_opcodes)
2635 {
2636   int i;
2637   int hash_count[HASH_SIZE];
2638   static sparc_opcode_hash *hash_buf = NULL;
2639
2640   /* Start at the end of the table and work backwards so that each
2641      chain is sorted.  */
2642
2643   memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0]));
2644   memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0]));
2645   if (hash_buf != NULL)
2646     free (hash_buf);
2647   hash_buf = malloc (sizeof (* hash_buf) * num_opcodes);
2648   for (i = num_opcodes - 1; i >= 0; --i)
2649     {
2650       int hash = HASH_INSN (opcode_table[i]->match);
2651       sparc_opcode_hash *h = &hash_buf[i];
2652
2653       h->next = hash_table[hash];
2654       h->opcode = opcode_table[i];
2655       hash_table[hash] = h;
2656       ++hash_count[hash];
2657     }
2658
2659 #if 0 /* for debugging */
2660   {
2661     int min_count = num_opcodes, max_count = 0;
2662     int total;
2663
2664     for (i = 0; i < HASH_SIZE; ++i)
2665       {
2666         if (hash_count[i] < min_count)
2667           min_count = hash_count[i];
2668         if (hash_count[i] > max_count)
2669           max_count = hash_count[i];
2670         total += hash_count[i];
2671       }
2672
2673     printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
2674             min_count, max_count, (double) total / HASH_SIZE);
2675   }
2676 #endif
2677 }
2678
2679 /* Print one instruction from MEMADDR on INFO->STREAM.
2680
2681    We suffix the instruction with a comment that gives the absolute
2682    address involved, as well as its symbolic form, if the instruction
2683    is preceded by a findable `sethi' and it either adds an immediate
2684    displacement to that register, or it is an `add' or `or' instruction
2685    on that register.  */
2686
2687 int
2688 print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
2689 {
2690   FILE *stream = info->stream;
2691   bfd_byte buffer[4];
2692   unsigned long insn;
2693   sparc_opcode_hash *op;
2694   /* Nonzero of opcode table has been initialized.  */
2695   static int opcodes_initialized = 0;
2696   /* bfd mach number of last call.  */
2697   static unsigned long current_mach = 0;
2698   bfd_vma (*getword) (const unsigned char *);
2699
2700   if (!opcodes_initialized
2701       || info->mach != current_mach)
2702     {
2703       int i;
2704
2705       current_arch_mask = compute_arch_mask (info->mach);
2706
2707       if (!opcodes_initialized)
2708         sorted_opcodes =
2709           malloc (sparc_num_opcodes * sizeof (sparc_opcode *));
2710       /* Reset the sorted table so we can resort it.  */
2711       for (i = 0; i < sparc_num_opcodes; ++i)
2712         sorted_opcodes[i] = &sparc_opcodes[i];
2713       qsort ((char *) sorted_opcodes, sparc_num_opcodes,
2714              sizeof (sorted_opcodes[0]), compare_opcodes);
2715
2716       build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
2717       current_mach = info->mach;
2718       opcodes_initialized = 1;
2719     }
2720
2721   {
2722     int status =
2723       (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
2724
2725     if (status != 0)
2726       {
2727         (*info->memory_error_func) (status, memaddr, info);
2728         return -1;
2729       }
2730   }
2731
2732   /* On SPARClite variants such as DANlite (sparc86x), instructions
2733      are always big-endian even when the machine is in little-endian mode.  */
2734   if (info->endian == BFD_ENDIAN_BIG || info->mach == bfd_mach_sparc_sparclite)
2735     getword = bfd_getb32;
2736   else
2737     getword = bfd_getl32;
2738
2739   insn = getword (buffer);
2740
2741   info->insn_info_valid = 1;                    /* We do return this info.  */
2742   info->insn_type = dis_nonbranch;              /* Assume non branch insn.  */
2743   info->branch_delay_insns = 0;                 /* Assume no delay.  */
2744   info->target = 0;                             /* Assume no target known.  */
2745
2746   for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
2747     {
2748       const sparc_opcode *opcode = op->opcode;
2749
2750       /* If the insn isn't supported by the current architecture, skip it.  */
2751       if (! (opcode->architecture & current_arch_mask))
2752         continue;
2753
2754       if ((opcode->match & insn) == opcode->match
2755           && (opcode->lose & insn) == 0)
2756         {
2757           /* Nonzero means that we have found an instruction which has
2758              the effect of adding or or'ing the imm13 field to rs1.  */
2759           int imm_added_to_rs1 = 0;
2760           int imm_ored_to_rs1 = 0;
2761
2762           /* Nonzero means that we have found a plus sign in the args
2763              field of the opcode table.  */
2764           int found_plus = 0;
2765
2766           /* Nonzero means we have an annulled branch.  */
2767           int is_annulled = 0;
2768
2769           /* Do we have an `add' or `or' instruction combining an
2770              immediate with rs1?  */
2771           if (opcode->match == 0x80102000) /* or */
2772             imm_ored_to_rs1 = 1;
2773           if (opcode->match == 0x80002000) /* add */
2774             imm_added_to_rs1 = 1;
2775
2776           if (X_RS1 (insn) != X_RD (insn)
2777               && strchr (opcode->args, 'r') != 0)
2778               /* Can't do simple format if source and dest are different.  */
2779               continue;
2780           if (X_RS2 (insn) != X_RD (insn)
2781               && strchr (opcode->args, 'O') != 0)
2782               /* Can't do simple format if source and dest are different.  */
2783               continue;
2784
2785           (*info->fprintf_func) (stream, opcode->name);
2786
2787           {
2788             const char *s;
2789
2790             if (opcode->args[0] != ',')
2791               (*info->fprintf_func) (stream, " ");
2792
2793             for (s = opcode->args; *s != '\0'; ++s)
2794               {
2795                 while (*s == ',')
2796                   {
2797                     (*info->fprintf_func) (stream, ",");
2798                     ++s;
2799                     switch (*s)
2800                       {
2801                       case 'a':
2802                         (*info->fprintf_func) (stream, "a");
2803                         is_annulled = 1;
2804                         ++s;
2805                         continue;
2806                       case 'N':
2807                         (*info->fprintf_func) (stream, "pn");
2808                         ++s;
2809                         continue;
2810
2811                       case 'T':
2812                         (*info->fprintf_func) (stream, "pt");
2813                         ++s;
2814                         continue;
2815
2816                       default:
2817                         break;
2818                       }
2819                   }
2820
2821                 (*info->fprintf_func) (stream, " ");
2822
2823                 switch (*s)
2824                   {
2825                   case '+':
2826                     found_plus = 1;
2827                     /* Fall through.  */
2828
2829                   default:
2830                     (*info->fprintf_func) (stream, "%c", *s);
2831                     break;
2832
2833                   case '#':
2834                     (*info->fprintf_func) (stream, "0");
2835                     break;
2836
2837 #define reg(n)  (*info->fprintf_func) (stream, "%%%s", reg_names[n])
2838                   case '1':
2839                   case 'r':
2840                     reg (X_RS1 (insn));
2841                     break;
2842
2843                   case '2':
2844                   case 'O':
2845                     reg (X_RS2 (insn));
2846                     break;
2847
2848                   case 'd':
2849                     reg (X_RD (insn));
2850                     break;
2851 #undef  reg
2852
2853 #define freg(n)         (*info->fprintf_func) (stream, "%%%s", freg_names[n])
2854 #define fregx(n)        (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
2855                   case 'e':
2856                     freg (X_RS1 (insn));
2857                     break;
2858                   case 'v':     /* Double/even.  */
2859                   case 'V':     /* Quad/multiple of 4.  */
2860                     fregx (X_RS1 (insn));
2861                     break;
2862
2863                   case 'f':
2864                     freg (X_RS2 (insn));
2865                     break;
2866                   case 'B':     /* Double/even.  */
2867                   case 'R':     /* Quad/multiple of 4.  */
2868                     fregx (X_RS2 (insn));
2869                     break;
2870
2871                   case 'g':
2872                     freg (X_RD (insn));
2873                     break;
2874                   case 'H':     /* Double/even.  */
2875                   case 'J':     /* Quad/multiple of 4.  */
2876                     fregx (X_RD (insn));
2877                     break;
2878 #undef  freg
2879 #undef  fregx
2880
2881 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
2882                   case 'b':
2883                     creg (X_RS1 (insn));
2884                     break;
2885
2886                   case 'c':
2887                     creg (X_RS2 (insn));
2888                     break;
2889
2890                   case 'D':
2891                     creg (X_RD (insn));
2892                     break;
2893 #undef  creg
2894
2895                   case 'h':
2896                     (*info->fprintf_func) (stream, "%%hi(%#x)",
2897                                            ((unsigned) 0xFFFFFFFF
2898                                             & ((int) X_IMM22 (insn) << 10)));
2899                     break;
2900
2901                   case 'i':     /* 13 bit immediate.  */
2902                   case 'I':     /* 11 bit immediate.  */
2903                   case 'j':     /* 10 bit immediate.  */
2904                     {
2905                       int imm;
2906
2907                       if (*s == 'i')
2908                         imm = X_SIMM (insn, 13);
2909                       else if (*s == 'I')
2910                         imm = X_SIMM (insn, 11);
2911                       else
2912                         imm = X_SIMM (insn, 10);
2913
2914                       /* Check to see whether we have a 1+i, and take
2915                          note of that fact.
2916
2917                          Note: because of the way we sort the table,
2918                          we will be matching 1+i rather than i+1,
2919                          so it is OK to assume that i is after +,
2920                          not before it.  */
2921                       if (found_plus)
2922                         imm_added_to_rs1 = 1;
2923
2924                       if (imm <= 9)
2925                         (*info->fprintf_func) (stream, "%d", imm);
2926                       else
2927                         (*info->fprintf_func) (stream, "%#x", imm);
2928                     }
2929                     break;
2930
2931                   case 'X':     /* 5 bit unsigned immediate.  */
2932                   case 'Y':     /* 6 bit unsigned immediate.  */
2933                     {
2934                       int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
2935
2936                       if (imm <= 9)
2937                         (info->fprintf_func) (stream, "%d", imm);
2938                       else
2939                         (info->fprintf_func) (stream, "%#x", (unsigned) imm);
2940                     }
2941                     break;
2942
2943                   case '3':
2944                     (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3));
2945                     break;
2946
2947                   case 'K':
2948                     {
2949                       int mask = X_MEMBAR (insn);
2950                       int bit = 0x40, printed_one = 0;
2951                       const char *name;
2952
2953                       if (mask == 0)
2954                         (info->fprintf_func) (stream, "0");
2955                       else
2956                         while (bit)
2957                           {
2958                             if (mask & bit)
2959                               {
2960                                 if (printed_one)
2961                                   (info->fprintf_func) (stream, "|");
2962                                 name = sparc_decode_membar (bit);
2963                                 (info->fprintf_func) (stream, "%s", name);
2964                                 printed_one = 1;
2965                               }
2966                             bit >>= 1;
2967                           }
2968                       break;
2969                     }
2970
2971                   case 'k':
2972                     info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
2973                     (*info->print_address_func) (info->target, info);
2974                     break;
2975
2976                   case 'G':
2977                     info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
2978                     (*info->print_address_func) (info->target, info);
2979                     break;
2980
2981                   case '6':
2982                   case '7':
2983                   case '8':
2984                   case '9':
2985                     (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
2986                     break;
2987
2988                   case 'z':
2989                     (*info->fprintf_func) (stream, "%%icc");
2990                     break;
2991
2992                   case 'Z':
2993                     (*info->fprintf_func) (stream, "%%xcc");
2994                     break;
2995
2996                   case 'E':
2997                     (*info->fprintf_func) (stream, "%%ccr");
2998                     break;
2999
3000                   case 's':
3001                     (*info->fprintf_func) (stream, "%%fprs");
3002                     break;
3003
3004                   case 'o':
3005                     (*info->fprintf_func) (stream, "%%asi");
3006                     break;
3007
3008                   case 'W':
3009                     (*info->fprintf_func) (stream, "%%tick");
3010                     break;
3011
3012                   case 'P':
3013                     (*info->fprintf_func) (stream, "%%pc");
3014                     break;
3015
3016                   case '?':
3017                     if (X_RS1 (insn) == 31)
3018                       (*info->fprintf_func) (stream, "%%ver");
3019                     else if ((unsigned) X_RS1 (insn) < 17)
3020                       (*info->fprintf_func) (stream, "%%%s",
3021                                              v9_priv_reg_names[X_RS1 (insn)]);
3022                     else
3023                       (*info->fprintf_func) (stream, "%%reserved");
3024                     break;
3025
3026                   case '!':
3027                     if ((unsigned) X_RD (insn) < 17)
3028                       (*info->fprintf_func) (stream, "%%%s",
3029                                              v9_priv_reg_names[X_RD (insn)]);
3030                     else
3031                       (*info->fprintf_func) (stream, "%%reserved");
3032                     break;
3033
3034                   case '$':
3035                     if ((unsigned) X_RS1 (insn) < 32)
3036                       (*info->fprintf_func) (stream, "%%%s",
3037                                              v9_hpriv_reg_names[X_RS1 (insn)]);
3038                     else
3039                       (*info->fprintf_func) (stream, "%%reserved");
3040                     break;
3041
3042                   case '%':
3043                     if ((unsigned) X_RD (insn) < 32)
3044                       (*info->fprintf_func) (stream, "%%%s",
3045                                              v9_hpriv_reg_names[X_RD (insn)]);
3046                     else
3047                       (*info->fprintf_func) (stream, "%%reserved");
3048                     break;
3049
3050                   case '/':
3051                     if (X_RS1 (insn) < 16 || X_RS1 (insn) > 25)
3052                       (*info->fprintf_func) (stream, "%%reserved");
3053                     else
3054                       (*info->fprintf_func) (stream, "%%%s",
3055                                              v9a_asr_reg_names[X_RS1 (insn)-16]);
3056                     break;
3057
3058                   case '_':
3059                     if (X_RD (insn) < 16 || X_RD (insn) > 25)
3060                       (*info->fprintf_func) (stream, "%%reserved");
3061                     else
3062                       (*info->fprintf_func) (stream, "%%%s",
3063                                              v9a_asr_reg_names[X_RD (insn)-16]);
3064                     break;
3065
3066                   case '*':
3067                     {
3068                       const char *name = sparc_decode_prefetch (X_RD (insn));
3069
3070                       if (name)
3071                         (*info->fprintf_func) (stream, "%s", name);
3072                       else
3073                         (*info->fprintf_func) (stream, "%ld", X_RD (insn));
3074                       break;
3075                     }
3076
3077                   case 'M':
3078                     (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn));
3079                     break;
3080
3081                   case 'm':
3082                     (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn));
3083                     break;
3084
3085                   case 'L':
3086                     info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
3087                     (*info->print_address_func) (info->target, info);
3088                     break;
3089
3090                   case 'n':
3091                     (*info->fprintf_func)
3092                       (stream, "%#x", SEX (X_DISP22 (insn), 22));
3093                     break;
3094
3095                   case 'l':
3096                     info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
3097                     (*info->print_address_func) (info->target, info);
3098                     break;
3099
3100                   case 'A':
3101                     {
3102                       const char *name;
3103
3104                       if ((info->mach == bfd_mach_sparc_v8plusa) ||
3105                           ((info->mach >= bfd_mach_sparc_v9) &&
3106                            (info->mach <= bfd_mach_sparc_v9b)))
3107                         name = sparc_decode_asi_v9 (X_ASI (insn));
3108                       else
3109                         name = sparc_decode_asi_v8 (X_ASI (insn));
3110
3111                       if (name)
3112                         (*info->fprintf_func) (stream, "%s", name);
3113                       else
3114                         (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn));
3115                       break;
3116                     }
3117
3118                   case 'C':
3119                     (*info->fprintf_func) (stream, "%%csr");
3120                     break;
3121
3122                   case 'F':
3123                     (*info->fprintf_func) (stream, "%%fsr");
3124                     break;
3125
3126                   case 'p':
3127                     (*info->fprintf_func) (stream, "%%psr");
3128                     break;
3129
3130                   case 'q':
3131                     (*info->fprintf_func) (stream, "%%fq");
3132                     break;
3133
3134                   case 'Q':
3135                     (*info->fprintf_func) (stream, "%%cq");
3136                     break;
3137
3138                   case 't':
3139                     (*info->fprintf_func) (stream, "%%tbr");
3140                     break;
3141
3142                   case 'w':
3143                     (*info->fprintf_func) (stream, "%%wim");
3144                     break;
3145
3146                   case 'x':
3147                     (*info->fprintf_func) (stream, "%ld",
3148                                            ((X_LDST_I (insn) << 8)
3149                                             + X_ASI (insn)));
3150                     break;
3151
3152                   case 'y':
3153                     (*info->fprintf_func) (stream, "%%y");
3154                     break;
3155
3156                   case 'u':
3157                   case 'U':
3158                     {
3159                       int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
3160                       const char *name = sparc_decode_sparclet_cpreg (val);
3161
3162                       if (name)
3163                         (*info->fprintf_func) (stream, "%s", name);
3164                       else
3165                         (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
3166                       break;
3167                     }
3168                   }
3169               }
3170           }
3171
3172           /* If we are adding or or'ing something to rs1, then
3173              check to see whether the previous instruction was
3174              a sethi to the same register as in the sethi.
3175              If so, attempt to print the result of the add or
3176              or (in this context add and or do the same thing)
3177              and its symbolic value.  */
3178           if (imm_ored_to_rs1 || imm_added_to_rs1)
3179             {
3180               unsigned long prev_insn;
3181               int errcode;
3182
3183               if (memaddr >= 4)
3184                 errcode =
3185                   (*info->read_memory_func)
3186                   (memaddr - 4, buffer, sizeof (buffer), info);
3187               else
3188                 errcode = 1;
3189
3190               prev_insn = getword (buffer);
3191
3192               if (errcode == 0)
3193                 {
3194                   /* If it is a delayed branch, we need to look at the
3195                      instruction before the delayed branch.  This handles
3196                      sequences such as:
3197
3198                      sethi %o1, %hi(_foo), %o1
3199                      call _printf
3200                      or %o1, %lo(_foo), %o1  */
3201
3202                   if (is_delayed_branch (prev_insn))
3203                     {
3204                       if (memaddr >= 8)
3205                         errcode = (*info->read_memory_func)
3206                           (memaddr - 8, buffer, sizeof (buffer), info);
3207                       else
3208                         errcode = 1;
3209
3210                       prev_insn = getword (buffer);
3211                     }
3212                 }
3213
3214               /* If there was a problem reading memory, then assume
3215                  the previous instruction was not sethi.  */
3216               if (errcode == 0)
3217                 {
3218                   /* Is it sethi to the same register?  */
3219                   if ((prev_insn & 0xc1c00000) == 0x01000000
3220                       && X_RD (prev_insn) == X_RS1 (insn))
3221                     {
3222                       (*info->fprintf_func) (stream, "\t! ");
3223                       info->target =
3224                         ((unsigned) 0xFFFFFFFF
3225                          & ((int) X_IMM22 (prev_insn) << 10));
3226                       if (imm_added_to_rs1)
3227                         info->target += X_SIMM (insn, 13);
3228                       else
3229                         info->target |= X_SIMM (insn, 13);
3230                       (*info->print_address_func) (info->target, info);
3231                       info->insn_type = dis_dref;
3232                       info->data_size = 4;  /* FIXME!!! */
3233                     }
3234                 }
3235             }
3236
3237           if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
3238             {
3239                 /* FIXME -- check is_annulled flag.  */
3240               if (opcode->flags & F_UNBR)
3241                 info->insn_type = dis_branch;
3242               if (opcode->flags & F_CONDBR)
3243                 info->insn_type = dis_condbranch;
3244               if (opcode->flags & F_JSR)
3245                 info->insn_type = dis_jsr;
3246               if (opcode->flags & F_DELAYED)
3247                 info->branch_delay_insns = 1;
3248             }
3249
3250           return sizeof (buffer);
3251         }
3252     }
3253
3254   info->insn_type = dis_noninsn;        /* Mark as non-valid instruction.  */
3255   (*info->fprintf_func) (stream, _("unknown"));
3256   return sizeof (buffer);
3257 }