~ubuntu-branches/ubuntu/wily/qemu-kvm-spice/wily

« back to all changes in this revision

Viewing changes to sparc-dis.c

  • Committer: Bazaar Package Importer
  • Author(s): Serge Hallyn
  • Date: 2011-10-19 10:44:56 UTC
  • Revision ID: james.westby@ubuntu.com-20111019104456-xgvskumk3sxi97f4
Tags: upstream-0.15.0+noroms
ImportĀ upstreamĀ versionĀ 0.15.0+noroms

Show diffs side-by-side

added added

removed removed

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