home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / binutils-2.7-src.tgz / tar.out / fsf / binutils / opcodes / sparc-opc.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  106KB  |  1,889 lines

  1. /* Table of opcodes for the sparc.
  2.    Copyright (C) 1989, 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
  3.  
  4. This file is part of the BFD library.
  5.  
  6. BFD is free software; you can redistribute it and/or modify it under
  7. the terms of the GNU General Public License as published by the Free
  8. Software Foundation; either version 2, or (at your option) any later
  9. version.
  10.  
  11. BFD is distributed in the hope that it will be useful, but WITHOUT ANY
  12. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14. for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this software; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 59 Temple Place - Suite 330,
  19. Boston, MA 02111-1307, USA.    */
  20.  
  21. /* FIXME-someday: perhaps the ,a's and such should be embedded in the
  22.    instruction's name rather than the args.  This would make gas faster, pinsn
  23.    slower, but would mess up some macros a bit.  xoxorich. */
  24.  
  25. /* v9 FIXME: Doesn't accept `setsw', `setx' synthetic instructions for v9.  */
  26.  
  27. #include <stdio.h>
  28. #include "ansidecl.h"
  29. #include "opcode/sparc.h"
  30.  
  31. /* Some defines to make life easy.  */
  32. #define MASK_V6        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V6)
  33. #define MASK_V7        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V7)
  34. #define MASK_V8        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8)
  35. #define MASK_SPARCLET    SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET)
  36. #define MASK_SPARCLITE    SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
  37. #define MASK_V9        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9)
  38. #define MASK_V9A    SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A)
  39.  
  40. /* Bit masks of architectures supporting the insn.  */
  41.  
  42. #define v6        (MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLET \
  43.              | MASK_SPARCLITE | MASK_V9 | MASK_V9A)
  44. /* v6 insns not supported on the sparclet */
  45. #define v6notlet    (MASK_V6 | MASK_V7 | MASK_V8 \
  46.              | MASK_SPARCLITE | MASK_V9 | MASK_V9A)
  47. #define v7        (MASK_V7 | MASK_V8 | MASK_SPARCLET \
  48.              | MASK_SPARCLITE | MASK_V9 | MASK_V9A)
  49. /* Although not all insns are implemented in hardware, sparclite is defined
  50.    to be a superset of v8.  Unimplemented insns trap and are then theoretically
  51.    implemented in software.
  52.    It's not clear that the same is true for sparclet, although the docs
  53.    suggest it is.  Rather than complicating things, the sparclet assembler
  54.    recognizes all v8 insns.  */
  55. #define v8        (MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE | MASK_V9 | MASK_V9A)
  56. #define sparclet    (MASK_SPARCLET)
  57. #define sparclite    (MASK_SPARCLITE)
  58. #define v9        (MASK_V9 | MASK_V9A)
  59. #define v9a        (MASK_V9A)
  60. /* v6 insns not supported by v9 */
  61. #define v6notv9        (MASK_V6 | MASK_V7 | MASK_V8 \
  62.              | MASK_SPARCLET | MASK_SPARCLITE)
  63.  
  64. /* Table of opcode architectures.
  65.    The order is defined in opcode/sparc.h.
  66.    The names must match the arguments to gas' -A<arch> option in tc-sparc.c.
  67. */
  68. const struct sparc_opcode_arch sparc_opcode_archs[] = {
  69.   { "v6", MASK_V6 },
  70.   { "v7", MASK_V6 | MASK_V7 },
  71.   { "v8", MASK_V6 | MASK_V7 | MASK_V8 },
  72.   { "sparclet", MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLET },
  73.   { "sparclite", MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLITE },
  74.   /* ??? Don't some v8 priviledged insns conflict with v9?  */
  75.   /* ??? Will we want v8plus{,a} entries?  */
  76.   { "v9", MASK_V6 | MASK_V7 | MASK_V8 | MASK_V9 },
  77.   /* v9 with ultrasparc additions */
  78.   { "v9a", MASK_V6 | MASK_V7 | MASK_V8 | MASK_V9 | MASK_V9A },
  79.   { NULL, 0 }
  80. };
  81.  
  82. /* Given NAME, return it's architecture entry.  */
  83.  
  84. enum sparc_opcode_arch_val
  85. sparc_opcode_lookup_arch (name)
  86.      const char *name;
  87. {
  88.   const struct sparc_opcode_arch *p;
  89.  
  90.   for (p = &sparc_opcode_archs[0]; p->name; ++p)
  91.     {
  92.       if (strcmp (name, p->name) == 0)
  93.     return (enum sparc_opcode_arch_val) (p - &sparc_opcode_archs[0]);
  94.     }
  95.  
  96.   return SPARC_OPCODE_ARCH_BAD;
  97. }
  98.  
  99. /* Branch condition field.  */
  100. #define COND(x)        (((x)&0xf)<<25)
  101.  
  102. /* v9: Move (MOVcc and FMOVcc) condition field.  */
  103. #define MCOND(x,i_or_f)    ((((i_or_f)&1)<<18)|(((x)>>11)&(0xf<<14))) /* v9 */
  104.  
  105. /* v9: Move register (MOVRcc and FMOVRcc) condition field.  */
  106. #define RCOND(x)    (((x)&0x7)<<10)    /* v9 */
  107.  
  108. #define CONDA    (COND(0x8))
  109. #define CONDCC    (COND(0xd))
  110. #define CONDCS    (COND(0x5))
  111. #define CONDE    (COND(0x1))
  112. #define CONDG    (COND(0xa))
  113. #define CONDGE    (COND(0xb))
  114. #define CONDGU    (COND(0xc))
  115. #define CONDL    (COND(0x3))
  116. #define CONDLE    (COND(0x2))
  117. #define CONDLEU    (COND(0x4))
  118. #define CONDN    (COND(0x0))
  119. #define CONDNE    (COND(0x9))
  120. #define CONDNEG    (COND(0x6))
  121. #define CONDPOS    (COND(0xe))
  122. #define CONDVC    (COND(0xf))
  123. #define CONDVS    (COND(0x7))
  124.  
  125. #define CONDNZ    CONDNE
  126. #define CONDZ    CONDE
  127. #define CONDGEU    CONDCC
  128. #define CONDLU    CONDCS
  129.  
  130. #define FCONDA        (COND(0x8))
  131. #define FCONDE        (COND(0x9))
  132. #define FCONDG        (COND(0x6))
  133. #define FCONDGE        (COND(0xb))
  134. #define FCONDL        (COND(0x4))
  135. #define FCONDLE        (COND(0xd))
  136. #define FCONDLG        (COND(0x2))
  137. #define FCONDN        (COND(0x0))
  138. #define FCONDNE        (COND(0x1))
  139. #define FCONDO        (COND(0xf))
  140. #define FCONDU        (COND(0x7))
  141. #define FCONDUE        (COND(0xa))
  142. #define FCONDUG        (COND(0x5))
  143. #define FCONDUGE    (COND(0xc))
  144. #define FCONDUL        (COND(0x3))
  145. #define FCONDULE    (COND(0xe))
  146.  
  147. #define FCONDNZ    FCONDNE
  148. #define FCONDZ    FCONDE
  149.  
  150. #define ICC (0)    /* v9 */
  151. #define XCC (1<<12) /* v9 */
  152. #define FCC(x)    (((x)&0x3)<<11) /* v9 */
  153. #define FBFCC(x)    (((x)&0x3)<<20)    /* v9 */
  154.  
  155. /* The order of the opcodes in the table is significant:
  156.     
  157.     * The assembler requires that all instances of the same mnemonic must
  158.     be consecutive.    If they aren't, the assembler will bomb at runtime.
  159.  
  160.     * The disassembler should not care about the order of the opcodes.
  161.  
  162. */
  163.  
  164. /* Entries for commutative arithmetic operations.  */
  165. /* ??? More entries can make use of this.  */
  166. #define COMMUTEOP(opcode, op3, arch_mask) \
  167. { opcode,    F3(2, op3, 0), F3(~2, ~op3, ~0)|ASI(~0),    "1,2,d", 0, arch_mask }, \
  168. { opcode,    F3(2, op3, 1), F3(~2, ~op3, ~1),        "1,i,d", 0, arch_mask }, \
  169. { opcode,    F3(2, op3, 1), F3(~2, ~op3, ~1),        "i,1,d", 0, arch_mask }
  170.  
  171. struct sparc_opcode sparc_opcodes[] = {
  172.  
  173. { "ld",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0),        "[1+2],d", 0, v6 },
  174. { "ld",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,    "[1],d", 0, v6 }, /* ld [rs1+%g0],d */
  175. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[1+i],d", 0, v6 },
  176. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[i+1],d", 0, v6 },
  177. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,    "[i],d", 0, v6 },
  178. { "ld",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ld [rs1+0],d */
  179. { "ld",    F3(3, 0x20, 0), F3(~3, ~0x20, ~0),        "[1+2],g", 0, v6 },
  180. { "ld",    F3(3, 0x20, 0), F3(~3, ~0x20, ~0)|RS2_G0,    "[1],g", 0, v6 }, /* ld [rs1+%g0],d */
  181. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1),        "[1+i],g", 0, v6 },
  182. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1),        "[i+1],g", 0, v6 },
  183. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|RS1_G0,    "[i],g", 0, v6 },
  184. { "ld",    F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|SIMM13(~0),    "[1],g", 0, v6 }, /* ld [rs1+0],d */
  185.  
  186. { "ld",    F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RD(~0),    "[1+2],F", 0, v6 },
  187. { "ld",    F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RS2_G0|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+%g0],d */
  188. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),    "[1+i],F", 0, v6 },
  189. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),    "[i+1],F", 0, v6 },
  190. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~0),"[i],F", 0, v6 },
  191. { "ld",    F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+0],d */
  192.  
  193. { "ld",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0),        "[1+2],D", 0, v6notv9 },
  194. { "ld",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,    "[1],D", 0, v6notv9 }, /* ld [rs1+%g0],d */
  195. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[1+i],D", 0, v6notv9 },
  196. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[i+1],D", 0, v6notv9 },
  197. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,    "[i],D", 0, v6notv9 },
  198. { "ld",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),    "[1],D", 0, v6notv9 }, /* ld [rs1+0],d */
  199. { "ld",    F3(3, 0x31, 0), F3(~3, ~0x31, ~0),        "[1+2],C", 0, v6notv9 },
  200. { "ld",    F3(3, 0x31, 0), F3(~3, ~0x31, ~0)|RS2_G0,    "[1],C", 0, v6notv9 }, /* ld [rs1+%g0],d */
  201. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1),        "[1+i],C", 0, v6notv9 },
  202. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1),        "[i+1],C", 0, v6notv9 },
  203. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|RS1_G0,    "[i],C", 0, v6notv9 },
  204. { "ld",    F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|SIMM13(~0),    "[1],C", 0, v6notv9 }, /* ld [rs1+0],d */
  205.  
  206. /* The v9 LDUW is the same as the old 'ld' opcode, it is not the same as the
  207.    'ld' pseudo-op in v9.  */
  208. { "lduw",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0),        "[1+2],d", F_ALIAS, v9 },
  209. { "lduw",    F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,    "[1],d", F_ALIAS, v9 }, /* ld [rs1+%g0],d */
  210. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[1+i],d", F_ALIAS, v9 },
  211. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1),        "[i+1],d", F_ALIAS, v9 },
  212. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,    "[i],d", F_ALIAS, v9 },
  213. { "lduw",    F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),    "[1],d", F_ALIAS, v9 }, /* ld [rs1+0],d */
  214.  
  215. { "ldd",    F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  216. { "ldd",    F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldd [rs1+%g0],d */
  217. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1),        "[1+i],d", 0, v6 },
  218. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1),        "[i+1],d", 0, v6 },
  219. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|RS1_G0,    "[i],d", 0, v6 },
  220. { "ldd",    F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldd [rs1+0],d */
  221. { "ldd",    F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI(~0),    "[1+2],H", 0, v6 },
  222. { "ldd",    F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI_RS2(~0),    "[1],H", 0, v6 }, /* ldd [rs1+%g0],d */
  223. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1),        "[1+i],H", 0, v6 },
  224. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1),        "[i+1],H", 0, v6 },
  225. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|RS1_G0,    "[i],H", 0, v6 },
  226. { "ldd",    F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|SIMM13(~0),    "[1],H", 0, v6 }, /* ldd [rs1+0],d */
  227.  
  228. { "ldd",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI(~0),    "[1+2],D", 0, v6notv9 },
  229. { "ldd",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI_RS2(~0),    "[1],D", 0, v6notv9 }, /* ldd [rs1+%g0],d */
  230. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[1+i],D", 0, v6notv9 },
  231. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[i+1],D", 0, v6notv9 },
  232. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,    "[i],D", 0, v6notv9 },
  233. { "ldd",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),    "[1],D", 0, v6notv9 }, /* ldd [rs1+0],d */
  234.  
  235. { "ldq",    F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI(~0),    "[1+2],J", 0, v9 },
  236. { "ldq",    F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI_RS2(~0),    "[1],J", 0, v9 }, /* ldd [rs1+%g0],d */
  237. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1),        "[1+i],J", 0, v9 },
  238. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1),        "[i+1],J", 0, v9 },
  239. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|RS1_G0,    "[i],J", 0, v9 },
  240. { "ldq",    F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|SIMM13(~0),    "[1],J", 0, v9 }, /* ldd [rs1+0],d */
  241.  
  242. { "ldsb",    F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  243. { "ldsb",    F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldsb [rs1+%g0],d */
  244. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1),        "[1+i],d", 0, v6 },
  245. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1),        "[i+1],d", 0, v6 },
  246. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|RS1_G0,    "[i],d", 0, v6 },
  247. { "ldsb",    F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldsb [rs1+0],d */
  248.  
  249. { "ldsh",    F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldsh [rs1+%g0],d */
  250. { "ldsh",    F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  251. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),        "[1+i],d", 0, v6 },
  252. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),        "[i+1],d", 0, v6 },
  253. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|RS1_G0,    "[i],d", 0, v6 },
  254. { "ldsh",    F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldsh [rs1+0],d */
  255.  
  256. { "ldstub",    F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  257. { "ldstub",    F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldstub [rs1+%g0],d */
  258. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),        "[1+i],d", 0, v6 },
  259. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),        "[i+1],d", 0, v6 },
  260. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|RS1_G0,    "[i],d", 0, v6 },
  261. { "ldstub",    F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldstub [rs1+0],d */
  262.  
  263. { "ldsw",    F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI(~0),    "[1+2],d", 0, v9 },
  264. { "ldsw",    F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI_RS2(~0),    "[1],d", 0, v9 }, /* ldsw [rs1+%g0],d */
  265. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1),        "[1+i],d", 0, v9 },
  266. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1),        "[i+1],d", 0, v9 },
  267. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|RS1_G0,    "[i],d", 0, v9 },
  268. { "ldsw",    F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|SIMM13(~0),    "[1],d", 0, v9 }, /* ldsw [rs1+0],d */
  269.  
  270. { "ldub",    F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  271. { "ldub",    F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* ldub [rs1+%g0],d */
  272. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1),        "[1+i],d", 0, v6 },
  273. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1),        "[i+1],d", 0, v6 },
  274. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|RS1_G0,    "[i],d", 0, v6 },
  275. { "ldub",    F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* ldub [rs1+0],d */
  276.  
  277. { "lduh",    F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI(~0),    "[1+2],d", 0, v6 },
  278. { "lduh",    F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI_RS2(~0),    "[1],d", 0, v6 }, /* lduh [rs1+%g0],d */
  279. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1),        "[1+i],d", 0, v6 },
  280. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1),        "[i+1],d", 0, v6 },
  281. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|RS1_G0,    "[i],d", 0, v6 },
  282. { "lduh",    F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|SIMM13(~0),    "[1],d", 0, v6 }, /* lduh [rs1+0],d */
  283.  
  284. { "ldx",    F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI(~0),    "[1+2],d", 0, v9 },
  285. { "ldx",    F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI_RS2(~0),    "[1],d", 0, v9 }, /* ldx [rs1+%g0],d */
  286. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),        "[1+i],d", 0, v9 },
  287. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),        "[i+1],d", 0, v9 },
  288. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|RS1_G0,    "[i],d", 0, v9 },
  289. { "ldx",    F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|SIMM13(~0),    "[1],d", 0, v9 }, /* ldx [rs1+0],d */
  290.  
  291. { "ldx",    F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RD(~1),    "[1+2],F", 0, v9 },
  292. { "ldx",    F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RS2_G0|RD(~1),    "[1],F", 0, v9 }, /* ld [rs1+%g0],d */
  293. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1),    "[1+i],F", 0, v9 },
  294. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1),    "[i+1],F", 0, v9 },
  295. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~1),    "[i],F", 0, v9 },
  296. { "ldx",    F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~1),"[1],F", 0, v9 }, /* ld [rs1+0],d */
  297.  
  298. { "lda",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0),        "[1+2]A,d", 0, v6 },
  299. { "lda",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* lda [rs1+%g0],d */
  300. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[1+i]o,d", 0, v9 },
  301. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[i+1]o,d", 0, v9 },
  302. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  303. { "lda",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  304. { "lda",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0),        "[1+2]A,g", 0, v9 },
  305. { "lda",    F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,    "[1]A,g", 0, v9 }, /* lda [rs1+%g0],d */
  306. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[1+i]o,g", 0, v9 },
  307. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1),        "[i+1]o,g", 0, v9 },
  308. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,    "[i]o,g", 0, v9 },
  309. { "lda",    F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),    "[1]o,g", 0, v9 }, /* ld [rs1+0],d */
  310.  
  311. { "ldda",    F3(3, 0x13, 0), F3(~3, ~0x13, ~0),        "[1+2]A,d", 0, v6 },
  312. { "ldda",    F3(3, 0x13, 0), F3(~3, ~0x13, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldda [rs1+%g0],d */
  313. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1),        "[1+i]o,d", 0, v9 },
  314. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1),        "[i+1]o,d", 0, v9 },
  315. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  316. { "ldda",    F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  317.  
  318. { "ldda",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0),        "[1+2]A,H", 0, v9 },
  319. { "ldda",    F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|RS2_G0,    "[1]A,H", 0, v9 }, /* ldda [rs1+%g0],d */
  320. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[1+i]o,H", 0, v9 },
  321. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1),        "[i+1]o,H", 0, v9 },
  322. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,    "[i]o,H", 0, v9 },
  323. { "ldda",    F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),    "[1]o,H", 0, v9 }, /* ld [rs1+0],d */
  324.  
  325. { "ldqa",    F3(3, 0x32, 0), F3(~3, ~0x32, ~0),        "[1+2]A,J", 0, v9 },
  326. { "ldqa",    F3(3, 0x32, 0), F3(~3, ~0x32, ~0)|RS2_G0,    "[1]A,J", 0, v9 }, /* ldd [rs1+%g0],d */
  327. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1),        "[1+i]o,J", 0, v9 },
  328. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1),        "[i+1]o,J", 0, v9 },
  329. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|RS1_G0,    "[i]o,J", 0, v9 },
  330. { "ldqa",    F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|SIMM13(~0),    "[1]o,J", 0, v9 }, /* ldd [rs1+0],d */
  331.  
  332. { "ldsba",    F3(3, 0x19, 0), F3(~3, ~0x19, ~0),        "[1+2]A,d", 0, v6 },
  333. { "ldsba",    F3(3, 0x19, 0), F3(~3, ~0x19, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldsba [rs1+%g0],d */
  334. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1),        "[1+i]o,d", 0, v9 },
  335. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1),        "[i+1]o,d", 0, v9 },
  336. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  337. { "ldsba",    F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  338.  
  339. { "ldsha",    F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0),        "[1+2]A,d", 0, v6 },
  340. { "ldsha",    F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldsha [rs1+%g0],d */
  341. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),        "[1+i]o,d", 0, v9 },
  342. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),        "[i+1]o,d", 0, v9 },
  343. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  344. { "ldsha",    F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  345.  
  346. { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0),        "[1+2]A,d", 0, v6 },
  347. { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* ldstuba [rs1+%g0],d */
  348. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),        "[1+i]o,d", 0, v9 },
  349. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),        "[i+1]o,d", 0, v9 },
  350. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  351. { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  352.  
  353. { "ldswa",    F3(3, 0x18, 0), F3(~3, ~0x18, ~0),        "[1+2]A,d", 0, v9 },
  354. { "ldswa",    F3(3, 0x18, 0), F3(~3, ~0x18, ~0)|RS2_G0,    "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
  355. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1),        "[1+i]o,d", 0, v9 },
  356. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1),        "[i+1]o,d", 0, v9 },
  357. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  358. { "ldswa",    F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  359.  
  360. { "lduba",    F3(3, 0x11, 0), F3(~3, ~0x11, ~0),        "[1+2]A,d", 0, v6 },
  361. { "lduba",    F3(3, 0x11, 0), F3(~3, ~0x11, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* lduba [rs1+%g0],d */
  362. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1),        "[1+i]o,d", 0, v9 },
  363. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1),        "[i+1]o,d", 0, v9 },
  364. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  365. { "lduba",    F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  366.  
  367. { "lduha",    F3(3, 0x12, 0), F3(~3, ~0x12, ~0),        "[1+2]A,d", 0, v6 },
  368. { "lduha",    F3(3, 0x12, 0), F3(~3, ~0x12, ~0)|RS2_G0,    "[1]A,d", 0, v6 }, /* lduha [rs1+%g0],d */
  369. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1),        "[1+i]o,d", 0, v9 },
  370. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1),        "[i+1]o,d", 0, v9 },
  371. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  372. { "lduha",    F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  373.  
  374. { "lduwa",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0),        "[1+2]A,d", F_ALIAS, v9 }, /* lduwa === lda */
  375. { "lduwa",    F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,    "[1]A,d", F_ALIAS, v9 }, /* lda [rs1+%g0],d */
  376. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[1+i]o,d", F_ALIAS, v9 },
  377. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1),        "[i+1]o,d", F_ALIAS, v9 },
  378. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,    "[i]o,d", F_ALIAS, v9 },
  379. { "lduwa",    F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),    "[1]o,d", F_ALIAS, v9 }, /* ld [rs1+0],d */
  380.  
  381. { "ldxa",    F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0),        "[1+2]A,d", 0, v9 }, /* lduwa === lda */
  382. { "ldxa",    F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0)|RS2_G0,    "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
  383. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),        "[1+i]o,d", 0, v9 },
  384. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),        "[i+1]o,d", 0, v9 },
  385. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  386. { "ldxa",    F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
  387.  
  388. { "st",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),        "d,[1+2]", 0, v6 },
  389. { "st",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),        "d,[1]", 0, v6 }, /* st d,[rs1+%g0] */
  390. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),            "d,[1+i]", 0, v6 },
  391. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),            "d,[i+1]", 0, v6 },
  392. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,        "d,[i]", 0, v6 },
  393. { "st",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),        "d,[1]", 0, v6 }, /* st d,[rs1+0] */
  394. { "st",    F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI(~0),        "g,[1+2]", 0, v6 },
  395. { "st",    F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI_RS2(~0),        "g,[1]", 0, v6 }, /* st d[rs1+%g0] */
  396. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1),            "g,[1+i]", 0, v6 },
  397. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1),            "g,[i+1]", 0, v6 },
  398. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|RS1_G0,        "g,[i]", 0, v6 },
  399. { "st",    F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|SIMM13(~0),        "g,[1]", 0, v6 }, /* st d,[rs1+0] */
  400.  
  401. { "st",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI(~0),        "D,[1+2]", 0, v6notv9 },
  402. { "st",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI_RS2(~0),        "D,[1]", 0, v6notv9 }, /* st d,[rs1+%g0] */
  403. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),            "D,[1+i]", 0, v6notv9 },
  404. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),            "D,[i+1]", 0, v6notv9 },
  405. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,        "D,[i]", 0, v6notv9 },
  406. { "st",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),        "D,[1]", 0, v6notv9 }, /* st d,[rs1+0] */
  407. { "st",    F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI(~0),        "C,[1+2]", 0, v6notv9 },
  408. { "st",    F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI_RS2(~0),        "C,[1]", 0, v6notv9 }, /* st d,[rs1+%g0] */
  409. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1),            "C,[1+i]", 0, v6notv9 },
  410. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1),            "C,[i+1]", 0, v6notv9 },
  411. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|RS1_G0,        "C,[i]", 0, v6notv9 },
  412. { "st",    F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|SIMM13(~0),        "C,[1]", 0, v6notv9 }, /* st d,[rs1+0] */
  413.  
  414. { "st",    F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI(~0),    "F,[1+2]", 0, v6 },
  415. { "st",    F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI_RS2(~0),    "F,[1]", 0, v6 }, /* st d,[rs1+%g0] */
  416. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,        "F,[1+i]", 0, v6 },
  417. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,        "F,[i+1]", 0, v6 },
  418. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|RS1_G0,        "F,[i]", 0, v6 },
  419. { "st",    F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|SIMM13(~0),    "F,[1]", 0, v6 }, /* st d,[rs1+0] */
  420.  
  421. { "stw",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),    "d,[1+2]", F_ALIAS, v9 },
  422. { "stw",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),    "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
  423. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),        "d,[1+i]", F_ALIAS, v9 },
  424. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1),        "d,[i+1]", F_ALIAS, v9 },
  425. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,    "d,[i]", F_ALIAS, v9 },
  426. { "stw",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),    "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
  427.  
  428. { "sta",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0),        "d,[1+2]A", 0, v6 },
  429. { "sta",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* sta d,[rs1+%g0] */
  430. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[1+i]o", 0, v9 },
  431. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[i+1]o", 0, v9 },
  432. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  433. { "sta",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* st d,[rs1+0] */
  434.  
  435. { "sta",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0),        "g,[1+2]A", 0, v9 },
  436. { "sta",    F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|RS2(~0),    "g,[1]A", 0, v9 }, /* sta d,[rs1+%g0] */
  437. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),        "g,[1+i]o", 0, v9 },
  438. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1),        "g,[i+1]o", 0, v9 },
  439. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,    "g,[i]o", 0, v9 },
  440. { "sta",    F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),    "g,[1]o", 0, v9 }, /* st d,[rs1+0] */
  441.  
  442. { "stwa",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0),        "d,[1+2]A", F_ALIAS, v9 },
  443. { "stwa",    F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),    "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
  444. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[1+i]o", F_ALIAS, v9 },
  445. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1),        "d,[i+1]o", F_ALIAS, v9 },
  446. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,    "d,[i]o", F_ALIAS, v9 },
  447. { "stwa",    F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),    "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
  448.  
  449. { "stb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),    "d,[1+2]", 0, v6 },
  450. { "stb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),    "d,[1]", 0, v6 }, /* stb d,[rs1+%g0] */
  451. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1),        "d,[1+i]", 0, v6 },
  452. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1),        "d,[i+1]", 0, v6 },
  453. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,    "d,[i]", 0, v6 },
  454. { "stb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),    "d,[1]", 0, v6 }, /* stb d,[rs1+0] */
  455.  
  456. { "stba",    F3(3, 0x15, 0), F3(~3, ~0x15, ~0),        "d,[1+2]A", 0, v6 },
  457. { "stba",    F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* stba d,[rs1+%g0] */
  458. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1),        "d,[1+i]o", 0, v9 },
  459. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1),        "d,[i+1]o", 0, v9 },
  460. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  461. { "stba",    F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* stb d,[rs1+0] */
  462.  
  463. { "std",    F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI(~0),    "d,[1+2]", 0, v6 },
  464. { "std",    F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI_RS2(~0),    "d,[1]", 0, v6 }, /* std d,[rs1+%g0] */
  465. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1),        "d,[1+i]", 0, v6 },
  466. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1),        "d,[i+1]", 0, v6 },
  467. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|RS1_G0,    "d,[i]", 0, v6 },
  468. { "std",    F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|SIMM13(~0),    "d,[1]", 0, v6 }, /* std d,[rs1+0] */
  469.  
  470. { "std",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),    "q,[1+2]", 0, v6notv9 },
  471. { "std",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),    "q,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
  472. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "q,[1+i]", 0, v6notv9 },
  473. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "q,[i+1]", 0, v6notv9 },
  474. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,    "q,[i]", 0, v6notv9 },
  475. { "std",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),    "q,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
  476. { "std",    F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI(~0),    "H,[1+2]", 0, v6 },
  477. { "std",    F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI_RS2(~0),    "H,[1]", 0, v6 }, /* std d,[rs1+%g0] */
  478. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1),        "H,[1+i]", 0, v6 },
  479. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1),        "H,[i+1]", 0, v6 },
  480. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|RS1_G0,    "H,[i]", 0, v6 },
  481. { "std",    F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|SIMM13(~0),    "H,[1]", 0, v6 }, /* std d,[rs1+0] */
  482.  
  483. { "std",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),    "Q,[1+2]", 0, v6notv9 },
  484. { "std",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),    "Q,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
  485. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "Q,[1+i]", 0, v6notv9 },
  486. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "Q,[i+1]", 0, v6notv9 },
  487. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,    "Q,[i]", 0, v6notv9 },
  488. { "std",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),    "Q,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
  489. { "std",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI(~0),    "D,[1+2]", 0, v6notv9 },
  490. { "std",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI_RS2(~0),    "D,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
  491. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "D,[1+i]", 0, v6notv9 },
  492. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "D,[i+1]", 0, v6notv9 },
  493. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,    "D,[i]", 0, v6notv9 },
  494. { "std",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),    "D,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
  495.  
  496. { "stda",    F3(3, 0x17, 0), F3(~3, ~0x17, ~0),        "d,[1+2]A", 0, v6 },
  497. { "stda",    F3(3, 0x17, 0), F3(~3, ~0x17, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* stda d,[rs1+%g0] */
  498. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1),        "d,[1+i]o", 0, v9 },
  499. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1),        "d,[i+1]o", 0, v9 },
  500. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  501. { "stda",    F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* std d,[rs1+0] */
  502. { "stda",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0),        "H,[1+2]A", 0, v9 },
  503. { "stda",    F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|RS2(~0),    "H,[1]A", 0, v9 }, /* stda d,[rs1+%g0] */
  504. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "H,[1+i]o", 0, v9 },
  505. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1),        "H,[i+1]o", 0, v9 },
  506. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,    "H,[i]o", 0, v9 },
  507. { "stda",    F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),    "H,[1]o", 0, v9 }, /* std d,[rs1+0] */
  508.  
  509. { "sth",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),    "d,[1+2]", 0, v6 },
  510. { "sth",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),    "d,[1]", 0, v6 }, /* sth d,[rs1+%g0] */
  511. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1),        "d,[1+i]", 0, v6 },
  512. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1),        "d,[i+1]", 0, v6 },
  513. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,    "d,[i]", 0, v6 },
  514. { "sth",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),    "d,[1]", 0, v6 }, /* sth d,[rs1+0] */
  515.  
  516. { "stha",    F3(3, 0x16, 0), F3(~3, ~0x16, ~0),        "d,[1+2]A", 0, v6 },
  517. { "stha",    F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),    "d,[1]A", 0, v6 }, /* stha ,[rs1+%g0] */
  518. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1),        "d,[1+i]o", 0, v9 },
  519. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1),        "d,[i+1]o", 0, v9 },
  520. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  521. { "stha",    F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* sth d,[rs1+0] */
  522.  
  523. { "stx",    F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI(~0),    "d,[1+2]", 0, v9 },
  524. { "stx",    F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI_RS2(~0),    "d,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
  525. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),        "d,[1+i]", 0, v9 },
  526. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),        "d,[i+1]", 0, v9 },
  527. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RS1_G0,    "d,[i]", 0, v9 },
  528. { "stx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|SIMM13(~0),    "d,[1]", 0, v9 }, /* stx d,[rs1+0] */
  529.  
  530. { "stx",    F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI(~0)|RD(~1),    "F,[1+2]", 0, v9 },
  531. { "stx",    F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI_RS2(~0)|RD(~1),"F,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
  532. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),        "F,[1+i]", 0, v9 },
  533. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),        "F,[i+1]", 0, v9 },
  534. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RS1_G0|RD(~1),    "F,[i]", 0, v9 },
  535. { "stx",    F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|SIMM13(~0)|RD(~1),"F,[1]", 0, v9 }, /* stx d,[rs1+0] */
  536.  
  537. { "stxa",    F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0),        "d,[1+2]A", 0, v9 },
  538. { "stxa",    F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0)|RS2(~0),    "d,[1]A", 0, v9 }, /* stxa d,[rs1+%g0] */
  539. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),        "d,[1+i]o", 0, v9 },
  540. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),        "d,[i+1]o", 0, v9 },
  541. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|RS1_G0,    "d,[i]o", 0, v9 },
  542. { "stxa",    F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|SIMM13(~0),    "d,[1]o", 0, v9 }, /* stx d,[rs1+0] */
  543.  
  544. { "stq",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),    "J,[1+2]", 0, v9 },
  545. { "stq",    F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),    "J,[1]", 0, v9 }, /* stq [rs1+%g0] */
  546. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "J,[1+i]", 0, v9 },
  547. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1),        "J,[i+1]", 0, v9 },
  548. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,    "J,[i]", 0, v9 },
  549. { "stq",    F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),    "J,[1]", 0, v9 }, /* stq [rs1+0] */
  550.  
  551. { "stqa",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),    "J,[1+2]A", 0, v9 },
  552. { "stqa",    F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),    "J,[1]A", 0, v9 }, /* stqa [rs1+%g0] */
  553. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "J,[1+i]o", 0, v9 },
  554. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1),        "J,[i+1]o", 0, v9 },
  555. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,    "J,[i]o", 0, v9 },
  556. { "stqa",    F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),    "J,[1]o", 0, v9 }, /* stqa [rs1+0] */
  557.  
  558. { "swap",    F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI(~0),    "[1+2],d", 0, v7 },
  559. { "swap",    F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI_RS2(~0),    "[1],d", 0, v7 }, /* swap [rs1+%g0],d */
  560. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),        "[1+i],d", 0, v7 },
  561. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),        "[i+1],d", 0, v7 },
  562. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|RS1_G0,    "[i],d", 0, v7 },
  563. { "swap",    F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|SIMM13(~0),    "[1],d", 0, v7 }, /* swap [rs1+0],d */
  564.  
  565. { "swapa",    F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0),        "[1+2]A,d", 0, v7 },
  566. { "swapa",    F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0)|RS2(~0),    "[1]A,d", 0, v7 }, /* swapa [rs1+%g0],d */
  567. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),        "[1+i]o,d", 0, v9 },
  568. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),        "[i+1]o,d", 0, v9 },
  569. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|RS1_G0,    "[i]o,d", 0, v9 },
  570. { "swapa",    F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|SIMM13(~0),    "[1]o,d", 0, v9 }, /* swap [rs1+0],d */
  571.  
  572. { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|ASI(~0),            "1,2,d", 0, v6 },
  573. { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),    "", 0, v6 }, /* restore %g0,%g0,%g0 */
  574. { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1),                "1,i,d", 0, v6 },
  575. { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1)|RD_G0|RS1_G0|SIMM13(~0),    "", 0, v6 }, /* restore %g0,0,%g0 */
  576.  
  577. { "rett",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI(~0),    "1+2", F_UNBR|F_DELAYED, v6 }, /* rett rs1+rs2 */
  578. { "rett",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1,%g0 */
  579. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,        "1+i", F_UNBR|F_DELAYED, v6 }, /* rett rs1+X */
  580. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,        "i+1", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
  581. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,        "i", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
  582. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,        "i", F_UNBR|F_DELAYED, v6 },    /* rett X */
  583. { "rett",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|SIMM13(~0),    "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1+0 */
  584.  
  585. { "save",    F3(2, 0x3c, 0), F3(~2, ~0x3c, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  586. { "save",    F3(2, 0x3c, 1), F3(~2, ~0x3c, ~1),        "1,i,d", 0, v6 },
  587. { "save",    0x81e00000,    ~0x81e00000,            "", F_ALIAS, v6 },
  588.  
  589. { "ret",  F3(2, 0x38, 1)|RS1(0x1f)|SIMM13(8), F3(~2, ~0x38, ~1)|SIMM13(~8),           "", F_UNBR|F_DELAYED, v6 }, /* jmpl %i7+8,%g0 */
  590. { "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 */
  591.  
  592. { "jmpl",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI(~0),    "1+2,d", F_JSR|F_DELAYED, v6 },
  593. { "jmpl",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI_RS2(~0),    "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,d */
  594. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|SIMM13(~0),    "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,d */
  595. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RS1_G0,    "i,d", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,d */
  596. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1),        "1+i,d", F_JSR|F_DELAYED, v6 },
  597. { "jmpl",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1),        "i+1,d", F_JSR|F_DELAYED, v6 },
  598.  
  599. { "done",    F3(2, 0x3e, 0)|RD(0), F3(~2, ~0x3e, ~0)|RD(~0)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  600. { "retry",    F3(2, 0x3e, 0)|RD(1), F3(~2, ~0x3e, ~0)|RD(~1)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  601. { "saved",    F3(2, 0x31, 0)|RD(0), F3(~2, ~0x31, ~0)|RD(~0)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  602. { "restored",    F3(2, 0x31, 0)|RD(1), F3(~2, ~0x31, ~0)|RD(~1)|RS1_G0|SIMM13(~0),    "", 0, v9 },
  603. { "sir",    F3(2, 0x30, 1)|RD(0xf), F3(~2, ~0x30, ~1)|RD(~0xf)|RS1_G0,        "i", 0, v9 },
  604.  
  605. { "flush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),    "1+2", 0, v8 },
  606. { "flush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),    "1", 0, v8 }, /* flush rs1+%g0 */
  607. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),    "1", 0, v8 }, /* flush rs1+0 */
  608. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,    "i", 0, v8 }, /* flush %g0+i */
  609. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "1+i", 0, v8 },
  610. { "flush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "i+1", 0, v8 },
  611.  
  612. /* IFLUSH was renamed to FLUSH in v8.  */
  613. { "iflush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),    "1+2", F_ALIAS, v6 },
  614. { "iflush",    F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),    "1", F_ALIAS, v6 }, /* flush rs1+%g0 */
  615. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),    "1", F_ALIAS, v6 }, /* flush rs1+0 */
  616. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,    "i", F_ALIAS, v6 },
  617. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "1+i", F_ALIAS, v6 },
  618. { "iflush",    F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),        "i+1", F_ALIAS, v6 },
  619.  
  620. { "return",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI(~0),    "1+2", 0, v9 },
  621. { "return",    F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI_RS2(~0),    "1", 0, v9 }, /* return rs1+%g0 */
  622. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|SIMM13(~0),    "1", 0, v9 }, /* return rs1+0 */
  623. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RS1_G0,    "i", 0, v9 }, /* return %g0+i */
  624. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1),        "1+i", 0, v9 },
  625. { "return",    F3(2, 0x39, 1), F3(~2, ~0x39, ~1),        "i+1", 0, v9 },
  626.  
  627. { "flushw",    F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),    "", 0, v9 },
  628.  
  629. { "membar",    F3(2, 0x28, 1)|RS1(0xf), F3(~2, ~0x28, ~1)|RD_G0|RS1(~0xf)|SIMM13(~127), "K", 0, v9 },
  630. { "stbar",    F3(2, 0x28, 0)|RS1(0xf), F3(~2, ~0x28, ~0)|RD_G0|RS1(~0xf)|SIMM13(~0), "", 0, v8 },
  631.  
  632. { "prefetch",    F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0),        "[1+2],*", 0, v9 },
  633. { "prefetch",    F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0)|RS2_G0,    "[1],*", 0, v9 }, /* prefetch [rs1+%g0],prefetch_fcn */
  634. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),        "[1+i],*", 0, v9 },
  635. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),        "[i+1],*", 0, v9 },
  636. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|RS1_G0,    "[i],*", 0, v9 },
  637. { "prefetch",    F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|SIMM13(~0),    "[1],*", 0, v9 }, /* prefetch [rs1+0],prefetch_fcn */
  638. { "prefetcha",    F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0),        "[1+2]A,*", 0, v9 },
  639. { "prefetcha",    F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0)|RS2_G0,    "[1]A,*", 0, v9 }, /* prefetcha [rs1+%g0],prefetch_fcn */
  640. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),        "[1+i]o,*", 0, v9 },
  641. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),        "[i+1]o,*", 0, v9 },
  642. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|RS1_G0,    "[i]o,*", 0, v9 },
  643. { "prefetcha",    F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|SIMM13(~0),    "[1]o,*", 0, v9 }, /* prefetcha [rs1+0],d */
  644.  
  645. { "sll",    F3(2, 0x25, 0), F3(~2, ~0x25, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
  646. { "sll",    F3(2, 0x25, 1), F3(~2, ~0x25, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
  647. { "sra",    F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
  648. { "sra",    F3(2, 0x27, 1), F3(~2, ~0x27, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
  649. { "srl",    F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
  650. { "srl",    F3(2, 0x26, 1), F3(~2, ~0x26, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
  651.  
  652. { "sllx",    F3(2, 0x25, 0)|(1<<12), F3(~2, ~0x25, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
  653. { "sllx",    F3(2, 0x25, 1)|(1<<12), F3(~2, ~0x25, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
  654. { "srax",    F3(2, 0x27, 0)|(1<<12), F3(~2, ~0x27, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
  655. { "srax",    F3(2, 0x27, 1)|(1<<12), F3(~2, ~0x27, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
  656. { "srlx",    F3(2, 0x26, 0)|(1<<12), F3(~2, ~0x26, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
  657. { "srlx",    F3(2, 0x26, 1)|(1<<12), F3(~2, ~0x26, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
  658.  
  659. { "mulscc",    F3(2, 0x24, 0), F3(~2, ~0x24, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  660. { "mulscc",    F3(2, 0x24, 1), F3(~2, ~0x24, ~1),        "1,i,d", 0, v6 },
  661.  
  662. { "divscc",    F3(2, 0x1d, 0), F3(~2, ~0x1d, ~0)|ASI(~0),    "1,2,d", 0, sparclite },
  663. { "divscc",    F3(2, 0x1d, 1), F3(~2, ~0x1d, ~1),        "1,i,d", 0, sparclite },
  664.  
  665. { "scan",    F3(2, 0x2c, 0), F3(~2, ~0x2c, ~0)|ASI(~0),    "1,2,d", 0, sparclet|sparclite },
  666. { "scan",    F3(2, 0x2c, 1), F3(~2, ~0x2c, ~1),        "1,i,d", 0, sparclet|sparclite },
  667.  
  668. { "popc",    F3(2, 0x2e, 0), F3(~2, ~0x2e, ~0)|RS2_G0|ASI(~0),"2,d", 0, v9 },
  669. { "popc",    F3(2, 0x2e, 1), F3(~2, ~0x2e, ~1)|RS2_G0,    "i,d", 0, v9 },
  670.  
  671. { "clr",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),    "d", F_ALIAS, v6 }, /* or %g0,%g0,d */
  672. { "clr",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0|SIMM13(~0),        "d", F_ALIAS, v6 }, /* or %g0,0,d    */
  673. { "clr",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v6 },
  674. { "clr",    F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI_RS2(~0),        "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+%g0] */
  675. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,            "[1+i]", F_ALIAS, v6 },
  676. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,            "[i+1]", F_ALIAS, v6 },
  677. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|RS1_G0,            "[i]", F_ALIAS, v6 },
  678. { "clr",    F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|SIMM13(~0),        "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+0] */
  679.  
  680. { "clrb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI(~0),    "[1+2]", F_ALIAS, v6 },
  681. { "clrb",    F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+%g0] */
  682. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,        "[1+i]", F_ALIAS, v6 },
  683. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,        "[i+1]", F_ALIAS, v6 },
  684. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|RS1_G0,        "[i]", F_ALIAS, v6 },
  685. { "clrb",    F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|SIMM13(~0),    "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+0] */
  686.  
  687. { "clrh",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI(~0),    "[1+2]", F_ALIAS, v6 },
  688. { "clrh",    F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+%g0] */
  689. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,        "[1+i]", F_ALIAS, v6 },
  690. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,        "[i+1]", F_ALIAS, v6 },
  691. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|RS1_G0,        "[i]", F_ALIAS, v6 },
  692. { "clrh",    F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|SIMM13(~0),    "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+0] */
  693.  
  694. { "clrx",    F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|RD_G0|ASI(~0),    "[1+2]", F_ALIAS, v9 },
  695. { "clrx",    F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v9 }, /* stx %g0,[rs1+%g0] */
  696. { "clrx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0,        "[1+i]", F_ALIAS, v9 },
  697. { "clrx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0,        "[i+1]", F_ALIAS, v9 },
  698. { "clrx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0|RS1_G0,        "[i]", F_ALIAS, v9 },
  699. { "clrx",    F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0|SIMM13(~0),    "[1]", F_ALIAS, v9 }, /* stx %g0,[rs1+0] */
  700.  
  701. { "orcc",    F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  702. { "orcc",    F3(2, 0x12, 1), F3(~2, ~0x12, ~1),        "1,i,d", 0, v6 },
  703. { "orcc",    F3(2, 0x12, 1), F3(~2, ~0x12, ~1),        "i,1,d", 0, v6 },
  704.  
  705. /* This is not a commutative instruction.  */
  706. { "orncc",    F3(2, 0x16, 0), F3(~2, ~0x16, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  707. { "orncc",    F3(2, 0x16, 1), F3(~2, ~0x16, ~1),        "1,i,d", 0, v6 },
  708.  
  709. /* This is not a commutative instruction.  */
  710. { "orn",    F3(2, 0x06, 0), F3(~2, ~0x06, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  711. { "orn",    F3(2, 0x06, 1), F3(~2, ~0x06, ~1),        "1,i,d", 0, v6 },
  712.  
  713. { "tst",    F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|ASI_RS2(~0),    "1", 0, v6 }, /* orcc rs1, %g0, %g0 */
  714. { "tst",    F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|RS1_G0|ASI(~0),    "2", 0, v6 }, /* orcc %g0, rs2, %g0 */
  715. { "tst",    F3(2, 0x12, 1), F3(~2, ~0x12, ~1)|RD_G0|SIMM13(~0),    "1", 0, v6 }, /* orcc rs1, 0, %g0 */
  716.  
  717. { "wr",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|ASI(~0),        "1,2,m", 0, v8 }, /* wr r,r,%asrX */
  718. { "wr",    F3(2, 0x30, 1),        F3(~2, ~0x30, ~1),            "1,i,m", 0, v8 }, /* wr r,i,%asrX */
  719. { "wr",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|ASI_RS2(~0),        "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
  720. { "wr",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),    "1,2,y", 0, v6 }, /* wr r,r,%y */
  721. { "wr",    F3(2, 0x30, 1),        F3(~2, ~0x30, ~1)|RD_G0,        "1,i,y", 0, v6 }, /* wr r,i,%y */
  722. { "wr",    F3(2, 0x30, 0),        F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
  723. { "wr",    F3(2, 0x31, 0),        F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),    "1,2,p", 0, v6notv9 }, /* wr r,r,%psr */
  724. { "wr",    F3(2, 0x31, 1),        F3(~2, ~0x31, ~1)|RD_G0,        "1,i,p", 0, v6notv9 }, /* wr r,i,%psr */
  725. { "wr",    F3(2, 0x31, 0),        F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
  726. { "wr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),    "1,2,w", 0, v6notv9 }, /* wr r,r,%wim */
  727. { "wr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1)|RD_G0,        "1,i,w", 0, v6notv9 }, /* wr r,i,%wim */
  728. { "wr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
  729. { "wr",    F3(2, 0x33, 0),        F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),    "1,2,t", 0, v6notv9 }, /* wr r,r,%tbr */
  730. { "wr",    F3(2, 0x33, 1),        F3(~2, ~0x33, ~1)|RD_G0,        "1,i,t", 0, v6notv9 }, /* wr r,i,%tbr */
  731. { "wr",    F3(2, 0x33, 0),        F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
  732.  
  733. { "wr", F3(2, 0x30, 0)|RD(2),    F3(~2, ~0x30, ~0)|RD(~2)|ASI(~0),    "1,2,E", 0, v9 }, /* wr r,r,%ccr */
  734. { "wr", F3(2, 0x30, 1)|RD(2),    F3(~2, ~0x30, ~1)|RD(~2),        "1,i,E", 0, v9 }, /* wr r,i,%ccr */
  735. { "wr", F3(2, 0x30, 0)|RD(3),    F3(~2, ~0x30, ~0)|RD(~3)|ASI(~0),    "1,2,o", 0, v9 }, /* wr r,r,%asi */
  736. { "wr", F3(2, 0x30, 1)|RD(3),    F3(~2, ~0x30, ~1)|RD(~3),        "1,i,o", 0, v9 }, /* wr r,i,%asi */
  737. { "wr", F3(2, 0x30, 0)|RD(6),    F3(~2, ~0x30, ~0)|RD(~6)|ASI(~0),    "1,2,s", 0, v9 }, /* wr r,i,%fprs */
  738. { "wr", F3(2, 0x30, 1)|RD(6),    F3(~2, ~0x30, ~1)|RD(~6),        "1,i,s", 0, v9 }, /* wr r,i,%fprs */
  739.  
  740. { "rd",    F3(2, 0x28, 0),            F3(~2, ~0x28, ~0)|SIMM13(~0),        "M,d", 0, v8 }, /* rd %asrX,r */
  741. { "rd",    F3(2, 0x28, 0),            F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", 0, v6 }, /* rd %y,r */
  742. { "rd",    F3(2, 0x29, 0),            F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", 0, v6notv9 }, /* rd %psr,r */
  743. { "rd",    F3(2, 0x2a, 0),            F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", 0, v6notv9 }, /* rd %wim,r */
  744. { "rd",    F3(2, 0x2b, 0),            F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", 0, v6notv9 }, /* rd %tbr,r */
  745.  
  746. { "rd",    F3(2, 0x28, 0)|RS1(2),        F3(~2, ~0x28, ~0)|RS1(~2)|SIMM13(~0),    "E,d", 0, v9 }, /* rd %ccr,r */
  747. { "rd",    F3(2, 0x28, 0)|RS1(3),        F3(~2, ~0x28, ~0)|RS1(~3)|SIMM13(~0),    "o,d", 0, v9 }, /* rd %asi,r */
  748. { "rd",    F3(2, 0x28, 0)|RS1(4),        F3(~2, ~0x28, ~0)|RS1(~4)|SIMM13(~0),    "W,d", 0, v9 }, /* rd %tick,r */
  749. { "rd",    F3(2, 0x28, 0)|RS1(5),        F3(~2, ~0x28, ~0)|RS1(~5)|SIMM13(~0),    "P,d", 0, v9 }, /* rd %pc,r */
  750. { "rd",    F3(2, 0x28, 0)|RS1(6),        F3(~2, ~0x28, ~0)|RS1(~6)|SIMM13(~0),    "s,d", 0, v9 }, /* rd %fprs,r */
  751.  
  752. { "rdpr",    F3(2, 0x2a, 0),        F3(~2, ~0x2a, ~0)|SIMM13(~0),    "?,d", 0, v9 },   /* rdpr %priv,r */
  753. { "wrpr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0),        "1,2,!", 0, v9 }, /* wrpr r1,r2,%priv */
  754. { "wrpr",    F3(2, 0x32, 0),        F3(~2, ~0x32, ~0)|SIMM13(~0),    "1,!", 0, v9 },   /* wrpr r1,%priv */
  755. { "wrpr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1),        "1,i,!", 0, v9 }, /* wrpr r1,i,%priv */
  756. { "wrpr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1),        "i,1,!", F_ALIAS, v9 }, /* wrpr i,r1,%priv */
  757. { "wrpr",    F3(2, 0x32, 1),        F3(~2, ~0x32, ~1)|RS1(~0),    "i,!", 0, v9 },   /* wrpr i,%priv */
  758.  
  759. /* ??? This group seems wrong.  A three operand move?  */
  760. { "mov",    F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI(~0),        "1,2,m", F_ALIAS, v8 }, /* wr r,r,%asrX */
  761. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1),            "1,i,m", F_ALIAS, v8 }, /* wr r,i,%asrX */
  762. { "mov",    F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),    "1,2,y", F_ALIAS, v6 }, /* wr r,r,%y */
  763. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,        "1,i,y", F_ALIAS, v6 }, /* wr r,i,%y */
  764. { "mov",    F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),    "1,2,p", F_ALIAS, v6notv9 }, /* wr r,r,%psr */
  765. { "mov",    F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,        "1,i,p", F_ALIAS, v6notv9 }, /* wr r,i,%psr */
  766. { "mov",    F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),    "1,2,w", F_ALIAS, v6notv9 }, /* wr r,r,%wim */
  767. { "mov",    F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,        "1,i,w", F_ALIAS, v6notv9 }, /* wr r,i,%wim */
  768. { "mov",    F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),    "1,2,t", F_ALIAS, v6notv9 }, /* wr r,r,%tbr */
  769. { "mov",    F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,        "1,i,t", F_ALIAS, v6notv9 }, /* wr r,i,%tbr */
  770.  
  771. { "mov",    F3(2, 0x28, 0), F3(~2, ~0x28, ~0)|SIMM13(~0),        "M,d", F_ALIAS, v8 }, /* rd %asr1,r */
  772. { "mov",    F3(2, 0x28, 0), F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", F_ALIAS, v6 }, /* rd %y,r */
  773. { "mov",    F3(2, 0x29, 0), F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", F_ALIAS, v6notv9 }, /* rd %psr,r */
  774. { "mov",    F3(2, 0x2a, 0), F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", F_ALIAS, v6notv9 }, /* rd %wim,r */
  775. { "mov",    F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", F_ALIAS, v6notv9 }, /* rd %tbr,r */
  776.  
  777. { "mov",    F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI_RS2(~0),        "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
  778. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1),            "i,m", F_ALIAS, v8 }, /* wr %g0,i,%asrX */
  779. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|SIMM13(~0),        "1,m", F_ALIAS, v8 }, /* wr rs1,0,%asrX */
  780. { "mov",    F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
  781. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,        "i,y", F_ALIAS, v6 }, /* wr %g0,i,%y */
  782. { "mov",    F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0|SIMM13(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,0,%y */
  783. { "mov",    F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
  784. { "mov",    F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,        "i,p", F_ALIAS, v6notv9 }, /* wr %g0,i,%psr */
  785. { "mov",    F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0|SIMM13(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,0,%psr */
  786. { "mov",    F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
  787. { "mov",    F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,        "i,w", F_ALIAS, v6notv9 }, /* wr %g0,i,%wim */
  788. { "mov",    F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0|SIMM13(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,0,%wim */
  789. { "mov",    F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
  790. { "mov",    F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,        "i,t", F_ALIAS, v6notv9 }, /* wr %g0,i,%tbr */
  791. { "mov",    F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0|SIMM13(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,0,%tbr */
  792.  
  793. { "mov",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RS1_G0|ASI(~0),    "2,d", 0, v6 }, /* or %g0,rs2,d */
  794. { "mov",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0,        "i,d", 0, v6 }, /* or %g0,i,d    */
  795. { "mov",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI_RS2(~0),        "1,d", 0, v6 }, /* or rs1,%g0,d   */
  796. { "mov",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|SIMM13(~0),        "1,d", 0, v6 }, /* or rs1,0,d */
  797.  
  798. { "or",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  799. { "or",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1),        "1,i,d", 0, v6 },
  800. { "or",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1),        "i,1,d", 0, v6 },
  801.  
  802. { "bset",    F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),    "2,r", F_ALIAS, v6 },    /* or rd,rs2,rd */
  803. { "bset",    F3(2, 0x02, 1), F3(~2, ~0x02, ~1),        "i,r", F_ALIAS, v6 },    /* or rd,i,rd */
  804.  
  805. /* This is not a commutative instruction.  */
  806. { "andn",    F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  807. { "andn",    F3(2, 0x05, 1), F3(~2, ~0x05, ~1),        "1,i,d", 0, v6 },
  808.  
  809. /* This is not a commutative instruction.  */
  810. { "andncc",    F3(2, 0x15, 0), F3(~2, ~0x15, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  811. { "andncc",    F3(2, 0x15, 1), F3(~2, ~0x15, ~1),        "1,i,d", 0, v6 },
  812.  
  813. { "bclr",    F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),    "2,r", F_ALIAS, v6 },    /* andn rd,rs2,rd */
  814. { "bclr",    F3(2, 0x05, 1), F3(~2, ~0x05, ~1),        "i,r", F_ALIAS, v6 },    /* andn rd,i,rd */
  815.  
  816. { "cmp",    F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|RD_G0|ASI(~0),    "1,2", 0, v6 },    /* subcc rs1,rs2,%g0 */
  817. { "cmp",    F3(2, 0x14, 1), F3(~2, ~0x14, ~1)|RD_G0,        "1,i", 0, v6 },    /* subcc rs1,i,%g0 */
  818.  
  819. { "sub",    F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  820. { "sub",    F3(2, 0x04, 1), F3(~2, ~0x04, ~1),        "1,i,d", 0, v6 },
  821.  
  822. { "subcc",    F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  823. { "subcc",    F3(2, 0x14, 1), F3(~2, ~0x14, ~1),        "1,i,d", 0, v6 },
  824.  
  825. { "subx",    F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),    "1,2,d", 0, v6notv9 },
  826. { "subx",    F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),        "1,i,d", 0, v6notv9 },
  827. { "subc",    F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  828. { "subc",    F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),        "1,i,d", 0, v9 },
  829.  
  830. { "subxcc",    F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),    "1,2,d", 0, v6notv9 },
  831. { "subxcc",    F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),        "1,i,d", 0, v6notv9 },
  832. { "subccc",    F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  833. { "subccc",    F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),        "1,i,d", 0, v9 },
  834.  
  835. { "and",    F3(2, 0x01, 0), F3(~2, ~0x01, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  836. { "and",    F3(2, 0x01, 1), F3(~2, ~0x01, ~1),        "1,i,d", 0, v6 },
  837. { "and",    F3(2, 0x01, 1), F3(~2, ~0x01, ~1),        "i,1,d", 0, v6 },
  838.  
  839. { "andcc",    F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  840. { "andcc",    F3(2, 0x11, 1), F3(~2, ~0x11, ~1),        "1,i,d", 0, v6 },
  841. { "andcc",    F3(2, 0x11, 1), F3(~2, ~0x11, ~1),        "i,1,d", 0, v6 },
  842.  
  843. { "dec",    F3(2, 0x04, 1)|SIMM13(0x1), F3(~2, ~0x04, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* sub rd,1,rd */
  844. { "dec",    F3(2, 0x04, 1),            F3(~2, ~0x04, ~1),               "i,r", F_ALIAS, v8 },    /* sub rd,imm,rd */
  845. { "deccc",    F3(2, 0x14, 1)|SIMM13(0x1), F3(~2, ~0x14, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* subcc rd,1,rd */
  846. { "deccc",    F3(2, 0x14, 1),            F3(~2, ~0x14, ~1),               "i,r", F_ALIAS, v8 },    /* subcc rd,imm,rd */
  847. { "inc",    F3(2, 0x00, 1)|SIMM13(0x1), F3(~2, ~0x00, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* add rd,1,rd */
  848. { "inc",    F3(2, 0x00, 1),            F3(~2, ~0x00, ~1),               "i,r", F_ALIAS, v8 },    /* add rd,imm,rd */
  849. { "inccc",    F3(2, 0x10, 1)|SIMM13(0x1), F3(~2, ~0x10, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },    /* addcc rd,1,rd */
  850. { "inccc",    F3(2, 0x10, 1),            F3(~2, ~0x10, ~1),               "i,r", F_ALIAS, v8 },    /* addcc rd,imm,rd */
  851.  
  852. { "btst",    F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|RD_G0|ASI(~0), "1,2", F_ALIAS, v6 },    /* andcc rs1,rs2,%g0 */
  853. { "btst",    F3(2, 0x11, 1), F3(~2, ~0x11, ~1)|RD_G0, "i,1", F_ALIAS, v6 },    /* andcc rs1,i,%g0 */
  854.  
  855. { "neg",    F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "2,d", F_ALIAS, v6 }, /* sub %g0,rs2,rd */
  856. { "neg",    F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "O", F_ALIAS, v6 }, /* sub %g0,rd,rd */
  857.  
  858. { "add",    F3(2, 0x00, 0), F3(~2, ~0x00, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  859. { "add",    F3(2, 0x00, 1), F3(~2, ~0x00, ~1),        "1,i,d", 0, v6 },
  860. { "add",    F3(2, 0x00, 1), F3(~2, ~0x00, ~1),        "i,1,d", 0, v6 },
  861. { "addcc",    F3(2, 0x10, 0), F3(~2, ~0x10, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  862. { "addcc",    F3(2, 0x10, 1), F3(~2, ~0x10, ~1),        "1,i,d", 0, v6 },
  863. { "addcc",    F3(2, 0x10, 1), F3(~2, ~0x10, ~1),        "i,1,d", 0, v6 },
  864.  
  865. { "addx",    F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),    "1,2,d", 0, v6notv9 },
  866. { "addx",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "1,i,d", 0, v6notv9 },
  867. { "addx",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "i,1,d", 0, v6notv9 },
  868. { "addc",    F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  869. { "addc",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "1,i,d", 0, v9 },
  870. { "addc",    F3(2, 0x08, 1), F3(~2, ~0x08, ~1),        "i,1,d", 0, v9 },
  871.  
  872. { "addxcc",    F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),    "1,2,d", 0, v6notv9 },
  873. { "addxcc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "1,i,d", 0, v6notv9 },
  874. { "addxcc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "i,1,d", 0, v6notv9 },
  875. { "addccc",    F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  876. { "addccc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "1,i,d", 0, v9 },
  877. { "addccc",    F3(2, 0x18, 1), F3(~2, ~0x18, ~1),        "i,1,d", 0, v9 },
  878.  
  879. { "smul",    F3(2, 0x0b, 0), F3(~2, ~0x0b, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  880. { "smul",    F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),        "1,i,d", 0, v8 },
  881. { "smul",    F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),        "i,1,d", 0, v8 },
  882. { "smulcc",    F3(2, 0x1b, 0), F3(~2, ~0x1b, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  883. { "smulcc",    F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),        "1,i,d", 0, v8 },
  884. { "smulcc",    F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),        "i,1,d", 0, v8 },
  885. { "umul",    F3(2, 0x0a, 0), F3(~2, ~0x0a, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  886. { "umul",    F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),        "1,i,d", 0, v8 },
  887. { "umul",    F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),        "i,1,d", 0, v8 },
  888. { "umulcc",    F3(2, 0x1a, 0), F3(~2, ~0x1a, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  889. { "umulcc",    F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),        "1,i,d", 0, v8 },
  890. { "umulcc",    F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),        "i,1,d", 0, v8 },
  891. { "sdiv",    F3(2, 0x0f, 0), F3(~2, ~0x0f, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  892. { "sdiv",    F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),        "1,i,d", 0, v8 },
  893. { "sdiv",    F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),        "i,1,d", 0, v8 },
  894. { "sdivcc",    F3(2, 0x1f, 0), F3(~2, ~0x1f, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  895. { "sdivcc",    F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),        "1,i,d", 0, v8 },
  896. { "sdivcc",    F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),        "i,1,d", 0, v8 },
  897. { "udiv",    F3(2, 0x0e, 0), F3(~2, ~0x0e, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  898. { "udiv",    F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),        "1,i,d", 0, v8 },
  899. { "udiv",    F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),        "i,1,d", 0, v8 },
  900. { "udivcc",    F3(2, 0x1e, 0), F3(~2, ~0x1e, ~0)|ASI(~0),    "1,2,d", 0, v8 },
  901. { "udivcc",    F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),        "1,i,d", 0, v8 },
  902. { "udivcc",    F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),        "i,1,d", 0, v8 },
  903.  
  904. { "mulx",    F3(2, 0x09, 0), F3(~2, ~0x09, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  905. { "mulx",    F3(2, 0x09, 1), F3(~2, ~0x09, ~1),        "1,i,d", 0, v9 },
  906. { "sdivx",    F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  907. { "sdivx",    F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),        "1,i,d", 0, v9 },
  908. { "udivx",    F3(2, 0x0d, 0), F3(~2, ~0x0d, ~0)|ASI(~0),    "1,2,d", 0, v9 },
  909. { "udivx",    F3(2, 0x0d, 1), F3(~2, ~0x0d, ~1),        "1,i,d", 0, v9 },
  910.  
  911. { "call",    F1(0x1), F1(~0x1), "L", F_JSR|F_DELAYED, v6 },
  912. { "call",    F1(0x1), F1(~0x1), "L,#", F_JSR|F_DELAYED, v6 },
  913.  
  914. { "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 */
  915. { "call",    F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),    "1+2,#", F_JSR|F_DELAYED, v6 },
  916. { "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 */
  917. { "call",    F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0),    "1,#", F_JSR|F_DELAYED, v6 },
  918. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "1+i", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+i,%o7 */
  919. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "1+i,#", F_JSR|F_DELAYED, v6 },
  920. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "i+1", F_JSR|F_DELAYED, v6 }, /* jmpl i+rs1,%o7 */
  921. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),        "i+1,#", F_JSR|F_DELAYED, v6 },
  922. { "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 */
  923. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,    "i,#", F_JSR|F_DELAYED, v6 },
  924. { "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 */
  925. { "call",    F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),    "1,#", F_JSR|F_DELAYED, v6 },
  926.  
  927.  
  928. /* Conditional instructions.
  929.  
  930.    Because this part of the table was such a mess earlier, I have
  931.    macrofied it so that all the branches and traps are generated from
  932.    a single-line description of each condition value.  John Gilmore. */
  933.  
  934. /* Define branches -- one annulled, one without, etc. */
  935. #define br(opcode, mask, lose, flags) \
  936.  { opcode, (mask)|ANNUL, (lose),       ",a l",   (flags), v6 }, \
  937.  { opcode, (mask)      , (lose)|ANNUL, "l",     (flags), v6 }
  938.  
  939. #define brx(opcode, mask, lose, flags) /* v9 */ \
  940.  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), "Z,G",      (flags), v9 }, \
  941.  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), ",T Z,G",   (flags), v9 }, \
  942.  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a Z,G",   (flags), v9 }, \
  943.  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a,T Z,G", (flags), v9 }, \
  944.  { opcode, (mask)|(2<<20), ANNUL|BPRED|(lose), ",N Z,G",   (flags), v9 }, \
  945.  { opcode, (mask)|(2<<20)|ANNUL, BPRED|(lose), ",a,N Z,G", (flags), v9 }, \
  946.  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), "z,G",      (flags), v9 }, \
  947.  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), ",T z,G",   (flags), v9 }, \
  948.  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a z,G",   (flags), v9 }, \
  949.  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a,T z,G", (flags), v9 }, \
  950.  { opcode, (mask), ANNUL|BPRED|(lose)|(2<<20), ",N z,G",   (flags), v9 }, \
  951.  { opcode, (mask)|ANNUL, BPRED|(lose)|(2<<20), ",a,N z,G", (flags), v9 }
  952.  
  953. /* Define four traps: reg+reg, reg + immediate, immediate alone, reg alone. */
  954. #define tr(opcode, mask, lose, flags) \
  955.  { opcode, (mask)|(2<<11)|IMMED, (lose)|RS1_G0,    "Z,i",   (flags), v9 }, /* %g0 + imm */ \
  956.  { opcode, (mask)|(2<<11)|IMMED, (lose),    "Z,1+i", (flags), v9 }, /* rs1 + imm */ \
  957.  { opcode, (mask)|(2<<11), IMMED|(lose),    "Z,1+2", (flags), v9 }, /* rs1 + rs2 */ \
  958.  { opcode, (mask)|(2<<11), IMMED|(lose)|RS2_G0,    "Z,1",   (flags), v9 }, /* rs1 + %g0 */ \
  959.  { opcode, (mask)|IMMED, (lose)|RS1_G0,    "z,i",   (flags)|F_ALIAS, v9 }, /* %g0 + imm */ \
  960.  { opcode, (mask)|IMMED, (lose),    "z,1+i", (flags)|F_ALIAS, v9 }, /* rs1 + imm */ \
  961.  { opcode, (mask), IMMED|(lose),    "z,1+2", (flags)|F_ALIAS, v9 }, /* rs1 + rs2 */ \
  962.  { opcode, (mask), IMMED|(lose)|RS2_G0,    "z,1",   (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \
  963.  { opcode, (mask)|IMMED, (lose)|RS1_G0,        "i",     (flags), v6 }, /* %g0 + imm */ \
  964.  { opcode, (mask)|IMMED, (lose),        "1+i",   (flags), v6 }, /* rs1 + imm */ \
  965.  { opcode, (mask), IMMED|(lose),        "1+2",   (flags), v6 }, /* rs1 + rs2 */ \
  966.  { opcode, (mask), IMMED|(lose)|RS2_G0,        "1",     (flags), v6 } /* rs1 + %g0 */
  967.  
  968. /* v9: We must put `brx' before `br', to ensure that we never match something
  969.    v9: against an expression unless it is an expression.  Otherwise, we end
  970.    v9: up with undefined symbol tables entries, because they get added, but
  971.    v9: are not deleted if the pattern fails to match.  */
  972.  
  973. /* Define both branches and traps based on condition mask */
  974. #define cond(bop, top, mask, flags) \
  975.   brx(bop, F2(0, 1)|(mask), F2(~0, ~1)|((~mask)&COND(~0)), F_DELAYED|(flags)), /* v9 */ \
  976.   br(bop,  F2(0, 2)|(mask), F2(~0, ~2)|((~mask)&COND(~0)), F_DELAYED|(flags)), \
  977.   tr(top,  F3(2, 0x3a, 0)|(mask), F3(~2, ~0x3a, 0)|((~mask)&COND(~0)), ((flags) & ~(F_UNBR|F_CONDBR)))
  978.  
  979. /* Define all the conditions, all the branches, all the traps.  */
  980.  
  981. /* Standard branch, trap mnemonics */
  982. cond ("b",    "ta",   CONDA, F_UNBR),
  983. /* Alternative form (just for assembly, not for disassembly) */
  984. cond ("ba",    "t",    CONDA, F_UNBR|F_ALIAS),
  985.  
  986. cond ("bcc",    "tcc",  CONDCC, F_CONDBR),
  987. cond ("bcs",    "tcs",  CONDCS, F_CONDBR),
  988. cond ("be",    "te",   CONDE, F_CONDBR),
  989. cond ("beq",    "teq",  CONDE, F_CONDBR|F_ALIAS),
  990. cond ("bg",    "tg",   CONDG, F_CONDBR),
  991. cond ("bgt",    "tgt",  CONDG, F_CONDBR|F_ALIAS),
  992. cond ("bge",    "tge",  CONDGE, F_CONDBR),
  993. cond ("bgeu",    "tgeu", CONDGEU, F_CONDBR|F_ALIAS), /* for cc */
  994. cond ("bgu",    "tgu",  CONDGU, F_CONDBR),
  995. cond ("bl",    "tl",   CONDL, F_CONDBR),
  996. cond ("blt",    "tlt",  CONDL, F_CONDBR|F_ALIAS),
  997. cond ("ble",    "tle",  CONDLE, F_CONDBR),
  998. cond ("bleu",    "tleu", CONDLEU, F_CONDBR),
  999. cond ("blu",    "tlu",  CONDLU, F_CONDBR|F_ALIAS), /* for cs */
  1000. cond ("bn",    "tn",   CONDN, F_CONDBR),
  1001. cond ("bne",    "tne",  CONDNE, F_CONDBR),
  1002. cond ("bneg",    "tneg", CONDNEG, F_CONDBR),
  1003. cond ("bnz",    "tnz",  CONDNZ, F_CONDBR|F_ALIAS), /* for ne */
  1004. cond ("bpos",    "tpos", CONDPOS, F_CONDBR),
  1005. cond ("bvc",    "tvc",  CONDVC, F_CONDBR),
  1006. cond ("bvs",    "tvs",  CONDVS, F_CONDBR),
  1007. cond ("bz",    "tz",   CONDZ, F_CONDBR|F_ALIAS), /* for e */
  1008.  
  1009. #undef cond
  1010. #undef br
  1011. #undef brr /* v9 */
  1012. #undef tr
  1013.  
  1014. #define brr(opcode, mask, lose, flags) /* v9 */ \
  1015.  { opcode, (mask)|BPRED, ANNUL|(lose), "1,k",      F_DELAYED|(flags), v9 }, \
  1016.  { opcode, (mask)|BPRED, ANNUL|(lose), ",T 1,k",   F_DELAYED|(flags), v9 }, \
  1017.  { opcode, (mask)|BPRED|ANNUL, (lose), ",a 1,k",   F_DELAYED|(flags), v9 }, \
  1018.  { opcode, (mask)|BPRED|ANNUL, (lose), ",a,T 1,k", F_DELAYED|(flags), v9 }, \
  1019.  { opcode, (mask), ANNUL|BPRED|(lose), ",N 1,k",   F_DELAYED|(flags), v9 }, \
  1020.  { opcode, (mask)|ANNUL, BPRED|(lose), ",a,N 1,k", F_DELAYED|(flags), v9 }
  1021.  
  1022. #define condr(bop, mask, flags) /* v9 */ \
  1023.   brr(bop, F2(0, 3)|COND(mask), F2(~0, ~3)|COND(~(mask)), (flags)) /* v9 */
  1024.  
  1025. /* v9 */ condr("brnz", 0x5, F_CONDBR),
  1026. /* v9 */ condr("brz", 0x1, F_CONDBR),
  1027. /* v9 */ condr("brgez", 0x7, F_CONDBR),
  1028. /* v9 */ condr("brlz", 0x3, F_CONDBR),
  1029. /* v9 */ condr("brlez", 0x2, F_CONDBR),
  1030. /* v9 */ condr("brgz", 0x6, F_CONDBR),
  1031.  
  1032. #undef condr /* v9 */
  1033. #undef brr /* v9 */
  1034.  
  1035. #define movr(opcode, mask, flags) /* v9 */ \
  1036.  { opcode, F3(2, 0x2f, 0)|RCOND(mask), F3(~2, ~0x2f, ~0)|RCOND(~(mask)), "1,2,d", (flags), v9 }, \
  1037.  { opcode, F3(2, 0x2f, 1)|RCOND(mask), F3(~2, ~0x2f, ~1)|RCOND(~(mask)), "1,j,d", (flags), v9 }
  1038.  
  1039. #define fmrrs(opcode, mask, lose, flags) /* v9 */ \
  1040.  { opcode, (mask), (lose), "1,f,g", (flags) | F_FLOAT, v9 }
  1041. #define fmrrd(opcode, mask, lose, flags) /* v9 */ \
  1042.  { opcode, (mask), (lose), "1,B,H", (flags) | F_FLOAT, v9 }
  1043. #define fmrrq(opcode, mask, lose, flags) /* v9 */ \
  1044.  { opcode, (mask), (lose), "1,R,J", (flags) | F_FLOAT, v9 }
  1045.  
  1046. #define fmovrs(mop, mask, flags) /* v9 */ \
  1047.   fmrrs(mop, F3(2, 0x35, 0)|OPF_LOW5(5)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~5)|RCOND(~(mask)), (flags)) /* v9 */
  1048. #define fmovrd(mop, mask, flags) /* v9 */ \
  1049.   fmrrd(mop, F3(2, 0x35, 0)|OPF_LOW5(6)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~6)|RCOND(~(mask)), (flags)) /* v9 */
  1050. #define fmovrq(mop, mask, flags) /* v9 */ \
  1051.   fmrrq(mop, F3(2, 0x35, 0)|OPF_LOW5(7)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~7)|RCOND(~(mask)), (flags)) /* v9 */
  1052.  
  1053. /* v9 */ movr("movrne", 0x5, 0),
  1054. /* v9 */ movr("movre", 0x1, 0),
  1055. /* v9 */ movr("movrgez", 0x7, 0),
  1056. /* v9 */ movr("movrlz", 0x3, 0),
  1057. /* v9 */ movr("movrlez", 0x2, 0),
  1058. /* v9 */ movr("movrgz", 0x6, 0),
  1059. /* v9 */ movr("movrnz", 0x5, F_ALIAS),
  1060. /* v9 */ movr("movrz", 0x1, F_ALIAS),
  1061.  
  1062. /* v9 */ fmovrs("fmovrsne", 0x5, 0),
  1063. /* v9 */ fmovrs("fmovrse", 0x1, 0),
  1064. /* v9 */ fmovrs("fmovrsgez", 0x7, 0),
  1065. /* v9 */ fmovrs("fmovrslz", 0x3, 0),
  1066. /* v9 */ fmovrs("fmovrslez", 0x2, 0),
  1067. /* v9 */ fmovrs("fmovrsgz", 0x6, 0),
  1068. /* v9 */ fmovrs("fmovrsnz", 0x5, F_ALIAS),
  1069. /* v9 */ fmovrs("fmovrsz", 0x1, F_ALIAS),
  1070.  
  1071. /* v9 */ fmovrd("fmovrdne", 0x5, 0),
  1072. /* v9 */ fmovrd("fmovrde", 0x1, 0),
  1073. /* v9 */ fmovrd("fmovrdgez", 0x7, 0),
  1074. /* v9 */ fmovrd("fmovrdlz", 0x3, 0),
  1075. /* v9 */ fmovrd("fmovrdlez", 0x2, 0),
  1076. /* v9 */ fmovrd("fmovrdgz", 0x6, 0),
  1077. /* v9 */ fmovrd("fmovrdnz", 0x5, F_ALIAS),
  1078. /* v9 */ fmovrd("fmovrdz", 0x1, F_ALIAS),
  1079.  
  1080. /* v9 */ fmovrq("fmovrqne", 0x5, 0),
  1081. /* v9 */ fmovrq("fmovrqe", 0x1, 0),
  1082. /* v9 */ fmovrq("fmovrqgez", 0x7, 0),
  1083. /* v9 */ fmovrq("fmovrqlz", 0x3, 0),
  1084. /* v9 */ fmovrq("fmovrqlez", 0x2, 0),
  1085. /* v9 */ fmovrq("fmovrqgz", 0x6, 0),
  1086. /* v9 */ fmovrq("fmovrqnz", 0x5, F_ALIAS),
  1087. /* v9 */ fmovrq("fmovrqz", 0x1, F_ALIAS),
  1088.  
  1089. #undef movr /* v9 */
  1090. #undef fmovr /* v9 */
  1091. #undef fmrr /* v9 */
  1092.  
  1093. #define movicc(opcode, cond, flags) /* v9 */ \
  1094.   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|XCC|(1<<11), "z,2,d", flags, v9 }, \
  1095.   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|XCC|(1<<11), "z,I,d", flags, v9 }, \
  1096.   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|(1<<11),     "Z,2,d", flags, v9 }, \
  1097.   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|(1<<11),     "Z,I,d", flags, v9 }
  1098.  
  1099. #define movfcc(opcode, fcond, flags) /* v9 */ \
  1100.   { opcode, F3(2, 0x2c, 0)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~0), "6,2,d", flags, v9 }, \
  1101.   { opcode, F3(2, 0x2c, 1)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~1), "6,I,d", flags, v9 }, \
  1102.   { opcode, F3(2, 0x2c, 0)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~0), "7,2,d", flags, v9 }, \
  1103.   { opcode, F3(2, 0x2c, 1)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~1), "7,I,d", flags, v9 }, \
  1104.   { opcode, F3(2, 0x2c, 0)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~0), "8,2,d", flags, v9 }, \
  1105.   { opcode, F3(2, 0x2c, 1)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~1), "8,I,d", flags, v9 }, \
  1106.   { opcode, F3(2, 0x2c, 0)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~0), "9,2,d", flags, v9 }, \
  1107.   { opcode, F3(2, 0x2c, 1)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~1), "9,I,d", flags, v9 }
  1108.  
  1109. #define movcc(opcode, cond, fcond, flags) /* v9 */ \
  1110.   movfcc (opcode, fcond, flags), /* v9 */ \
  1111.   movicc (opcode, cond, flags) /* v9 */
  1112.  
  1113. /* v9 */ movcc  ("mova",    CONDA, FCONDA, 0),
  1114. /* v9 */ movicc ("movcc",    CONDCC, 0),
  1115. /* v9 */ movicc ("movgeu",    CONDGEU, F_ALIAS),
  1116. /* v9 */ movicc ("movcs",    CONDCS, 0),
  1117. /* v9 */ movicc ("movlu",    CONDLU, F_ALIAS),
  1118. /* v9 */ movcc  ("move",    CONDE, FCONDE, 0),
  1119. /* v9 */ movcc  ("movg",    CONDG, FCONDG, 0),
  1120. /* v9 */ movcc  ("movge",    CONDGE, FCONDGE, 0),
  1121. /* v9 */ movicc ("movgu",    CONDGU, 0),
  1122. /* v9 */ movcc  ("movl",    CONDL, FCONDL, 0),
  1123. /* v9 */ movcc  ("movle",    CONDLE, FCONDLE, 0),
  1124. /* v9 */ movicc ("movleu",    CONDLEU, 0),
  1125. /* v9 */ movfcc ("movlg",    FCONDLG, 0),
  1126. /* v9 */ movcc  ("movn",    CONDN, FCONDN, 0),
  1127. /* v9 */ movcc  ("movne",    CONDNE, FCONDNE, 0),
  1128. /* v9 */ movicc ("movneg",    CONDNEG, 0),
  1129. /* v9 */ movcc  ("movnz",    CONDNZ, FCONDNZ, F_ALIAS),
  1130. /* v9 */ movfcc ("movo",    FCONDO, 0),
  1131. /* v9 */ movicc ("movpos",    CONDPOS, 0),
  1132. /* v9 */ movfcc ("movu",    FCONDU, 0),
  1133. /* v9 */ movfcc ("movue",    FCONDUE, 0),
  1134. /* v9 */ movfcc ("movug",    FCONDUG, 0),
  1135. /* v9 */ movfcc ("movuge",    FCONDUGE, 0),
  1136. /* v9 */ movfcc ("movul",    FCONDUL, 0),
  1137. /* v9 */ movfcc ("movule",    FCONDULE, 0),
  1138. /* v9 */ movicc ("movvc",    CONDVC, 0),
  1139. /* v9 */ movicc ("movvs",    CONDVS, 0),
  1140. /* v9 */ movcc  ("movz",    CONDZ, FCONDZ, F_ALIAS),
  1141.  
  1142. #undef movicc /* v9 */
  1143. #undef movfcc /* v9 */
  1144. #undef movcc /* v9 */
  1145.  
  1146. #define FM_SF 1        /* v9 - values for fpsize */
  1147. #define FM_DF 2        /* v9 */
  1148. #define FM_QF 3        /* v9 */
  1149.  
  1150. #define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \
  1151. { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags, v9 }, \
  1152. { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags, v9 }
  1153.  
  1154. #define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \
  1155. { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \
  1156. { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \
  1157. { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \
  1158. { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 }
  1159.  
  1160. /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
  1161. #define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \
  1162. { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags | F_FLOAT, v9 }, \
  1163. { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \
  1164. { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags | F_FLOAT, v9 }, \
  1165. { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \
  1166. { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \
  1167. { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 }
  1168.  
  1169. /* v9 */ fmovcc  ("fmovda",    FM_DF, CONDA, FCONDA, 0),
  1170. /* v9 */ fmovcc  ("fmovqa",    FM_QF, CONDA, FCONDA, 0),
  1171. /* v9 */ fmovcc  ("fmovsa",    FM_SF, CONDA, FCONDA, 0),
  1172. /* v9 */ fmovicc ("fmovdcc",    FM_DF, CONDCC, 0),
  1173. /* v9 */ fmovicc ("fmovqcc",    FM_QF, CONDCC, 0),
  1174. /* v9 */ fmovicc ("fmovscc",    FM_SF, CONDCC, 0),
  1175. /* v9 */ fmovicc ("fmovdcs",    FM_DF, CONDCS, 0),
  1176. /* v9 */ fmovicc ("fmovqcs",    FM_QF, CONDCS, 0),
  1177. /* v9 */ fmovicc ("fmovscs",    FM_SF, CONDCS, 0),
  1178. /* v9 */ fmovcc  ("fmovde",    FM_DF, CONDE, FCONDE, 0),
  1179. /* v9 */ fmovcc  ("fmovqe",    FM_QF, CONDE, FCONDE, 0),
  1180. /* v9 */ fmovcc  ("fmovse",    FM_SF, CONDE, FCONDE, 0),
  1181. /* v9 */ fmovcc  ("fmovdg",    FM_DF, CONDG, FCONDG, 0),
  1182. /* v9 */ fmovcc  ("fmovqg",    FM_QF, CONDG, FCONDG, 0),
  1183. /* v9 */ fmovcc  ("fmovsg",    FM_SF, CONDG, FCONDG, 0),
  1184. /* v9 */ fmovcc  ("fmovdge",    FM_DF, CONDGE, FCONDGE, 0),
  1185. /* v9 */ fmovcc  ("fmovqge",    FM_QF, CONDGE, FCONDGE, 0),
  1186. /* v9 */ fmovcc  ("fmovsge",    FM_SF, CONDGE, FCONDGE, 0),
  1187. /* v9 */ fmovicc ("fmovdgeu",    FM_DF, CONDGEU, F_ALIAS),
  1188. /* v9 */ fmovicc ("fmovqgeu",    FM_QF, CONDGEU, F_ALIAS),
  1189. /* v9 */ fmovicc ("fmovsgeu",    FM_SF, CONDGEU, F_ALIAS),
  1190. /* v9 */ fmovicc ("fmovdgu",    FM_DF, CONDGU, 0),
  1191. /* v9 */ fmovicc ("fmovqgu",    FM_QF, CONDGU, 0),
  1192. /* v9 */ fmovicc ("fmovsgu",    FM_SF, CONDGU, 0),
  1193. /* v9 */ fmovcc  ("fmovdl",    FM_DF, CONDL, FCONDL, 0),
  1194. /* v9 */ fmovcc  ("fmovql",    FM_QF, CONDL, FCONDL, 0),
  1195. /* v9 */ fmovcc  ("fmovsl",    FM_SF, CONDL, FCONDL, 0),
  1196. /* v9 */ fmovcc  ("fmovdle",    FM_DF, CONDLE, FCONDLE, 0),
  1197. /* v9 */ fmovcc  ("fmovqle",    FM_QF, CONDLE, FCONDLE, 0),
  1198. /* v9 */ fmovcc  ("fmovsle",    FM_SF, CONDLE, FCONDLE, 0),
  1199. /* v9 */ fmovicc ("fmovdleu",    FM_DF, CONDLEU, 0),
  1200. /* v9 */ fmovicc ("fmovqleu",    FM_QF, CONDLEU, 0),
  1201. /* v9 */ fmovicc ("fmovsleu",    FM_SF, CONDLEU, 0),
  1202. /* v9 */ fmovfcc ("fmovdlg",    FM_DF, FCONDLG, 0),
  1203. /* v9 */ fmovfcc ("fmovqlg",    FM_QF, FCONDLG, 0),
  1204. /* v9 */ fmovfcc ("fmovslg",    FM_SF, FCONDLG, 0),
  1205. /* v9 */ fmovicc ("fmovdlu",    FM_DF, CONDLU, F_ALIAS),
  1206. /* v9 */ fmovicc ("fmovqlu",    FM_QF, CONDLU, F_ALIAS),
  1207. /* v9 */ fmovicc ("fmovslu",    FM_SF, CONDLU, F_ALIAS),
  1208. /* v9 */ fmovcc  ("fmovdn",    FM_DF, CONDN, FCONDN, 0),
  1209. /* v9 */ fmovcc  ("fmovqn",    FM_QF, CONDN, FCONDN, 0),
  1210. /* v9 */ fmovcc  ("fmovsn",    FM_SF, CONDN, FCONDN, 0),
  1211. /* v9 */ fmovcc  ("fmovdne",    FM_DF, CONDNE, FCONDNE, 0),
  1212. /* v9 */ fmovcc  ("fmovqne",    FM_QF, CONDNE, FCONDNE, 0),
  1213. /* v9 */ fmovcc  ("fmovsne",    FM_SF, CONDNE, FCONDNE, 0),
  1214. /* v9 */ fmovicc ("fmovdneg",    FM_DF, CONDNEG, 0),
  1215. /* v9 */ fmovicc ("fmovqneg",    FM_QF, CONDNEG, 0),
  1216. /* v9 */ fmovicc ("fmovsneg",    FM_SF, CONDNEG, 0),
  1217. /* v9 */ fmovcc  ("fmovdnz",    FM_DF, CONDNZ, FCONDNZ, F_ALIAS),
  1218. /* v9 */ fmovcc  ("fmovqnz",    FM_QF, CONDNZ, FCONDNZ, F_ALIAS),
  1219. /* v9 */ fmovcc  ("fmovsnz",    FM_SF, CONDNZ, FCONDNZ, F_ALIAS),
  1220. /* v9 */ fmovfcc ("fmovdo",    FM_DF, FCONDO, 0),
  1221. /* v9 */ fmovfcc ("fmovqo",    FM_QF, FCONDO, 0),
  1222. /* v9 */ fmovfcc ("fmovso",    FM_SF, FCONDO, 0),
  1223. /* v9 */ fmovicc ("fmovdpos",    FM_DF, CONDPOS, 0),
  1224. /* v9 */ fmovicc ("fmovqpos",    FM_QF, CONDPOS, 0),
  1225. /* v9 */ fmovicc ("fmovspos",    FM_SF, CONDPOS, 0),
  1226. /* v9 */ fmovfcc ("fmovdu",    FM_DF, FCONDU, 0),
  1227. /* v9 */ fmovfcc ("fmovqu",    FM_QF, FCONDU, 0),
  1228. /* v9 */ fmovfcc ("fmovsu",    FM_SF, FCONDU, 0),
  1229. /* v9 */ fmovfcc ("fmovdue",    FM_DF, FCONDUE, 0),
  1230. /* v9 */ fmovfcc ("fmovque",    FM_QF, FCONDUE, 0),
  1231. /* v9 */ fmovfcc ("fmovsue",    FM_SF, FCONDUE, 0),
  1232. /* v9 */ fmovfcc ("fmovdug",    FM_DF, FCONDUG, 0),
  1233. /* v9 */ fmovfcc ("fmovqug",    FM_QF, FCONDUG, 0),
  1234. /* v9 */ fmovfcc ("fmovsug",    FM_SF, FCONDUG, 0),
  1235. /* v9 */ fmovfcc ("fmovduge",    FM_DF, FCONDUGE, 0),
  1236. /* v9 */ fmovfcc ("fmovquge",    FM_QF, FCONDUGE, 0),
  1237. /* v9 */ fmovfcc ("fmovsuge",    FM_SF, FCONDUGE, 0),
  1238. /* v9 */ fmovfcc ("fmovdul",    FM_DF, FCONDUL, 0),
  1239. /* v9 */ fmovfcc ("fmovqul",    FM_QF, FCONDUL, 0),
  1240. /* v9 */ fmovfcc ("fmovsul",    FM_SF, FCONDUL, 0),
  1241. /* v9 */ fmovfcc ("fmovdule",    FM_DF, FCONDULE, 0),
  1242. /* v9 */ fmovfcc ("fmovqule",    FM_QF, FCONDULE, 0),
  1243. /* v9 */ fmovfcc ("fmovsule",    FM_SF, FCONDULE, 0),
  1244. /* v9 */ fmovicc ("fmovdvc",    FM_DF, CONDVC, 0),
  1245. /* v9 */ fmovicc ("fmovqvc",    FM_QF, CONDVC, 0),
  1246. /* v9 */ fmovicc ("fmovsvc",    FM_SF, CONDVC, 0),
  1247. /* v9 */ fmovicc ("fmovdvs",    FM_DF, CONDVS, 0),
  1248. /* v9 */ fmovicc ("fmovqvs",    FM_QF, CONDVS, 0),
  1249. /* v9 */ fmovicc ("fmovsvs",    FM_SF, CONDVS, 0),
  1250. /* v9 */ fmovcc  ("fmovdz",    FM_DF, CONDZ, FCONDZ, F_ALIAS),
  1251. /* v9 */ fmovcc  ("fmovqz",    FM_QF, CONDZ, FCONDZ, F_ALIAS),
  1252. /* v9 */ fmovcc  ("fmovsz",    FM_SF, CONDZ, FCONDZ, F_ALIAS),
  1253.  
  1254. #undef fmovicc /* v9 */
  1255. #undef fmovfcc /* v9 */
  1256. #undef fmovcc /* v9 */
  1257. #undef FM_DF /* v9 */
  1258. #undef FM_QF /* v9 */
  1259. #undef FM_SF /* v9 */
  1260.  
  1261. /* Coprocessor branches.  */
  1262. #define CBR(opcode, mask, lose, flags, arch) \
  1263.  { opcode, (mask), ANNUL|(lose), "l",    flags|F_DELAYED, arch }, \
  1264.  { opcode, (mask)|ANNUL, (lose), ",a l", flags|F_DELAYED, arch }
  1265.  
  1266. /* Floating point branches.  */
  1267. #define FBR(opcode, mask, lose, flags) \
  1268.  { opcode, (mask), ANNUL|(lose), "l",    flags|F_DELAYED|F_FBR, v6 }, \
  1269.  { opcode, (mask)|ANNUL, (lose), ",a l", flags|F_DELAYED|F_FBR, v6 }
  1270.  
  1271. /* V9 extended floating point branches.  */
  1272. #define FBRX(opcode, mask, lose, flags) /* v9 */ \
  1273.  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), "6,G",      flags|F_DELAYED|F_FBR, v9 }, \
  1274.  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), ",T 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1275.  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1276.  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a,T 6,G", flags|F_DELAYED|F_FBR, v9 }, \
  1277.  { opcode, FBFCC(0)|(mask), ANNUL|BPRED|FBFCC(~0)|(lose), ",N 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1278.  { opcode, FBFCC(0)|(mask)|ANNUL, BPRED|FBFCC(~0)|(lose), ",a,N 6,G", flags|F_DELAYED|F_FBR, v9 }, \
  1279.  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), "7,G",      flags|F_DELAYED|F_FBR, v9 }, \
  1280.  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), ",T 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1281.  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1282.  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a,T 7,G", flags|F_DELAYED|F_FBR, v9 }, \
  1283.  { opcode, FBFCC(1)|(mask), ANNUL|BPRED|FBFCC(~1)|(lose), ",N 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1284.  { opcode, FBFCC(1)|(mask)|ANNUL, BPRED|FBFCC(~1)|(lose), ",a,N 7,G", flags|F_DELAYED|F_FBR, v9 }, \
  1285.  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), "8,G",      flags|F_DELAYED|F_FBR, v9 }, \
  1286.  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), ",T 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1287.  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1288.  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a,T 8,G", flags|F_DELAYED|F_FBR, v9 }, \
  1289.  { opcode, FBFCC(2)|(mask), ANNUL|BPRED|FBFCC(~2)|(lose), ",N 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1290.  { opcode, FBFCC(2)|(mask)|ANNUL, BPRED|FBFCC(~2)|(lose), ",a,N 8,G", flags|F_DELAYED|F_FBR, v9 }, \
  1291.  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), "9,G",      flags|F_DELAYED|F_FBR, v9 }, \
  1292.  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), ",T 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1293.  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1294.  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a,T 9,G", flags|F_DELAYED|F_FBR, v9 }, \
  1295.  { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), ",N 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
  1296.  { opcode, FBFCC(3)|(mask)|ANNUL, BPRED|FBFCC(~3)|(lose), ",a,N  9,G", flags|F_DELAYED|F_FBR, v9 }
  1297.  
  1298. /* v9: We must put `FBRX' before `FBR', to ensure that we never match
  1299.    v9: something against an expression unless it is an expression.  Otherwise,
  1300.    v9: we end up with undefined symbol tables entries, because they get added,
  1301.    v9: but are not deleted if the pattern fails to match.  */
  1302.  
  1303. #define CONDFC(fop, cop, mask, flags) \
  1304.   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
  1305.   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
  1306.   CBR(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags, v6notlet)
  1307.  
  1308. #define CONDFCL(fop, cop, mask, flags) \
  1309.   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
  1310.   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
  1311.   CBR(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags, v6)
  1312.  
  1313. #define CONDF(fop, mask, flags) \
  1314.   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
  1315.   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags)
  1316.  
  1317. CONDFC  ("fb",    "cb",    0x8, 0),
  1318. CONDFCL ("fba",      "cba",   0x8, F_ALIAS),
  1319. CONDFC  ("fbe",      "cb0",   0x9, 0),
  1320. CONDF   ("fbz",            0x9, F_ALIAS),
  1321. CONDFC  ("fbg",      "cb2",   0x6, 0),
  1322. CONDFC  ("fbge",  "cb02",  0xb, 0),
  1323. CONDFC  ("fbl",      "cb1",   0x4, 0),
  1324. CONDFC  ("fble",  "cb01",  0xd, 0),
  1325. CONDFC  ("fblg",  "cb12",  0x2, 0),
  1326. CONDFCL ("fbn",      "cbn",   0x0, 0),
  1327. CONDFC  ("fbne",  "cb123", 0x1, 0),
  1328. CONDF   ("fbnz",           0x1, F_ALIAS),
  1329. CONDFC  ("fbo",      "cb012", 0xf, 0),
  1330. CONDFC  ("fbu",      "cb3",   0x7, 0),
  1331. CONDFC  ("fbue",  "cb03",  0xa, 0),
  1332. CONDFC  ("fbug",  "cb23",  0x5, 0),
  1333. CONDFC  ("fbuge", "cb023", 0xc, 0),
  1334. CONDFC  ("fbul",  "cb13",  0x3, 0),
  1335. CONDFC  ("fbule", "cb013", 0xe, 0),
  1336.  
  1337. #undef CONDFC
  1338. #undef CONDFCL
  1339. #undef CONDF
  1340. #undef CBR
  1341. #undef FBR
  1342. #undef FBRX    /* v9 */
  1343.  
  1344. { "jmp",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI(~0),    "1+2", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%g0 */
  1345. { "jmp",    F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%g0 */
  1346. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,        "1+i", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+i,%g0 */
  1347. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,        "i+1", F_UNBR|F_DELAYED, v6 }, /* jmpl i+rs1,%g0 */
  1348. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|RS1_G0,        "i", F_UNBR|F_DELAYED, v6 }, /* jmpl %g0+i,%g0 */
  1349. { "jmp",    F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|SIMM13(~0),    "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+0,%g0 */
  1350.  
  1351. { "nop",    F2(0, 4), 0xfeffffff, "", 0, v6 }, /* sethi 0, %g0 */
  1352.  
  1353. { "set",    F2(0x0, 0x4), F2(~0x0, ~0x4), "Sh,d", F_ALIAS, v6 },
  1354.  
  1355. { "sethi",    F2(0x0, 0x4), F2(~0x0, ~0x4), "h,d", 0, v6 },
  1356.  
  1357. { "taddcc",    F3(2, 0x20, 0), F3(~2, ~0x20, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1358. { "taddcc",    F3(2, 0x20, 1), F3(~2, ~0x20, ~1),        "1,i,d", 0, v6 },
  1359. { "taddcc",    F3(2, 0x20, 1), F3(~2, ~0x20, ~1),        "i,1,d", 0, v6 },
  1360. { "taddcctv",    F3(2, 0x22, 0), F3(~2, ~0x22, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1361. { "taddcctv",    F3(2, 0x22, 1), F3(~2, ~0x22, ~1),        "1,i,d", 0, v6 },
  1362. { "taddcctv",    F3(2, 0x22, 1), F3(~2, ~0x22, ~1),        "i,1,d", 0, v6 },
  1363.  
  1364. { "tsubcc",    F3(2, 0x21, 0), F3(~2, ~0x21, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1365. { "tsubcc",    F3(2, 0x21, 1), F3(~2, ~0x21, ~1),        "1,i,d", 0, v6 },
  1366. { "tsubcctv",    F3(2, 0x23, 0), F3(~2, ~0x23, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1367. { "tsubcctv",    F3(2, 0x23, 1), F3(~2, ~0x23, ~1),        "1,i,d", 0, v6 },
  1368.  
  1369. { "unimp",    F2(0x0, 0x0), 0xffc00000, "n", 0, v6notv9 },
  1370. { "illtrap",    F2(0, 0), F2(~0, ~0)|RD_G0, "n", 0, v9 },
  1371.  
  1372. /* This *is* a commutative instruction.  */
  1373. { "xnor",    F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1374. { "xnor",    F3(2, 0x07, 1), F3(~2, ~0x07, ~1),        "1,i,d", 0, v6 },
  1375. { "xnor",    F3(2, 0x07, 1), F3(~2, ~0x07, ~1),        "i,1,d", 0, v6 },
  1376. /* This *is* a commutative instruction.  */
  1377. { "xnorcc",    F3(2, 0x17, 0), F3(~2, ~0x17, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1378. { "xnorcc",    F3(2, 0x17, 1), F3(~2, ~0x17, ~1),        "1,i,d", 0, v6 },
  1379. { "xnorcc",    F3(2, 0x17, 1), F3(~2, ~0x17, ~1),        "i,1,d", 0, v6 },
  1380. { "xor",    F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1381. { "xor",    F3(2, 0x03, 1), F3(~2, ~0x03, ~1),        "1,i,d", 0, v6 },
  1382. { "xor",    F3(2, 0x03, 1), F3(~2, ~0x03, ~1),        "i,1,d", 0, v6 },
  1383. { "xorcc",    F3(2, 0x13, 0), F3(~2, ~0x13, ~0)|ASI(~0),    "1,2,d", 0, v6 },
  1384. { "xorcc",    F3(2, 0x13, 1), F3(~2, ~0x13, ~1),        "1,i,d", 0, v6 },
  1385. { "xorcc",    F3(2, 0x13, 1), F3(~2, ~0x13, ~1),        "i,1,d", 0, v6 },
  1386.  
  1387. { "not",    F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "1,d", F_ALIAS, v6 }, /* xnor rs1,%0,rd */
  1388. { "not",    F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "r", F_ALIAS, v6 }, /* xnor rd,%0,rd */
  1389.  
  1390. { "btog",    F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),    "2,r", F_ALIAS, v6 }, /* xor rd,rs2,rd */
  1391. { "btog",    F3(2, 0x03, 1), F3(~2, ~0x03, ~1),        "i,r", F_ALIAS, v6 }, /* xor rd,i,rd */
  1392.  
  1393. /* FPop1 and FPop2 are not instructions.  Don't accept them.  */
  1394.  
  1395. { "fdtoi",    F3F(2, 0x34, 0x0d2), F3F(~2, ~0x34, ~0x0d2)|RS1_G0, "B,g", F_FLOAT, v6 },
  1396. { "fstoi",    F3F(2, 0x34, 0x0d1), F3F(~2, ~0x34, ~0x0d1)|RS1_G0, "f,g", F_FLOAT, v6 },
  1397. { "fqtoi",    F3F(2, 0x34, 0x0d3), F3F(~2, ~0x34, ~0x0d3)|RS1_G0, "R,g", F_FLOAT, v8 },
  1398.  
  1399. { "fdtox",    F3F(2, 0x34, 0x082), F3F(~2, ~0x34, ~0x082)|RS1_G0, "B,g", F_FLOAT, v9 },
  1400. { "fstox",    F3F(2, 0x34, 0x081), F3F(~2, ~0x34, ~0x081)|RS1_G0, "f,g", F_FLOAT, v9 },
  1401. { "fqtox",    F3F(2, 0x34, 0x083), F3F(~2, ~0x34, ~0x083)|RS1_G0, "R,g", F_FLOAT, v9 },
  1402.  
  1403. { "fitod",    F3F(2, 0x34, 0x0c8), F3F(~2, ~0x34, ~0x0c8)|RS1_G0, "f,H", F_FLOAT, v6 },
  1404. { "fitos",    F3F(2, 0x34, 0x0c4), F3F(~2, ~0x34, ~0x0c4)|RS1_G0, "f,g", F_FLOAT, v6 },
  1405. { "fitoq",    F3F(2, 0x34, 0x0cc), F3F(~2, ~0x34, ~0x0cc)|RS1_G0, "f,J", F_FLOAT, v8 },
  1406.  
  1407. { "fxtod",    F3F(2, 0x34, 0x088), F3F(~2, ~0x34, ~0x088)|RS1_G0, "f,H", F_FLOAT, v9 },
  1408. { "fxtos",    F3F(2, 0x34, 0x084), F3F(~2, ~0x34, ~0x084)|RS1_G0, "f,g", F_FLOAT, v9 },
  1409. { "fxtoq",    F3F(2, 0x34, 0x08c), F3F(~2, ~0x34, ~0x08c)|RS1_G0, "f,J", F_FLOAT, v9 },
  1410.  
  1411. { "fdtoq",    F3F(2, 0x34, 0x0ce), F3F(~2, ~0x34, ~0x0ce)|RS1_G0, "B,J", F_FLOAT, v8 },
  1412. { "fdtos",    F3F(2, 0x34, 0x0c6), F3F(~2, ~0x34, ~0x0c6)|RS1_G0, "B,g", F_FLOAT, v6 },
  1413. { "fqtod",    F3F(2, 0x34, 0x0cb), F3F(~2, ~0x34, ~0x0cb)|RS1_G0, "R,H", F_FLOAT, v8 },
  1414. { "fqtos",    F3F(2, 0x34, 0x0c7), F3F(~2, ~0x34, ~0x0c7)|RS1_G0, "R,g", F_FLOAT, v8 },
  1415. { "fstod",    F3F(2, 0x34, 0x0c9), F3F(~2, ~0x34, ~0x0c9)|RS1_G0, "f,H", F_FLOAT, v6 },
  1416. { "fstoq",    F3F(2, 0x34, 0x0cd), F3F(~2, ~0x34, ~0x0cd)|RS1_G0, "f,J", F_FLOAT, v8 },
  1417.  
  1418. { "fdivd",    F3F(2, 0x34, 0x04e), F3F(~2, ~0x34, ~0x04e), "v,B,H", F_FLOAT, v6 },
  1419. { "fdivq",    F3F(2, 0x34, 0x04f), F3F(~2, ~0x34, ~0x04f), "V,R,J", F_FLOAT, v8 },
  1420. { "fdivs",    F3F(2, 0x34, 0x04d), F3F(~2, ~0x34, ~0x04d), "e,f,g", F_FLOAT, v6 },
  1421. { "fmuld",    F3F(2, 0x34, 0x04a), F3F(~2, ~0x34, ~0x04a), "v,B,H", F_FLOAT, v6 },
  1422. { "fmulq",    F3F(2, 0x34, 0x04b), F3F(~2, ~0x34, ~0x04b), "V,R,J", F_FLOAT, v8 },
  1423. { "fmuls",    F3F(2, 0x34, 0x049), F3F(~2, ~0x34, ~0x049), "e,f,g", F_FLOAT, v6 },
  1424.  
  1425. { "fdmulq",    F3F(2, 0x34, 0x06e), F3F(~2, ~0x34, ~0x06e), "v,B,J", F_FLOAT, v8 },
  1426. { "fsmuld",    F3F(2, 0x34, 0x069), F3F(~2, ~0x34, ~0x069), "e,f,H", F_FLOAT, v8 },
  1427.  
  1428. { "fsqrtd",    F3F(2, 0x34, 0x02a), F3F(~2, ~0x34, ~0x02a)|RS1_G0, "B,H", F_FLOAT, v7 },
  1429. { "fsqrtq",    F3F(2, 0x34, 0x02b), F3F(~2, ~0x34, ~0x02b)|RS1_G0, "R,J", F_FLOAT, v8 },
  1430. { "fsqrts",    F3F(2, 0x34, 0x029), F3F(~2, ~0x34, ~0x029)|RS1_G0, "f,g", F_FLOAT, v7 },
  1431.  
  1432. { "fabsd",    F3F(2, 0x34, 0x00a), F3F(~2, ~0x34, ~0x00a)|RS1_G0, "B,H", F_FLOAT, v9 },
  1433. { "fabsq",    F3F(2, 0x34, 0x00b), F3F(~2, ~0x34, ~0x00b)|RS1_G0, "R,J", F_FLOAT, v9 },
  1434. { "fabss",    F3F(2, 0x34, 0x009), F3F(~2, ~0x34, ~0x009)|RS1_G0, "f,g", F_FLOAT, v6 },
  1435. { "fmovd",    F3F(2, 0x34, 0x002), F3F(~2, ~0x34, ~0x002)|RS1_G0, "B,H", F_FLOAT, v9 },
  1436. { "fmovq",    F3F(2, 0x34, 0x003), F3F(~2, ~0x34, ~0x003)|RS1_G0, "R,J", F_FLOAT, v9 },
  1437. { "fmovs",    F3F(2, 0x34, 0x001), F3F(~2, ~0x34, ~0x001)|RS1_G0, "f,g", F_FLOAT, v6 },
  1438. { "fnegd",    F3F(2, 0x34, 0x006), F3F(~2, ~0x34, ~0x006)|RS1_G0, "B,H", F_FLOAT, v9 },
  1439. { "fnegq",    F3F(2, 0x34, 0x007), F3F(~2, ~0x34, ~0x007)|RS1_G0, "R,J", F_FLOAT, v9 },
  1440. { "fnegs",    F3F(2, 0x34, 0x005), F3F(~2, ~0x34, ~0x005)|RS1_G0, "f,g", F_FLOAT, v6 },
  1441.  
  1442. { "faddd",    F3F(2, 0x34, 0x042), F3F(~2, ~0x34, ~0x042), "v,B,H", F_FLOAT, v6 },
  1443. { "faddq",    F3F(2, 0x34, 0x043), F3F(~2, ~0x34, ~0x043), "V,R,J", F_FLOAT, v8 },
  1444. { "fadds",    F3F(2, 0x34, 0x041), F3F(~2, ~0x34, ~0x041), "e,f,g", F_FLOAT, v6 },
  1445. { "fsubd",    F3F(2, 0x34, 0x046), F3F(~2, ~0x34, ~0x046), "v,B,H", F_FLOAT, v6 },
  1446. { "fsubq",    F3F(2, 0x34, 0x047), F3F(~2, ~0x34, ~0x047), "V,R,J", F_FLOAT, v8 },
  1447. { "fsubs",    F3F(2, 0x34, 0x045), F3F(~2, ~0x34, ~0x045), "e,f,g", F_FLOAT, v6 },
  1448.  
  1449. #define CMPFCC(x)    (((x)&0x3)<<25)
  1450.  
  1451. { "fcmpd",              F3F(2, 0x35, 0x052),            F3F(~2, ~0x35, ~0x052)|RD_G0,  "v,B",   F_FLOAT, v6 },
  1452. { "fcmpd",    CMPFCC(0)|F3F(2, 0x35, 0x052), CMPFCC(~0)|F3F(~2, ~0x35, ~0x052),     "6,v,B", F_FLOAT, v9 },
  1453. { "fcmpd",    CMPFCC(1)|F3F(2, 0x35, 0x052), CMPFCC(~1)|F3F(~2, ~0x35, ~0x052),     "7,v,B", F_FLOAT, v9 },
  1454. { "fcmpd",    CMPFCC(2)|F3F(2, 0x35, 0x052), CMPFCC(~2)|F3F(~2, ~0x35, ~0x052),     "8,v,B", F_FLOAT, v9 },
  1455. { "fcmpd",    CMPFCC(3)|F3F(2, 0x35, 0x052), CMPFCC(~3)|F3F(~2, ~0x35, ~0x052),     "9,v,B", F_FLOAT, v9 },
  1456. { "fcmped",              F3F(2, 0x35, 0x056),            F3F(~2, ~0x35, ~0x056)|RD_G0,  "v,B",   F_FLOAT, v6 },
  1457. { "fcmped",    CMPFCC(0)|F3F(2, 0x35, 0x056), CMPFCC(~0)|F3F(~2, ~0x35, ~0x056),     "6,v,B", F_FLOAT, v9 },
  1458. { "fcmped",    CMPFCC(1)|F3F(2, 0x35, 0x056), CMPFCC(~1)|F3F(~2, ~0x35, ~0x056),     "7,v,B", F_FLOAT, v9 },
  1459. { "fcmped",    CMPFCC(2)|F3F(2, 0x35, 0x056), CMPFCC(~2)|F3F(~2, ~0x35, ~0x056),     "8,v,B", F_FLOAT, v9 },
  1460. { "fcmped",    CMPFCC(3)|F3F(2, 0x35, 0x056), CMPFCC(~3)|F3F(~2, ~0x35, ~0x056),     "9,v,B", F_FLOAT, v9 },
  1461. { "fcmpq",              F3F(2, 0x34, 0x053),            F3F(~2, ~0x34, ~0x053)|RD_G0,     "V,R", F_FLOAT, v8 },
  1462. { "fcmpq",    CMPFCC(0)|F3F(2, 0x35, 0x053), CMPFCC(~0)|F3F(~2, ~0x35, ~0x053),     "6,V,R", F_FLOAT, v9 },
  1463. { "fcmpq",    CMPFCC(1)|F3F(2, 0x35, 0x053), CMPFCC(~1)|F3F(~2, ~0x35, ~0x053),     "7,V,R", F_FLOAT, v9 },
  1464. { "fcmpq",    CMPFCC(2)|F3F(2, 0x35, 0x053), CMPFCC(~2)|F3F(~2, ~0x35, ~0x053),     "8,V,R", F_FLOAT, v9 },
  1465. { "fcmpq",    CMPFCC(3)|F3F(2, 0x35, 0x053), CMPFCC(~3)|F3F(~2, ~0x35, ~0x053),     "9,V,R", F_FLOAT, v9 },
  1466. { "fcmpeq",              F3F(2, 0x34, 0x057),            F3F(~2, ~0x34, ~0x057)|RD_G0,     "V,R", F_FLOAT, v8 },
  1467. { "fcmpeq",    CMPFCC(0)|F3F(2, 0x35, 0x057), CMPFCC(~0)|F3F(~2, ~0x35, ~0x057),     "6,V,R", F_FLOAT, v9 },
  1468. { "fcmpeq",    CMPFCC(1)|F3F(2, 0x35, 0x057), CMPFCC(~1)|F3F(~2, ~0x35, ~0x057),     "7,V,R", F_FLOAT, v9 },
  1469. { "fcmpeq",    CMPFCC(2)|F3F(2, 0x35, 0x057), CMPFCC(~2)|F3F(~2, ~0x35, ~0x057),     "8,V,R", F_FLOAT, v9 },
  1470. { "fcmpeq",    CMPFCC(3)|F3F(2, 0x35, 0x057), CMPFCC(~3)|F3F(~2, ~0x35, ~0x057),     "9,V,R", F_FLOAT, v9 },
  1471. { "fcmps",              F3F(2, 0x35, 0x051),            F3F(~2, ~0x35, ~0x051)|RD_G0, "e,f",   F_FLOAT, v6 },
  1472. { "fcmps",    CMPFCC(0)|F3F(2, 0x35, 0x051), CMPFCC(~0)|F3F(~2, ~0x35, ~0x051),     "6,e,f", F_FLOAT, v9 },
  1473. { "fcmps",    CMPFCC(1)|F3F(2, 0x35, 0x051), CMPFCC(~1)|F3F(~2, ~0x35, ~0x051),     "7,e,f", F_FLOAT, v9 },
  1474. { "fcmps",    CMPFCC(2)|F3F(2, 0x35, 0x051), CMPFCC(~2)|F3F(~2, ~0x35, ~0x051),     "8,e,f", F_FLOAT, v9 },
  1475. { "fcmps",    CMPFCC(3)|F3F(2, 0x35, 0x051), CMPFCC(~3)|F3F(~2, ~0x35, ~0x051),     "9,e,f", F_FLOAT, v9 },
  1476. { "fcmpes",              F3F(2, 0x35, 0x055),            F3F(~2, ~0x35, ~0x055)|RD_G0, "e,f",   F_FLOAT, v6 },
  1477. { "fcmpes",    CMPFCC(0)|F3F(2, 0x35, 0x055), CMPFCC(~0)|F3F(~2, ~0x35, ~0x055),     "6,e,f", F_FLOAT, v9 },
  1478. { "fcmpes",    CMPFCC(1)|F3F(2, 0x35, 0x055), CMPFCC(~1)|F3F(~2, ~0x35, ~0x055),     "7,e,f", F_FLOAT, v9 },
  1479. { "fcmpes",    CMPFCC(2)|F3F(2, 0x35, 0x055), CMPFCC(~2)|F3F(~2, ~0x35, ~0x055),     "8,e,f", F_FLOAT, v9 },
  1480. { "fcmpes",    CMPFCC(3)|F3F(2, 0x35, 0x055), CMPFCC(~3)|F3F(~2, ~0x35, ~0x055),     "9,e,f", F_FLOAT, v9 },
  1481.  
  1482. /* These Extended FPop (FIFO) instructions are new in the Fujitsu
  1483.    MB86934, replacing the CPop instructions from v6 and later
  1484.    processors.  */
  1485.  
  1486. #define EFPOP1_2(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op)|RS1_G0, args, 0, sparclite }
  1487. #define EFPOP1_3(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op),        args, 0, sparclite }
  1488. #define EFPOP2_2(name, op, args) { name, F3F(2, 0x37, op), F3F(~2, ~0x37, ~op)|RD_G0,  args, 0, sparclite }
  1489.  
  1490. EFPOP1_2 ("efitod",    0x0c8, "f,H"),
  1491. EFPOP1_2 ("efitos",    0x0c4, "f,g"),
  1492. EFPOP1_2 ("efdtoi",    0x0d2, "B,g"),
  1493. EFPOP1_2 ("efstoi",    0x0d1, "f,g"),
  1494. EFPOP1_2 ("efstod",    0x0c9, "f,H"),
  1495. EFPOP1_2 ("efdtos",    0x0c6, "B,g"),
  1496. EFPOP1_2 ("efmovs",    0x001, "f,g"),
  1497. EFPOP1_2 ("efnegs",    0x005, "f,g"),
  1498. EFPOP1_2 ("efabss",    0x009, "f,g"),
  1499. EFPOP1_2 ("efsqrtd",    0x02a, "B,H"),
  1500. EFPOP1_2 ("efsqrts",    0x029, "f,g"),
  1501. EFPOP1_3 ("efaddd",    0x042, "v,B,H"),
  1502. EFPOP1_3 ("efadds",    0x041, "e,f,g"),
  1503. EFPOP1_3 ("efsubd",    0x046, "v,B,H"),
  1504. EFPOP1_3 ("efsubs",    0x045, "e,f,g"),
  1505. EFPOP1_3 ("efdivd",    0x04e, "v,B,H"),
  1506. EFPOP1_3 ("efdivs",    0x04d, "e,f,g"),
  1507. EFPOP1_3 ("efmuld",    0x04a, "v,B,H"),
  1508. EFPOP1_3 ("efmuls",    0x049, "e,f,g"),
  1509. EFPOP1_3 ("efsmuld",    0x069, "e,f,H"),
  1510. EFPOP2_2 ("efcmpd",    0x052, "v,B"),
  1511. EFPOP2_2 ("efcmped",    0x056, "v,B"),
  1512. EFPOP2_2 ("efcmps",    0x051, "e,f"),
  1513. EFPOP2_2 ("efcmpes",    0x055, "e,f"),
  1514.  
  1515. #undef EFPOP1_2
  1516. #undef EFPOP1_3
  1517. #undef EFPOP2_2
  1518.  
  1519. /* These are marked F_ALIAS, so that they won't conflict with sparclite insns
  1520.    present.  Otherwise, the F_ALIAS flag is ignored.  */
  1521. { "cpop1",    F3(2, 0x36, 0), F3(~2, ~0x36, ~1), "[1+2],d", F_ALIAS, v6notv9 },
  1522. { "cpop2",    F3(2, 0x37, 0), F3(~2, ~0x37, ~1), "[1+2],d", F_ALIAS, v6notv9 },
  1523.  
  1524. /* sparclet specific insns */
  1525.  
  1526. COMMUTEOP ("umac", 0x3e, sparclet),
  1527. COMMUTEOP ("smac", 0x3f, sparclet),
  1528. COMMUTEOP ("umacd", 0x2e, sparclet),
  1529. COMMUTEOP ("smacd", 0x2f, sparclet),
  1530. COMMUTEOP ("umuld", 0x09, sparclet),
  1531. COMMUTEOP ("smuld", 0x0d, sparclet),
  1532.  
  1533. { "shuffle",    F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),    "1,2,d", 0, sparclet },
  1534. { "shuffle",    F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),        "1,i,d", 0, sparclet },
  1535.  
  1536. /* The manual isn't completely accurate on these insns.  The `rs2' field is
  1537.    treated as being 6 bits to account for 6 bit immediates to cpush.  It is
  1538.    assumed that it is intended that bit 5 is 0 when rs2 contains a reg.  */
  1539. #define BIT5 (1<<5)
  1540. { "crdcxt",    F3(2, 0x36, 0)|SLCPOP(4), F3(~2, ~0x36, ~0)|SLCPOP(~4)|BIT5|RS2(~0),    "U,d", 0, sparclet },
  1541. { "cwrcxt",    F3(2, 0x36, 0)|SLCPOP(3), F3(~2, ~0x36, ~0)|SLCPOP(~3)|BIT5|RS2(~0),    "1,u", 0, sparclet },
  1542. { "cpush",    F3(2, 0x36, 0)|SLCPOP(0), F3(~2, ~0x36, ~0)|SLCPOP(~0)|BIT5|RD(~0),    "1,2", 0, sparclet },
  1543. { "cpush",    F3(2, 0x36, 1)|SLCPOP(0), F3(~2, ~0x36, ~1)|SLCPOP(~0)|RD(~0),        "1,Y", 0, sparclet },
  1544. { "cpusha",    F3(2, 0x36, 0)|SLCPOP(1), F3(~2, ~0x36, ~0)|SLCPOP(~1)|BIT5|RD(~0),    "1,2", 0, sparclet },
  1545. { "cpusha",    F3(2, 0x36, 1)|SLCPOP(1), F3(~2, ~0x36, ~1)|SLCPOP(~1)|RD(~0),        "1,Y", 0, sparclet },
  1546. { "cpull",    F3(2, 0x36, 0)|SLCPOP(2), F3(~2, ~0x36, ~0)|SLCPOP(~2)|BIT5|RS1(~0)|RS2(~0), "d", 0, sparclet },
  1547. #undef BIT5
  1548.  
  1549. /* sparclet coprocessor branch insns */
  1550. #define SLCBCC2(opcode, mask, lose) \
  1551.  { opcode, (mask), ANNUL|(lose), "l",    F_DELAYED|F_CONDBR, sparclet }, \
  1552.  { opcode, (mask)|ANNUL, (lose), ",a l", F_DELAYED|F_CONDBR, sparclet }
  1553. #define SLCBCC(opcode, mask) \
  1554.   SLCBCC2(opcode, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)))
  1555.  
  1556. /* cbn,cba can't be defined here because they're defined elsewhere and GAS
  1557.    requires all mnemonics of the same name to be consecutive.  */
  1558. /*SLCBCC("cbn", 0), - already defined */
  1559. SLCBCC("cbe", 1),
  1560. SLCBCC("cbf", 2),
  1561. SLCBCC("cbef", 3),
  1562. SLCBCC("cbr", 4),
  1563. SLCBCC("cber", 5),
  1564. SLCBCC("cbfr", 6),
  1565. SLCBCC("cbefr", 7),
  1566. /*SLCBCC("cba", 8), - already defined */
  1567. SLCBCC("cbne", 9),
  1568. SLCBCC("cbnf", 10),
  1569. SLCBCC("cbnef", 11),
  1570. SLCBCC("cbnr", 12),
  1571. SLCBCC("cbner", 13),
  1572. SLCBCC("cbnfr", 14),
  1573. SLCBCC("cbnefr", 15),
  1574.  
  1575. #undef SLCBCC2
  1576. #undef SLCBCC
  1577.  
  1578. /* More v9 specific insns */
  1579.  
  1580. #define IMPDEP(name, code) \
  1581. { name,    F3(2, code, 0), F3(~2, ~code, ~0)|ASI(~0), "1,2,d", 0, v9 }, \
  1582. { name,    F3(2, code, 1), F3(~2, ~code, ~1),       "1,i,d", 0, v9 }, \
  1583. { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,1,2,d", 0, v9 }, \
  1584. { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,e,f,g", 0, v9 }
  1585.  
  1586. IMPDEP ("impdep1", 0x36),
  1587. IMPDEP ("impdep2", 0x37),
  1588.  
  1589. #undef IMPDEP
  1590.  
  1591. { "casa",    F3(3, 0x3c, 0), F3(~3, ~0x3c, ~0), "[1]A,2,d", 0, v9 },
  1592. { "casa",    F3(3, 0x3c, 1), F3(~3, ~0x3c, ~1), "[1]o,2,d", 0, v9 },
  1593. { "casxa",    F3(3, 0x3e, 0), F3(~3, ~0x3e, ~0), "[1]A,2,d", 0, v9 },
  1594. { "casxa",    F3(3, 0x3e, 1), F3(~3, ~0x3e, ~1), "[1]o,2,d", 0, v9 },
  1595.  
  1596. /* v9 synthetic insns */
  1597. /* FIXME: still missing "signx d", and "clruw d".  Can't be done here.  */
  1598. { "iprefetch",    F2(0, 1)|(2<<20)|BPRED, F2(~0, ~1)|(1<<20)|ANNUL|COND(~0), "G", 0, v9 }, /* bn,a,pt %xcc,label */
  1599. { "signx",    F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|ASI(~0)|RS2_G0, "1,d", F_ALIAS, v9 }, /* sra rs1,%g0,rd */
  1600. { "clruw",    F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|ASI(~0)|RS2_G0, "1,d", F_ALIAS, v9 }, /* srl rs1,%g0,rd */
  1601. { "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 */
  1602. { "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 */
  1603. { "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 */
  1604. { "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 */
  1605.  
  1606. /* Ultrasparc extensions */
  1607. { "shutdown",    F3F(2, 0x36, 0x080), F3F(~2, ~0x36, ~0x080)|RD_G0|RS1_G0|RS2_G0, "", 0, v9a },
  1608.  
  1609. /* FIXME: Do we want to mark these as F_FLOAT, or something similar?  */
  1610. { "fadd16",    F3F(2, 0x36, 0x050), F3F(~2, ~0x36, ~0x050), "v,B,H", 0, v9a },
  1611. { "fadd16s",    F3F(2, 0x36, 0x051), F3F(~2, ~0x36, ~0x051), "e,f,g", 0, v9a },
  1612. { "fadd32",    F3F(2, 0x36, 0x052), F3F(~2, ~0x36, ~0x052), "v,B,H", 0, v9a },
  1613. { "fadd32s",    F3F(2, 0x36, 0x053), F3F(~2, ~0x36, ~0x053), "e,f,g", 0, v9a },
  1614. { "fsub16",    F3F(2, 0x36, 0x054), F3F(~2, ~0x36, ~0x054), "v,B,H", 0, v9a },
  1615. { "fsub16s",    F3F(2, 0x36, 0x055), F3F(~2, ~0x36, ~0x055), "e,f,g", 0, v9a },
  1616. { "fsub32",    F3F(2, 0x36, 0x056), F3F(~2, ~0x36, ~0x056), "v,B,H", 0, v9a },
  1617. { "fsub32s",    F3F(2, 0x36, 0x057), F3F(~2, ~0x36, ~0x057), "e,f,g", 0, v9a },
  1618.  
  1619. { "fpack16",    F3F(2, 0x36, 0x039), F3F(~2, ~0x36, ~0x039)|RS1_G0, "B,H", 0, v9a },
  1620. { "fpack32",    F3F(2, 0x36, 0x03a), F3F(~2, ~0x36, ~0x03a), "v,B,H", 0, v9a },
  1621. { "fpackfix",    F3F(2, 0x36, 0x03b), F3F(~2, ~0x36, ~0x03b)|RS1_G0, "B,H", 0, v9a },
  1622. { "fexpand",    F3F(2, 0x36, 0x04d), F3F(~2, ~0x36, ~0x04d)|RS1_G0, "B,H", 0, v9a },
  1623. { "fpmerge",    F3F(2, 0x36, 0x04b), F3F(~2, ~0x36, ~0x04b), "v,B,H", 0, v9a },
  1624.  
  1625. /* Note that the mixing of 32/64 bit regs is intentional.
  1626.    FIXME: Should these be commutative?  */
  1627. { "fmul8x16",        F3F(2, 0x36, 0x031), F3F(~2, ~0x36, ~0x031), "e,B,H", 0, v9a },
  1628. { "fmul8x16au",        F3F(2, 0x36, 0x033), F3F(~2, ~0x36, ~0x033), "e,f,H", 0, v9a },
  1629. { "fmul8x16al",        F3F(2, 0x36, 0x035), F3F(~2, ~0x36, ~0x035), "e,f,H", 0, v9a },
  1630. { "fmul8sux16",        F3F(2, 0x36, 0x036), F3F(~2, ~0x36, ~0x036), "v,B,H", 0, v9a },
  1631. { "fmul8ulx16",        F3F(2, 0x36, 0x037), F3F(~2, ~0x36, ~0x037), "v,B,H", 0, v9a },
  1632. { "fmuld8sux16",    F3F(2, 0x36, 0x038), F3F(~2, ~0x36, ~0x038), "e,f,H", 0, v9a },
  1633. { "fmuld8ulx16",    F3F(2, 0x36, 0x039), F3F(~2, ~0x36, ~0x039), "e,f,H", 0, v9a },
  1634.  
  1635. { "alignaddr",    F3F(2, 0x36, 0x018), F3F(~2, ~0x36, ~0x018), "1,2,d", 0, v9a },
  1636. { "alignaddrl",    F3F(2, 0x36, 0x01a), F3F(~2, ~0x36, ~0x01a), "1,2,d", 0, v9a },
  1637. { "faligndata",    F3F(2, 0x36, 0x048), F3F(~2, ~0x36, ~0x048), "v,B,H", 0, v9a },
  1638.  
  1639. { "fzero",    F3F(2, 0x36, 0x060), F3F(~2, ~0x36, ~0x060), "H", 0, v9a },
  1640. { "fzeros",    F3F(2, 0x36, 0x061), F3F(~2, ~0x36, ~0x061), "H", 0, v9a },
  1641. { "fone",    F3F(2, 0x36, 0x07e), F3F(~2, ~0x36, ~0x07e), "H", 0, v9a },
  1642. { "fones",    F3F(2, 0x36, 0x07f), F3F(~2, ~0x36, ~0x07f), "H", 0, v9a },
  1643. /* FIXME: v or B in next 8 insns? */
  1644. { "fsrc1",    F3F(2, 0x36, 0x074), F3F(~2, ~0x36, ~0x074), "B,H", 0, v9a },
  1645. { "fsrc1s",    F3F(2, 0x36, 0x075), F3F(~2, ~0x36, ~0x075), "B,H", 0, v9a },
  1646. { "fsrc2",    F3F(2, 0x36, 0x078), F3F(~2, ~0x36, ~0x078), "B,H", 0, v9a },
  1647. { "fsrc2s",    F3F(2, 0x36, 0x079), F3F(~2, ~0x36, ~0x079), "B,H", 0, v9a },
  1648. { "fnot1",    F3F(2, 0x36, 0x06a), F3F(~2, ~0x36, ~0x06a), "B,H", 0, v9a },
  1649. { "fnot1s",    F3F(2, 0x36, 0x06b), F3F(~2, ~0x36, ~0x06b), "B,H", 0, v9a },
  1650. { "fnot2",    F3F(2, 0x36, 0x066), F3F(~2, ~0x36, ~0x066), "B,H", 0, v9a },
  1651. { "fnot2s",    F3F(2, 0x36, 0x067), F3F(~2, ~0x36, ~0x067), "B,H", 0, v9a },
  1652. { "for",    F3F(2, 0x36, 0x07c), F3F(~2, ~0x36, ~0x07c), "v,B,H", 0, v9a },
  1653. { "fors",    F3F(2, 0x36, 0x07d), F3F(~2, ~0x36, ~0x07d), "v,B,H", 0, v9a },
  1654. { "fnor",    F3F(2, 0x36, 0x062), F3F(~2, ~0x36, ~0x062), "v,B,H", 0, v9a },
  1655. { "fnors",    F3F(2, 0x36, 0x063), F3F(~2, ~0x36, ~0x063), "v,B,H", 0, v9a },
  1656. { "fand",    F3F(2, 0x36, 0x070), F3F(~2, ~0x36, ~0x070), "v,B,H", 0, v9a },
  1657. { "fands",    F3F(2, 0x36, 0x071), F3F(~2, ~0x36, ~0x071), "v,B,H", 0, v9a },
  1658. { "fnand",    F3F(2, 0x36, 0x06e), F3F(~2, ~0x36, ~0x06e), "v,B,H", 0, v9a },
  1659. { "fnands",    F3F(2, 0x36, 0x06f), F3F(~2, ~0x36, ~0x06f), "v,B,H", 0, v9a },
  1660. { "fxor",    F3F(2, 0x36, 0x06c), F3F(~2, ~0x36, ~0x06c), "v,B,H", 0, v9a },
  1661. { "fxors",    F3F(2, 0x36, 0x06d), F3F(~2, ~0x36, ~0x06d), "v,B,H", 0, v9a },
  1662. { "fxnor",    F3F(2, 0x36, 0x072), F3F(~2, ~0x36, ~0x072), "v,B,H", 0, v9a },
  1663. { "fxnors",    F3F(2, 0x36, 0x073), F3F(~2, ~0x36, ~0x073), "v,B,H", 0, v9a },
  1664. { "fornot1",    F3F(2, 0x36, 0x07a), F3F(~2, ~0x36, ~0x07a), "v,B,H", 0, v9a },
  1665. { "fornot1s",    F3F(2, 0x36, 0x07b), F3F(~2, ~0x36, ~0x07b), "v,B,H", 0, v9a },
  1666. { "fornot2",    F3F(2, 0x36, 0x076), F3F(~2, ~0x36, ~0x076), "v,B,H", 0, v9a },
  1667. { "fornot2s",    F3F(2, 0x36, 0x077), F3F(~2, ~0x36, ~0x077), "v,B,H", 0, v9a },
  1668. { "fandnot1",    F3F(2, 0x36, 0x068), F3F(~2, ~0x36, ~0x068), "v,B,H", 0, v9a },
  1669. { "fandnot1s",    F3F(2, 0x36, 0x069), F3F(~2, ~0x36, ~0x069), "v,B,H", 0, v9a },
  1670. { "fandnot2",    F3F(2, 0x36, 0x064), F3F(~2, ~0x36, ~0x064), "v,B,H", 0, v9a },
  1671. { "fandnot2s",    F3F(2, 0x36, 0x065), F3F(~2, ~0x36, ~0x065), "v,B,H", 0, v9a },
  1672.  
  1673. { "fcmpgt16",    F3F(2, 0x36, 0x028), F3F(~2, ~0x36, ~0x028), "v,B,H", 0, v9a },
  1674. { "fcmpgt32",    F3F(2, 0x36, 0x02c), F3F(~2, ~0x36, ~0x02c), "v,B,H", 0, v9a },
  1675. { "fcmple16",    F3F(2, 0x36, 0x020), F3F(~2, ~0x36, ~0x020), "v,B,H", 0, v9a },
  1676. { "fcmple32",    F3F(2, 0x36, 0x024), F3F(~2, ~0x36, ~0x024), "v,B,H", 0, v9a },
  1677. { "fcmpne16",    F3F(2, 0x36, 0x022), F3F(~2, ~0x36, ~0x022), "v,B,H", 0, v9a },
  1678. { "fcmpne32",    F3F(2, 0x36, 0x026), F3F(~2, ~0x36, ~0x026), "v,B,H", 0, v9a },
  1679. { "fcmpeq16",    F3F(2, 0x36, 0x02a), F3F(~2, ~0x36, ~0x02a), "v,B,H", 0, v9a },
  1680. { "fcmpeq32",    F3F(2, 0x36, 0x02e), F3F(~2, ~0x36, ~0x02e), "v,B,H", 0, v9a },
  1681.  
  1682. { "edge8",    F3F(2, 0x36, 0x000), F3F(~2, ~0x36, ~0x000), "1,2,d", 0, v9a },
  1683. { "edge8l",    F3F(2, 0x36, 0x002), F3F(~2, ~0x36, ~0x002), "1,2,d", 0, v9a },
  1684. { "edge16",    F3F(2, 0x36, 0x004), F3F(~2, ~0x36, ~0x004), "1,2,d", 0, v9a },
  1685. { "edge16l",    F3F(2, 0x36, 0x006), F3F(~2, ~0x36, ~0x006), "1,2,d", 0, v9a },
  1686. { "edge32",    F3F(2, 0x36, 0x008), F3F(~2, ~0x36, ~0x008), "1,2,d", 0, v9a },
  1687. { "edge32l",    F3F(2, 0x36, 0x00a), F3F(~2, ~0x36, ~0x00a), "1,2,d", 0, v9a },
  1688.  
  1689. { "pdist",    F3F(2, 0x36, 0x03e), F3F(~2, ~0x36, ~0x03e), "v,B,H", 0, v9a },
  1690.  
  1691. { "array8",    F3F(2, 0x36, 0x010), F3F(~2, ~0x36, ~0x010), "1,2,d", 0, v9a },
  1692. { "array16",    F3F(2, 0x36, 0x012), F3F(~2, ~0x36, ~0x012), "1,2,d", 0, v9a },
  1693. { "array32",    F3F(2, 0x36, 0x014), F3F(~2, ~0x36, ~0x014), "1,2,d", 0, v9a },
  1694.  
  1695. };
  1696.  
  1697. const int sparc_num_opcodes = ((sizeof sparc_opcodes)/(sizeof sparc_opcodes[0]));
  1698.  
  1699. /* Utilities for argument parsing.  */
  1700.  
  1701. typedef struct
  1702. {
  1703.   int value;
  1704.   char *name;
  1705. } arg;
  1706.  
  1707. /* Look up NAME in TABLE.  */
  1708.  
  1709. static int
  1710. lookup_name (table, name)
  1711.      arg *table;
  1712.      char *name;
  1713. {
  1714.   arg *p;
  1715.  
  1716.   for (p = table; p->name; ++p)
  1717.     if (strcmp (name, p->name) == 0)
  1718.       return p->value;
  1719.  
  1720.   return -1;
  1721. }
  1722.  
  1723. /* Look up VALUE in TABLE.  */
  1724.  
  1725. static char *
  1726. lookup_value (table, value)
  1727.      arg *table;
  1728.      int value;
  1729. {
  1730.   arg *p;
  1731.  
  1732.   for (p = table; p->name; ++p)
  1733.     if (value == p->value)
  1734.       return p->name;
  1735.  
  1736.   return (char *) 0;
  1737. }
  1738.  
  1739. /* Handle ASI's.  */
  1740.  
  1741. static arg asi_table[] =
  1742. {
  1743.   /* These are in the v9 architecture manual.  */
  1744.   /* The shorter versions appear first, they're here because Sun's as has them.
  1745.      Sun's as uses #ASI_P_L instead of #ASI_PL (which appears in the
  1746.      UltraSPARC architecture manual).  */
  1747.   { 0x04, "#ASI_N" },
  1748.   { 0x0c, "#ASI_N_L" },
  1749.   { 0x10, "#ASI_AIUP" },
  1750.   { 0x11, "#ASI_AIUS" },
  1751.   { 0x18, "#ASI_AIUP_L" },
  1752.   { 0x19, "#ASI_AIUS_L" },
  1753.   { 0x80, "#ASI_P" },
  1754.   { 0x81, "#ASI_S" },
  1755.   { 0x82, "#ASI_PNF" },
  1756.   { 0x83, "#ASI_SNF" },
  1757.   { 0x88, "#ASI_P_L" },
  1758.   { 0x89, "#ASI_S_L" },
  1759.   { 0x8a, "#ASI_PNF_L" },
  1760.   { 0x8b, "#ASI_SNF_L" },
  1761.   { 0x04, "#ASI_NUCLEUS" },
  1762.   { 0x0c, "#ASI_NUCLEUS_LITTLE" },
  1763.   { 0x10, "#ASI_AS_IF_USER_PRIMARY" },
  1764.   { 0x11, "#ASI_AS_IF_USER_SECONDARY" },
  1765.   { 0x18, "#ASI_AS_IF_USER_PRIMARY_LITTLE" },
  1766.   { 0x19, "#ASI_AS_IF_USER_SECONDARY_LITTLE" },
  1767.   { 0x80, "#ASI_PRIMARY" },
  1768.   { 0x81, "#ASI_SECONDARY" },
  1769.   { 0x82, "#ASI_PRIMARY_NOFAULT" },
  1770.   { 0x83, "#ASI_SECONDARY_NOFAULT" },
  1771.   { 0x88, "#ASI_PRIMARY_LITTLE" },
  1772.   { 0x89, "#ASI_SECONDARY_LITTLE" },
  1773.   { 0x8a, "#ASI_PRIMARY_NOFAULT_LITTLE" },
  1774.   { 0x8b, "#ASI_SECONDARY_NOFAULT_LITTLE" },
  1775.   /* These are UltraSPARC extensions.  */
  1776.   /* FIXME: There are dozens of them.  Not sure we want them all.
  1777.      Most are for kernel building but some are for vis type stuff.  */
  1778.   { 0, 0 }
  1779. };
  1780.  
  1781. /* Return the value for ASI NAME, or -1 if not found.  */
  1782.  
  1783. int
  1784. sparc_encode_asi (name)
  1785.      char *name;
  1786. {
  1787.   return lookup_name (asi_table, name);
  1788. }
  1789.  
  1790. /* Return the name for ASI value VALUE or NULL if not found.  */
  1791.  
  1792. char *
  1793. sparc_decode_asi (value)
  1794.      int value;
  1795. {
  1796.   return lookup_value (asi_table, value);
  1797. }
  1798.  
  1799. /* Handle membar masks.  */
  1800.  
  1801. static arg membar_table[] =
  1802. {
  1803.   { 0x40, "#Sync" },
  1804.   { 0x20, "#MemIssue" },
  1805.   { 0x10, "#Lookaside" },
  1806.   { 0x08, "#StoreStore" },
  1807.   { 0x04, "#LoadStore" },
  1808.   { 0x02, "#StoreLoad" },
  1809.   { 0x01, "#LoadLoad" },
  1810.   { 0, 0 }
  1811. };
  1812.  
  1813. /* Return the value for membar arg NAME, or -1 if not found.  */
  1814.  
  1815. int
  1816. sparc_encode_membar (name)
  1817.      char *name;
  1818. {
  1819.   return lookup_name (membar_table, name);
  1820. }
  1821.  
  1822. /* Return the name for membar value VALUE or NULL if not found.  */
  1823.  
  1824. char *
  1825. sparc_decode_membar (value)
  1826.      int value;
  1827. {
  1828.   return lookup_value (membar_table, value);
  1829. }
  1830.  
  1831. /* Handle prefetch args.  */
  1832.  
  1833. static arg prefetch_table[] =
  1834. {
  1835.   { 0, "#n_reads" },
  1836.   { 1, "#one_read" },
  1837.   { 2, "#n_writes" },
  1838.   { 3, "#one_write" },
  1839.   { 4, "#page" },
  1840.   { 0, 0 }
  1841. };
  1842.  
  1843. /* Return the value for prefetch arg NAME, or -1 if not found.  */
  1844.  
  1845. int
  1846. sparc_encode_prefetch (name)
  1847.      char *name;
  1848. {
  1849.   return lookup_name (prefetch_table, name);
  1850. }
  1851.  
  1852. /* Return the name for prefetch value VALUE or NULL if not found.  */
  1853.  
  1854. char *
  1855. sparc_decode_prefetch (value)
  1856.      int value;
  1857. {
  1858.   return lookup_value (prefetch_table, value);
  1859. }
  1860.  
  1861. /* Handle sparclet coprocessor registers.  */
  1862.  
  1863. static arg sparclet_cpreg_table[] =
  1864. {
  1865.   { 0, "%ccsr" },
  1866.   { 1, "%ccfr" },
  1867.   { 2, "%cccrcr" },
  1868.   { 3, "%ccpr" },
  1869.   { 0, 0 }
  1870. };
  1871.  
  1872. /* Return the value for sparclet cpreg arg NAME, or -1 if not found.  */
  1873.  
  1874. int
  1875. sparc_encode_sparclet_cpreg (name)
  1876.      char *name;
  1877. {
  1878.   return lookup_name (sparclet_cpreg_table, name);
  1879. }
  1880.  
  1881. /* Return the name for sparclet cpreg value VALUE or NULL if not found.  */
  1882.  
  1883. char *
  1884. sparc_decode_sparclet_cpreg (value)
  1885.      int value;
  1886. {
  1887.   return lookup_value (sparclet_cpreg_table, value);
  1888. }
  1889.