xref: /openbsd-src/gnu/usr.bin/binutils-2.17/opcodes/tic80-opc.c (revision 3d8817e467ea46cf4772788d6804dd293abfb01a)
1*3d8817e4Smiod /* Opcode table for TI TMS320C80 (MVP).
2*3d8817e4Smiod    Copyright 1996, 1997, 2000 Free Software Foundation, Inc.
3*3d8817e4Smiod 
4*3d8817e4Smiod This file is part of GDB, GAS, and the GNU binutils.
5*3d8817e4Smiod 
6*3d8817e4Smiod GDB, GAS, and the GNU binutils are free software; you can redistribute
7*3d8817e4Smiod them and/or modify them under the terms of the GNU General Public
8*3d8817e4Smiod License as published by the Free Software Foundation; either version
9*3d8817e4Smiod 1, or (at your option) any later version.
10*3d8817e4Smiod 
11*3d8817e4Smiod GDB, GAS, and the GNU binutils are distributed in the hope that they
12*3d8817e4Smiod will be useful, but WITHOUT ANY WARRANTY; without even the implied
13*3d8817e4Smiod warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14*3d8817e4Smiod the GNU General Public License for more details.
15*3d8817e4Smiod 
16*3d8817e4Smiod You should have received a copy of the GNU General Public License
17*3d8817e4Smiod along with this file; see the file COPYING.  If not, write to the Free
18*3d8817e4Smiod Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19*3d8817e4Smiod 02110-1301, USA.  */
20*3d8817e4Smiod 
21*3d8817e4Smiod #include <stdio.h>
22*3d8817e4Smiod #include "sysdep.h"
23*3d8817e4Smiod #include "opcode/tic80.h"
24*3d8817e4Smiod 
25*3d8817e4Smiod /* This file holds various tables for the TMS320C80 (MVP).
26*3d8817e4Smiod 
27*3d8817e4Smiod    The opcode table is strictly constant data, so the compiler should
28*3d8817e4Smiod    be able to put it in the .text section.
29*3d8817e4Smiod 
30*3d8817e4Smiod    This file also holds the operand table.  All knowledge about
31*3d8817e4Smiod    inserting operands into instructions and vice-versa is kept in this
32*3d8817e4Smiod    file.
33*3d8817e4Smiod 
34*3d8817e4Smiod    The predefined register table maps from register names to register
35*3d8817e4Smiod    values.  */
36*3d8817e4Smiod 
37*3d8817e4Smiod 
38*3d8817e4Smiod /* Table of predefined symbol names, such as general purpose registers,
39*3d8817e4Smiod    floating point registers, condition codes, control registers, and bit
40*3d8817e4Smiod    numbers.
41*3d8817e4Smiod 
42*3d8817e4Smiod    The table is sorted case independently by name so that it is suitable for
43*3d8817e4Smiod    searching via a binary search using a case independent comparison
44*3d8817e4Smiod    function.
45*3d8817e4Smiod 
46*3d8817e4Smiod    Note that the type of the symbol is stored in the upper bits of the value
47*3d8817e4Smiod    field, which allows the value and type to be passed around as a unit in a
48*3d8817e4Smiod    single int.  The types have to be masked off before using the numeric
49*3d8817e4Smiod    value as a number.
50*3d8817e4Smiod */
51*3d8817e4Smiod 
52*3d8817e4Smiod const struct predefined_symbol tic80_predefined_symbols[] =
53*3d8817e4Smiod {
54*3d8817e4Smiod   { "a0",	TIC80_OPERAND_FPA | 0 },
55*3d8817e4Smiod   { "a1",	TIC80_OPERAND_FPA | 1 },
56*3d8817e4Smiod   { "alw.b",	TIC80_OPERAND_CC | 7 },
57*3d8817e4Smiod   { "alw.h",	TIC80_OPERAND_CC | 15 },
58*3d8817e4Smiod   { "alw.w",	TIC80_OPERAND_CC | 23 },
59*3d8817e4Smiod   { "ANASTAT",	TIC80_OPERAND_CR | 0x34 },
60*3d8817e4Smiod   { "BRK1",	TIC80_OPERAND_CR | 0x39 },
61*3d8817e4Smiod   { "BRK2",	TIC80_OPERAND_CR | 0x3A },
62*3d8817e4Smiod   { "CONFIG",	TIC80_OPERAND_CR | 2 },
63*3d8817e4Smiod   { "DLRU",	TIC80_OPERAND_CR | 0x500 },
64*3d8817e4Smiod   { "DTAG0",	TIC80_OPERAND_CR | 0x400 },
65*3d8817e4Smiod   { "DTAG1",	TIC80_OPERAND_CR | 0x401 },
66*3d8817e4Smiod   { "DTAG10",	TIC80_OPERAND_CR | 0x40A },
67*3d8817e4Smiod   { "DTAG11",	TIC80_OPERAND_CR | 0x40B },
68*3d8817e4Smiod   { "DTAG12",	TIC80_OPERAND_CR | 0x40C },
69*3d8817e4Smiod   { "DTAG13",	TIC80_OPERAND_CR | 0x40D },
70*3d8817e4Smiod   { "DTAG14",	TIC80_OPERAND_CR | 0x40E },
71*3d8817e4Smiod   { "DTAG15",	TIC80_OPERAND_CR | 0x40F },
72*3d8817e4Smiod   { "DTAG2",	TIC80_OPERAND_CR | 0x402 },
73*3d8817e4Smiod   { "DTAG3",	TIC80_OPERAND_CR | 0x403 },
74*3d8817e4Smiod   { "DTAG4",	TIC80_OPERAND_CR | 0x404 },
75*3d8817e4Smiod   { "DTAG5",	TIC80_OPERAND_CR | 0x405 },
76*3d8817e4Smiod   { "DTAG6",	TIC80_OPERAND_CR | 0x406 },
77*3d8817e4Smiod   { "DTAG7",	TIC80_OPERAND_CR | 0x407 },
78*3d8817e4Smiod   { "DTAG8",	TIC80_OPERAND_CR | 0x408 },
79*3d8817e4Smiod   { "DTAG9",	TIC80_OPERAND_CR | 0x409 },
80*3d8817e4Smiod   { "ECOMCNTL",	TIC80_OPERAND_CR | 0x33 },
81*3d8817e4Smiod   { "EIP",	TIC80_OPERAND_CR | 1 },
82*3d8817e4Smiod   { "EPC",	TIC80_OPERAND_CR | 0 },
83*3d8817e4Smiod   { "eq.b",	TIC80_OPERAND_BITNUM  | 0 },
84*3d8817e4Smiod   { "eq.f",	TIC80_OPERAND_BITNUM  | 20 },
85*3d8817e4Smiod   { "eq.h",	TIC80_OPERAND_BITNUM  | 10 },
86*3d8817e4Smiod   { "eq.w",	TIC80_OPERAND_BITNUM  | 20 },
87*3d8817e4Smiod   { "eq0.b",	TIC80_OPERAND_CC | 2 },
88*3d8817e4Smiod   { "eq0.h",	TIC80_OPERAND_CC | 10 },
89*3d8817e4Smiod   { "eq0.w",	TIC80_OPERAND_CC | 18 },
90*3d8817e4Smiod   { "FLTADR",	TIC80_OPERAND_CR | 0x11 },
91*3d8817e4Smiod   { "FLTDTH",	TIC80_OPERAND_CR | 0x14 },
92*3d8817e4Smiod   { "FLTDTL",	TIC80_OPERAND_CR | 0x13 },
93*3d8817e4Smiod   { "FLTOP",	TIC80_OPERAND_CR | 0x10 },
94*3d8817e4Smiod   { "FLTTAG",	TIC80_OPERAND_CR | 0x12 },
95*3d8817e4Smiod   { "FPST",	TIC80_OPERAND_CR | 8 },
96*3d8817e4Smiod   { "ge.b",	TIC80_OPERAND_BITNUM  | 5 },
97*3d8817e4Smiod   { "ge.f",	TIC80_OPERAND_BITNUM  | 25 },
98*3d8817e4Smiod   { "ge.h",	TIC80_OPERAND_BITNUM  | 15 },
99*3d8817e4Smiod   { "ge.w",	TIC80_OPERAND_BITNUM  | 25 },
100*3d8817e4Smiod   { "ge0.b",	TIC80_OPERAND_CC | 3 },
101*3d8817e4Smiod   { "ge0.h",	TIC80_OPERAND_CC | 11 },
102*3d8817e4Smiod   { "ge0.w",	TIC80_OPERAND_CC | 19 },
103*3d8817e4Smiod   { "gt.b",	TIC80_OPERAND_BITNUM  | 2 },
104*3d8817e4Smiod   { "gt.f",	TIC80_OPERAND_BITNUM  | 22 },
105*3d8817e4Smiod   { "gt.h",	TIC80_OPERAND_BITNUM  | 12 },
106*3d8817e4Smiod   { "gt.w",	TIC80_OPERAND_BITNUM  | 22 },
107*3d8817e4Smiod   { "gt0.b",	TIC80_OPERAND_CC | 1 },
108*3d8817e4Smiod   { "gt0.h",	TIC80_OPERAND_CC | 9 },
109*3d8817e4Smiod   { "gt0.w",	TIC80_OPERAND_CC | 17 },
110*3d8817e4Smiod   { "hi.b",	TIC80_OPERAND_BITNUM  | 6 },
111*3d8817e4Smiod   { "hi.h",	TIC80_OPERAND_BITNUM  | 16 },
112*3d8817e4Smiod   { "hi.w",	TIC80_OPERAND_BITNUM  | 26 },
113*3d8817e4Smiod   { "hs.b",	TIC80_OPERAND_BITNUM  | 9 },
114*3d8817e4Smiod   { "hs.h",	TIC80_OPERAND_BITNUM  | 19 },
115*3d8817e4Smiod   { "hs.w",	TIC80_OPERAND_BITNUM  | 29 },
116*3d8817e4Smiod   { "ib.f",	TIC80_OPERAND_BITNUM  | 28 },
117*3d8817e4Smiod   { "IE",	TIC80_OPERAND_CR | 6 },
118*3d8817e4Smiod   { "ILRU",	TIC80_OPERAND_CR | 0x300 },
119*3d8817e4Smiod   { "in.f",	TIC80_OPERAND_BITNUM  | 27 },
120*3d8817e4Smiod   { "IN0P",	TIC80_OPERAND_CR | 0x4000 },
121*3d8817e4Smiod   { "IN1P",	TIC80_OPERAND_CR | 0x4001 },
122*3d8817e4Smiod   { "INTPEN",	TIC80_OPERAND_CR | 4 },
123*3d8817e4Smiod   { "ITAG0",	TIC80_OPERAND_CR | 0x200 },
124*3d8817e4Smiod   { "ITAG1",	TIC80_OPERAND_CR | 0x201 },
125*3d8817e4Smiod   { "ITAG10",	TIC80_OPERAND_CR | 0x20A },
126*3d8817e4Smiod   { "ITAG11",	TIC80_OPERAND_CR | 0x20B },
127*3d8817e4Smiod   { "ITAG12",	TIC80_OPERAND_CR | 0x20C },
128*3d8817e4Smiod   { "ITAG13",	TIC80_OPERAND_CR | 0x20D },
129*3d8817e4Smiod   { "ITAG14",	TIC80_OPERAND_CR | 0x20E },
130*3d8817e4Smiod   { "ITAG15",	TIC80_OPERAND_CR | 0x20F },
131*3d8817e4Smiod   { "ITAG2",	TIC80_OPERAND_CR | 0x202 },
132*3d8817e4Smiod   { "ITAG3",	TIC80_OPERAND_CR | 0x203 },
133*3d8817e4Smiod   { "ITAG4",	TIC80_OPERAND_CR | 0x204 },
134*3d8817e4Smiod   { "ITAG5",	TIC80_OPERAND_CR | 0x205 },
135*3d8817e4Smiod   { "ITAG6",	TIC80_OPERAND_CR | 0x206 },
136*3d8817e4Smiod   { "ITAG7",	TIC80_OPERAND_CR | 0x207 },
137*3d8817e4Smiod   { "ITAG8",	TIC80_OPERAND_CR | 0x208 },
138*3d8817e4Smiod   { "ITAG9",	TIC80_OPERAND_CR | 0x209 },
139*3d8817e4Smiod   { "le.b",	TIC80_OPERAND_BITNUM  | 3 },
140*3d8817e4Smiod   { "le.f",	TIC80_OPERAND_BITNUM  | 23 },
141*3d8817e4Smiod   { "le.h",	TIC80_OPERAND_BITNUM  | 13 },
142*3d8817e4Smiod   { "le.w",	TIC80_OPERAND_BITNUM  | 23 },
143*3d8817e4Smiod   { "le0.b",	TIC80_OPERAND_CC | 6 },
144*3d8817e4Smiod   { "le0.h",	TIC80_OPERAND_CC | 14 },
145*3d8817e4Smiod   { "le0.w",	TIC80_OPERAND_CC | 22 },
146*3d8817e4Smiod   { "lo.b",	TIC80_OPERAND_BITNUM  | 8 },
147*3d8817e4Smiod   { "lo.h",	TIC80_OPERAND_BITNUM  | 18 },
148*3d8817e4Smiod   { "lo.w",	TIC80_OPERAND_BITNUM  | 28 },
149*3d8817e4Smiod   { "ls.b",	TIC80_OPERAND_BITNUM  | 7 },
150*3d8817e4Smiod   { "ls.h",	TIC80_OPERAND_BITNUM  | 17 },
151*3d8817e4Smiod   { "ls.w",	TIC80_OPERAND_BITNUM  | 27 },
152*3d8817e4Smiod   { "lt.b",	TIC80_OPERAND_BITNUM  | 4 },
153*3d8817e4Smiod   { "lt.f",	TIC80_OPERAND_BITNUM  | 24 },
154*3d8817e4Smiod   { "lt.h",	TIC80_OPERAND_BITNUM  | 14 },
155*3d8817e4Smiod   { "lt.w",	TIC80_OPERAND_BITNUM  | 24 },
156*3d8817e4Smiod   { "lt0.b",	TIC80_OPERAND_CC | 4 },
157*3d8817e4Smiod   { "lt0.h",	TIC80_OPERAND_CC | 12 },
158*3d8817e4Smiod   { "lt0.w",	TIC80_OPERAND_CC | 20 },
159*3d8817e4Smiod   { "MIP",	TIC80_OPERAND_CR | 0x31 },
160*3d8817e4Smiod   { "MPC",	TIC80_OPERAND_CR | 0x30 },
161*3d8817e4Smiod   { "ne.b",	TIC80_OPERAND_BITNUM  | 1 },
162*3d8817e4Smiod   { "ne.f",	TIC80_OPERAND_BITNUM  | 21 },
163*3d8817e4Smiod   { "ne.h",	TIC80_OPERAND_BITNUM  | 11 },
164*3d8817e4Smiod   { "ne.w",	TIC80_OPERAND_BITNUM  | 21 },
165*3d8817e4Smiod   { "ne0.b",	TIC80_OPERAND_CC | 5 },
166*3d8817e4Smiod   { "ne0.h",	TIC80_OPERAND_CC | 13 },
167*3d8817e4Smiod   { "ne0.w",	TIC80_OPERAND_CC | 21 },
168*3d8817e4Smiod   { "nev.b",	TIC80_OPERAND_CC | 0 },
169*3d8817e4Smiod   { "nev.h",	TIC80_OPERAND_CC | 8 },
170*3d8817e4Smiod   { "nev.w",	TIC80_OPERAND_CC | 16 },
171*3d8817e4Smiod   { "ob.f",	TIC80_OPERAND_BITNUM  | 29 },
172*3d8817e4Smiod   { "or.f",	TIC80_OPERAND_BITNUM  | 31 },
173*3d8817e4Smiod   { "ou.f",	TIC80_OPERAND_BITNUM  | 26 },
174*3d8817e4Smiod   { "OUTP",	TIC80_OPERAND_CR | 0x4002 },
175*3d8817e4Smiod   { "PKTREQ",	TIC80_OPERAND_CR | 0xD },
176*3d8817e4Smiod   { "PPERROR",	TIC80_OPERAND_CR | 0xA },
177*3d8817e4Smiod   { "r0",	TIC80_OPERAND_GPR | 0 },
178*3d8817e4Smiod   { "r1",	TIC80_OPERAND_GPR | 1 },
179*3d8817e4Smiod   { "r10",	TIC80_OPERAND_GPR | 10 },
180*3d8817e4Smiod   { "r11",	TIC80_OPERAND_GPR | 11 },
181*3d8817e4Smiod   { "r12",	TIC80_OPERAND_GPR | 12 },
182*3d8817e4Smiod   { "r13",	TIC80_OPERAND_GPR | 13 },
183*3d8817e4Smiod   { "r14",	TIC80_OPERAND_GPR | 14 },
184*3d8817e4Smiod   { "r15",	TIC80_OPERAND_GPR | 15 },
185*3d8817e4Smiod   { "r16",	TIC80_OPERAND_GPR | 16 },
186*3d8817e4Smiod   { "r17",	TIC80_OPERAND_GPR | 17 },
187*3d8817e4Smiod   { "r18",	TIC80_OPERAND_GPR | 18 },
188*3d8817e4Smiod   { "r19",	TIC80_OPERAND_GPR | 19 },
189*3d8817e4Smiod   { "r2",	TIC80_OPERAND_GPR | 2 },
190*3d8817e4Smiod   { "r20",	TIC80_OPERAND_GPR | 20 },
191*3d8817e4Smiod   { "r21",	TIC80_OPERAND_GPR | 21 },
192*3d8817e4Smiod   { "r22",	TIC80_OPERAND_GPR | 22 },
193*3d8817e4Smiod   { "r23",	TIC80_OPERAND_GPR | 23 },
194*3d8817e4Smiod   { "r24",	TIC80_OPERAND_GPR | 24 },
195*3d8817e4Smiod   { "r25",	TIC80_OPERAND_GPR | 25 },
196*3d8817e4Smiod   { "r26",	TIC80_OPERAND_GPR | 26 },
197*3d8817e4Smiod   { "r27",	TIC80_OPERAND_GPR | 27 },
198*3d8817e4Smiod   { "r28",	TIC80_OPERAND_GPR | 28 },
199*3d8817e4Smiod   { "r29",	TIC80_OPERAND_GPR | 29 },
200*3d8817e4Smiod   { "r3",	TIC80_OPERAND_GPR | 3 },
201*3d8817e4Smiod   { "r30",	TIC80_OPERAND_GPR | 30 },
202*3d8817e4Smiod   { "r31",	TIC80_OPERAND_GPR | 31 },
203*3d8817e4Smiod   { "r4",	TIC80_OPERAND_GPR | 4 },
204*3d8817e4Smiod   { "r5",	TIC80_OPERAND_GPR | 5 },
205*3d8817e4Smiod   { "r6",	TIC80_OPERAND_GPR | 6 },
206*3d8817e4Smiod   { "r7",	TIC80_OPERAND_GPR | 7 },
207*3d8817e4Smiod   { "r8",	TIC80_OPERAND_GPR | 8 },
208*3d8817e4Smiod   { "r9",	TIC80_OPERAND_GPR | 9 },
209*3d8817e4Smiod   { "SYSSTK",	TIC80_OPERAND_CR | 0x20 },
210*3d8817e4Smiod   { "SYSTMP",	TIC80_OPERAND_CR | 0x21 },
211*3d8817e4Smiod   { "TCOUNT",	TIC80_OPERAND_CR | 0xE },
212*3d8817e4Smiod   { "TSCALE",	TIC80_OPERAND_CR | 0xF },
213*3d8817e4Smiod   { "uo.f",	TIC80_OPERAND_BITNUM  | 30 },
214*3d8817e4Smiod };
215*3d8817e4Smiod 
216*3d8817e4Smiod const int tic80_num_predefined_symbols = sizeof (tic80_predefined_symbols) / sizeof (struct predefined_symbol);
217*3d8817e4Smiod 
218*3d8817e4Smiod /* This function takes a predefined symbol name in NAME, symbol class
219*3d8817e4Smiod    in CLASS, and translates it to a numeric value, which it returns.
220*3d8817e4Smiod 
221*3d8817e4Smiod    If CLASS is zero, any symbol that matches NAME is translated.  If
222*3d8817e4Smiod    CLASS is non-zero, then only a symbol that has class CLASS is
223*3d8817e4Smiod    matched.
224*3d8817e4Smiod 
225*3d8817e4Smiod    If no translation is possible, it returns -1, a value not used by
226*3d8817e4Smiod    any predefined symbol. Note that the predefined symbol array is
227*3d8817e4Smiod    presorted case independently by name.
228*3d8817e4Smiod 
229*3d8817e4Smiod    This function is implemented with the assumption that there are no
230*3d8817e4Smiod    duplicate names in the predefined symbol array, which happens to be
231*3d8817e4Smiod    true at the moment.
232*3d8817e4Smiod 
233*3d8817e4Smiod  */
234*3d8817e4Smiod 
235*3d8817e4Smiod int
tic80_symbol_to_value(name,class)236*3d8817e4Smiod tic80_symbol_to_value (name, class)
237*3d8817e4Smiod      char *name;
238*3d8817e4Smiod      int class;
239*3d8817e4Smiod {
240*3d8817e4Smiod   const struct predefined_symbol *pdsp;
241*3d8817e4Smiod   int low = 0;
242*3d8817e4Smiod   int middle;
243*3d8817e4Smiod   int high = tic80_num_predefined_symbols - 1;
244*3d8817e4Smiod   int cmp;
245*3d8817e4Smiod   int rtnval = -1;
246*3d8817e4Smiod 
247*3d8817e4Smiod   while (low <= high)
248*3d8817e4Smiod     {
249*3d8817e4Smiod       middle = (low + high) / 2;
250*3d8817e4Smiod       cmp = strcasecmp (name, tic80_predefined_symbols[middle].name);
251*3d8817e4Smiod       if (cmp < 0)
252*3d8817e4Smiod 	{
253*3d8817e4Smiod 	  high = middle - 1;
254*3d8817e4Smiod 	}
255*3d8817e4Smiod       else if (cmp > 0)
256*3d8817e4Smiod 	{
257*3d8817e4Smiod 	  low = middle + 1;
258*3d8817e4Smiod 	}
259*3d8817e4Smiod       else
260*3d8817e4Smiod 	{
261*3d8817e4Smiod 	  pdsp = &tic80_predefined_symbols[middle];
262*3d8817e4Smiod 	  if ((class == 0) || (class & PDS_VALUE (pdsp)))
263*3d8817e4Smiod 	    {
264*3d8817e4Smiod 	      rtnval = PDS_VALUE (pdsp);
265*3d8817e4Smiod 	    }
266*3d8817e4Smiod 	  /* For now we assume that there are no duplicate names */
267*3d8817e4Smiod 	  break;
268*3d8817e4Smiod 	}
269*3d8817e4Smiod     }
270*3d8817e4Smiod   return (rtnval);
271*3d8817e4Smiod }
272*3d8817e4Smiod 
273*3d8817e4Smiod /* This function takes a value VAL and finds a matching predefined
274*3d8817e4Smiod    symbol that is in the operand class specified by CLASS.  If CLASS
275*3d8817e4Smiod    is zero, the first matching symbol is returned. */
276*3d8817e4Smiod 
277*3d8817e4Smiod const char *
tic80_value_to_symbol(val,class)278*3d8817e4Smiod tic80_value_to_symbol (val, class)
279*3d8817e4Smiod      int val;
280*3d8817e4Smiod      int class;
281*3d8817e4Smiod {
282*3d8817e4Smiod   const struct predefined_symbol *pdsp;
283*3d8817e4Smiod   int ival;
284*3d8817e4Smiod   char *name;
285*3d8817e4Smiod 
286*3d8817e4Smiod   name = NULL;
287*3d8817e4Smiod   for (pdsp = tic80_predefined_symbols;
288*3d8817e4Smiod        pdsp < tic80_predefined_symbols + tic80_num_predefined_symbols;
289*3d8817e4Smiod        pdsp++)
290*3d8817e4Smiod     {
291*3d8817e4Smiod       ival = PDS_VALUE (pdsp) & ~TIC80_OPERAND_MASK;
292*3d8817e4Smiod       if (ival == val)
293*3d8817e4Smiod 	{
294*3d8817e4Smiod 	  if ((class == 0) || (class & PDS_VALUE (pdsp)))
295*3d8817e4Smiod 	    {
296*3d8817e4Smiod 	      /* Found the desired match */
297*3d8817e4Smiod 	      name = PDS_NAME (pdsp);
298*3d8817e4Smiod 	      break;
299*3d8817e4Smiod 	    }
300*3d8817e4Smiod 	}
301*3d8817e4Smiod     }
302*3d8817e4Smiod   return (name);
303*3d8817e4Smiod }
304*3d8817e4Smiod 
305*3d8817e4Smiod /* This function returns a pointer to the next symbol in the predefined
306*3d8817e4Smiod    symbol table after PDSP, or NULL if PDSP points to the last symbol.  If
307*3d8817e4Smiod    PDSP is NULL, it returns the first symbol in the table.  Thus it can be
308*3d8817e4Smiod    used to walk through the table by first calling it with NULL and then
309*3d8817e4Smiod    calling it with each value it returned on the previous call, until it
310*3d8817e4Smiod    returns NULL. */
311*3d8817e4Smiod 
312*3d8817e4Smiod const struct predefined_symbol *
tic80_next_predefined_symbol(pdsp)313*3d8817e4Smiod tic80_next_predefined_symbol (pdsp)
314*3d8817e4Smiod      const struct predefined_symbol *pdsp;
315*3d8817e4Smiod {
316*3d8817e4Smiod   if (pdsp == NULL)
317*3d8817e4Smiod     {
318*3d8817e4Smiod       pdsp = tic80_predefined_symbols;
319*3d8817e4Smiod     }
320*3d8817e4Smiod   else if (pdsp >= tic80_predefined_symbols &&
321*3d8817e4Smiod 	   pdsp < tic80_predefined_symbols + tic80_num_predefined_symbols - 1)
322*3d8817e4Smiod     {
323*3d8817e4Smiod       pdsp++;
324*3d8817e4Smiod     }
325*3d8817e4Smiod   else
326*3d8817e4Smiod     {
327*3d8817e4Smiod       pdsp = NULL;
328*3d8817e4Smiod     }
329*3d8817e4Smiod   return (pdsp);
330*3d8817e4Smiod }
331*3d8817e4Smiod 
332*3d8817e4Smiod 
333*3d8817e4Smiod 
334*3d8817e4Smiod /* The operands table.  The fields are:
335*3d8817e4Smiod 
336*3d8817e4Smiod 	bits, shift, insertion function, extraction function, flags
337*3d8817e4Smiod  */
338*3d8817e4Smiod 
339*3d8817e4Smiod const struct tic80_operand tic80_operands[] =
340*3d8817e4Smiod {
341*3d8817e4Smiod 
342*3d8817e4Smiod   /* The zero index is used to indicate the end of the list of operands.  */
343*3d8817e4Smiod 
344*3d8817e4Smiod #define UNUSED (0)
345*3d8817e4Smiod   { 0, 0, 0, 0, 0 },
346*3d8817e4Smiod 
347*3d8817e4Smiod   /* Short signed immediate value in bits 14-0. */
348*3d8817e4Smiod 
349*3d8817e4Smiod #define SSI (UNUSED + 1)
350*3d8817e4Smiod   { 15, 0, NULL, NULL, TIC80_OPERAND_SIGNED },
351*3d8817e4Smiod 
352*3d8817e4Smiod   /* Short unsigned immediate value in bits 14-0 */
353*3d8817e4Smiod 
354*3d8817e4Smiod #define SUI (SSI + 1)
355*3d8817e4Smiod   { 15, 0, NULL, NULL, 0 },
356*3d8817e4Smiod 
357*3d8817e4Smiod   /* Short unsigned bitfield in bits 14-0.  We distinguish this
358*3d8817e4Smiod      from a regular unsigned immediate value only for the convenience
359*3d8817e4Smiod      of the disassembler and the user. */
360*3d8817e4Smiod 
361*3d8817e4Smiod #define SUBF (SUI + 1)
362*3d8817e4Smiod   { 15, 0, NULL, NULL, TIC80_OPERAND_BITFIELD },
363*3d8817e4Smiod 
364*3d8817e4Smiod   /* Long signed immediate in following 32 bit word */
365*3d8817e4Smiod 
366*3d8817e4Smiod #define LSI (SUBF + 1)
367*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_SIGNED },
368*3d8817e4Smiod 
369*3d8817e4Smiod   /* Long unsigned immediate in following 32 bit word */
370*3d8817e4Smiod 
371*3d8817e4Smiod #define LUI (LSI + 1)
372*3d8817e4Smiod   { 32, 0, NULL, NULL, 0 },
373*3d8817e4Smiod 
374*3d8817e4Smiod   /* Long unsigned bitfield in following 32 bit word.  We distinguish
375*3d8817e4Smiod      this from a regular unsigned immediate value only for the
376*3d8817e4Smiod      convenience of the disassembler and the user. */
377*3d8817e4Smiod 
378*3d8817e4Smiod #define LUBF (LUI + 1)
379*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_BITFIELD },
380*3d8817e4Smiod 
381*3d8817e4Smiod   /* Single precision floating point immediate in following 32 bit
382*3d8817e4Smiod      word. */
383*3d8817e4Smiod 
384*3d8817e4Smiod #define SPFI (LUBF + 1)
385*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_FLOAT },
386*3d8817e4Smiod 
387*3d8817e4Smiod   /* Register in bits 4-0 */
388*3d8817e4Smiod 
389*3d8817e4Smiod #define REG_0 (SPFI + 1)
390*3d8817e4Smiod   { 5, 0, NULL, NULL, TIC80_OPERAND_GPR },
391*3d8817e4Smiod 
392*3d8817e4Smiod   /* Even register in bits 4-0 */
393*3d8817e4Smiod 
394*3d8817e4Smiod #define REG_0_E (REG_0 + 1)
395*3d8817e4Smiod   { 5, 0, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_EVEN },
396*3d8817e4Smiod 
397*3d8817e4Smiod   /* Register in bits 26-22 */
398*3d8817e4Smiod 
399*3d8817e4Smiod #define REG_22 (REG_0_E + 1)
400*3d8817e4Smiod   { 5, 22, NULL, NULL, TIC80_OPERAND_GPR },
401*3d8817e4Smiod 
402*3d8817e4Smiod   /* Even register in bits 26-22 */
403*3d8817e4Smiod 
404*3d8817e4Smiod #define REG_22_E (REG_22 + 1)
405*3d8817e4Smiod   { 5, 22, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_EVEN },
406*3d8817e4Smiod 
407*3d8817e4Smiod   /* Register in bits 31-27 */
408*3d8817e4Smiod 
409*3d8817e4Smiod #define REG_DEST (REG_22_E + 1)
410*3d8817e4Smiod   { 5, 27, NULL, NULL, TIC80_OPERAND_GPR },
411*3d8817e4Smiod 
412*3d8817e4Smiod   /* Even register in bits 31-27 */
413*3d8817e4Smiod 
414*3d8817e4Smiod #define REG_DEST_E (REG_DEST + 1)
415*3d8817e4Smiod   { 5, 27, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_EVEN },
416*3d8817e4Smiod 
417*3d8817e4Smiod   /* Floating point accumulator register (a0-a3) specified by bit 16 (MSB)
418*3d8817e4Smiod      and bit 11 (LSB) */
419*3d8817e4Smiod   /* FIXME!  Needs to use functions to insert and extract the register
420*3d8817e4Smiod      number in bits 16 and 11. */
421*3d8817e4Smiod 
422*3d8817e4Smiod #define REG_FPA (REG_DEST_E + 1)
423*3d8817e4Smiod   { 0, 0, NULL, NULL, TIC80_OPERAND_FPA },
424*3d8817e4Smiod 
425*3d8817e4Smiod   /* Short signed PC word offset in bits 14-0 */
426*3d8817e4Smiod 
427*3d8817e4Smiod #define OFF_SS_PC (REG_FPA + 1)
428*3d8817e4Smiod   { 15, 0, NULL, NULL, TIC80_OPERAND_PCREL | TIC80_OPERAND_SIGNED },
429*3d8817e4Smiod 
430*3d8817e4Smiod   /* Long signed PC word offset in following 32 bit word */
431*3d8817e4Smiod 
432*3d8817e4Smiod #define OFF_SL_PC (OFF_SS_PC + 1)
433*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_PCREL | TIC80_OPERAND_SIGNED },
434*3d8817e4Smiod 
435*3d8817e4Smiod   /* Short signed base relative byte offset in bits 14-0 */
436*3d8817e4Smiod 
437*3d8817e4Smiod #define OFF_SS_BR (OFF_SL_PC + 1)
438*3d8817e4Smiod   { 15, 0, NULL, NULL, TIC80_OPERAND_BASEREL | TIC80_OPERAND_SIGNED },
439*3d8817e4Smiod 
440*3d8817e4Smiod   /* Long signed base relative byte offset in following 32 bit word */
441*3d8817e4Smiod 
442*3d8817e4Smiod #define OFF_SL_BR (OFF_SS_BR + 1)
443*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_BASEREL | TIC80_OPERAND_SIGNED },
444*3d8817e4Smiod 
445*3d8817e4Smiod   /* Long signed base relative byte offset in following 32 bit word
446*3d8817e4Smiod      with optional ":s" modifier flag in bit 11 */
447*3d8817e4Smiod 
448*3d8817e4Smiod #define OFF_SL_BR_SCALED (OFF_SL_BR + 1)
449*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_BASEREL | TIC80_OPERAND_SIGNED | TIC80_OPERAND_SCALED },
450*3d8817e4Smiod 
451*3d8817e4Smiod   /* BITNUM in bits 31-27 */
452*3d8817e4Smiod 
453*3d8817e4Smiod #define BITNUM (OFF_SL_BR_SCALED + 1)
454*3d8817e4Smiod   { 5, 27, NULL, NULL, TIC80_OPERAND_BITNUM },
455*3d8817e4Smiod 
456*3d8817e4Smiod   /* Condition code in bits 31-27 */
457*3d8817e4Smiod 
458*3d8817e4Smiod #define CC (BITNUM + 1)
459*3d8817e4Smiod   { 5, 27, NULL, NULL, TIC80_OPERAND_CC },
460*3d8817e4Smiod 
461*3d8817e4Smiod   /* Control register number in bits 14-0 */
462*3d8817e4Smiod 
463*3d8817e4Smiod #define CR_SI (CC + 1)
464*3d8817e4Smiod   { 15, 0, NULL, NULL, TIC80_OPERAND_CR },
465*3d8817e4Smiod 
466*3d8817e4Smiod   /* Control register number in next 32 bit word */
467*3d8817e4Smiod 
468*3d8817e4Smiod #define CR_LI (CR_SI + 1)
469*3d8817e4Smiod   { 32, 0, NULL, NULL, TIC80_OPERAND_CR },
470*3d8817e4Smiod 
471*3d8817e4Smiod   /* A base register in bits 26-22, enclosed in parens */
472*3d8817e4Smiod 
473*3d8817e4Smiod #define REG_BASE (CR_LI + 1)
474*3d8817e4Smiod   { 5, 22, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_PARENS },
475*3d8817e4Smiod 
476*3d8817e4Smiod   /* A base register in bits 26-22, enclosed in parens, with optional ":m"
477*3d8817e4Smiod      flag in bit 17 (short immediate instructions only) */
478*3d8817e4Smiod 
479*3d8817e4Smiod #define REG_BASE_M_SI (REG_BASE + 1)
480*3d8817e4Smiod   { 5, 22, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_PARENS | TIC80_OPERAND_M_SI },
481*3d8817e4Smiod 
482*3d8817e4Smiod   /* A base register in bits 26-22, enclosed in parens, with optional ":m"
483*3d8817e4Smiod    flag in bit 15 (long immediate and register instructions only) */
484*3d8817e4Smiod 
485*3d8817e4Smiod #define REG_BASE_M_LI (REG_BASE_M_SI + 1)
486*3d8817e4Smiod   { 5, 22, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_PARENS | TIC80_OPERAND_M_LI },
487*3d8817e4Smiod 
488*3d8817e4Smiod   /* Scaled register in bits 4-0, with optional ":s" modifier flag in bit 11 */
489*3d8817e4Smiod 
490*3d8817e4Smiod #define REG_SCALED (REG_BASE_M_LI + 1)
491*3d8817e4Smiod   { 5, 0, NULL, NULL, TIC80_OPERAND_GPR | TIC80_OPERAND_SCALED },
492*3d8817e4Smiod 
493*3d8817e4Smiod   /* Unsigned immediate in bits 4-0, used only for shift instructions */
494*3d8817e4Smiod 
495*3d8817e4Smiod #define ROTATE (REG_SCALED + 1)
496*3d8817e4Smiod   { 5, 0, NULL, NULL, 0 },
497*3d8817e4Smiod 
498*3d8817e4Smiod   /* Unsigned immediate in bits 9-5, used only for shift instructions */
499*3d8817e4Smiod #define ENDMASK (ROTATE + 1)
500*3d8817e4Smiod   { 5, 5, NULL, NULL, TIC80_OPERAND_ENDMASK },
501*3d8817e4Smiod 
502*3d8817e4Smiod };
503*3d8817e4Smiod 
504*3d8817e4Smiod const int tic80_num_operands = sizeof (tic80_operands)/sizeof(*tic80_operands);
505*3d8817e4Smiod 
506*3d8817e4Smiod 
507*3d8817e4Smiod /* Macros used to generate entries for the opcodes table. */
508*3d8817e4Smiod 
509*3d8817e4Smiod #define FIXME 0
510*3d8817e4Smiod 
511*3d8817e4Smiod /* Short-Immediate Format Instructions - basic opcode */
512*3d8817e4Smiod #define OP_SI(x)	(((x) & 0x7F) << 15)
513*3d8817e4Smiod #define MASK_SI		OP_SI(0x7F)
514*3d8817e4Smiod 
515*3d8817e4Smiod /* Long-Immediate Format Instructions - basic opcode */
516*3d8817e4Smiod #define OP_LI(x)	(((x) & 0x3FF) << 12)
517*3d8817e4Smiod #define MASK_LI		OP_LI(0x3FF)
518*3d8817e4Smiod 
519*3d8817e4Smiod /* Register Format Instructions - basic opcode */
520*3d8817e4Smiod #define OP_REG(x)	OP_LI(x)	/* For readability */
521*3d8817e4Smiod #define MASK_REG	MASK_LI		/* For readability */
522*3d8817e4Smiod 
523*3d8817e4Smiod /* The 'n' bit at bit 10 */
524*3d8817e4Smiod #define n(x)		((x) << 10)
525*3d8817e4Smiod 
526*3d8817e4Smiod /* The 'i' bit at bit 11 */
527*3d8817e4Smiod #define i(x)		((x) << 11)
528*3d8817e4Smiod 
529*3d8817e4Smiod /* The 'F' bit at bit 27 */
530*3d8817e4Smiod #define F(x)		((x) << 27)
531*3d8817e4Smiod 
532*3d8817e4Smiod /* The 'E' bit at bit 27 */
533*3d8817e4Smiod #define E(x)		((x) << 27)
534*3d8817e4Smiod 
535*3d8817e4Smiod /* The 'M' bit at bit 15 in register and long immediate opcodes */
536*3d8817e4Smiod #define M_REG(x)	((x) << 15)
537*3d8817e4Smiod #define M_LI(x)		((x) << 15)
538*3d8817e4Smiod 
539*3d8817e4Smiod /* The 'M' bit at bit 17 in short immediate opcodes */
540*3d8817e4Smiod #define M_SI(x)		((x) << 17)
541*3d8817e4Smiod 
542*3d8817e4Smiod /* The 'SZ' field at bits 14-13 in register and long immediate opcodes */
543*3d8817e4Smiod #define SZ_REG(x)	((x) << 13)
544*3d8817e4Smiod #define SZ_LI(x)	((x) << 13)
545*3d8817e4Smiod 
546*3d8817e4Smiod /* The 'SZ' field at bits 16-15 in short immediate opcodes */
547*3d8817e4Smiod #define SZ_SI(x)	((x) << 15)
548*3d8817e4Smiod 
549*3d8817e4Smiod /* The 'D' (direct external memory access) bit at bit 10 in long immediate
550*3d8817e4Smiod    and register opcodes. */
551*3d8817e4Smiod #define D(x)		((x) << 10)
552*3d8817e4Smiod 
553*3d8817e4Smiod /* The 'S' (scale offset by data size) bit at bit 11 in long immediate
554*3d8817e4Smiod    and register opcodes. */
555*3d8817e4Smiod #define S(x)		((x) << 11)
556*3d8817e4Smiod 
557*3d8817e4Smiod /* The 'PD' field at bits 10-9 in floating point instructions */
558*3d8817e4Smiod #define PD(x)		((x) << 9)
559*3d8817e4Smiod 
560*3d8817e4Smiod /* The 'P2' field at bits 8-7 in floating point instructions */
561*3d8817e4Smiod #define P2(x)		((x) << 7)
562*3d8817e4Smiod 
563*3d8817e4Smiod /* The 'P1' field at bits 6-5 in floating point instructions */
564*3d8817e4Smiod #define P1(x)		((x) << 5)
565*3d8817e4Smiod 
566*3d8817e4Smiod /* The 'a' field at bit 16 in vector instructions */
567*3d8817e4Smiod #define V_a1(x)		((x) << 16)
568*3d8817e4Smiod 
569*3d8817e4Smiod /* The 'a' field at bit 11 in vector instructions */
570*3d8817e4Smiod #define V_a0(x)		((x) << 11)
571*3d8817e4Smiod 
572*3d8817e4Smiod /* The 'm' field at bit 10 in vector instructions */
573*3d8817e4Smiod #define V_m(x)		((x) << 10)
574*3d8817e4Smiod 
575*3d8817e4Smiod /* The 'S' field at bit 9 in vector instructions */
576*3d8817e4Smiod #define V_S(x)		((x) << 9)
577*3d8817e4Smiod 
578*3d8817e4Smiod /* The 'Z' field at bit 8 in vector instructions */
579*3d8817e4Smiod #define V_Z(x)		((x) << 8)
580*3d8817e4Smiod 
581*3d8817e4Smiod /* The 'p' field at bit 6 in vector instructions */
582*3d8817e4Smiod #define V_p(x)		((x) << 6)
583*3d8817e4Smiod 
584*3d8817e4Smiod /* The opcode field at bits 21-17 for vector instructions */
585*3d8817e4Smiod #define OP_V(x)		((x) << 17)
586*3d8817e4Smiod #define MASK_V		OP_V(0x1F)
587*3d8817e4Smiod 
588*3d8817e4Smiod 
589*3d8817e4Smiod /* The opcode table.  Formatted for better readability on a wide screen.  Also, all
590*3d8817e4Smiod  entries with the same mnemonic are sorted so that they are adjacent in the table,
591*3d8817e4Smiod  allowing the use of a hash table to locate the first of a sequence of opcodes that have
592*3d8817e4Smiod  a particular name.  The short immediate forms also come before the long immediate forms
593*3d8817e4Smiod  so that the assembler will pick the "best fit" for the size of the operand, except for
594*3d8817e4Smiod  the case of the PC relative forms, where the long forms come first and are the default
595*3d8817e4Smiod  forms. */
596*3d8817e4Smiod 
597*3d8817e4Smiod const struct tic80_opcode tic80_opcodes[] = {
598*3d8817e4Smiod 
599*3d8817e4Smiod   /* The "nop" instruction is really "rdcr 0,r0".  We put it first so that this
600*3d8817e4Smiod      specific bit pattern will get disassembled as a nop rather than an rdcr. The
601*3d8817e4Smiod      mask of all ones ensures that this will happen. */
602*3d8817e4Smiod 
603*3d8817e4Smiod   {"nop",	OP_SI(0x4),	~0,		0,		{0}			},
604*3d8817e4Smiod 
605*3d8817e4Smiod   /* The "br" instruction is really "bbz target,r0,31".  We put it first so that
606*3d8817e4Smiod      this specific bit pattern will get disassembled as a br rather than bbz. */
607*3d8817e4Smiod 
608*3d8817e4Smiod   {"br",	OP_SI(0x48),	0xFFFF8000,	0,	{OFF_SS_PC}	},
609*3d8817e4Smiod   {"br",	OP_LI(0x391),	0xFFFFF000,	0,	{OFF_SL_PC}	},
610*3d8817e4Smiod   {"br",	OP_REG(0x390),	0xFFFFF000,	0,	{REG_0}		},
611*3d8817e4Smiod   {"br.a",	OP_SI(0x49),	0xFFFF8000,	0,	{OFF_SS_PC}	},
612*3d8817e4Smiod   {"br.a",	OP_LI(0x393),	0xFFFFF000,	0,	{OFF_SL_PC}	},
613*3d8817e4Smiod   {"br.a",	OP_REG(0x392),	0xFFFFF000,	0,	{REG_0}		},
614*3d8817e4Smiod 
615*3d8817e4Smiod   /* Signed integer ADD */
616*3d8817e4Smiod 
617*3d8817e4Smiod   {"add",	OP_SI(0x58),	MASK_SI,	0,	{SSI, REG_22, REG_DEST}		},
618*3d8817e4Smiod   {"add",	OP_LI(0x3B1),	MASK_LI,	0,	{LSI, REG_22, REG_DEST}		},
619*3d8817e4Smiod   {"add",	OP_REG(0x3B0),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
620*3d8817e4Smiod 
621*3d8817e4Smiod   /* Unsigned integer ADD */
622*3d8817e4Smiod 
623*3d8817e4Smiod   {"addu",	OP_SI(0x59),	MASK_SI,	0,	{SSI, REG_22, REG_DEST}		},
624*3d8817e4Smiod   {"addu",	OP_LI(0x3B3),	MASK_LI,	0,	{LSI, REG_22, REG_DEST}		},
625*3d8817e4Smiod   {"addu",	OP_REG(0x3B2),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
626*3d8817e4Smiod 
627*3d8817e4Smiod   /* Bitwise AND */
628*3d8817e4Smiod 
629*3d8817e4Smiod   {"and",	OP_SI(0x11),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST}	},
630*3d8817e4Smiod   {"and",	OP_LI(0x323),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST}	},
631*3d8817e4Smiod   {"and",	OP_REG(0x322),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
632*3d8817e4Smiod   {"and.tt",	OP_SI(0x11),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST}	},
633*3d8817e4Smiod   {"and.tt",	OP_LI(0x323),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST}	},
634*3d8817e4Smiod   {"and.tt",	OP_REG(0x322),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
635*3d8817e4Smiod 
636*3d8817e4Smiod   /* Bitwise AND with ones complement of both sources */
637*3d8817e4Smiod 
638*3d8817e4Smiod   {"and.ff",	OP_SI(0x18),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST}	},
639*3d8817e4Smiod   {"and.ff",	OP_LI(0x331),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST}	},
640*3d8817e4Smiod   {"and.ff",	OP_REG(0x330),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
641*3d8817e4Smiod 
642*3d8817e4Smiod   /* Bitwise AND with ones complement of source 1 */
643*3d8817e4Smiod 
644*3d8817e4Smiod   {"and.ft",	OP_SI(0x14),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST}	},
645*3d8817e4Smiod   {"and.ft",	OP_LI(0x329),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST}	},
646*3d8817e4Smiod   {"and.ft",	OP_REG(0x328),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
647*3d8817e4Smiod 
648*3d8817e4Smiod   /* Bitwise AND with ones complement of source 2 */
649*3d8817e4Smiod 
650*3d8817e4Smiod   {"and.tf",	OP_SI(0x12),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST}	},
651*3d8817e4Smiod   {"and.tf",	OP_LI(0x325),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST}	},
652*3d8817e4Smiod   {"and.tf",	OP_REG(0x324),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
653*3d8817e4Smiod 
654*3d8817e4Smiod   /* Branch Bit One - nonannulled */
655*3d8817e4Smiod 
656*3d8817e4Smiod   {"bbo",	OP_SI(0x4A),	MASK_SI,	0, 	{OFF_SS_PC, REG_22, BITNUM}	},
657*3d8817e4Smiod   {"bbo",	OP_LI(0x395),	MASK_LI,	0, 	{OFF_SL_PC, REG_22, BITNUM}	},
658*3d8817e4Smiod   {"bbo",	OP_REG(0x394),	MASK_REG,	0,	{REG_0, REG_22, BITNUM}		},
659*3d8817e4Smiod 
660*3d8817e4Smiod   /* Branch Bit One - annulled */
661*3d8817e4Smiod 
662*3d8817e4Smiod   {"bbo.a",	OP_SI(0x4B),	MASK_SI,	0, 	{OFF_SS_PC, REG_22, BITNUM}	},
663*3d8817e4Smiod   {"bbo.a",	OP_LI(0x397),	MASK_LI,	0, 	{OFF_SL_PC, REG_22, BITNUM}	},
664*3d8817e4Smiod   {"bbo.a",	OP_REG(0x396),	MASK_REG,	0,	{REG_0, REG_22, BITNUM}		},
665*3d8817e4Smiod 
666*3d8817e4Smiod   /* Branch Bit Zero - nonannulled */
667*3d8817e4Smiod 
668*3d8817e4Smiod   {"bbz",	OP_SI(0x48),	MASK_SI,	0, 	{OFF_SS_PC, REG_22, BITNUM}	},
669*3d8817e4Smiod   {"bbz",	OP_LI(0x391),	MASK_LI,	0, 	{OFF_SL_PC, REG_22, BITNUM}	},
670*3d8817e4Smiod   {"bbz",	OP_REG(0x390),	MASK_REG,	0,	{REG_0, REG_22, BITNUM}		},
671*3d8817e4Smiod 
672*3d8817e4Smiod   /* Branch Bit Zero - annulled */
673*3d8817e4Smiod 
674*3d8817e4Smiod   {"bbz.a",	OP_SI(0x49),	MASK_SI,	0, 	{OFF_SS_PC, REG_22, BITNUM}	},
675*3d8817e4Smiod   {"bbz.a",	OP_LI(0x393),	MASK_LI,	0, 	{OFF_SL_PC, REG_22, BITNUM}	},
676*3d8817e4Smiod   {"bbz.a",	OP_REG(0x392),	MASK_REG,	0,	{REG_0, REG_22, BITNUM}		},
677*3d8817e4Smiod 
678*3d8817e4Smiod   /* Branch Conditional - nonannulled */
679*3d8817e4Smiod 
680*3d8817e4Smiod   {"bcnd",	OP_SI(0x4C),	MASK_SI,	0, 	{OFF_SS_PC, REG_22, CC}	},
681*3d8817e4Smiod   {"bcnd",	OP_LI(0x399),	MASK_LI,	0, 	{OFF_SL_PC, REG_22, CC}	},
682*3d8817e4Smiod   {"bcnd",	OP_REG(0x398),	MASK_REG,	0,	{REG_0, REG_22, CC}	},
683*3d8817e4Smiod 
684*3d8817e4Smiod   /* Branch Conditional - annulled */
685*3d8817e4Smiod 
686*3d8817e4Smiod   {"bcnd.a",	OP_SI(0x4D),	MASK_SI,	0, 	{OFF_SS_PC, REG_22, CC}	},
687*3d8817e4Smiod   {"bcnd.a",	OP_LI(0x39B),	MASK_LI,	0, 	{OFF_SL_PC, REG_22, CC}	},
688*3d8817e4Smiod   {"bcnd.a",	OP_REG(0x39A),	MASK_REG,	0,	{REG_0, REG_22, CC}	},
689*3d8817e4Smiod 
690*3d8817e4Smiod   /* Branch Control Register */
691*3d8817e4Smiod 
692*3d8817e4Smiod   {"brcr",	OP_SI(0x6),	MASK_SI,	0,	{CR_SI}	},
693*3d8817e4Smiod   {"brcr",	OP_LI(0x30D),	MASK_LI,	0,	{CR_LI}	},
694*3d8817e4Smiod   {"brcr",	OP_REG(0x30C),	MASK_REG,	0,	{REG_0}	},
695*3d8817e4Smiod 
696*3d8817e4Smiod   /* Branch and save return - nonannulled */
697*3d8817e4Smiod 
698*3d8817e4Smiod   {"bsr",	OP_SI(0x40),	MASK_SI,	0,	{OFF_SS_PC, REG_DEST}	},
699*3d8817e4Smiod   {"bsr",	OP_LI(0x381),	MASK_LI,	0, 	{OFF_SL_PC, REG_DEST}	},
700*3d8817e4Smiod   {"bsr",	OP_REG(0x380),	MASK_REG,	0,	{REG_0, REG_DEST}	},
701*3d8817e4Smiod 
702*3d8817e4Smiod   /* Branch and save return - annulled */
703*3d8817e4Smiod 
704*3d8817e4Smiod   {"bsr.a",	OP_SI(0x41),	MASK_SI,	0, 	{OFF_SS_PC, REG_DEST}	},
705*3d8817e4Smiod   {"bsr.a",	OP_LI(0x383),	MASK_LI,	0, 	{OFF_SL_PC, REG_DEST}	},
706*3d8817e4Smiod   {"bsr.a",	OP_REG(0x382),	MASK_REG,	0,	{REG_0, REG_DEST}	},
707*3d8817e4Smiod 
708*3d8817e4Smiod   /* Send command */
709*3d8817e4Smiod 
710*3d8817e4Smiod   {"cmnd",	OP_SI(0x2),	MASK_SI,	0, 	{SUI}	},
711*3d8817e4Smiod   {"cmnd",	OP_LI(0x305),	MASK_LI,	0, 	{LUI}	},
712*3d8817e4Smiod   {"cmnd",	OP_REG(0x304),	MASK_REG,	0,	{REG_0}	},
713*3d8817e4Smiod 
714*3d8817e4Smiod   /* Integer compare */
715*3d8817e4Smiod 
716*3d8817e4Smiod   {"cmp",	OP_SI(0x50),	MASK_SI,	0, 	{SSI, REG_22, REG_DEST}		},
717*3d8817e4Smiod   {"cmp",	OP_LI(0x3A1),	MASK_LI,	0, 	{LSI, REG_22, REG_DEST}		},
718*3d8817e4Smiod   {"cmp",	OP_REG(0x3A0),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
719*3d8817e4Smiod 
720*3d8817e4Smiod   /* Flush data cache subblock - don't clear subblock preset flag */
721*3d8817e4Smiod 
722*3d8817e4Smiod   {"dcachec",	OP_SI(0x38),	F(1) | (MASK_SI  & ~M_SI(1)),			0, {SSI, REG_BASE_M_SI}		},
723*3d8817e4Smiod   {"dcachec",	OP_LI(0x371),	F(1) | (MASK_LI  & ~M_LI(1))  | S(1) | D(1),	0, {LSI, REG_BASE_M_LI}		},
724*3d8817e4Smiod   {"dcachec",	OP_REG(0x370),	F(1) | (MASK_REG & ~M_REG(1)) | S(1) | D(1),	0, {REG_0, REG_BASE_M_LI}	},
725*3d8817e4Smiod 
726*3d8817e4Smiod   /* Flush data cache subblock - clear subblock preset flag */
727*3d8817e4Smiod 
728*3d8817e4Smiod   {"dcachef",	OP_SI(0x38)   | F(1),	F(1) | (MASK_SI  & ~M_SI(1)),			0, {SSI, REG_BASE_M_SI}		},
729*3d8817e4Smiod   {"dcachef",	OP_LI(0x371)  | F(1),	F(1) | (MASK_LI  & ~M_LI(1))   | S(1) | D(1),	0, {LSI, REG_BASE_M_LI}		},
730*3d8817e4Smiod   {"dcachef",	OP_REG(0x370) | F(1),	F(1) | (MASK_REG & ~M_REG(1)) | S(1) | D(1),	0, {REG_0, REG_BASE_M_LI}	},
731*3d8817e4Smiod 
732*3d8817e4Smiod   /* Direct load signed data into register */
733*3d8817e4Smiod 
734*3d8817e4Smiod   {"dld",	OP_LI(0x345)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
735*3d8817e4Smiod   {"dld",	OP_REG(0x344) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
736*3d8817e4Smiod   {"dld.b",	OP_LI(0x341)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
737*3d8817e4Smiod   {"dld.b",	OP_REG(0x340) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
738*3d8817e4Smiod   {"dld.d",	OP_LI(0x347)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST_E}	},
739*3d8817e4Smiod   {"dld.d",	OP_REG(0x346) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST_E}		},
740*3d8817e4Smiod   {"dld.h",	OP_LI(0x343)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
741*3d8817e4Smiod   {"dld.h",	OP_REG(0x342) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
742*3d8817e4Smiod 
743*3d8817e4Smiod   /* Direct load unsigned data into register */
744*3d8817e4Smiod 
745*3d8817e4Smiod   {"dld.ub",	OP_LI(0x351)  | D(1),	(MASK_LI  &  ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
746*3d8817e4Smiod   {"dld.ub",	OP_REG(0x350) | D(1),	(MASK_REG & ~M_REG(1))  | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
747*3d8817e4Smiod   {"dld.uh",	OP_LI(0x353)  | D(1),	(MASK_LI  &  ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
748*3d8817e4Smiod   {"dld.uh",	OP_REG(0x352) | D(1),	(MASK_REG & ~M_REG(1))  | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
749*3d8817e4Smiod 
750*3d8817e4Smiod   /* Direct store data into memory */
751*3d8817e4Smiod 
752*3d8817e4Smiod   {"dst",	OP_LI(0x365)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
753*3d8817e4Smiod   {"dst",	OP_REG(0x364) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
754*3d8817e4Smiod   {"dst.b",	OP_LI(0x361)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
755*3d8817e4Smiod   {"dst.b",	OP_REG(0x360) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
756*3d8817e4Smiod   {"dst.d",	OP_LI(0x367)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST_E}	},
757*3d8817e4Smiod   {"dst.d",	OP_REG(0x366) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST_E}		},
758*3d8817e4Smiod   {"dst.h",	OP_LI(0x363)  | D(1),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
759*3d8817e4Smiod   {"dst.h",	OP_REG(0x362) | D(1),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
760*3d8817e4Smiod 
761*3d8817e4Smiod   /* Emulation stop */
762*3d8817e4Smiod 
763*3d8817e4Smiod   {"estop",	OP_LI(0x3FC),	MASK_LI,	0,		{0}	},
764*3d8817e4Smiod 
765*3d8817e4Smiod   /* Emulation trap */
766*3d8817e4Smiod 
767*3d8817e4Smiod   {"etrap",	OP_SI(0x1)    | E(1),	MASK_SI  | E(1),	0,	{SUI}	},
768*3d8817e4Smiod   {"etrap",	OP_LI(0x303)  | E(1),	MASK_LI  | E(1),	0,	{LUI}	},
769*3d8817e4Smiod   {"etrap",	OP_REG(0x302) | E(1),	MASK_REG | E(1),	0,	{REG_0}	},
770*3d8817e4Smiod 
771*3d8817e4Smiod   /* Floating-point addition */
772*3d8817e4Smiod 
773*3d8817e4Smiod   {"fadd.ddd",	OP_REG(0x3E0) | PD(1) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22_E, REG_DEST_E}	},
774*3d8817e4Smiod   {"fadd.dsd",	OP_REG(0x3E0) | PD(1) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22, REG_DEST_E}	},
775*3d8817e4Smiod   {"fadd.sdd",	OP_LI(0x3E1)  | PD(1) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22_E, REG_DEST_E}	},
776*3d8817e4Smiod   {"fadd.sdd",	OP_REG(0x3E0) | PD(1) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22_E, REG_DEST_E}	},
777*3d8817e4Smiod   {"fadd.ssd",	OP_LI(0x3E1)  | PD(1) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST_E}	},
778*3d8817e4Smiod   {"fadd.ssd",	OP_REG(0x3E0) | PD(1) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST_E}	},
779*3d8817e4Smiod   {"fadd.sss",	OP_LI(0x3E1)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST}	},
780*3d8817e4Smiod   {"fadd.sss",	OP_REG(0x3E0) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST}	},
781*3d8817e4Smiod 
782*3d8817e4Smiod   /* Floating point compare */
783*3d8817e4Smiod 
784*3d8817e4Smiod   {"fcmp.dd",	OP_REG(0x3EA) | PD(0) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3),  0,	 {REG_0_E, REG_22_E, REG_DEST}	},
785*3d8817e4Smiod   {"fcmp.ds",	OP_REG(0x3EA) | PD(0) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3),  0,	 {REG_0_E, REG_22, REG_DEST}	},
786*3d8817e4Smiod   {"fcmp.sd",	OP_LI(0x3EB)  | PD(0) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3),  0,	 {SPFI, REG_22_E, REG_DEST}	},
787*3d8817e4Smiod   {"fcmp.sd",	OP_REG(0x3EA) | PD(0) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3),  0,	 {REG_0, REG_22_E, REG_DEST}	},
788*3d8817e4Smiod   {"fcmp.ss",	OP_LI(0x3EB)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3),  0,	 {SPFI, REG_22, REG_DEST}	},
789*3d8817e4Smiod   {"fcmp.ss",	OP_REG(0x3EA) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3),  0,	 {REG_0, REG_22, REG_DEST}	},
790*3d8817e4Smiod 
791*3d8817e4Smiod   /* Floating point divide */
792*3d8817e4Smiod 
793*3d8817e4Smiod   {"fdiv.ddd",	OP_REG(0x3E6) | PD(1) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22_E, REG_DEST_E}	},
794*3d8817e4Smiod   {"fdiv.dsd",	OP_REG(0x3E6) | PD(1) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22, REG_DEST_E}	},
795*3d8817e4Smiod   {"fdiv.sdd",	OP_LI(0x3E7)  | PD(1) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22_E, REG_DEST_E}	},
796*3d8817e4Smiod   {"fdiv.sdd",	OP_REG(0x3E6) | PD(1) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22_E, REG_DEST_E}	},
797*3d8817e4Smiod   {"fdiv.ssd",	OP_LI(0x3E7)  | PD(1) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST_E}	},
798*3d8817e4Smiod   {"fdiv.ssd",	OP_REG(0x3E6) | PD(1) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST_E}	},
799*3d8817e4Smiod   {"fdiv.sss",	OP_LI(0x3E7)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST}	},
800*3d8817e4Smiod   {"fdiv.sss",	OP_REG(0x3E6) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST}	},
801*3d8817e4Smiod 
802*3d8817e4Smiod   /* Floating point multiply */
803*3d8817e4Smiod 
804*3d8817e4Smiod   {"fmpy.ddd",	OP_REG(0x3E4) | PD(1) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22_E, REG_DEST_E}	},
805*3d8817e4Smiod   {"fmpy.dsd",	OP_REG(0x3E4) | PD(1) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22, REG_DEST_E}	},
806*3d8817e4Smiod   {"fmpy.iii",	OP_LI(0x3E5)  | PD(2) | P2(2) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_22, REG_DEST}	},
807*3d8817e4Smiod   {"fmpy.iii",	OP_REG(0x3E4) | PD(2) | P2(2) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST}	},
808*3d8817e4Smiod   {"fmpy.sdd",	OP_LI(0x3E5)  | PD(1) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22_E, REG_DEST_E}	},
809*3d8817e4Smiod   {"fmpy.sdd",	OP_REG(0x3E4) | PD(1) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22_E, REG_DEST_E}	},
810*3d8817e4Smiod   {"fmpy.ssd",	OP_LI(0x3E5)  | PD(1) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST_E}	},
811*3d8817e4Smiod   {"fmpy.ssd",	OP_REG(0x3E4) | PD(1) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST_E}	},
812*3d8817e4Smiod   {"fmpy.sss",	OP_LI(0x3E5)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST}	},
813*3d8817e4Smiod   {"fmpy.sss",	OP_REG(0x3E4) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST}	},
814*3d8817e4Smiod   {"fmpy.uuu",	OP_LI(0x3E5)  | PD(3) | P2(3) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LUI, REG_22, REG_DEST}	},
815*3d8817e4Smiod   {"fmpy.uuu",	OP_REG(0x3E4) | PD(3) | P2(3) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST}	},
816*3d8817e4Smiod 
817*3d8817e4Smiod   /* Convert/Round to Minus Infinity */
818*3d8817e4Smiod 
819*3d8817e4Smiod   {"frndm.dd",	OP_REG(0x3E8) | PD(1) | P2(3) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST_E}	},
820*3d8817e4Smiod   {"frndm.di",	OP_REG(0x3E8) | PD(2) | P2(3) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
821*3d8817e4Smiod   {"frndm.ds",	OP_REG(0x3E8) | PD(0) | P2(3) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
822*3d8817e4Smiod   {"frndm.du",	OP_REG(0x3E8) | PD(3) | P2(3) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
823*3d8817e4Smiod   {"frndm.id",	OP_LI(0x3E9)  | PD(1) | P2(3) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
824*3d8817e4Smiod   {"frndm.id",	OP_REG(0x3E8) | PD(1) | P2(3) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
825*3d8817e4Smiod   {"frndm.is",	OP_LI(0x3E9)  | PD(0) | P2(3) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
826*3d8817e4Smiod   {"frndm.is",	OP_REG(0x3E8) | PD(0) | P2(3) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
827*3d8817e4Smiod   {"frndm.sd",	OP_LI(0x3E9)  | PD(1) | P2(3) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST_E}	},
828*3d8817e4Smiod   {"frndm.sd",	OP_REG(0x3E8) | PD(1) | P2(3) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
829*3d8817e4Smiod   {"frndm.si",	OP_LI(0x3E9)  | PD(2) | P2(3) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
830*3d8817e4Smiod   {"frndm.si",	OP_REG(0x3E8) | PD(2) | P2(3) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
831*3d8817e4Smiod   {"frndm.ss",	OP_LI(0x3E9)  | PD(0) | P2(3) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
832*3d8817e4Smiod   {"frndm.ss",	OP_REG(0x3E8) | PD(0) | P2(3) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
833*3d8817e4Smiod   {"frndm.su",	OP_LI(0x3E9)  | PD(3) | P2(3) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
834*3d8817e4Smiod   {"frndm.su",	OP_REG(0x3E8) | PD(3) | P2(3) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
835*3d8817e4Smiod   {"frndm.ud",	OP_LI(0x3E9)  | PD(1) | P2(3) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
836*3d8817e4Smiod   {"frndm.ud",	OP_REG(0x3E8) | PD(1) | P2(3) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
837*3d8817e4Smiod   {"frndm.us",	OP_LI(0x3E9)  | PD(0) | P2(3) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
838*3d8817e4Smiod   {"frndm.us",	OP_REG(0x3E8) | PD(0) | P2(3) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
839*3d8817e4Smiod 
840*3d8817e4Smiod   /* Convert/Round to Nearest */
841*3d8817e4Smiod 
842*3d8817e4Smiod   {"frndn.dd",	OP_REG(0x3E8) | PD(1) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST_E}	},
843*3d8817e4Smiod   {"frndn.di",	OP_REG(0x3E8) | PD(2) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
844*3d8817e4Smiod   {"frndn.ds",	OP_REG(0x3E8) | PD(0) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
845*3d8817e4Smiod   {"frndn.du",	OP_REG(0x3E8) | PD(3) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
846*3d8817e4Smiod   {"frndn.id",	OP_LI(0x3E9)  | PD(1) | P2(0) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
847*3d8817e4Smiod   {"frndn.id",	OP_REG(0x3E8) | PD(1) | P2(0) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
848*3d8817e4Smiod   {"frndn.is",	OP_LI(0x3E9)  | PD(0) | P2(0) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
849*3d8817e4Smiod   {"frndn.is",	OP_REG(0x3E8) | PD(0) | P2(0) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
850*3d8817e4Smiod   {"frndn.sd",	OP_LI(0x3E9)  | PD(1) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST_E}	},
851*3d8817e4Smiod   {"frndn.sd",	OP_REG(0x3E8) | PD(1) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
852*3d8817e4Smiod   {"frndn.si",	OP_LI(0x3E9)  | PD(2) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
853*3d8817e4Smiod   {"frndn.si",	OP_REG(0x3E8) | PD(2) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
854*3d8817e4Smiod   {"frndn.ss",	OP_LI(0x3E9)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
855*3d8817e4Smiod   {"frndn.ss",	OP_REG(0x3E8) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
856*3d8817e4Smiod   {"frndn.su",	OP_LI(0x3E9)  | PD(3) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
857*3d8817e4Smiod   {"frndn.su",	OP_REG(0x3E8) | PD(3) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
858*3d8817e4Smiod   {"frndn.ud",	OP_LI(0x3E9)  | PD(1) | P2(0) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
859*3d8817e4Smiod   {"frndn.ud",	OP_REG(0x3E8) | PD(1) | P2(0) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
860*3d8817e4Smiod   {"frndn.us",	OP_LI(0x3E9)  | PD(0) | P2(0) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
861*3d8817e4Smiod   {"frndn.us",	OP_REG(0x3E8) | PD(0) | P2(0) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
862*3d8817e4Smiod 
863*3d8817e4Smiod   /* Convert/Round to Positive Infinity */
864*3d8817e4Smiod 
865*3d8817e4Smiod   {"frndp.dd",	OP_REG(0x3E8) | PD(1) | P2(2) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST_E}	},
866*3d8817e4Smiod   {"frndp.di",	OP_REG(0x3E8) | PD(2) | P2(2) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
867*3d8817e4Smiod   {"frndp.ds",	OP_REG(0x3E8) | PD(0) | P2(2) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
868*3d8817e4Smiod   {"frndp.du",	OP_REG(0x3E8) | PD(3) | P2(2) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
869*3d8817e4Smiod   {"frndp.id",	OP_LI(0x3E9)  | PD(1) | P2(2) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
870*3d8817e4Smiod   {"frndp.id",	OP_REG(0x3E8) | PD(1) | P2(2) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
871*3d8817e4Smiod   {"frndp.is",	OP_LI(0x3E9)  | PD(0) | P2(2) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
872*3d8817e4Smiod   {"frndp.is",	OP_REG(0x3E8) | PD(0) | P2(2) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
873*3d8817e4Smiod   {"frndp.sd",	OP_LI(0x3E9)  | PD(1) | P2(2) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST_E}	},
874*3d8817e4Smiod   {"frndp.sd",	OP_REG(0x3E8) | PD(1) | P2(2) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
875*3d8817e4Smiod   {"frndp.si",	OP_LI(0x3E9)  | PD(2) | P2(2) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
876*3d8817e4Smiod   {"frndp.si",	OP_REG(0x3E8) | PD(2) | P2(2) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
877*3d8817e4Smiod   {"frndp.ss",	OP_LI(0x3E9)  | PD(0) | P2(2) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
878*3d8817e4Smiod   {"frndp.ss",	OP_REG(0x3E8) | PD(0) | P2(2) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
879*3d8817e4Smiod   {"frndp.su",	OP_LI(0x3E9)  | PD(3) | P2(2) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
880*3d8817e4Smiod   {"frndp.su",	OP_REG(0x3E8) | PD(3) | P2(2) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
881*3d8817e4Smiod   {"frndp.ud",	OP_LI(0x3E9)  | PD(1) | P2(2) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
882*3d8817e4Smiod   {"frndp.ud",	OP_REG(0x3E8) | PD(1) | P2(2) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
883*3d8817e4Smiod   {"frndp.us",	OP_LI(0x3E9)  | PD(0) | P2(2) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
884*3d8817e4Smiod   {"frndp.us",	OP_REG(0x3E8) | PD(0) | P2(2) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
885*3d8817e4Smiod 
886*3d8817e4Smiod   /* Convert/Round to Zero */
887*3d8817e4Smiod 
888*3d8817e4Smiod   {"frndz.dd",	OP_REG(0x3E8) | PD(1) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST_E}	},
889*3d8817e4Smiod   {"frndz.di",	OP_REG(0x3E8) | PD(2) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
890*3d8817e4Smiod   {"frndz.ds",	OP_REG(0x3E8) | PD(0) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
891*3d8817e4Smiod   {"frndz.du",	OP_REG(0x3E8) | PD(3) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST}	},
892*3d8817e4Smiod   {"frndz.id",	OP_LI(0x3E9)  | PD(1) | P2(1) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
893*3d8817e4Smiod   {"frndz.id",	OP_REG(0x3E8) | PD(1) | P2(1) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
894*3d8817e4Smiod   {"frndz.is",	OP_LI(0x3E9)  | PD(0) | P2(1) | P1(2),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
895*3d8817e4Smiod   {"frndz.is",	OP_REG(0x3E8) | PD(0) | P2(1) | P1(2),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
896*3d8817e4Smiod   {"frndz.sd",	OP_LI(0x3E9)  | PD(1) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST_E}	},
897*3d8817e4Smiod   {"frndz.sd",	OP_REG(0x3E8) | PD(1) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
898*3d8817e4Smiod   {"frndz.si",	OP_LI(0x3E9)  | PD(2) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
899*3d8817e4Smiod   {"frndz.si",	OP_REG(0x3E8) | PD(2) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
900*3d8817e4Smiod   {"frndz.ss",	OP_LI(0x3E9)  | PD(0) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
901*3d8817e4Smiod   {"frndz.ss",	OP_REG(0x3E8) | PD(0) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
902*3d8817e4Smiod   {"frndz.su",	OP_LI(0x3E9)  | PD(3) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
903*3d8817e4Smiod   {"frndz.su",	OP_REG(0x3E8) | PD(3) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
904*3d8817e4Smiod   {"frndz.ud",	OP_LI(0x3E9)  | PD(1) | P2(1) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST_E}	},
905*3d8817e4Smiod   {"frndz.ud",	OP_REG(0x3E8) | PD(1) | P2(1) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
906*3d8817e4Smiod   {"frndz.us",	OP_LI(0x3E9)  | PD(0) | P2(1) | P1(3),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {LSI, REG_DEST}	},
907*3d8817e4Smiod   {"frndz.us",	OP_REG(0x3E8) | PD(0) | P2(1) | P1(3),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
908*3d8817e4Smiod 
909*3d8817e4Smiod   /* Floating point square root */
910*3d8817e4Smiod 
911*3d8817e4Smiod   {"fsqrt.dd",	OP_REG(0x3EE) | PD(1) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_DEST_E}	},
912*3d8817e4Smiod   {"fsqrt.sd",	OP_LI(0x3EF)  | PD(1) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST_E}	},
913*3d8817e4Smiod   {"fsqrt.sd",	OP_REG(0x3EE) | PD(1) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST_E}	},
914*3d8817e4Smiod   {"fsqrt.ss",	OP_LI(0x3EF)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_DEST}	},
915*3d8817e4Smiod   {"fsqrt.ss",	OP_REG(0x3EE) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_DEST}	},
916*3d8817e4Smiod 
917*3d8817e4Smiod   /* Floating point subtraction */
918*3d8817e4Smiod 
919*3d8817e4Smiod   { "fsub.ddd",	OP_REG(0x3E2) | PD(1) | P2(1) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22_E, REG_DEST_E}	},
920*3d8817e4Smiod   { "fsub.dsd",	OP_REG(0x3E2) | PD(1) | P2(0) | P1(1),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0_E, REG_22, REG_DEST_E}	},
921*3d8817e4Smiod   { "fsub.sdd",	OP_LI(0x3E3)  | PD(1) | P2(1) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22_E, REG_DEST_E}	},
922*3d8817e4Smiod   { "fsub.sdd",	OP_REG(0x3E2) | PD(1) | P2(1) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22_E, REG_DEST_E}	},
923*3d8817e4Smiod   { "fsub.ssd",	OP_LI(0x3E3)  | PD(1) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST_E}	},
924*3d8817e4Smiod   { "fsub.ssd",	OP_REG(0x3E2) | PD(1) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST_E}	},
925*3d8817e4Smiod   { "fsub.sss",	OP_LI(0x3E3)  | PD(0) | P2(0) | P1(0),	MASK_LI  | PD(3) | P2(3) | P1(3), 0,	 {SPFI, REG_22, REG_DEST}	},
926*3d8817e4Smiod   { "fsub.sss",	OP_REG(0x3E2) | PD(0) | P2(0) | P1(0),	MASK_REG | PD(3) | P2(3) | P1(3), 0,	 {REG_0, REG_22, REG_DEST}	},
927*3d8817e4Smiod 
928*3d8817e4Smiod   /* Illegal instructions */
929*3d8817e4Smiod 
930*3d8817e4Smiod   {"illop0",	OP_SI(0x0),	MASK_SI,	0,	{0}	},
931*3d8817e4Smiod   {"illopF",	0x1FF << 13,	0x1FF << 13,	0,	{0}	},
932*3d8817e4Smiod 
933*3d8817e4Smiod   /* Jump and save return */
934*3d8817e4Smiod 
935*3d8817e4Smiod   {"jsr",	OP_SI(0x44),	MASK_SI,	0,	{OFF_SS_BR, REG_BASE, REG_DEST}	},
936*3d8817e4Smiod   {"jsr",	OP_LI(0x389),	MASK_LI,	0,	{OFF_SL_BR, REG_BASE, REG_DEST}	},
937*3d8817e4Smiod   {"jsr",	OP_REG(0x388),	MASK_REG,	0,	{REG_0, REG_BASE, REG_DEST}	},
938*3d8817e4Smiod   {"jsr.a",	OP_SI(0x45),	MASK_SI,	0,	{OFF_SS_BR, REG_BASE, REG_DEST}	},
939*3d8817e4Smiod   {"jsr.a",	OP_LI(0x38B),	MASK_LI,	0,	{OFF_SL_BR, REG_BASE, REG_DEST}	},
940*3d8817e4Smiod   {"jsr.a",	OP_REG(0x38A),	MASK_REG,	0,	{REG_0, REG_BASE, REG_DEST}	},
941*3d8817e4Smiod 
942*3d8817e4Smiod   /* Load Signed Data Into Register */
943*3d8817e4Smiod 
944*3d8817e4Smiod   {"ld",	OP_SI(0x22),		(MASK_SI  & ~M_SI(1)),		0,	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
945*3d8817e4Smiod   {"ld",	OP_LI(0x345)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
946*3d8817e4Smiod   {"ld",	OP_REG(0x344) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
947*3d8817e4Smiod   {"ld.b",	OP_SI(0x20),		(MASK_SI  & ~M_SI(1)),		0,	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
948*3d8817e4Smiod   {"ld.b",	OP_LI(0x341)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
949*3d8817e4Smiod   {"ld.b",	OP_REG(0x340) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
950*3d8817e4Smiod   {"ld.d",	OP_SI(0x23),		(MASK_SI  & ~M_SI(1)),		0,	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST_E}		},
951*3d8817e4Smiod   {"ld.d",	OP_LI(0x347)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST_E}	},
952*3d8817e4Smiod   {"ld.d",	OP_REG(0x346) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST_E}		},
953*3d8817e4Smiod   {"ld.h",	OP_SI(0x21),		(MASK_SI  & ~M_SI(1)),		0,	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
954*3d8817e4Smiod   {"ld.h",	OP_LI(0x343)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
955*3d8817e4Smiod   {"ld.h",	OP_REG(0x342) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
956*3d8817e4Smiod 
957*3d8817e4Smiod   /* Load Unsigned Data Into Register */
958*3d8817e4Smiod 
959*3d8817e4Smiod   {"ld.ub",	OP_SI(0x28),		(MASK_SI  & ~M_SI(1)),		0,	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
960*3d8817e4Smiod   {"ld.ub",	OP_LI(0x351)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
961*3d8817e4Smiod   {"ld.ub",	OP_REG(0x350) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
962*3d8817e4Smiod   {"ld.uh",	OP_SI(0x29),		(MASK_SI  & ~M_SI(1)),		0,	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
963*3d8817e4Smiod   {"ld.uh",	OP_LI(0x353)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
964*3d8817e4Smiod   {"ld.uh",	OP_REG(0x352) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
965*3d8817e4Smiod 
966*3d8817e4Smiod   /* Leftmost one */
967*3d8817e4Smiod 
968*3d8817e4Smiod   {"lmo",	OP_LI(0x3F0),	MASK_LI,	0,	{REG_22, REG_DEST}	},
969*3d8817e4Smiod 
970*3d8817e4Smiod   /* Bitwise logical OR.  Note that "or.tt" and "or" are the same instructions. */
971*3d8817e4Smiod 
972*3d8817e4Smiod   {"or.ff",	OP_SI(0x1E),	MASK_SI,	0,	{SUI, REG_22, REG_DEST}		},
973*3d8817e4Smiod   {"or.ff",	OP_LI(0x33D),	MASK_LI,	0,	{LUI, REG_22, REG_DEST}		},
974*3d8817e4Smiod   {"or.ff",	OP_REG(0x33C),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
975*3d8817e4Smiod   {"or.ft",	OP_SI(0x1D),	MASK_SI,	0,	{SUI, REG_22, REG_DEST}		},
976*3d8817e4Smiod   {"or.ft",	OP_LI(0x33B),	MASK_LI,	0,	{LUI, REG_22, REG_DEST}		},
977*3d8817e4Smiod   {"or.ft",	OP_REG(0x33A),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
978*3d8817e4Smiod   {"or.tf",	OP_SI(0x1B),	MASK_SI,	0,	{SUI, REG_22, REG_DEST}		},
979*3d8817e4Smiod   {"or.tf",	OP_LI(0x337),	MASK_LI,	0,	{LUI, REG_22, REG_DEST}		},
980*3d8817e4Smiod   {"or.tf",	OP_REG(0x336),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
981*3d8817e4Smiod   {"or.tt",	OP_SI(0x17),	MASK_SI,	0,	{SUI, REG_22, REG_DEST}		},
982*3d8817e4Smiod   {"or.tt",	OP_LI(0x32F),	MASK_LI,	0,	{LUI, REG_22, REG_DEST}		},
983*3d8817e4Smiod   {"or.tt",	OP_REG(0x32E),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
984*3d8817e4Smiod   {"or",	OP_SI(0x17),	MASK_SI,	0,	{SUI, REG_22, REG_DEST}		},
985*3d8817e4Smiod   {"or",	OP_LI(0x32F),	MASK_LI,	0,	{LUI, REG_22, REG_DEST}		},
986*3d8817e4Smiod   {"or",	OP_REG(0x32E),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
987*3d8817e4Smiod 
988*3d8817e4Smiod   /* Read Control Register */
989*3d8817e4Smiod 
990*3d8817e4Smiod   {"rdcr",	OP_SI(0x4),	MASK_SI  | (0x1F << 22),	0,	{CR_SI, REG_DEST}	},
991*3d8817e4Smiod   {"rdcr",	OP_LI(0x309),	MASK_LI  | (0x1F << 22),	0,	{CR_LI, REG_DEST}	},
992*3d8817e4Smiod   {"rdcr",	OP_REG(0x308),	MASK_REG | (0x1F << 22),	0,	{REG_0, REG_DEST}	},
993*3d8817e4Smiod 
994*3d8817e4Smiod   /* Rightmost one */
995*3d8817e4Smiod 
996*3d8817e4Smiod   {"rmo",	OP_LI(0x3F2),	MASK_LI,	0,		{REG_22, REG_DEST}	},
997*3d8817e4Smiod 
998*3d8817e4Smiod   /* Shift Register Left - note that rotl, shl, and ins are all alternate names for one of the shift instructions.
999*3d8817e4Smiod      They appear prior to their sl equivalent so that they will be diassembled as the alternate name. */
1000*3d8817e4Smiod 
1001*3d8817e4Smiod 
1002*3d8817e4Smiod   {"ins",	OP_REG(0x31E) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1003*3d8817e4Smiod   {"ins",	OP_SI(0xF)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0,	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1004*3d8817e4Smiod   {"rotl",	OP_REG(0x310) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1005*3d8817e4Smiod   {"rotl",	OP_SI(0x8)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0,	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1006*3d8817e4Smiod   {"shl",	OP_REG(0x31C) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1007*3d8817e4Smiod   {"shl",	OP_SI(0xE)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1008*3d8817e4Smiod   {"sl.dm",	OP_REG(0x312) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1009*3d8817e4Smiod   {"sl.dm",	OP_SI(0x9)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1010*3d8817e4Smiod   {"sl.ds",	OP_REG(0x314) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1011*3d8817e4Smiod   {"sl.ds",	OP_SI(0xA)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1012*3d8817e4Smiod   {"sl.dz",	OP_REG(0x310) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1013*3d8817e4Smiod   {"sl.dz",	OP_SI(0x8)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1014*3d8817e4Smiod   {"sl.em",	OP_REG(0x318) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1015*3d8817e4Smiod   {"sl.em",	OP_SI(0xC)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1016*3d8817e4Smiod   {"sl.es",	OP_REG(0x31A) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1017*3d8817e4Smiod   {"sl.es",	OP_SI(0xD)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1018*3d8817e4Smiod   {"sl.ez",	OP_REG(0x316) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1019*3d8817e4Smiod   {"sl.ez",	OP_SI(0xB)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1020*3d8817e4Smiod   {"sl.im",	OP_REG(0x31E) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1021*3d8817e4Smiod   {"sl.im",	OP_SI(0xF)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1022*3d8817e4Smiod   {"sl.iz",	OP_REG(0x31C) | i(0) | n(0),	MASK_REG | i(1) | n(1),	0, 	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1023*3d8817e4Smiod   {"sl.iz",	OP_SI(0xE)    | i(0) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1024*3d8817e4Smiod 
1025*3d8817e4Smiod   /* Shift Register Left With Inverted Endmask */
1026*3d8817e4Smiod 
1027*3d8817e4Smiod   {"sli.dm",	OP_REG(0x312) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1028*3d8817e4Smiod   {"sli.dm",	OP_SI(0x9)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1029*3d8817e4Smiod   {"sli.ds",	OP_REG(0x314) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1030*3d8817e4Smiod   {"sli.ds",	OP_SI(0xA)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1031*3d8817e4Smiod   {"sli.dz",	OP_REG(0x310) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1032*3d8817e4Smiod   {"sli.dz",	OP_SI(0x8)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1033*3d8817e4Smiod   {"sli.em",	OP_REG(0x318) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1034*3d8817e4Smiod   {"sli.em",	OP_SI(0xC)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1035*3d8817e4Smiod   {"sli.es",	OP_REG(0x31A) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1036*3d8817e4Smiod   {"sli.es",	OP_SI(0xD)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1037*3d8817e4Smiod   {"sli.ez",	OP_REG(0x316) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1038*3d8817e4Smiod   {"sli.ez",	OP_SI(0xB)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1039*3d8817e4Smiod   {"sli.im",	OP_REG(0x31E) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1040*3d8817e4Smiod   {"sli.im",	OP_SI(0xF)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1041*3d8817e4Smiod   {"sli.iz",	OP_REG(0x31C) | i(1) | n(0),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1042*3d8817e4Smiod   {"sli.iz",	OP_SI(0xE)    | i(1) | n(0),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1043*3d8817e4Smiod 
1044*3d8817e4Smiod   /* Shift Register Right - note that exts, extu, rotr, sra, and srl are all alternate names for one of the shift instructions.
1045*3d8817e4Smiod      They appear prior to their sr equivalent so that they will be diassembled as the alternate name. */
1046*3d8817e4Smiod 
1047*3d8817e4Smiod   {"exts",	OP_REG(0x314) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1048*3d8817e4Smiod   {"exts",	OP_SI(0xA)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1049*3d8817e4Smiod   {"extu",	OP_REG(0x310) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1050*3d8817e4Smiod   {"extu",	OP_SI(0x8)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1051*3d8817e4Smiod   {"rotr",	OP_REG(0x310) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1052*3d8817e4Smiod   {"rotr",	OP_SI(0x8)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0,	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1053*3d8817e4Smiod   {"sra",	OP_REG(0x31A) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1054*3d8817e4Smiod   {"sra",	OP_SI(0xD)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1055*3d8817e4Smiod   {"srl",	OP_REG(0x316) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1056*3d8817e4Smiod   {"srl",	OP_SI(0xB)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1057*3d8817e4Smiod   {"sr.dm",	OP_REG(0x312) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1058*3d8817e4Smiod   {"sr.dm",	OP_SI(0x9)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1059*3d8817e4Smiod   {"sr.ds",	OP_REG(0x314) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1060*3d8817e4Smiod   {"sr.ds",	OP_SI(0xA)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1061*3d8817e4Smiod   {"sr.dz",	OP_REG(0x310) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1062*3d8817e4Smiod   {"sr.dz",	OP_SI(0x8)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1063*3d8817e4Smiod   {"sr.em",	OP_REG(0x318) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1064*3d8817e4Smiod   {"sr.em",	OP_SI(0xC)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1065*3d8817e4Smiod   {"sr.es",	OP_REG(0x31A) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1066*3d8817e4Smiod   {"sr.es",	OP_SI(0xD)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1067*3d8817e4Smiod   {"sr.ez",	OP_REG(0x316) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1068*3d8817e4Smiod   {"sr.ez",	OP_SI(0xB)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1069*3d8817e4Smiod   {"sr.im",	OP_REG(0x31E) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1070*3d8817e4Smiod   {"sr.im",	OP_SI(0xF)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1071*3d8817e4Smiod   {"sr.iz",	OP_REG(0x31C) | i(0) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1072*3d8817e4Smiod   {"sr.iz",	OP_SI(0xE)    | i(0) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1073*3d8817e4Smiod 
1074*3d8817e4Smiod   /* Shift Register Right With Inverted Endmask */
1075*3d8817e4Smiod 
1076*3d8817e4Smiod   {"sri.dm",	OP_REG(0x312) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1077*3d8817e4Smiod   {"sri.dm",	OP_SI(0x9)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1078*3d8817e4Smiod   {"sri.ds",	OP_REG(0x314) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1079*3d8817e4Smiod   {"sri.ds",	OP_SI(0xA)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1080*3d8817e4Smiod   {"sri.dz",	OP_REG(0x310) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1081*3d8817e4Smiod   {"sri.dz",	OP_SI(0x8)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1082*3d8817e4Smiod   {"sri.em",	OP_REG(0x318) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1083*3d8817e4Smiod   {"sri.em",	OP_SI(0xC)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1084*3d8817e4Smiod   {"sri.es",	OP_REG(0x31A) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1085*3d8817e4Smiod   {"sri.es",	OP_SI(0xD)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1086*3d8817e4Smiod   {"sri.ez",	OP_REG(0x316) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1087*3d8817e4Smiod   {"sri.ez",	OP_SI(0xB)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1088*3d8817e4Smiod   {"sri.im",	OP_REG(0x31E) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1089*3d8817e4Smiod   {"sri.im",	OP_SI(0xF)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1090*3d8817e4Smiod   {"sri.iz",	OP_REG(0x31C) | i(1) | n(1),	MASK_REG | i(1) | n(1),	0,	{REG_0, ENDMASK, REG_22, REG_DEST}	},
1091*3d8817e4Smiod   {"sri.iz",	OP_SI(0xE)    | i(1) | n(1),	MASK_SI  | i(1) | n(1),	0, 	{ROTATE, ENDMASK, REG_22, REG_DEST}	},
1092*3d8817e4Smiod 
1093*3d8817e4Smiod   /* Store Data into Memory */
1094*3d8817e4Smiod 
1095*3d8817e4Smiod   {"st",	OP_SI(0x32),		(MASK_SI  & ~M_SI(1)),		0, 	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
1096*3d8817e4Smiod   {"st",	OP_LI(0x365)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
1097*3d8817e4Smiod   {"st",	OP_REG(0x364) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
1098*3d8817e4Smiod   {"st.b",	OP_SI(0x30),		(MASK_SI  & ~M_SI(1)),		0, 	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
1099*3d8817e4Smiod   {"st.b",	OP_LI(0x361)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
1100*3d8817e4Smiod   {"st.b",	OP_REG(0x360) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
1101*3d8817e4Smiod   {"st.d",	OP_SI(0x33),		(MASK_SI  & ~M_SI(1)),		0, 	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST_E}		},
1102*3d8817e4Smiod   {"st.d",	OP_LI(0x367)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST_E}	},
1103*3d8817e4Smiod   {"st.d",	OP_REG(0x366) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST_E}		},
1104*3d8817e4Smiod   {"st.h",	OP_SI(0x31),		(MASK_SI  & ~M_SI(1)),		0, 	{OFF_SS_BR, REG_BASE_M_SI, REG_DEST}		},
1105*3d8817e4Smiod   {"st.h",	OP_LI(0x363)  | D(0),	(MASK_LI  & ~M_REG(1)) | D(1),	0,	{OFF_SL_BR_SCALED, REG_BASE_M_LI, REG_DEST}	},
1106*3d8817e4Smiod   {"st.h",	OP_REG(0x362) | D(0),	(MASK_REG & ~M_REG(1)) | D(1),	0,	{REG_SCALED, REG_BASE_M_LI, REG_DEST}		},
1107*3d8817e4Smiod 
1108*3d8817e4Smiod   /* Signed Integer Subtract */
1109*3d8817e4Smiod 
1110*3d8817e4Smiod   {"sub",	OP_SI(0x5A),	MASK_SI,	0, 	{SSI, REG_22, REG_DEST}		},
1111*3d8817e4Smiod   {"sub",	OP_LI(0x3B5),	MASK_LI,	0,	{LSI, REG_22, REG_DEST}		},
1112*3d8817e4Smiod   {"sub",	OP_REG(0x3B4),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
1113*3d8817e4Smiod 
1114*3d8817e4Smiod   /* Unsigned Integer Subtract */
1115*3d8817e4Smiod 
1116*3d8817e4Smiod   {"subu",	OP_SI(0x5B),	MASK_SI,	0, 	{SSI, REG_22, REG_DEST}		},
1117*3d8817e4Smiod   {"subu",	OP_LI(0x3B7),	MASK_LI,	0,	{LSI, REG_22, REG_DEST}		},
1118*3d8817e4Smiod   {"subu",	OP_REG(0x3B6),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
1119*3d8817e4Smiod 
1120*3d8817e4Smiod   /* Write Control Register
1121*3d8817e4Smiod      Is a special form of the "swcr" instruction so comes before it in the table. */
1122*3d8817e4Smiod 
1123*3d8817e4Smiod   {"wrcr",	OP_SI(0x5),	MASK_SI | (0x1F << 27),		0,	{CR_SI, REG_22}	},
1124*3d8817e4Smiod   {"wrcr",	OP_LI(0x30B),	MASK_LI | (0x1F << 27),		0,	{CR_LI, REG_22}	},
1125*3d8817e4Smiod   {"wrcr",	OP_REG(0x30A),	MASK_REG | (0x1F << 27),	0,	{REG_0, REG_22}	},
1126*3d8817e4Smiod 
1127*3d8817e4Smiod   /* Swap Control Register */
1128*3d8817e4Smiod 
1129*3d8817e4Smiod   {"swcr",	OP_SI(0x5),	MASK_SI,	0,	{CR_SI, REG_22, REG_DEST}	},
1130*3d8817e4Smiod   {"swcr",	OP_LI(0x30B),	MASK_LI,	0,	{CR_LI, REG_22, REG_DEST}	},
1131*3d8817e4Smiod   {"swcr",	OP_REG(0x30A),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST}	},
1132*3d8817e4Smiod 
1133*3d8817e4Smiod   /* Trap */
1134*3d8817e4Smiod 
1135*3d8817e4Smiod   {"trap",	OP_SI(0x1)    | E(0),	MASK_SI  | E(1),	0,	{SUI}	},
1136*3d8817e4Smiod   {"trap",	OP_LI(0x303)  | E(0),	MASK_LI  | E(1),	0,	{LUI}	},
1137*3d8817e4Smiod   {"trap",	OP_REG(0x302) | E(0),	MASK_REG | E(1),	0,	{REG_0}	},
1138*3d8817e4Smiod 
1139*3d8817e4Smiod   /* Vector Floating-Point Add */
1140*3d8817e4Smiod 
1141*3d8817e4Smiod   {"vadd.dd",	OP_REG(0x3C0) | P2(1) | P1(1),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{REG_0_E, REG_22_E, REG_22_E}	},
1142*3d8817e4Smiod   {"vadd.sd",	OP_LI(0x3C1)  | P2(1) | P1(0),	MASK_LI  | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{SPFI, REG_22_E, REG_22_E}	},
1143*3d8817e4Smiod   {"vadd.sd",	OP_REG(0x3C0) | P2(1) | P1(0),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{REG_0, REG_22_E, REG_22_E}	},
1144*3d8817e4Smiod   {"vadd.ss",	OP_LI(0x3C1)  | P2(0) | P1(0),	MASK_LI  | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{SPFI, REG_22, REG_22}	},
1145*3d8817e4Smiod   {"vadd.ss",	OP_REG(0x3C0) | P2(0) | P1(0),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{REG_0, REG_22, REG_22}	},
1146*3d8817e4Smiod 
1147*3d8817e4Smiod   /* Vector Floating-Point Multiply and Add to Accumulator FIXME! This is not yet fully implemented.
1148*3d8817e4Smiod    From the documentation there appears to be no way to tell the difference between the opcodes for
1149*3d8817e4Smiod    instructions that have register destinations and instructions that have accumulator destinations.
1150*3d8817e4Smiod    Further investigation is necessary.  Since this isn't critical to getting a TIC80 toolchain up
1151*3d8817e4Smiod    and running, it is defered until later. */
1152*3d8817e4Smiod 
1153*3d8817e4Smiod   /* Vector Floating-Point Multiply
1154*3d8817e4Smiod    Note: If r0 is in the destination reg, then this is a "vector nop" instruction. */
1155*3d8817e4Smiod 
1156*3d8817e4Smiod   {"vmpy.dd",	OP_REG(0x3C4) | P2(1) | P1(1),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR | TIC80_NO_R0_DEST, {REG_0_E, REG_22_E, REG_22_E} },
1157*3d8817e4Smiod   {"vmpy.sd",	OP_LI(0x3C5)  | P2(1) | P1(0),	MASK_LI  | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR | TIC80_NO_R0_DEST, {SPFI, REG_22_E, REG_22_E}	},
1158*3d8817e4Smiod   {"vmpy.sd",	OP_REG(0x3C4) | P2(1) | P1(0),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR | TIC80_NO_R0_DEST, {REG_0, REG_22_E, REG_22_E} },
1159*3d8817e4Smiod   {"vmpy.ss",	OP_LI(0x3C5)  | P2(0) | P1(0),	MASK_LI  | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR | TIC80_NO_R0_DEST, {SPFI, REG_22, REG_22}	},
1160*3d8817e4Smiod   {"vmpy.ss",	OP_REG(0x3C4) | P2(0) | P1(0),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR | TIC80_NO_R0_DEST, {REG_0, REG_22, REG_22} },
1161*3d8817e4Smiod 
1162*3d8817e4Smiod   /* Vector Floating-Point Multiply and Subtract from Accumulator
1163*3d8817e4Smiod      FIXME: See note above for vmac instruction */
1164*3d8817e4Smiod 
1165*3d8817e4Smiod   /* Vector Floating-Point Subtract Accumulator From Source
1166*3d8817e4Smiod      FIXME: See note above for vmac instruction */
1167*3d8817e4Smiod 
1168*3d8817e4Smiod   /* Vector Round With Floating-Point Input
1169*3d8817e4Smiod      FIXME: See note above for vmac instruction */
1170*3d8817e4Smiod 
1171*3d8817e4Smiod   /* Vector Round with Integer Input */
1172*3d8817e4Smiod 
1173*3d8817e4Smiod   {"vrnd.id",	OP_LI (0x3CB)  | P2(1) | P1(0),	MASK_LI  | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {LSI, REG_22_E}},
1174*3d8817e4Smiod   {"vrnd.id",	OP_REG (0x3CA) | P2(1) | P1(0),	MASK_REG | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {REG_0, REG_22_E}},
1175*3d8817e4Smiod   {"vrnd.is",	OP_LI (0x3CB)  | P2(0) | P1(0),	MASK_LI  | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {LSI, REG_22}},
1176*3d8817e4Smiod   {"vrnd.is",	OP_REG (0x3CA) | P2(0) | P1(0),	MASK_REG | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {REG_0, REG_22}},
1177*3d8817e4Smiod   {"vrnd.ud",	OP_LI (0x3CB)  | P2(1) | P1(1),	MASK_LI  | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {LUI, REG_22_E}},
1178*3d8817e4Smiod   {"vrnd.ud",	OP_REG (0x3CA) | P2(1) | P1(1),	MASK_REG | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {REG_0, REG_22_E}},
1179*3d8817e4Smiod   {"vrnd.us",	OP_LI (0x3CB)  | P2(0) | P1(1),	MASK_LI  | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {LUI, REG_22}},
1180*3d8817e4Smiod   {"vrnd.us",	OP_REG (0x3CA) | P2(0) | P1(1),	MASK_REG | V_a0(1) | V_Z(1) | P2(1) | P1(1),	TIC80_VECTOR, {REG_0, REG_22}},
1181*3d8817e4Smiod 
1182*3d8817e4Smiod   /* Vector Floating-Point Subtract */
1183*3d8817e4Smiod 
1184*3d8817e4Smiod   {"vsub.dd",	OP_REG(0x3C2) | P2(1) | P1(1),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{REG_0_E, REG_22_E, REG_22_E}	},
1185*3d8817e4Smiod   {"vsub.sd",	OP_LI(0x3C3)  | P2(1) | P1(0),	MASK_LI  | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{SPFI, REG_22_E, REG_22_E}	},
1186*3d8817e4Smiod   {"vsub.sd",	OP_REG(0x3C2) | P2(1) | P1(0),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{REG_0, REG_22_E, REG_22_E}	},
1187*3d8817e4Smiod   {"vsub.ss",	OP_LI(0x3C3)  | P2(0) | P1(0),	MASK_LI  | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{SPFI, REG_22, REG_22}	},
1188*3d8817e4Smiod   {"vsub.ss",	OP_REG(0x3C2) | P2(0) | P1(0),	MASK_REG | V_a1(1) | P2(1) | P1(1),	TIC80_VECTOR,	{REG_0, REG_22, REG_22}	},
1189*3d8817e4Smiod 
1190*3d8817e4Smiod   /* Vector Load Data Into Register - Note that the vector load/store instructions come after the other
1191*3d8817e4Smiod    vector instructions so that the disassembler will always print the load/store instruction second for
1192*3d8817e4Smiod    vector instructions that have two instructions in the same opcode. */
1193*3d8817e4Smiod 
1194*3d8817e4Smiod   {"vld0.d",	OP_V(0x1E) | V_m(1) | V_S(1) | V_p(0),	MASK_V | V_m(1) | V_S(1) | V_p(1),	TIC80_VECTOR, {REG_DEST_E} },
1195*3d8817e4Smiod   {"vld0.s",	OP_V(0x1E) | V_m(1) | V_S(0) | V_p(0),	MASK_V | V_m(1) | V_S(1) | V_p(1),	TIC80_VECTOR, {REG_DEST} },
1196*3d8817e4Smiod   {"vld1.d",	OP_V(0x1E) | V_m(1) | V_S(1) | V_p(1),	MASK_V | V_m(1) | V_S(1) | V_p(1),	TIC80_VECTOR, {REG_DEST_E} },
1197*3d8817e4Smiod   {"vld1.s",	OP_V(0x1E) | V_m(1) | V_S(0) | V_p(1),	MASK_V | V_m(1) | V_S(1) | V_p(1),	TIC80_VECTOR, {REG_DEST} },
1198*3d8817e4Smiod 
1199*3d8817e4Smiod   /* Vector Store Data Into Memory - Note that the vector load/store instructions come after the other
1200*3d8817e4Smiod    vector instructions so that the disassembler will always print the load/store instruction second for
1201*3d8817e4Smiod    vector instructions that have two instructions in the same opcode. */
1202*3d8817e4Smiod 
1203*3d8817e4Smiod   {"vst.d",	OP_V(0x1E) | V_m(0) | V_S(1) | V_p(1),	MASK_V | V_m(1) | V_S(1) | V_p(1),	TIC80_VECTOR, {REG_DEST_E} },
1204*3d8817e4Smiod   {"vst.s",	OP_V(0x1E) | V_m(0) | V_S(0) | V_p(1),	MASK_V | V_m(1) | V_S(1) | V_p(1),	TIC80_VECTOR, {REG_DEST} },
1205*3d8817e4Smiod 
1206*3d8817e4Smiod   {"xnor",	OP_SI(0x19),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST} },
1207*3d8817e4Smiod   {"xnor",	OP_LI(0x333),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST} },
1208*3d8817e4Smiod   {"xnor",	OP_REG(0x332),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST} },
1209*3d8817e4Smiod 
1210*3d8817e4Smiod   {"xor",	OP_SI(0x16),	MASK_SI,	0,	{SUBF, REG_22, REG_DEST} },
1211*3d8817e4Smiod   {"xor",	OP_LI(0x32D),	MASK_LI,	0,	{LUBF, REG_22, REG_DEST} },
1212*3d8817e4Smiod   {"xor",	OP_REG(0x32C),	MASK_REG,	0,	{REG_0, REG_22, REG_DEST} },
1213*3d8817e4Smiod 
1214*3d8817e4Smiod };
1215*3d8817e4Smiod 
1216*3d8817e4Smiod const int tic80_num_opcodes = sizeof (tic80_opcodes) / sizeof (tic80_opcodes[0]);
1217