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