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